copier-python 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. copier_python-0.1.0/.gitignore +19 -0
  2. copier_python-0.1.0/CHANGELOG.md +10 -0
  3. copier_python-0.1.0/CONTRIBUTING.md +30 -0
  4. copier_python-0.1.0/LICENSE +21 -0
  5. copier_python-0.1.0/MAINTAINING.md +68 -0
  6. copier_python-0.1.0/PKG-INFO +59 -0
  7. copier_python-0.1.0/README.md +33 -0
  8. copier_python-0.1.0/copier_python/__init__.py +8 -0
  9. copier_python-0.1.0/copier_python/py.typed +0 -0
  10. copier_python-0.1.0/docs/api.md +3 -0
  11. copier_python-0.1.0/docs/changelog.md +5 -0
  12. copier_python-0.1.0/docs/contributing.md +5 -0
  13. copier_python-0.1.0/docs/index.md +5 -0
  14. copier_python-0.1.0/docs/license.md +9 -0
  15. copier_python-0.1.0/docs/maintaining.md +5 -0
  16. copier_python-0.1.0/pyproject.toml +219 -0
  17. copier_python-0.1.0/tests/__init__.py +0 -0
  18. copier_python-0.1.0/tests/__snapshots__/test_contributing.ambr +68 -0
  19. copier_python-0.1.0/tests/__snapshots__/test_license.ambr +221 -0
  20. copier_python-0.1.0/tests/__snapshots__/test_maintaining.ambr +505 -0
  21. copier_python-0.1.0/tests/__snapshots__/test_pyproject.ambr +1509 -0
  22. copier_python-0.1.0/tests/__snapshots__/test_readme.ambr +137 -0
  23. copier_python-0.1.0/tests/conftest.py +48 -0
  24. copier_python-0.1.0/tests/test_contributing.py +21 -0
  25. copier_python-0.1.0/tests/test_license.py +31 -0
  26. copier_python-0.1.0/tests/test_maintaining.py +38 -0
  27. copier_python-0.1.0/tests/test_pyproject.py +29 -0
  28. copier_python-0.1.0/tests/test_readme.py +48 -0
  29. copier_python-0.1.0/tests/test_structure.py +88 -0
  30. copier_python-0.1.0/tests/test_template.py +22 -0
  31. copier_python-0.1.0/tests/test_version.py +5 -0
