wexample-wex-addon-dev-python 8.1.2__tar.gz → 8.2.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 (67) hide show
  1. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/PKG-INFO +2 -2
  2. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/README.md +1 -1
  3. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/pyproject.toml +1 -1
  4. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/workdir/python_workdir.py +41 -18
  5. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/__init__.py +0 -0
  6. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/__pycache__/__init__.py +0 -0
  7. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/commands/__init__.py +0 -0
  8. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/commands/code/__init__.py +0 -0
  9. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/commands/code/check/__init__.py +0 -0
  10. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/commands/code/check/mypy.py +0 -0
  11. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/commands/code/check/pylint.py +0 -0
  12. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/commands/code/check/pyright.py +0 -0
  13. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/commands/code/check.py +0 -0
  14. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/commands/code/format/__init__.py +0 -0
  15. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/commands/code/format/black.py +0 -0
  16. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/commands/code/format/isort.py +0 -0
  17. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/commands/code/format.py +0 -0
  18. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/commands/examples/__init__.py +0 -0
  19. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/commands/examples/utils/__init__.py +0 -0
  20. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/commands/examples/utils/some_example_type.py +0 -0
  21. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/commands/examples/validate.py +0 -0
  22. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/commands/release/__init__.py +0 -0
  23. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/config_value/__init__.py +0 -0
  24. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/config_value/__pycache__/__init__.py +0 -0
  25. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/config_value/python_package_readme_config_value.py +0 -0
  26. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/const/__init__.py +0 -0
  27. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/const/__pycache__/__init__.py +0 -0
  28. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/const/package.py +0 -0
  29. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/const/python.py +0 -0
  30. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/file/__init__.py +0 -0
  31. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/file/__pycache__/__init__.py +0 -0
  32. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/file/python_app_iml_file.py +0 -0
  33. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/file/python_pyproject_toml_file.py +0 -0
  34. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/helpers/__init__.py +0 -0
  35. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/helpers/pdm.py +0 -0
  36. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/middleware/__init__.py +0 -0
  37. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/middleware/__pycache__/__init__.py +0 -0
  38. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/middleware/each_python_file_middleware.py +0 -0
  39. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/py.typed +0 -0
  40. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/python_addon_manager.py +0 -0
  41. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/resources/.wex.yml +0 -0
  42. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/resources/docker/Dockerfile.python-profiling +0 -0
  43. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/resources/package_publish_gitlab.yml +0 -0
  44. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/resources/readme_templates/tests.md.j2 +0 -0
  45. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/services/__init__.py +0 -0
  46. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/services/python/__init__.py +0 -0
  47. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/services/python/app_service.py +0 -0
  48. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/services/python/commands/__init__.py +0 -0
  49. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/services/python/commands/service/__init__.py +0 -0
  50. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/services/python/commands/service/install.py +0 -0
  51. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/services/python/commands/service/setup.py +0 -0
  52. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/services/python/docker/.wex.yml +0 -0
  53. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/services/python/docker/docker-compose.yml +0 -0
  54. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/services/python/samples/__init__.py +0 -0
  55. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/services/python/samples/docker/__init__.py +0 -0
  56. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/services/python/samples/docker/docker-compose.yml +0 -0
  57. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/services/python/samples/docker/entrypoint.sh +0 -0
  58. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/services/python/samples/docker/images/Dockerfile.base +0 -0
  59. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/services/python/samples/docker/images/Dockerfile.develop +0 -0
  60. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/services/python/samples/docker/images/__init__.py +0 -0
  61. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/services/python/service.yml +0 -0
  62. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/workdir/__init__.py +0 -0
  63. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/workdir/__pycache__/__init__.py +0 -0
  64. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/workdir/mixin/__init__.py +0 -0
  65. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/workdir/mixin/with_profiling_python_workdir_mixin.py +0 -0
  66. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/workdir/python_package_workdir.py +0 -0
  67. {wexample_wex_addon_dev_python-8.1.2 → wexample_wex_addon_dev_python-8.2.0}/src/wexample_wex_addon_dev_python/workdir/python_packages_suite_workdir.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: wexample-wex-addon-dev-python
