pyfr-cli 0.12.0__tar.gz → 0.13.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.
- {pyfr_cli-0.12.0 → pyfr_cli-0.13.0}/PKG-INFO +16 -12
- {pyfr_cli-0.12.0 → pyfr_cli-0.13.0}/README.md +15 -11
- {pyfr_cli-0.12.0 → pyfr_cli-0.13.0}/pyproject.toml +1 -1
- {pyfr_cli-0.12.0 → pyfr_cli-0.13.0}/src/pyfr_cli/update.py +7 -0
- {pyfr_cli-0.12.0 → pyfr_cli-0.13.0}/.gitignore +0 -0
- {pyfr_cli-0.12.0 → pyfr_cli-0.13.0}/LICENSE +0 -0
- {pyfr_cli-0.12.0 → pyfr_cli-0.13.0}/src/pyfr_cli/__init__.py +0 -0
- {pyfr_cli-0.12.0 → pyfr_cli-0.13.0}/src/pyfr_cli/__main__.py +0 -0
- {pyfr_cli-0.12.0 → pyfr_cli-0.13.0}/src/pyfr_cli/answers.py +0 -0
- {pyfr_cli-0.12.0 → pyfr_cli-0.13.0}/src/pyfr_cli/changelog.py +0 -0
- {pyfr_cli-0.12.0 → pyfr_cli-0.13.0}/src/pyfr_cli/errors.py +0 -0
- {pyfr_cli-0.12.0 → pyfr_cli-0.13.0}/src/pyfr_cli/git.py +0 -0
- {pyfr_cli-0.12.0 → pyfr_cli-0.13.0}/src/pyfr_cli/ignore.py +0 -0
- {pyfr_cli-0.12.0 → pyfr_cli-0.13.0}/src/pyfr_cli/migrate.py +0 -0
- {pyfr_cli-0.12.0 → pyfr_cli-0.13.0}/src/pyfr_cli/render.py +0 -0
- {pyfr_cli-0.12.0 → pyfr_cli-0.13.0}/src/pyfr_cli/state.py +0 -0
- {pyfr_cli-0.12.0 → pyfr_cli-0.13.0}/src/pyfr_cli/vendor.py +0 -0
- {pyfr_cli-0.12.0 → pyfr_cli-0.13.0}/src/pyfr_cli/versions.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: pyfr-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.13.0
|
|
4
4
|
Summary: PyFr — a cookiecutter template for production-ready Python microservices, and the tool that keeps a generated project up to date with it
|
|
5
5
|
License: Mozilla Public License Version 2.0
|
|
6
6
|
==================================
|
|
@@ -412,13 +412,14 @@ weeks, and every team's result is a little different.
|
|
|
412
412
|
PyFr aims to make that a ten-minute step instead — and to make the result the
|
|
413
413
|
same good one every time.
|
|
414
414
|
|
|
415
|
-
**The generated code is yours.** 🎁
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
415
|
+
**The generated code is yours.** 🎁 A generated service imports no PyFr
|
|
416
|
+
package: no framework to upgrade, no runtime dependency on us, and nothing to
|
|
417
|
+
lock you in. The one thing PyFr publishes is the updater, `pyfr-cli`, which
|
|
418
|
+
runs at update time and is never imported. A generated project still receives
|
|
419
|
+
later template fixes: `just update` pulls them into itself through an
|
|
419
420
|
ordinary `git merge`.
|
|
420
421
|
|
|
421
|
-
## ✅ Status: M0–
|
|
422
|
+
## ✅ Status: M0–M8 done
|
|
422
423
|
|
|
423
424
|
**The template is usable** — `uvx cookiecutter gh:EmadMokhtar/pyfr`
|
|
424
425
|
generates a project whose `just check` passes: three combinations are
|
|
@@ -427,7 +428,10 @@ to `main` and every night, and all eight are rendered and lint-checked on
|
|
|
427
428
|
every pull request and merge. M7, the conversion into a template, is complete: the template
|
|
428
429
|
renders from twelve prompts, prunes the backends you do not choose, gives
|
|
429
430
|
a generated project its own workflows and its own documentation site
|
|
430
|
-
about itself, and records the template version it came from.
|
|
431
|
+
about itself, and records the template version it came from. M8, template
|
|
432
|
+
updates, is complete too: `just update` pulls a later template version
|
|
433
|
+
into a generated project through a git merge, and a weekly workflow opens
|
|
434
|
+
the pull request for it. See the
|
|
431
435
|
[roadmap](https://emadmokhtar.github.io/pyfr/roadmap/) for what each
|
|
432
436
|
milestone delivered.
|
|
433
437
|
The [**reference service**](examples/reference-service/) is rendered from
|
|
@@ -440,14 +444,14 @@ PyFr is built in three phases:
|
|
|
440
444
|
| --- | --- | --- |
|
|
441
445
|
| **A** | M0–M6 | Build the reference service as ordinary Python — no template placeholders anywhere |
|
|
442
446
|
| **B** | M7 | Convert it into the cookiecutter template ✨ |
|
|
443
|
-
| **C** | M8
|
|
447
|
+
| **C** | M8, then forever | Keep the two in step: the template stays the source of truth, and a generated project pulls later versions into itself 🔁 |
|
|
444
448
|
|
|
445
449
|
The rule behind that order: never debug Jinja and Python at the same time. 🙂
|
|
446
450
|
|
|
447
|
-
**M0 through
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
+
**M0 through M8 — the reference service, its conversion into a template,
|
|
452
|
+
and template updates for generated projects — are complete.** See the
|
|
453
|
+
[roadmap](https://emadmokhtar.github.io/pyfr/roadmap/) for what each
|
|
454
|
+
milestone delivered.
|
|
451
455
|
|
|
452
456
|
## 🚀 Try it in one command
|
|
453
457
|
|
|
@@ -28,13 +28,14 @@ weeks, and every team's result is a little different.
|
|
|
28
28
|
PyFr aims to make that a ten-minute step instead — and to make the result the
|
|
29
29
|
same good one every time.
|
|
30
30
|
|
|
31
|
-
**The generated code is yours.** 🎁
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
31
|
+
**The generated code is yours.** 🎁 A generated service imports no PyFr
|
|
32
|
+
package: no framework to upgrade, no runtime dependency on us, and nothing to
|
|
33
|
+
lock you in. The one thing PyFr publishes is the updater, `pyfr-cli`, which
|
|
34
|
+
runs at update time and is never imported. A generated project still receives
|
|
35
|
+
later template fixes: `just update` pulls them into itself through an
|
|
35
36
|
ordinary `git merge`.
|
|
36
37
|
|
|
37
|
-
## ✅ Status: M0–
|
|
38
|
+
## ✅ Status: M0–M8 done
|
|
38
39
|
|
|
39
40
|
**The template is usable** — `uvx cookiecutter gh:EmadMokhtar/pyfr`
|
|
40
41
|
generates a project whose `just check` passes: three combinations are
|
|
@@ -43,7 +44,10 @@ to `main` and every night, and all eight are rendered and lint-checked on
|
|
|
43
44
|
every pull request and merge. M7, the conversion into a template, is complete: the template
|
|
44
45
|
renders from twelve prompts, prunes the backends you do not choose, gives
|
|
45
46
|
a generated project its own workflows and its own documentation site
|
|
46
|
-
about itself, and records the template version it came from.
|
|
47
|
+
about itself, and records the template version it came from. M8, template
|
|
48
|
+
updates, is complete too: `just update` pulls a later template version
|
|
49
|
+
into a generated project through a git merge, and a weekly workflow opens
|
|
50
|
+
the pull request for it. See the
|
|
47
51
|
[roadmap](https://emadmokhtar.github.io/pyfr/roadmap/) for what each
|
|
48
52
|
milestone delivered.
|
|
49
53
|
The [**reference service**](examples/reference-service/) is rendered from
|
|
@@ -56,14 +60,14 @@ PyFr is built in three phases:
|
|
|
56
60
|
| --- | --- | --- |
|
|
57
61
|
| **A** | M0–M6 | Build the reference service as ordinary Python — no template placeholders anywhere |
|
|
58
62
|
| **B** | M7 | Convert it into the cookiecutter template ✨ |
|
|
59
|
-
| **C** | M8
|
|
63
|
+
| **C** | M8, then forever | Keep the two in step: the template stays the source of truth, and a generated project pulls later versions into itself 🔁 |
|
|
60
64
|
|
|
61
65
|
The rule behind that order: never debug Jinja and Python at the same time. 🙂
|
|
62
66
|
|
|
63
|
-
**M0 through
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
+
**M0 through M8 — the reference service, its conversion into a template,
|
|
68
|
+
and template updates for generated projects — are complete.** See the
|
|
69
|
+
[roadmap](https://emadmokhtar.github.io/pyfr/roadmap/) for what each
|
|
70
|
+
milestone delivered.
|
|
67
71
|
|
|
68
72
|
## 🚀 Try it in one command
|
|
69
73
|
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
# examples/reference-service/. The two are never synced together.
|
|
14
14
|
[project]
|
|
15
15
|
name = "pyfr-cli"
|
|
16
|
-
version = "0.
|
|
16
|
+
version = "0.13.0"
|
|
17
17
|
description = "PyFr — a cookiecutter template for production-ready Python microservices, and the tool that keeps a generated project up to date with it"
|
|
18
18
|
readme = "README.md"
|
|
19
19
|
requires-python = ">=3.13"
|
|
@@ -49,14 +49,21 @@ def check(
|
|
|
49
49
|
template = options.template or recorded.template
|
|
50
50
|
newest = versions.remote_versions(template, Git(project))[-1]
|
|
51
51
|
behind = recorded.version < newest
|
|
52
|
+
# The release page of the newest version, so the weekly workflow's
|
|
53
|
+
# issue and a person reading the line both get the address from one
|
|
54
|
+
# place instead of rebuilding it from the template URL.
|
|
55
|
+
release = changelog.release_url(template, newest)
|
|
52
56
|
if as_json:
|
|
53
57
|
record = {
|
|
54
58
|
"recorded": str(recorded.version),
|
|
55
59
|
"newest": str(newest),
|
|
56
60
|
"behind": behind,
|
|
57
61
|
"template": template,
|
|
62
|
+
"release_url": release,
|
|
58
63
|
}
|
|
59
64
|
out.write(json.dumps(record) + "\n")
|
|
65
|
+
elif behind:
|
|
66
|
+
out.write(f"recorded {recorded.version}, newest {newest} -- {release}\n")
|
|
60
67
|
else:
|
|
61
68
|
out.write(f"recorded {recorded.version}, newest {newest}\n")
|
|
62
69
|
return 1 if behind else 0
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|