gd-tools-cli 0.9.0__tar.gz → 0.10.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 (103) hide show
  1. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/PKG-INFO +1 -1
  2. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/pyproject.toml +2 -2
  3. gd_tools_cli-0.10.0/src/gd_tools/addon_check.py +157 -0
  4. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/commands/test.py +8 -0
  5. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools_cli.egg-info/PKG-INFO +1 -1
  6. gd_tools_cli-0.9.0/src/gd_tools/addon_check.py +0 -75
  7. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/README.md +0 -0
  8. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/setup.cfg +0 -0
  9. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/__init__.py +0 -0
  10. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/__main__.py +0 -0
  11. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/addons/__init__.py +0 -0
  12. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/addons/gd-tools-coverage/coverage.gd +0 -0
  13. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/addons/gd-tools-editor/coverage_overlay.gd +0 -0
  14. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/addons/gd-tools-editor/dock.gd +0 -0
  15. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/addons/gd-tools-editor/plugin.cfg +0 -0
  16. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/addons/gd-tools-editor/plugin.gd +0 -0
  17. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/addons/gd-tools-test/gd_tools_mock.gd +0 -0
  18. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/addons/gd-tools-test/gd_tools_native_coverage.gd +0 -0
  19. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/addons/gd-tools-test/gd_tools_parameter_naming.gd +0 -0
  20. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/addons/gd-tools-test/gd_tools_snapshot_serializer.gd +0 -0
  21. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/addons/gd-tools-test/gd_tools_snapshot_store.gd +0 -0
  22. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/addons/gd-tools-test/gd_tools_test.gd +0 -0
  23. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/addons/gd-tools-test/gd_tools_test_context.gd +0 -0
  24. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/addons/gd-tools-test/gd_tools_test_preflight.gd +0 -0
  25. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/addons/gd-tools-test/gd_tools_test_runner.gd +0 -0
  26. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/atomic_io.py +0 -0
  27. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/changes.py +0 -0
  28. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/clean.py +0 -0
  29. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/cli.py +0 -0
  30. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/commands/__init__.py +0 -0
  31. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/commands/clean.py +0 -0
  32. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/commands/completion.py +0 -0
  33. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/commands/config.py +0 -0
  34. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/commands/coverage.py +0 -0
  35. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/commands/doctor.py +0 -0
  36. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/commands/format.py +0 -0
  37. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/commands/init.py +0 -0
  38. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/commands/install_hooks.py +0 -0
  39. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/commands/lint.py +0 -0
  40. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/commands/migrate.py +0 -0
  41. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/commands/test_validation.py +0 -0
  42. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/commands/version.py +0 -0
  43. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/config.py +0 -0
  44. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/coverage/__init__.py +0 -0
  45. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/coverage/cobertura_reporter.py +0 -0
  46. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/coverage/diff_reporter.py +0 -0
  47. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/coverage/html_reporter.py +0 -0
  48. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/coverage/lcov_reporter.py +0 -0
  49. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/coverage/omissions.py +0 -0
  50. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/coverage/orchestrator.py +0 -0
  51. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/coverage/patch.py +0 -0
  52. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/coverage/plan_generator.py +0 -0
  53. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/coverage/playtest.py +0 -0
  54. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/coverage/reporter.py +0 -0
  55. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/coverage/templates/file.html +0 -0
  56. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/coverage/templates/index.html +0 -0
  57. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/coverage/terminal_reporter.py +0 -0
  58. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/doctor.py +0 -0
  59. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/errors.py +0 -0
  60. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/file_discovery.py +0 -0
  61. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/format_runner.py +0 -0
  62. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/gh_annotations.py +0 -0
  63. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/godot.py +0 -0
  64. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/init.py +0 -0
  65. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/lint_runner.py +0 -0
  66. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/migration/__init__.py +0 -0
  67. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/migration/apply.py +0 -0
  68. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/migration/gutconfig.py +0 -0
  69. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/migration/reporter.py +0 -0
  70. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/migration/rewrite.py +0 -0
  71. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/migration/scan.py +0 -0
  72. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/migration/translate.py +0 -0
  73. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/native_test/__init__.py +0 -0
  74. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/native_test/artifacts.py +0 -0
  75. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/native_test/bridge_scan.py +0 -0
  76. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/native_test/command.py +0 -0
  77. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/native_test/discovery.py +0 -0
  78. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/native_test/flaky.py +0 -0
  79. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/native_test/import_cache.py +0 -0
  80. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/native_test/orchestrator.py +0 -0
  81. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/native_test/ordering.py +0 -0
  82. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/native_test/preflight.py +0 -0
  83. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/native_test/preflight_cache.py +0 -0
  84. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/native_test/protocol.py +0 -0
  85. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/output.py +0 -0
  86. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/pre_commit.py +0 -0
  87. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/schema.py +0 -0
  88. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/test_results.py +0 -0
  89. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/update_check.py +0 -0
  90. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/verbosity.py +0 -0
  91. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/version.py +0 -0
  92. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/watch/__init__.py +0 -0
  93. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/watch/coalescer.py +0 -0
  94. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/watch/loop.py +0 -0
  95. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/watch/mapping.py +0 -0
  96. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/watch/observer.py +0 -0
  97. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/watch/scope.py +0 -0
  98. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools/watch/session.py +0 -0
  99. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools_cli.egg-info/SOURCES.txt +0 -0
  100. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools_cli.egg-info/dependency_links.txt +0 -0
  101. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools_cli.egg-info/entry_points.txt +0 -0
  102. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools_cli.egg-info/requires.txt +0 -0
  103. {gd_tools_cli-0.9.0 → gd_tools_cli-0.10.0}/src/gd_tools_cli.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gd-tools-cli
