We use all good stuffs like:
ruff, uv, basedpyright, pytest, doctest, MkDocs, versioneer, GitHub Actions, conventional commit, changelog, typer CLI, rich logging, ...
This template is designed to make it easy to install in various ways as follows.
# For developers
pip install -e .
# If you want to use both API and CLI
pip install .
pip install 'git+https://github.com/deargen/python-project-template-2024'
# If you want to use only CLI
pipx install .
pipx install 'git+https://github.com/deargen/python-project-template-2024'
uv tool install .
uv tool install 'git+https://github.com/deargen/python-project-template-2024'
Key features
- Use GitHub Actions to check ruff formatter, ruff linter, pytest (unit test) pass or not
- Actions can apply formatting
- Use GitHub Actions to check uv pip-compile is applied or not (Convert dynamic version in
deps/requirements.in
to lock file indeps/lock
)- Actions can compile lock file
- Use MkDocs to automatically generate documents
- Use GitHub Pages for public repo
- Use GitLab Pages for private repo
- Versioning the project and automatically generating changelog.
- Release new version in Actions (commit changelog and tag, create release)
- Refer to https://github.com/deargen/workflows
- Provide convenience features with CLI (typer)
ml-project health
to check environment settings.ml-project --version
to check the current version.
- (Optional)
pip3 install --user uv
orbrew install uv
(macOS) to install uv, to enable fasteruv pip
overpip
. uv pip install -r deps/lock/x86_64-manylinux_2_28/requirements.txt
,uv pip install -e .
to install dependencies and the package "ml-project"ml-project config
to copytemplate.env
->.env
. (Modify if necessary)ml-project health
to check health of the environment and installation.python tools/examples/color_logging_main.py
: example script with rich logging. Logs are saved indata/logs
folder.ML_PROJECT_LOG_LEVEL=WARNING python tools/examples/color_logging_main.py
to exclude INFO logs.
uv pip install -r deps/lock/x86_64-manylinux_2_28/requirements_dev.txt
to install pytest and other developer packages.pytest
to run tests.- doctest is automatically run in Actions.
import ml_project; print(ml_project.__version__)
to see the version like0.1.0+4.g75bbed7.dirty
.- It means 4 commits after 0.1.0 version. And if there are uncommitted changes, it is a dirty version.
π .vscode/
β π settings.json # VSCode settings for ruff auto formatting on save etc.
β π extensions.json # List of extensions to recommend in VSCode.
π .github/
β π ISSUE_TEMPLATE/
β π workflows/ # GitHub Actions for automated deployment pipeline
β π *.yml
π src/
β π ml_project/ # `import ml_project` to define functions, classes, etc.
β π __init__.py
β π _version.py # versioneer file to read version information from git tag (DO NOT modify)
β π template.env # Environment settings file copied to `.env` when `ml-project config` is executed
β π ...
π tools/ # Files that can be run directly without importing. (e.g. train.py)
π tests/ # Functions executed when `pytest` is run
π scripts/ # Not directly related to the project, but necessary for project management
β # Script to find modules when generating MkDocs reference page.
β # It is possible to modify if there are modules you want to exclude manually!
β π gen_ref_nav.py
π deps/
β # DO NOT modify. Created when `.github/workflows/apply-pip-compile.yml` is executed
β π‘οΈ .requirements.in.sha256
β π‘οΈ .requirements_dev.in.sha256
β π‘οΈ .requirements_docs.in.sha256
β
β # Dependencies required for program users.
β ποΈ requirements.in
β # Dependencies required for developers, not program users.
β ποΈ requirements_dev.in
β # Programs required for document generation with mkdocs
β ποΈ requirements_docs.in
β # NOTE: *.in files are package dependencies, not lock files, so they should all be written in dynamic version.
β
β # DO NOT modify. Created from *.in files
β π lock/
β π requirements.txt
β π requirements_dev.txt
β π requirements_docs.txt
βοΈ pyproject.toml # Python project integration information. Including settings for external tools like ruff.
To change the project name, modify the contents of ./replace_project_name.sh
and run it. The script will take care of the following.
- Change the
src/ml_project
folder name to the desired name (import ml_project
name) - Modify the parts to be changed in
pyproject.toml
. (Commented) - Change the badge URLs in
README.md
(python-project-template-2024 -> new address) to display test results correctly.
β The script is a simple replacement, so it does not work twice. Use it once and delete it.
Other useful things to know:
- Modify
deps/requirements*.in
to generate lock files indeps/lock
when modified. (Actions) - Create a new repo for document hosting on GitLab (e.g. ml-project-docs)
- Refer to GitLab Pages settings documentation.
- The GitLab address and token required for document deployment and gitlab pages are set in the Github project settings as Environment secrets / variables.
- For open source projects, remove gitlab related parameters from
.github/workflows/deploy.yml
and.github/workflows/deploy-mkdocs-on-latest.yml
files.
- Leave
setup.py
as it is. - If you haven't written tests, delete all files in the
tests/
folder to pass the tests in GitHub Actions. - β Apply all contents of Python Tools in VSCode/NeoVim (formatter, linter, LSP, etc.).
- Remove all contents of
docs/CHANGELOG.md
except the top paragraph. - Pre-release the first commit as v0.0.0 (possible in github release)
- When deploying a new version with CI, there is an action to compare with the previous version, but it fails if there is no first version.
- Please release the version when it is somewhat stable. The first stable version is v0.1.0, and the previous versions such as v0.0.1, v0.0.2 are used to test whether the release works well.
ruff, uv, basedpyright, pytest, doctest, MkDocs, versioneer, GitHub Actions, conventional commit, changelog, typer CLI, rich logging λ± μ’μ κ² λ€ μ°λ νμ΄μ¬ νλ‘μ νΈ ν νλ¦Ώμ λλ€.
λ³Έ ν νλ¦ΏμΌλ‘ λ§λ ν¨ν€μ§λ λ€μκ³Ό κ°μ΄ μ½κ² μ€μΉν μ μλλ‘ κ³ μλμμ΅λλ€.
# κ°λ°μλ
pip install -e .
# API, CLI λ λ€ μ¬μ©νκ³ μΆλ€λ©΄
pip install .
pip install 'git+https://github.com/deargen/python-project-template-2024'
# CLIλ§ μ¬μ©νκ³ μΆλ€λ©΄
pipx install .
pipx install 'git+https://github.com/deargen/python-project-template-2024'
uv tool install .
uv tool install 'git+https://github.com/deargen/python-project-template-2024'
μ£Όμ κΈ°λ₯
- Github Actionsλ‘ ruff formatter, ruff linter, pytest (unit test) ν΅κ³Ό μ¬λΆ νμΈ
- Actionsμμ ν¬λ§€ν μ μ© κ°λ₯
- GitHub Actionsλ‘ uv pip-compile μ μ© μ¬λΆ νμΈ (
deps/requirements.in
μ dynamic versionμdeps/lock
μμ lock fileλ‘ λ³ν)- Actionsμμ lock file compile κ°λ₯
- MkDocs μ΄μ©ν΄ μλ document μμ±
- Public repoλ GitHub Pages μ΄μ©
- Private repoλ GitLab Pages μ΄μ©
- νλ‘μ νΈ versioningνκ³ changelog μλ μμ±.
- Actionsμμ μ λ²μ release κ°λ₯
- https://github.com/deargen/workflows μ°Έκ³
- νΈμ κΈ°λ₯ CLIλ‘ μ 곡
ml-project health
λ‘ νκ²½ μ€μ νμΈml-project --version
μΌλ‘ νμ¬ λ²μ νμΈ
- (Optional)
pip3 install --user uv
ν΄μ pip λμuv pip
μ¬μ©νλ©΄ λ λΉ λ¦. uv pip install -r deps/lock/x86_64-manylinux_2_28/requirements.txt
,uv pip install -e .
μΌλ‘ dependencies λ° ml-project ν¨ν€μ§ μ€μΉml-project config
μ€νν΄μ.env
νμΌ μμ±. (νμν κ²½μ° μμ )ml-project health
μ€νν΄μ νκ²½ μ€μ μ΄ μ λμλμ§ νμΈ.python tools/examples/color_logging_main.py
μ€νν΄λ³΄κΈ°. λ‘κΉ λ΄μ©μdata/logs
ν΄λ μμ κΈ°λ‘λ¨.ML_PROJECT_LOG_LEVEL=WARNING python tools/examples/color_logging_main.py
λΌκ³ μ€ννλ©΄ μΆλ ₯ λ΄μ©μ€ INFO μΈκ²μ΄ λΉ μ§κ³ μΆλ ₯λ¨.
uv pip install -r deps/lock/x86_64-manylinux_2_28/requirements_dev.txt
μΌλ‘ pytest λ± κ°λ°μμ© ν¨ν€μ§λ μ€μΉκ°λ₯pytest
컀맨λλ‘ ν μ€νΈ μ€νν΄λ³΄κΈ°.- doctestλ Actionsμμ μλμΌλ‘ μ€νλ¨.
import ml_project; print(ml_project.__version__)
ν΄λ³΄λ©΄0.1.0+4.g75bbed7.dirty
μ΄λ°μμΌλ‘ λμ΄.- 0.1.0 λ²μ μ΄ν 4κ°μ 컀λ°μ΄λ λ». κ·Έλ¦¬κ³ μ»€λ°λμ§ μμ μμ μ¬νμ΄ μλ μνμ΄λ©΄ dirtyλ²μ μ.
π .vscode/
β π settings.json # VSCode ruff μ μ₯μ μλ ν¬λ§€ν
μ€μ λ±.
β π extensions.json # VSCodeμμ μΆμ²ν νμ₯ νλ‘κ·Έλ¨ λͺ©λ‘.
π .github/
β π ISSUE_TEMPLATE/
β π workflows/ # κΉν μ‘μ
μλν λ°°ν¬ νμ΄νλΌμΈ
β π *.yml
π src/
β π ml_project/ # `import ml_project`ν΄μ μ¬μ©νλ ν¨μλ ν΄λμ€ λ± μ μνλ κ³³
β π __init__.py
β π _version.py # git tagλ‘ λ²μ μ 보λ₯Ό μ½λ versioneer νμΌ (μμ X)
β π template.env # `ml-project config` μ€νμ `.env`λ‘ λ³΅μ¬λλ νκ²½μ€μ νμΌ
β π ...
π tools/ # import νμ§ μκ³ λ°λ‘ μ€ν κ°λ₯ν νμΌλ€. (μ: train.py)
π tests/ # `pytest` μ€νμ μ€νλλ ν¨μλ€
π scripts/ # νλ‘μ νΈμ μ§μ κ΄λ ¨ X, but νλ‘μ νΈ κ΄λ¦¬λ₯Ό μν΄ νμ
β # MkDocs reference νμ΄μ§ μμ±ν λ λͺ¨λ μ°Ύλ μ€ν¬λ¦½νΈ.
β # μλμΌλ‘ μ μΈνκ³ μΆμ λͺ¨λ μμΌλ©΄ μμ λ κ°λ₯!
β π gen_ref_nav.py
π deps/
β # μ§μ μμ X. .github/workflows/apply-pip-compile.yml μ€νμ μμ±λ¨.
β π‘οΈ .requirements.in.sha256
β π‘οΈ .requirements_dev.in.sha256
β π‘οΈ .requirements_docs.in.sha256
β
β # νλ‘κ·Έλ¨ μ¬μ©μμκ² νμν dependencies.
β ποΈ requirements.in
β # νλ‘κ·Έλ¨ μ¬μ©μκ° μλ κ°λ°μμκ² νμν dependencies.
β ποΈ requirements_dev.in
β # mkdocsλ‘ λ¬Έμ μμ±ν λ νμν νλ‘κ·Έλ¨λ€
β ποΈ requirements_docs.in
β # NOTE: in νμΌμ lock νμΌμ΄ μλ ν¨ν€μ§ dependencyμ΄λ―λ‘ μ λΆ dynamic versionμΌλ‘ μμ±ν΄μΌν¨.
β
β # μ§μ μμ X. in νμΌμμ μμ±λ¨
β π lock/
β π requirements.txt
β π requirements_dev.txt
β π requirements_docs.txt
βοΈ pyproject.toml # νμ΄μ¬ νλ‘μ νΈ ν΅ν© μ 보. ruffλ± μΈλΆ ν΄μ μ€μ λ ν¬ν¨.
νλ‘μ νΈ μ΄λ¦ λ°κΎΈκΈ° μν΄ ./replace_project_name.sh
λ΄μ©μ μμ ν μ€νν©λλ€. μ€ν¬λ¦½νΈμμ μλ λ΄μ©μ ν΄κ²°ν΄μ€λλ€.
src/ml_project
ν΄λ μ΄λ¦ μνλ κ±Έλ‘ λ°κΎΈκΈ° (import ml_project
ν λ μ΄λ¦)pyproject.toml
μ λ°κΏμΌνλ λΆλΆ μ£Όμ λμ΄μμ. λ°κΏ μ°κΈ°README.md
μ μλ badgeλ€ URL (python-project-template-2024 -> μ μ£Όμ) λ°κΎΈμ΄ μ£Όμ΄μΌ μ λλ‘ ν μ€νΈ κ²°κ³Όκ° λΈ.
β ν΄λΉ μ€ν¬λ¦½νΈλ λ¨μ μΉνμ΄κΈ°μ λλ² μλνμ§ μμ΅λλ€. ν λ² μ°κ³ μ§μ°μΈμ.
κ·Έ μΈ μμλλ©΄ μ’μ κ²λ€:
deps/requirements*.in
μ μμ νλ©΄deps/lock
ν΄λμ lock νμΌμ΄ μμ±λ¨. (Actions)- GitLabμ document νΈμ€ν
μ© μ repo λ§λ€κΈ° (μ: ml-project-docs)
- GitLab Pages μ€μ λ¬Έμ μ°Έκ³ .
- docs, deploy ν λ νμν gitlab μ£Όμμ ν ν°μ Github νλ‘μ νΈ μ€μ μμ Environment secrets / variableμ λ°κΎΈμ΄μΌ ν¨.
- μ€νμμ€μ κ²½μ° github pageλ₯Ό μ΄μ©νλλ‘
.github/workflows/deploy.yml
λ°.github/workflows/deploy-mkdocs-on-latest.yml
νμΌμμ gitlab κ΄λ ¨ parameter μ κ±°.
setup.py
λ κ·Έλλ‘ λλ©΄ λ¨- ν
μ€νΈλ₯Ό μμ±νμ§ μμ κ²½μ°,
tests/
ν΄λ μμ νμΌ μ λΆ μμ νλ©΄ GitHub Actionsμμ ν μ€νΈ ν΅κ³Όλ¨. - β VSCodeμ Python Tools λ΄μ© μ λΆ (formatter, linter, LSP λ±) μ μ©νκΈ°.
docs/CHANGELOG.md
λ 맨 μ λ¬Έλ¨ λΉΌκ³ μμ λ΄μ© λ€ μμ .- 첫 commitμ v0.0.0 μΌλ‘ pre-release νκΈ° (github releaseμμ κ°λ₯)
- μλ‘μ΄ λ²μ μ CIλ‘ λ°°ν¬ν λ, μ΄μ λ²μ κ³Ό λΉκ΅νλ actionμ΄ μλλ° μ²« λ²μ μ΄ μμΌλ©΄ κ·Έκ² μ€ν¨ν¨.
- μ΄λ μ λ stableν μνμμ λ²μ μ λ°°ν¬ν΄ μ£ΌμΈμ. 첫 stable λ²μ μ v0.1.0μ΄λ©° κ·Έ μ΄μ v0.0.1, v0.0.2 λ±μ λ¦΄λ¦¬μ¦ λμ μνλμ§ ν μ€νΈ νκΈ° μν΄ μ¬μ©ν μ μμ΅λλ€.