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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: pyfr-cli
3
- Version: 0.12.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.** 🎁 Nothing is published to a package index, and
416
- a generated service imports no PyFr package. There is no framework to upgrade,
417
- no runtime dependency on us, and nothing to lock you in. From M8, a generated
418
- project will still be able to pull later template fixes into itself through an
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–M7 done, M8 to go
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. See the
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+ | Keep the two in step, forever |
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 M7 — the reference service and its conversion into a
448
- template — are complete. M8, template updates for generated projects, is
449
- next.** See the [roadmap](https://emadmokhtar.github.io/pyfr/roadmap/)
450
- for what ships when.
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.** 🎁 Nothing is published to a package index, and
32
- a generated service imports no PyFr package. There is no framework to upgrade,
33
- no runtime dependency on us, and nothing to lock you in. From M8, a generated
34
- project will still be able to pull later template fixes into itself through an
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–M7 done, M8 to go
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. See the
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+ | Keep the two in step, forever |
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 M7 — the reference service and its conversion into a
64
- template — are complete. M8, template updates for generated projects, is
65
- next.** See the [roadmap](https://emadmokhtar.github.io/pyfr/roadmap/)
66
- for what ships when.
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.12.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