@@ -0,0 +1,19 @@
1
+ # Python
2
+ __pycache__/
3
+ *.egg-info/
4
+ *.py[cod]
5
+
6
+ # uv and packaging
7
+ .venv/
8
+ /build/
9
+ /dist/
10
+ uv.lock
11
+
12
+ # Development tools
13
+ .cache/
14
+ .coverage*
15
+ .pytest_cache/
16
+ .ruff_cache/
17
+ /htmlcov/
18
+ /site/
19
+ coverage.xml
@@ -0,0 +1,10 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ [Unreleased]: https://github.com/smkent/copier-python/commits/main/
@@ -0,0 +1,30 @@
1
+ # Contributing to copier-python
2
+
3
+ ## Development setup
4
+
5
+ ### Prerequisites
6
+
7
+ - [Astral's **uv** Python project manager][uv]
8
+ - [`poethepoet`][poe] task runner: `uv tool install poethepoet`
9
+
10
+ ### Project setup
11
+
12
+ ```sh
13
+ git clone https://github.com/smkent/copier-python
14
+ cd copier-python
15
+ uv sync
16
+ uv run poe setup # Enables pre-commit hooks
17
+ ```
18
+
19
+ ## Common tasks
20
+
21
+ | Command | Description |
22
+ |---|---|
23
+ | `poe docs` | Run documentation server locally |
24
+ | `poe lint` | Run all formatters and static checks |
25
+ | `poe lt` | Run all formatters, static checks and tests (`lint` and `test`) |
26
+ | `poe snapup` | Update test snapshots |
27
+ | `poe test` | Run tests |
28
+
29
+ [poe]: https://poethepoet.naln1.net/
30
+ [uv]: https://docs.astral.sh/uv/
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Stephen Kent
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,68 @@
1
+ # Maintaining copier-python
2
+
3
+ ## First time setup
4
+
5
+ These steps only need to be completed once after the project is first created.
6
+
7
+ ### GitHub Repository
8
+
9
+ [Settings → General][repo-settings]:
10
+
11
+ - [x] Allow merge commits
12
+ - [ ] Allow squash merging
13
+ - [ ] Allow rebase merging
14
+ - [x] Automatically delete head branches
15
+
16
+ [Settings → Branches][repo-settings-branches] → Add branch protection rule
17
+ for the Default branch (`main`):
18
+
19
+ - [x] Restrict deletions
20
+ - [x] Require a pull request before merging
21
+ - [x] Block force pushes
22
+
23
+ ### Renovate
24
+
25
+ Ensure the [Renovate app][renovate] is installed on your account, then
26
+ enable it for `smkent/copier-python`.
27
+
28
+ ### PyPI publishing
29
+
30
+ This project uses [trusted publishing][pypi-trusted-publishing] so no API tokens
31
+ need to be stored as secrets.
32
+
33
+ 1. On PyPI, add a (pending) trusted publisher in your
34
+ [Trusted Publisher Management][pypi-publishing-settings] settings:
35
+ - Publisher: GitHub Actions
36
+ - Owner: `smkent`
37
+ - Repository: `copier-python`
38
+ - Workflow: `release.yaml`
39
+ - Environment: `pypi`
40
+ 2. Create the `pypi` environment in the GitHub repository:
41
+ [Settings → Environments][repo-settings-envs] → New environment → `pypi`
42
+ 3. Publish a release by pushing a tag:
43
+ ```sh
44
+ git tag 0.1.0 # or your desired first version number
45
+ git push --tags
46
+ ```
47
+
48
+ ### GitHub Pages
49
+
50
+ [Settings → Pages][repo-settings-pages] → Source → GitHub Actions
51
+
52
+ ## Releasing
53
+
54
+ 1. Update `CHANGELOG.md`: move items from `[Unreleased]` into a new version
55
+ section and update the comparison link at the bottom
56
+ 2. Commit and tag:
57
+ ```sh
58
+ git tag X.Y.Z
59
+ git push --tags
60
+ ```
61
+
62
+ [pypi-publishing-settings]: https://pypi.org/manage/account/publishing/
63
+ [pypi-trusted-publishing]: https://docs.pypi.org/trusted-publishers/
64
+ [renovate]: https://github.com/apps/renovate
65
+ [repo-settings]: https://github.com/smkent/copier-python/settings
66
+ [repo-settings-envs]: https://github.com/smkent/copier-python/settings/environments
67
+ [repo-settings-branches]: https://github.com/smkent/copier-python/settings/branches
68
+ [repo-settings-pages]: https://github.com/smkent/copier-python/settings/pages
@@ -0,0 +1,59 @@
1
+ Metadata-Version: 2.4
2
+ Name: copier-python
3
+ Version: 0.1.0
4
+ Summary: Copier template for Python projects with modern tooling
5
+ Project-URL: Homepage, https://github.com/smkent/copier-python
6
+ Project-URL: Repository, https://github.com/smkent/copier-python
7
+ Project-URL: Issues, https://github.com/smkent/copier-python/issues
8
+ Author-email: Stephen Kent <smkent@smkent.net>
9
+ License-Expression: MIT
10
+ License-File: LICENSE
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3 :: Only
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Programming Language :: Python :: 3.14
20
+ Classifier: Topic :: Documentation
21
+ Classifier: Topic :: Software Development
22
+ Classifier: Topic :: Utilities
23
+ Classifier: Typing :: Typed
24
+ Requires-Python: >=3.10
25
+ Description-Content-Type: text/markdown
26
+
27
+ # copier-python
28
+
29
+ [Copier][copier] template for Python projects with modern tooling
30
+
31
+ [![License](https://img.shields.io/github/license/smkent/copier-python)](LICENSE)
32
+ [![PyPI](https://img.shields.io/pypi/v/copier-python)](https://pypi.org/project/copier-python/)
33
+ [![Python](https://img.shields.io/pypi/pyversions/copier-python)](https://pypi.org/project/copier-python/)
34
+ [![CI](https://github.com/smkent/copier-python/actions/workflows/ci.yml/badge.svg)](https://github.com/smkent/copier-python/actions/workflows/ci.yml)
35
+ [![Coverage](https://codecov.io/gh/smkent/copier-python/branch/main/graph/badge.svg)](https://codecov.io/gh/smkent/copier-python)
36
+ [![Renovate](https://img.shields.io/badge/renovate-enabled-brightgreen?logo=renovatebot)](https://renovatebot.com)
37
+ [![GitHub stars](https://img.shields.io/github/stars/smkent/copier-python?style=social)](https://github.com/smkent/copier-python)
38
+
39
+ ## Prerequisites
40
+
41
+ - [Astral's **uv** Python project manager][uv]
42
+ - [Copier][copier]: `uv tool install copier`
43
+
44
+ ## Usage
45
+
46
+ ```sh
47
+ copier copy "gh:smkent/copier-python" /new/project/path
48
+ ```
49
+
50
+ [copier]: https://copier.readthedocs.io
51
+ [uv]: https://docs.astral.sh/uv/
52
+
53
+ ## Credits
54
+
55
+ This template was inspired by [pawamoy/copier-uv][copier-uv] and
56
+ [ritwiktiwari/copier-astral][copier-astral] -- Thanks!
57
+
58
+ [copier-uv]: https://github.com/pawamoy/copier-uv
59
+ [copier-astral]: https://github.com/ritwiktiwari/copier-astral
@@ -0,0 +1,33 @@
1
+ # copier-python
2
+
3
+ [Copier][copier] template for Python projects with modern tooling
4
+
5
+ [![License](https://img.shields.io/github/license/smkent/copier-python)](LICENSE)
6
+ [![PyPI](https://img.shields.io/pypi/v/copier-python)](https://pypi.org/project/copier-python/)
7
+ [![Python](https://img.shields.io/pypi/pyversions/copier-python)](https://pypi.org/project/copier-python/)
8
+ [![CI](https://github.com/smkent/copier-python/actions/workflows/ci.yml/badge.svg)](https://github.com/smkent/copier-python/actions/workflows/ci.yml)
9
+ [![Coverage](https://codecov.io/gh/smkent/copier-python/branch/main/graph/badge.svg)](https://codecov.io/gh/smkent/copier-python)
10
+ [![Renovate](https://img.shields.io/badge/renovate-enabled-brightgreen?logo=renovatebot)](https://renovatebot.com)
11
+ [![GitHub stars](https://img.shields.io/github/stars/smkent/copier-python?style=social)](https://github.com/smkent/copier-python)
12
+
13
+ ## Prerequisites
14
+
15
+ - [Astral's **uv** Python project manager][uv]
16
+ - [Copier][copier]: `uv tool install copier`
17
+
18
+ ## Usage
19
+
20
+ ```sh
21
+ copier copy "gh:smkent/copier-python" /new/project/path
22
+ ```
23
+
24
+ [copier]: https://copier.readthedocs.io
25
+ [uv]: https://docs.astral.sh/uv/
26
+
27
+ ## Credits
28
+
29
+ This template was inspired by [pawamoy/copier-uv][copier-uv] and
30
+ [ritwiktiwari/copier-astral][copier-astral] -- Thanks!
31
+
32
+ [copier-uv]: https://github.com/pawamoy/copier-uv
33
+ [copier-astral]: https://github.com/ritwiktiwari/copier-astral
@@ -0,0 +1,8 @@
1
+ """Copier template for Python projects with modern tooling."""
2
+
3
+ from importlib.metadata import PackageNotFoundError, version
4
+
5
+ try:
6
+ __version__ = version(__name__)
7
+ except PackageNotFoundError:
8
+ __version__ = "0.0.0"
File without changes
@@ -0,0 +1,3 @@
1
+ # API Reference
2
+
3
+ ::: copier_python
@@ -0,0 +1,5 @@
1
+ ---
2
+ icon: lucide/history
3
+ ---
4
+
5
+ --8<-- "CHANGELOG.md"
@@ -0,0 +1,5 @@
1
+ ---
2
+ icon: lucide/code
3
+ ---
4
+
5
+ --8<-- "CONTRIBUTING.md"
@@ -0,0 +1,5 @@
1
+ ---
2
+ icon: lucide/book-open
3
+ ---
4
+
5
+ --8<-- "README.md"
@@ -0,0 +1,9 @@
1
+ ---
2
+ icon: lucide/scale
3
+ ---
4
+
5
+ # License
6
+
7
+ ```
8
+ --8<-- "LICENSE"
9
+ ```
@@ -0,0 +1,5 @@
1
+ ---
2
+ icon: lucide/construction
3
+ ---
4
+
5
+ --8<-- "MAINTAINING.md"
@@ -0,0 +1,219 @@
1
+ [build-system]
2
+ requires = ["hatchling", "uv-dynamic-versioning"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "copier-python"
7
+ dynamic = ["version"]
8
+ description = "Copier template for Python projects with modern tooling"
9
+ readme = "README.md"
10
+ license = "MIT"
11
+ license-files = ["LICENSE"]
12
+ requires-python = ">=3.10"
13
+ authors = [
14
+ { name = "Stephen Kent", email = "smkent@smkent.net" },
15
+ ]
16
+ classifiers = [
17
+ "Development Status :: 3 - Alpha",
18
+ "Intended Audience :: Developers",
19
+ "Programming Language :: Python :: 3",
20
+ "Programming Language :: Python :: 3 :: Only",
21
+ "Programming Language :: Python :: 3.10",
22
+ "Programming Language :: Python :: 3.11",
23
+ "Programming Language :: Python :: 3.12",
24
+ "Programming Language :: Python :: 3.13",
25
+ "Programming Language :: Python :: 3.14",
26
+ "Topic :: Documentation",
27
+ "Topic :: Software Development",
28
+ "Topic :: Utilities",
29
+ "Typing :: Typed",
30
+ ]
31
+ keywords = []
32
+ dependencies = []
33
+
34
+ [project.urls]
35
+ Homepage = "https://github.com/smkent/copier-python"
36
+ Repository = "https://github.com/smkent/copier-python"
37
+ Issues = "https://github.com/smkent/copier-python/issues"
38
+
39
+ [dependency-groups]
40
+ dev = [
41
+ "copier>=9",
42
+ "poethepoet>=0.42",
43
+ "prek>=0.3",
44
+ "pysentry-rs>=0.4",
45
+ "pytest>=9.0",
46
+ "pytest-cov>=7.0",
47
+ "pytest-sugar>=1.0",
48
+ "syrupy>=4.0",
49
+ "ruff>=0.15",
50
+ "ty>=0.0.26",
51
+ ]
52
+ docs = [
53
+ "mkdocstrings[python]>=1",
54
+ "zensical>=0.0.30",
55
+ ]
56
+
57
+ [tool.hatch.build.targets.sdist]
58
+ include = ["/copier_python", "/tests", "*.md", "LICENSE"]
59
+
60
+ [tool.hatch.version]
61
+ source = "uv-dynamic-versioning"
62
+
63
+ [tool.poe.executor]
64
+ type = "uv"
65
+
66
+ [tool.poe.tasks.audit]
67
+ cmd = "pysentry-rs"
68
+ help = "Run dependencies security audit"
69
+
70
+ [tool.poe.tasks.build]
71
+ cmd = "uv build"
72
+ help = "Build distribution package"
73
+
74
+ [tool.poe.tasks.docs-build]
75
+ cmd = "zensical build -c"
76
+ help = "Build documentation site"
77
+
78
+ [tool.poe.tasks.docs]
79
+ sequence = [
80
+ {ref = "docs-build"},
81
+ {cmd = "zensical serve -a \"${host}:${port}\""},
82
+ ]
83
+ help = "Run documentation site locally"
84
+
85
+ [tool.poe.tasks.docs.args.host]
86
+ options = ['--host', '-h']
87
+ help = "Bind IP"
88
+ default = "localhost"
89
+
90
+ [tool.poe.tasks.docs.args.port]
91
+ positional = true
92
+ help = "Bind Port"
93
+ default = "8000"
94
+
95
+ [tool.poe.tasks.init]
96
+ sequence = [
97
+ {shell = "[ ! -d .git ] || { echo \"git repository already exists\"; exit 1; }"},
98
+ {cmd = "git init"},
99
+ {cmd = "uv sync"},
100
+ {ref = "setup"},
101
+ {cmd = "git remote add origin https://github.com/smkent/copier-python"},
102
+ {cmd = "git config --local remote.origin.pushurl git@github.com:smkent/copier-python.git"},
103
+ {cmd = "git add ."},
104
+ {cmd = "git commit -m 'Create project from template'"},
105
+ ]
106
+ help = "Initialize git repository once on project creation"
107
+
108
+ [tool.poe.tasks.lint]
109
+ cmd = "prek run --all-files"
110
+ help = "Run all formatters and static checks"
111
+
112
+ [tool.poe.tasks.lt]
113
+ sequence = [{ref = "lint"}, {ref = "test"}]
114
+ help = "Run all formatters, static checks and tests"
115
+
116
+ [tool.poe.tasks.setup]
117
+ cmd = "prek install"
118
+ help = "Install git hooks"
119
+
120
+ [tool.poe.tasks.snapup]
121
+ cmd = "pytest --snapshot-update"
122
+ help = "Update test snapshots"
123
+
124
+ [tool.poe.tasks.test]
125
+ cmd = "pytest"
126
+ help = "Run tests"
127
+
128
+ [tool.poe.tasks.test-versions]
129
+ sequence = ["test-py310", "test-py311", "test-py312", "test-py313", "test-py314"]
130
+ help = "Run tests across all Python versions"
131
+
132
+ [tool.poe.tasks.test-py310]
133
+ cmd = "pytest"
134
+ executor = {isolated = true, python = "3.10"}
135
+ help = "Run tests using Python 3.10"
136
+
137
+ [tool.poe.tasks.test-py311]
138
+ cmd = "pytest"
139
+ executor = {isolated = true, python = "3.11"}
140
+ help = "Run tests using Python 3.11"
141
+
142
+ [tool.poe.tasks.test-py312]
143
+ cmd = "pytest"
144
+ executor = {isolated = true, python = "3.12"}
145
+ help = "Run tests using Python 3.12"
146
+
147
+ [tool.poe.tasks.test-py313]
148
+ cmd = "pytest"
149
+ executor = {isolated = true, python = "3.13"}
150
+ help = "Run tests using Python 3.13"
151
+
152
+ [tool.poe.tasks.test-py314]
153
+ cmd = "pytest"
154
+ executor = {isolated = true, python = "3.14"}
155
+ help = "Run tests using Python 3.14"
156
+
157
+ [tool.pytest]
158
+ addopts = [
159
+ "-ra",
160
+ "--cov",
161
+ "--strict-config",
162
+ "--strict-markers",
163
+ ]
164
+ testpaths = ["tests"]
165
+
166
+ [tool.coverage.run]
167
+ source = ["copier_python"]
168
+ branch = true
169
+
170
+ [tool.coverage.report]
171
+ show_missing = true
172
+ skip_covered = true
173
+ exclude_lines = [
174
+ "pragma: no cover",
175
+ "if TYPE_CHECKING:",
176
+ "@abstractmethod",
177
+ ]
178
+
179
+ [tool.ruff]
180
+ line-length = 79
181
+ output-format = "concise"
182
+ target-version = "py310"
183
+
184
+ [tool.ruff.lint]
185
+ select = ["ALL"]
186
+ ignore = [
187
+ "ANN401", # Dynamically typed expressions (typing.Any) are disallowed
188
+ "COM812", # Trailing comma missing
189
+ "D1", # Missing docstring presence rules
190
+ "EM", # flake8-errmsg
191
+ "G004", # Logging statement uses f-string
192
+ "PLR", # pylint Refactor
193
+ "S607", # Starting a process with a partial executable path
194
+ "TD", # flake8-todos
195
+ "TRY003", # Avoid specifying long messages outside the exception class
196
+ ]
197
+
198
+ [tool.ruff.lint.isort]
199
+ known-first-party = ["copier_python"]
200
+
201
+ [tool.ruff.lint.per-file-ignores]
202
+ "tests/**/*.py" = [
203
+ "ARG", # flake8-unused-arguments
204
+ "S101", # Use of assert detected
205
+ ]
206
+
207
+ [tool.ruff.lint.pydocstyle]
208
+ convention = "google"
209
+
210
+ [tool.ty.terminal]
211
+ error-on-warning = true
212
+ output-format = "concise"
213
+
214
+ [tool.uv]
215
+ default-groups = ["dev", "docs"]
216
+
217
+ [tool.uv-dynamic-versioning]
218
+ pattern = "default-unprefixed"
219
+ fallback-version = "0.0.0"
File without changes
@@ -0,0 +1,68 @@
1
+ # serializer version: 1
2
+ # name: test_maintaining_features[docs]
3
+ '''
4
+ # Contributing to PKFire
5
+
6
+ ## Development setup
7
+
8
+ ### Prerequisites
9
+
10
+ - [Astral's **uv** Python project manager][uv]
11
+ - [`poethepoet`][poe] task runner: `uv tool install poethepoet`
12
+
13
+ ### Project setup
14
+
15
+ ```sh
16
+ git clone https://github.com/ness/PKFire
17
+ cd PKFire
18
+ uv sync
19
+ uv run poe setup # Enables pre-commit hooks
20
+ ```
21
+
22
+ ## Common tasks
23
+
24
+ | Command | Description |
25
+ |---|---|
26
+ | `poe docs` | Run documentation server locally |
27
+ | `poe lint` | Run all formatters and static checks |
28
+ | `poe lt` | Run all formatters, static checks and tests (`lint` and `test`) |
29
+ | `poe test` | Run tests |
30
+
31
+ [poe]: https://poethepoet.naln1.net/
32
+ [uv]: https://docs.astral.sh/uv/
33
+
34
+ '''
35
+ # ---
36
+ # name: test_maintaining_features[no_docs]
37
+ '''
38
+ # Contributing to PKFire
39
+
40
+ ## Development setup
41
+
42
+ ### Prerequisites
43
+
44
+ - [Astral's **uv** Python project manager][uv]
45
+ - [`poethepoet`][poe] task runner: `uv tool install poethepoet`
46
+
47
+ ### Project setup
48
+
49
+ ```sh
50
+ git clone https://github.com/ness/PKFire
51
+ cd PKFire
52
+ uv sync
53
+ uv run poe setup # Enables pre-commit hooks
54
+ ```
55
+
56
+ ## Common tasks
57
+
58
+ | Command | Description |
59
+ |---|---|
60
+ | `poe lint` | Run all formatters and static checks |
61
+ | `poe lt` | Run all formatters, static checks and tests (`lint` and `test`) |
62
+ | `poe test` | Run tests |
63
+
64
+ [poe]: https://poethepoet.naln1.net/
65
+ [uv]: https://docs.astral.sh/uv/
66
+
67
+ '''
68
+ # ---