3
- Version: 8.1.2
3
+ Version: 8.2.0
4
4
  Summary: Python dev addon for wex
5
5
  Author-Email: weeger <contact@wexample.com>
6
6
  License: MIT
@@ -24,7 +24,7 @@ Description-Content-Type: text/markdown
24
24
 
25
25
  # wex_addon_dev_python
26
26
 
27
- Version: 8.1.2
27
+ Version: 8.2.0
28
28
 
29
29
  Python dev addon for wex
30
30
 
@@ -1,6 +1,6 @@
1
1
  # wex_addon_dev_python
2
2
 
3
- Version: 8.1.2
3
+ Version: 8.2.0
4
4
 
5
5
  Python dev addon for wex
6
6
 
@@ -6,7 +6,7 @@ build-backend = "pdm.backend"
6
6
 
7
7
  [project]
8
8
  name = "wexample-wex-addon-dev-python"
9
- version = "8.1.2"
9
+ version = "8.2.0"
10
10
  description = "Python dev addon for wex"
11
11
  authors = [
12
12
  { name = "weeger", email = "contact@wexample.com" },
@@ -304,6 +304,10 @@ class PythonWorkdir(WithProfilingPythonWorkdirMixin, CodeBaseWorkdir):
304
304
  def update_dependencies(self, dependencies_map: dict[str, str]) -> None:
305
305
  import subprocess
306
306
 
307
+ from wexample_helpers.helpers.retryable_callback_manager import (
308
+ RetryableCallbackManager,
309
+ )
310
+
307
311
  super().update_dependencies(dependencies_map)
308
312
 
309
313
  requirements_path = self.get_path() / "requirements.txt"
@@ -311,25 +315,44 @@ class PythonWorkdir(WithProfilingPythonWorkdirMixin, CodeBaseWorkdir):
311
315
  return
312
316
 
313
317
  pyproject_path = self.get_path() / "pyproject.toml"
314
- result = subprocess.run(
315
- [
316
- "uv",
317
- "pip",
318
- "compile",
319
- str(pyproject_path),
320
- "--output-file",
321
- str(requirements_path),
322
- "--python-version",
323
- "3.11",
324
- "--no-cache",
325
- ],
326
- capture_output=True,
327
- text=True,
328
- )
329
- if result.returncode != 0:
330
- raise RuntimeError(
331
- f"uv pip compile failed for {self.get_path()}:\n{result.stderr}"
318
+
319
+ def _run_uv_compile() -> None:
320
+ result = subprocess.run(
321
+ [
322
+ "uv",
323
+ "pip",
324
+ "compile",
325
+ str(pyproject_path),
326
+ "--output-file",
327
+ str(requirements_path),
328
+ "--python-version",
329
+ "3.11",
330
+ "--no-cache",
331
+ ],
332
+ capture_output=True,
333
+ text=True,
332
334
  )
335
+ if result.returncode != 0:
336
+ raise RuntimeError(
337
+ f"uv pip compile failed for {self.get_path()}:\n{result.stderr}"
338
+ )
339
+
340
+ # Right after a publish, PyPI's index can still serve a stale view of the
341
+ # registry, making uv conclude that the freshly-published version is
342
+ # "unsatisfiable". Retry a few times with backoff to absorb this race.
343
+ # Real dependency conflicts will still fail after retries.
344
+ RetryableCallbackManager(
345
+ callback=_run_uv_compile,
346
+ max_attempts=4,
347
+ backoff_base_seconds=4,
348
+ should_retry_callback=lambda exc, msg, attempt, max_a: (
349
+ "No solution found" in msg or "unsatisfiable" in msg
350
+ ),
351
+ on_retry_callback=lambda attempt, max_a, delay, exc, msg: self.log(
352
+ f"uv pip compile reports unsatisfiable on attempt {attempt}/{max_a} "
353
+ f"(likely PyPI index propagation); retrying in {delay}s…"
354
+ ),
355
+ ).run()
333
356
 
334
357
  def _create_init_children_factory(self) -> ChildrenFileFactoryOption:
335
358
  from wexample_filestate.const.disk import DiskItemType