3
- Version: 0.9.0
3
+ Version: 0.10.0
4
4
  Summary: A modern development workflow CLI for GDScript projects in Godot 4.5+
5
5
  Author-email: mansyar <m.ansyarafi@gmail.com>
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "gd-tools-cli"
7
- version = "0.9.0"
7
+ version = "0.10.0"
8
8
  description = "A modern development workflow CLI for GDScript projects in Godot 4.5+"
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}
@@ -110,7 +110,7 @@ target-version = ["py310"]
110
110
 
111
111
  [tool.commitizen]
112
112
  name = "cz_conventional_commits"
113
- version = "0.9.0"
113
+ version = "0.10.0"
114
114
  version_files = ["pyproject.toml:version"]
115
115
  changelog_file = "CHANGELOG.md"
116
116
  tag_format = "v$version"
@@ -0,0 +1,157 @@
1
+ """Stale addon detection module.
2
+
3
+ Checks whether the deployed coverage addon version matches the installed
4
+ gd-tools-cli package version. Prints warnings to stderr when the addon
5
+ is missing or stale. Fails silently on any error and can be disabled via
6
+ the GD_TOOLS_NO_UPDATE_CHECK environment variable.
7
+ """
8
+
9
+ import os
10
+
11
+ import click
12
+ from packaging.version import parse as parse_version
13
+
14
+ from gd_tools import __version__
15
+ from gd_tools.config import find_project_root
16
+
17
+ ADDON_VERSION_FILENAME = "_version.txt"
18
+ COVERAGE_ADDON_DIR = "gd-tools-coverage"
19
+ NATIVE_ADDON_DIR = "gd-tools-test"
20
+
21
+
22
+ def _stale_refusal(label: str, deployed: str) -> str:
23
+ """Build the refusal message for a stale/unparseable addon.
24
+
25
+ Args:
26
+ label: Human-readable addon label ("Coverage"/"Native test").
27
+ deployed: Deployed version string (raw, may be unparseable).
28
+
29
+ Returns:
30
+ Refusal message naming both versions, the fix, and the abort.
31
+ """
32
+ return (
33
+ f"Error: {label} addon is outdated (v{deployed} deployed, "
34
+ f"v{__version__} installed). Run `gd-tools init` to "
35
+ "update. Aborted before running tests."
36
+ )
37
+
38
+
39
+ def _missing_refusal(label: str) -> str:
40
+ """Build the refusal message for a missing version file.
41
+
42
+ Args:
43
+ label: Human-readable addon label ("Coverage"/"Native test").
44
+
45
+ Returns:
46
+ Refusal message naming the CLI version, the fix, and abort.
47
+ """
48
+ return (
49
+ f"Error: {label} addon version file not found "
50
+ f"(deployed version unknown, v{__version__} installed). "
51
+ "Run `gd-tools init` to deploy the addon. "
52
+ "Aborted before running tests."
53
+ )
54
+
55
+
56
+ def check_coverage_addon_gate() -> str | None:
57
+ """Check the coverage-run addon gate before suite dispatch.
58
+
59
+ Compares the deployed coverage and native test addon versions
60
+ against the CLI version. A missing, unparseable, or older
61
+ deployed version refuses the run. Newer deployed addons and
62
+ matching versions pass. Suppressed by
63
+ ``GD_TOOLS_NO_UPDATE_CHECK=1``. Never raises; unexpected
64
+ errors defer to the caller's existing behavior.
65
+
66
+ Returns:
67
+ Refusal message when the run must abort, else None.
68
+ """
69
+ if os.environ.get("GD_TOOLS_NO_UPDATE_CHECK") == "1":
70
+ return None
71
+ try:
72
+ project_root = find_project_root()
73
+ except Exception:
74
+ return None
75
+ for addon_dir, label in (
76
+ (COVERAGE_ADDON_DIR, "Coverage"),
77
+ (NATIVE_ADDON_DIR, "Native test"),
78
+ ):
79
+ version_file = (
80
+ project_root / "addons" / addon_dir / ADDON_VERSION_FILENAME
81
+ )
82
+ try:
83
+ exists = version_file.exists()
84
+ except Exception:
85
+ return None
86
+ if not exists:
87
+ return _missing_refusal(label)
88
+ try:
89
+ addon_version = version_file.read_text(encoding="utf-8").strip()
90
+ except Exception:
91
+ return None
92
+ try:
93
+ addon_parsed = parse_version(addon_version)
94
+ package_parsed = parse_version(__version__)
95
+ except (TypeError, ValueError):
96
+ return _stale_refusal(label, addon_version)
97
+ if addon_parsed < package_parsed:
98
+ return _stale_refusal(label, addon_version)
99
+ return None
100
+
101
+
102
+ def check_addon_version() -> None:
103
+ """Check if the deployed coverage addon version is stale.
104
+
105
+ Compares the version in _version.txt against the installed package
106
+ version. Prints a warning to stderr if the addon is missing or stale.
107
+ Fails silently on any unexpected error.
108
+
109
+ FR2: Stale Addon Check on CLI Invocation.
110
+ FR3: Suppressed by GD_TOOLS_NO_UPDATE_CHECK=1.
111
+ FR4: Uses packaging.version.parse() for comparison.
112
+ """
113
+ # FR3.1: Environment variable disables check entirely.
114
+ if os.environ.get("GD_TOOLS_NO_UPDATE_CHECK") == "1":
115
+ return
116
+
117
+ try:
118
+ project_root = find_project_root()
119
+ version_file = (
120
+ project_root
121
+ / "addons"
122
+ / "gd-tools-coverage"
123
+ / ADDON_VERSION_FILENAME
124
+ )
125
+
126
+ if not version_file.exists():
127
+ click.echo(
128
+ "WARNING: Coverage addon version file not found. "
129
+ "Run `gd-tools init` to deploy the addon.",
130
+ err=True,
131
+ )
132
+ return
133
+
134
+ addon_version = version_file.read_text(encoding="utf-8").strip()
135
+ stale_msg = (
136
+ f"WARNING: Coverage addon is outdated (v{addon_version} "
137
+ f"deployed, v{__version__} available). "
138
+ f"Run `gd-tools init` to update."
139
+ )
140
+
141
+ # FR4.1: Compare versions using packaging.version.parse().
142
+ try:
143
+ addon_parsed = parse_version(addon_version)
144
+ package_parsed = parse_version(__version__)
145
+ except (TypeError, ValueError):
146
+ # FR4.2: Unparseable version = treated as stale.
147
+ click.echo(stale_msg, err=True)
148
+ return
149
+
150
+ # FR2.4: Stale (addon < package)
151
+ if addon_parsed < package_parsed:
152
+ click.echo(stale_msg, err=True)
153
+ # FR2.5: Match = no warning
154
+ # FR2.6: Newer addon (downgrade) = no warning
155
+ except Exception:
156
+ # FR2.8: Fail silently on any unexpected error.
157
+ pass
@@ -2,6 +2,7 @@
2
2
 
3
3
  import click
4
4
 
5
+ from ..addon_check import check_coverage_addon_gate
5
6
  from ..config import ConfigError, load_config
6
7
  from ..errors import GdToolsError, TestFailureError
7
8
  from ..native_test.command import run_native_test_command
@@ -291,6 +292,13 @@ def test(
291
292
 
292
293
  validate_test_flags(flags, stage=RuleStage.PRE_DISPATCH)
293
294
 
295
+ if coverage:
296
+ refusal = check_coverage_addon_gate()
297
+ if refusal is not None:
298
+ click.echo(refusal, err=True)
299
+ ctx = click.get_current_context()
300
+ ctx.exit(2)
301
+
294
302
  try:
295
303
  if watch:
296
304
  ctx = click.get_current_context()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gd-tools-cli
3
- Version: 0.9.0
3
+ Version: 0.10.0
4
4
  Summary: A modern development workflow CLI for GDScript projects in Godot 4.5+
5
5
  Author-email: mansyar <m.ansyarafi@gmail.com>
6
6
  License: MIT
@@ -1,75 +0,0 @@
1
- """Stale addon detection module.
2
-
3
- Checks whether the deployed coverage addon version matches the installed
4
- gd-tools-cli package version. Prints warnings to stderr when the addon
5
- is missing or stale. Fails silently on any error and can be disabled via
6
- the GD_TOOLS_NO_UPDATE_CHECK environment variable.
7
- """
8
-
9
- import os
10
-
11
- import click
12
- from packaging.version import parse as parse_version
13
-
14
- from gd_tools import __version__
15
- from gd_tools.config import find_project_root
16
-
17
- ADDON_VERSION_FILENAME = "_version.txt"
18
-
19
-
20
- def check_addon_version() -> None:
21
- """Check if the deployed coverage addon version is stale.
22
-
23
- Compares the version in _version.txt against the installed package
24
- version. Prints a warning to stderr if the addon is missing or stale.
25
- Fails silently on any unexpected error.
26
-
27
- FR2: Stale Addon Check on CLI Invocation.
28
- FR3: Suppressed by GD_TOOLS_NO_UPDATE_CHECK=1.
29
- FR4: Uses packaging.version.parse() for comparison.
30
- """
31
- # FR3.1: Environment variable disables check entirely.
32
- if os.environ.get("GD_TOOLS_NO_UPDATE_CHECK") == "1":
33
- return
34
-
35
- try:
36
- project_root = find_project_root()
37
- version_file = (
38
- project_root
39
- / "addons"
40
- / "gd-tools-coverage"
41
- / ADDON_VERSION_FILENAME
42
- )
43
-
44
- if not version_file.exists():
45
- click.echo(
46
- "WARNING: Coverage addon version file not found. "
47
- "Run `gd-tools init` to deploy the addon.",
48
- err=True,
49
- )
50
- return
51
-
52
- addon_version = version_file.read_text(encoding="utf-8").strip()
53
- stale_msg = (
54
- f"WARNING: Coverage addon is outdated (v{addon_version} "
55
- f"deployed, v{__version__} available). "
56
- f"Run `gd-tools init` to update."
57
- )
58
-
59
- # FR4.1: Compare versions using packaging.version.parse().
60
- try:
61
- addon_parsed = parse_version(addon_version)
62
- package_parsed = parse_version(__version__)
63
- except (TypeError, ValueError):
64
- # FR4.2: Unparseable version = treated as stale.
65
- click.echo(stale_msg, err=True)
66
- return
67
-
68
- # FR2.4: Stale (addon < package)
69
- if addon_parsed < package_parsed:
70
- click.echo(stale_msg, err=True)
71
- # FR2.5: Match = no warning
72
- # FR2.6: Newer addon (downgrade) = no warning
73
- except Exception:
74
- # FR2.8: Fail silently on any unexpected error.
75
- pass
File without changes
File without changes