wexample-wex-addon-dev-python 15.2.1__tar.gz → 15.3.1__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 (128) hide show
  1. wexample_wex_addon_dev_python-15.3.1/PKG-INFO +121 -0
  2. wexample_wex_addon_dev_python-15.3.1/README.md +93 -0
  3. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/pyproject.toml +4 -4
  4. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/commands/code/rename.py +0 -0
  5. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/common/pypi_registry_gateway.py +13 -3
  6. {wexample_wex_addon_dev_python-15.2.1/src/wexample_wex_addon_dev_python/common → wexample_wex_addon_dev_python-15.3.1/src/wexample_wex_addon_dev_python/config_value}/__init__.py +0 -0
  7. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/const/tags.py +0 -0
  8. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/formatter/python_code_formatter.py +0 -0
  9. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/refactor/__init__.py +0 -0
  10. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/refactor/abstract_python_path_rename_handler.py +0 -0
  11. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/refactor/abstract_python_rename_handler.py +0 -0
  12. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/refactor/abstract_python_symbol_rename_handler.py +0 -0
  13. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/refactor/applier.py +0 -0
  14. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/refactor/python_class_rename_handler.py +0 -0
  15. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/refactor/python_common.py +0 -0
  16. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/refactor/python_constant_rename_handler.py +0 -0
  17. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/refactor/python_function_rename_handler.py +0 -0
  18. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/refactor/python_module_rename_handler.py +0 -0
  19. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/refactor/python_package_rename_handler.py +0 -0
  20. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/refactor/rename_plan.py +0 -0
  21. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/refactor/symbol_kind.py +0 -0
  22. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/resources/ai/agents/describer/agent.yml +0 -0
  23. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/resources/ai/agents/describer/context.j2 +0 -0
  24. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/resources/design_rules/python_code.md +0 -0
  25. wexample_wex_addon_dev_python-15.3.1/src/wexample_wex_addon_dev_python/resources/package_gitlab_ci.yml +4 -0
  26. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/resources/readme_templates/install.md.j2 +0 -0
  27. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/resources/writing_rules/python_code.md +0 -0
  28. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/selection/abstract_python_code_selection.py +0 -0
  29. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/selection/package_description_missing_selection.py +0 -0
  30. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/selection/python_code_performance_selection.py +0 -0
  31. {wexample_wex_addon_dev_python-15.2.1/src/wexample_wex_addon_dev_python/formatter → wexample_wex_addon_dev_python-15.3.1/src/wexample_wex_addon_dev_python/services}/__init__.py +0 -0
  32. {wexample_wex_addon_dev_python-15.2.1/src/wexample_wex_addon_dev_python/selection → wexample_wex_addon_dev_python-15.3.1/src/wexample_wex_addon_dev_python/services/python/samples}/__init__.py +0 -0
  33. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/workdir/python_package_workdir.py +105 -17
  34. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/workdir/python_workdir.py +18 -0
  35. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/tests/.gitkeep +0 -0
  36. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/tests/helper/test_pdm.py +0 -0
  37. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/tests/integration/refactor/test_python_class_rename_handler.py +0 -0
  38. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/tests/integration/refactor/test_python_constant_rename_handler.py +0 -0
  39. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/tests/integration/refactor/test_python_function_rename_handler.py +0 -0
  40. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/tests/integration/refactor/test_python_module_rename_handler.py +0 -0
  41. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/tests/integration/refactor/test_python_package_rename_handler.py +0 -0
  42. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/tests/unit/helper/test_pdm.py +0 -0
  43. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/tests/unit/refactor/test_abstract_python_path_rename_handler.py +0 -0
  44. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/tests/unit/refactor/test_abstract_python_rename_handler.py +0 -0
  45. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/tests/unit/refactor/test_abstract_python_symbol_rename_handler.py +0 -0
  46. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/tests/unit/refactor/test_applier.py +0 -0
  47. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/tests/unit/refactor/test_python_class_rename_handler.py +0 -0
  48. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/tests/unit/refactor/test_python_common.py +0 -0
  49. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/tests/unit/refactor/test_python_constant_rename_handler.py +0 -0
  50. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/tests/unit/refactor/test_python_function_rename_handler.py +0 -0
  51. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/tests/unit/refactor/test_python_module_rename_handler.py +0 -0
  52. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/tests/unit/refactor/test_python_package_rename_handler.py +0 -0
  53. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/tests/unit/refactor/test_rename_plan.py +0 -0
  54. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/tests/unit/refactor/test_symbol_kind.py +0 -0
  55. {wexample_wex_addon_dev_python-15.2.1/tests/helper → wexample_wex_addon_dev_python-15.3.1/tests/unit/resources}/__init__.py +0 -0
  56. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/tests/unit/resources/test_shipped_agents.py +0 -0
  57. {wexample_wex_addon_dev_python-15.2.1/tests/integration → wexample_wex_addon_dev_python-15.3.1/tests/unit/workdir}/__init__.py +0 -0
  58. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/tests/unit/workdir/test_python_package_workdir.py +0 -0
  59. wexample_wex_addon_dev_python-15.2.1/PKG-INFO +0 -315
  60. wexample_wex_addon_dev_python-15.2.1/README.md +0 -287
  61. wexample_wex_addon_dev_python-15.2.1/tests/integration/refactor/__init__.py +0 -0
  62. wexample_wex_addon_dev_python-15.2.1/tests/unit/__init__.py +0 -0
  63. wexample_wex_addon_dev_python-15.2.1/tests/unit/helper/__init__.py +0 -0
  64. wexample_wex_addon_dev_python-15.2.1/tests/unit/refactor/__init__.py +0 -0
  65. wexample_wex_addon_dev_python-15.2.1/tests/unit/resources/__init__.py +0 -0
  66. wexample_wex_addon_dev_python-15.2.1/tests/unit/workdir/__init__.py +0 -0
  67. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/__init__.py +0 -0
  68. {wexample_wex_addon_dev_python-15.2.1/src/wexample_wex_addon_dev_python/__pycache__ → wexample_wex_addon_dev_python-15.3.1/src/wexample_wex_addon_dev_python/commands}/__init__.py +0 -0
  69. {wexample_wex_addon_dev_python-15.2.1/src/wexample_wex_addon_dev_python/commands → wexample_wex_addon_dev_python-15.3.1/src/wexample_wex_addon_dev_python/commands/code}/__init__.py +0 -0
  70. {wexample_wex_addon_dev_python-15.2.1/src/wexample_wex_addon_dev_python/commands/code → wexample_wex_addon_dev_python-15.3.1/src/wexample_wex_addon_dev_python/commands/code/check}/__init__.py +0 -0
  71. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/commands/code/check/mypy.py +0 -0
  72. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/commands/code/check/pylint.py +0 -0
  73. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/commands/code/check/pyright.py +0 -0
  74. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/commands/code/check.py +0 -0
  75. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/commands/code/format/__init__.py +0 -0
  76. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/commands/code/format/black.py +0 -0
  77. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/commands/code/format/isort.py +0 -0
  78. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/commands/code/format.py +0 -0
  79. {wexample_wex_addon_dev_python-15.2.1/src/wexample_wex_addon_dev_python/commands/code/check → wexample_wex_addon_dev_python-15.3.1/src/wexample_wex_addon_dev_python/commands/examples}/__init__.py +0 -0
  80. {wexample_wex_addon_dev_python-15.2.1/src/wexample_wex_addon_dev_python/commands/examples → wexample_wex_addon_dev_python-15.3.1/src/wexample_wex_addon_dev_python/commands/examples/utils}/__init__.py +0 -0
  81. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/commands/examples/utils/some_example_type.py +0 -0
  82. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/commands/examples/validate.py +0 -0
  83. {wexample_wex_addon_dev_python-15.2.1/src/wexample_wex_addon_dev_python/commands/examples/utils → wexample_wex_addon_dev_python-15.3.1/src/wexample_wex_addon_dev_python/commands/release}/__init__.py +0 -0
  84. {wexample_wex_addon_dev_python-15.2.1/src/wexample_wex_addon_dev_python/commands/release → wexample_wex_addon_dev_python-15.3.1/src/wexample_wex_addon_dev_python/common}/__init__.py +0 -0
  85. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/config_value/python_package_readme_config_value.py +0 -0
  86. {wexample_wex_addon_dev_python-15.2.1/src/wexample_wex_addon_dev_python/config_value → wexample_wex_addon_dev_python-15.3.1/src/wexample_wex_addon_dev_python/const}/__init__.py +0 -0
  87. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/const/package.py +0 -0
  88. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/const/python.py +0 -0
  89. {wexample_wex_addon_dev_python-15.2.1/src/wexample_wex_addon_dev_python/config_value/__pycache__ → wexample_wex_addon_dev_python-15.3.1/src/wexample_wex_addon_dev_python/file}/__init__.py +0 -0
  90. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/file/python_app_iml_file.py +0 -0
  91. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/file/python_pyproject_toml_file.py +0 -0
  92. {wexample_wex_addon_dev_python-15.2.1/src/wexample_wex_addon_dev_python/const → wexample_wex_addon_dev_python-15.3.1/src/wexample_wex_addon_dev_python/formatter}/__init__.py +0 -0
  93. {wexample_wex_addon_dev_python-15.2.1/src/wexample_wex_addon_dev_python/const/__pycache__ → wexample_wex_addon_dev_python-15.3.1/src/wexample_wex_addon_dev_python/helper}/__init__.py +0 -0
  94. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/helper/pdm.py +0 -0
  95. {wexample_wex_addon_dev_python-15.2.1/src/wexample_wex_addon_dev_python/file → wexample_wex_addon_dev_python-15.3.1/src/wexample_wex_addon_dev_python/middleware}/__init__.py +0 -0
  96. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/middleware/each_python_file_middleware.py +0 -0
  97. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/py.typed +0 -0
  98. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/python_addon_manager.py +0 -0
  99. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/resources/.wex.yml +0 -0
  100. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/resources/docker/Dockerfile.python-profiling +0 -0
  101. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/resources/package_publish_gitlab.yml +0 -0
  102. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/resources/readme_templates/tests.md.j2 +0 -0
  103. {wexample_wex_addon_dev_python-15.2.1/src/wexample_wex_addon_dev_python/file/__pycache__ → wexample_wex_addon_dev_python-15.3.1/src/wexample_wex_addon_dev_python/selection}/__init__.py +0 -0
  104. {wexample_wex_addon_dev_python-15.2.1/src/wexample_wex_addon_dev_python/helper → wexample_wex_addon_dev_python-15.3.1/src/wexample_wex_addon_dev_python/services/python}/__init__.py +0 -0
  105. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/services/python/app_service.py +0 -0
  106. {wexample_wex_addon_dev_python-15.2.1/src/wexample_wex_addon_dev_python/middleware → wexample_wex_addon_dev_python-15.3.1/src/wexample_wex_addon_dev_python/services/python/commands}/__init__.py +0 -0
  107. {wexample_wex_addon_dev_python-15.2.1/src/wexample_wex_addon_dev_python/middleware/__pycache__ → wexample_wex_addon_dev_python-15.3.1/src/wexample_wex_addon_dev_python/services/python/commands/service}/__init__.py +0 -0
  108. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/services/python/commands/service/install.py +0 -0
  109. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/services/python/commands/service/setup.py +0 -0
  110. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/services/python/docker/.wex.yml +0 -0
  111. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/services/python/docker/docker-compose.yml +0 -0
  112. {wexample_wex_addon_dev_python-15.2.1/src/wexample_wex_addon_dev_python/services → wexample_wex_addon_dev_python-15.3.1/src/wexample_wex_addon_dev_python/services/python/samples/docker}/__init__.py +0 -0
  113. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/services/python/samples/docker/docker-compose.yml +0 -0
  114. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/services/python/samples/docker/entrypoint.sh +0 -0
  115. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/services/python/samples/docker/images/Dockerfile.base +0 -0
  116. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/services/python/samples/docker/images/Dockerfile.develop +0 -0
  117. {wexample_wex_addon_dev_python-15.2.1/src/wexample_wex_addon_dev_python/services/python → wexample_wex_addon_dev_python-15.3.1/src/wexample_wex_addon_dev_python/services/python/samples/docker/images}/__init__.py +0 -0
  118. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/services/python/service.yml +0 -0
  119. {wexample_wex_addon_dev_python-15.2.1/src/wexample_wex_addon_dev_python/services/python/commands → wexample_wex_addon_dev_python-15.3.1/src/wexample_wex_addon_dev_python/workdir}/__init__.py +0 -0
  120. {wexample_wex_addon_dev_python-15.2.1/src/wexample_wex_addon_dev_python/services/python/commands/service → wexample_wex_addon_dev_python-15.3.1/src/wexample_wex_addon_dev_python/workdir/mixin}/__init__.py +0 -0
  121. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/workdir/mixin/with_profiling_python_workdir_mixin.py +0 -0
  122. {wexample_wex_addon_dev_python-15.2.1 → wexample_wex_addon_dev_python-15.3.1}/src/wexample_wex_addon_dev_python/workdir/python_packages_suite_workdir.py +0 -0
  123. {wexample_wex_addon_dev_python-15.2.1/src/wexample_wex_addon_dev_python/services/python/samples → wexample_wex_addon_dev_python-15.3.1/tests/helper}/__init__.py +0 -0
  124. {wexample_wex_addon_dev_python-15.2.1/src/wexample_wex_addon_dev_python/services/python/samples/docker → wexample_wex_addon_dev_python-15.3.1/tests/integration}/__init__.py +0 -0
  125. {wexample_wex_addon_dev_python-15.2.1/src/wexample_wex_addon_dev_python/services/python/samples/docker/images → wexample_wex_addon_dev_python-15.3.1/tests/integration/refactor}/__init__.py +0 -0
  126. {wexample_wex_addon_dev_python-15.2.1/src/wexample_wex_addon_dev_python/workdir → wexample_wex_addon_dev_python-15.3.1/tests/unit}/__init__.py +0 -0
  127. {wexample_wex_addon_dev_python-15.2.1/src/wexample_wex_addon_dev_python/workdir/__pycache__ → wexample_wex_addon_dev_python-15.3.1/tests/unit/helper}/__init__.py +0 -0
  128. {wexample_wex_addon_dev_python-15.2.1/src/wexample_wex_addon_dev_python/workdir/mixin → wexample_wex_addon_dev_python-15.3.1/tests/unit/refactor}/__init__.py +0 -0
@@ -0,0 +1,121 @@
1
+ Metadata-Version: 2.1
2
+ Name: wexample-wex-addon-dev-python
3
+ Version: 15.3.1
4
+ Summary: Extends wex with commands to format, lint, and rename Python symbols, plus workdir types for Python packages and suites
5
+ Author-Email: weeger <contact@wexample.com>
6
+ License: MIT
7
+ Classifier: Programming Language :: Python :: 3
8
+ Classifier: License :: OSI Approved :: MIT License
9
+ Classifier: Operating System :: OS Independent
10
+ Project-URL: homepage, https://github.com/wexample/python-wex-dev-python
11
+ Requires-Python: >=3.10
12
+ Requires-Dist: attrs>=23.1.0
13
+ Requires-Dist: black
14
+ Requires-Dist: cattrs>=23.1.0
15
+ Requires-Dist: griffe>=2.0.2
16
+ Requires-Dist: isort
17
+ Requires-Dist: networkx
18
+ Requires-Dist: pylint
19
+ Requires-Dist: pyright
20
+ Requires-Dist: wexample-api>=6.8.0
21
+ Requires-Dist: wexample-filestate-python>=9.1.4
22
+ Requires-Dist: wexample-wex-addon-ai>=19.0.2
23
+ Requires-Dist: wexample-wex-addon-app>=34.2.0
24
+ Provides-Extra: dev
25
+ Requires-Dist: pytest; extra == "dev"
26
+ Requires-Dist: pytest-cov; extra == "dev"
27
+ Description-Content-Type: text/markdown
28
+
29
+ # wex_addon_dev_python
30
+
31
+ Version: 15.3.1
32
+
33
+ Extends wex with commands to format, lint, and rename Python symbols, plus workdir types for Python packages and suites
34
+
35
+ ## Table of Contents
36
+
37
+ - [Install](#install)
38
+ - [Tests](#tests)
39
+ - [Roadmap](#roadmap)
40
+ - [Status Compatibility](#status-compatibility)
41
+ - [Useful Links](#useful-links)
42
+
43
+ ## Installation
44
+
45
+ ```bash
46
+ pip install wexample-wex-addon-dev-python
47
+ ```
48
+
49
+ Requires Python >=3.10.
50
+
51
+ ## Tests
52
+
53
+ This project uses `pytest` for testing and `pytest-cov` for code coverage analysis.
54
+
55
+ ### Installation
56
+
57
+ First, install the required testing dependencies:
58
+ ```bash
59
+ .venv/bin/python -m pip install pytest pytest-cov
60
+ ```
61
+
62
+ ### Basic Usage
63
+
64
+ Run all tests with coverage:
65
+ ```bash
66
+ .venv/bin/python -m pytest --cov --cov-report=html
67
+ ```
68
+
69
+ ### Common Commands
70
+ ```bash
71
+ # Run tests with coverage for a specific module
72
+ .venv/bin/python -m pytest --cov=your_module
73
+
74
+ # Show which lines are not covered
75
+ .venv/bin/python -m pytest --cov=your_module --cov-report=term-missing
76
+
77
+ # Generate an HTML coverage report
78
+ .venv/bin/python -m pytest --cov=your_module --cov-report=html
79
+
80
+ # Combine terminal and HTML reports
81
+ .venv/bin/python -m pytest --cov=your_module --cov-report=term-missing --cov-report=html
82
+
83
+ # Run specific test file with coverage
84
+ .venv/bin/python -m pytest tests/test_file.py --cov=your_module --cov-report=term-missing
85
+ ```
86
+
87
+ ### Viewing HTML Reports
88
+
89
+ After generating an HTML report, open `htmlcov/index.html` in your browser to view detailed line-by-line coverage information.
90
+
91
+ ### Coverage Threshold
92
+
93
+ To enforce a minimum coverage percentage:
94
+ ```bash
95
+ .venv/bin/python -m pytest --cov=your_module --cov-fail-under=80
96
+ ```
97
+
98
+ This will cause the test suite to fail if coverage drops below 80%.
99
+
100
+ ## Known Limitations & Roadmap
101
+
102
+ Current limitations and planned features are tracked in the GitHub issues.
103
+
104
+ See the [project roadmap](https://github.com/wexample/python-wex_addon_dev_python/issues) for upcoming features and improvements.
105
+
106
+ ## Status & Compatibility
107
+
108
+ **Maturity**: Production-ready
109
+
110
+ **Python Support**: >=3.10
111
+
112
+ **OS Support**: Linux, macOS, Windows
113
+
114
+ **Status**: Actively maintained
115
+
116
+ ## Useful Links
117
+
118
+ - **Homepage**: https://github.com/wexample/python-wex-addon-dev-python
119
+ - **Issue Tracker**: https://github.com/wexample/python-wex-addon-dev-python/issues
120
+ - **Discussions**: https://github.com/wexample/python-wex-addon-dev-python/discussions
121
+ - **PyPI**: [pypi.org/project/wexample-wex-addon-dev-python](https://pypi.org/project/wexample-wex-addon-dev-python/)
@@ -0,0 +1,93 @@
1
+ # wex_addon_dev_python
2
+
3
+ Version: 15.3.1
4
+
5
+ Extends wex with commands to format, lint, and rename Python symbols, plus workdir types for Python packages and suites
6
+
7
+ ## Table of Contents
8
+
9
+ - [Install](#install)
10
+ - [Tests](#tests)
11
+ - [Roadmap](#roadmap)
12
+ - [Status Compatibility](#status-compatibility)
13
+ - [Useful Links](#useful-links)
14
+
15
+ ## Installation
16
+
17
+ ```bash
18
+ pip install wexample-wex-addon-dev-python
19
+ ```
20
+
21
+ Requires Python >=3.10.
22
+
23
+ ## Tests
24
+
25
+ This project uses `pytest` for testing and `pytest-cov` for code coverage analysis.
26
+
27
+ ### Installation
28
+
29
+ First, install the required testing dependencies:
30
+ ```bash
31
+ .venv/bin/python -m pip install pytest pytest-cov
32
+ ```
33
+
34
+ ### Basic Usage
35
+
36
+ Run all tests with coverage:
37
+ ```bash
38
+ .venv/bin/python -m pytest --cov --cov-report=html
39
+ ```
40
+
41
+ ### Common Commands
42
+ ```bash
43
+ # Run tests with coverage for a specific module
44
+ .venv/bin/python -m pytest --cov=your_module
45
+
46
+ # Show which lines are not covered
47
+ .venv/bin/python -m pytest --cov=your_module --cov-report=term-missing
48
+
49
+ # Generate an HTML coverage report
50
+ .venv/bin/python -m pytest --cov=your_module --cov-report=html
51
+
52
+ # Combine terminal and HTML reports
53
+ .venv/bin/python -m pytest --cov=your_module --cov-report=term-missing --cov-report=html
54
+
55
+ # Run specific test file with coverage
56
+ .venv/bin/python -m pytest tests/test_file.py --cov=your_module --cov-report=term-missing
57
+ ```
58
+
59
+ ### Viewing HTML Reports
60
+
61
+ After generating an HTML report, open `htmlcov/index.html` in your browser to view detailed line-by-line coverage information.
62
+
63
+ ### Coverage Threshold
64
+
65
+ To enforce a minimum coverage percentage:
66
+ ```bash
67
+ .venv/bin/python -m pytest --cov=your_module --cov-fail-under=80
68
+ ```
69
+
70
+ This will cause the test suite to fail if coverage drops below 80%.
71
+
72
+ ## Known Limitations & Roadmap
73
+
74
+ Current limitations and planned features are tracked in the GitHub issues.
75
+
76
+ See the [project roadmap](https://github.com/wexample/python-wex_addon_dev_python/issues) for upcoming features and improvements.
77
+
78
+ ## Status & Compatibility
79
+
80
+ **Maturity**: Production-ready
81
+
82
+ **Python Support**: >=3.10
83
+
84
+ **OS Support**: Linux, macOS, Windows
85
+
86
+ **Status**: Actively maintained
87
+
88
+ ## Useful Links
89
+
90
+ - **Homepage**: https://github.com/wexample/python-wex-addon-dev-python
91
+ - **Issue Tracker**: https://github.com/wexample/python-wex-addon-dev-python/issues
92
+ - **Discussions**: https://github.com/wexample/python-wex-addon-dev-python/discussions
93
+ - **PyPI**: [pypi.org/project/wexample-wex-addon-dev-python](https://pypi.org/project/wexample-wex-addon-dev-python/)
@@ -6,7 +6,7 @@ build-backend = "pdm.backend"
6
6
 
7
7
  [project]
8
8
  name = "wexample-wex-addon-dev-python"
9
- version = "15.2.1"
9
+ version = "15.3.1"
10
10
  description = "Extends wex with commands to format, lint, and rename Python symbols, plus workdir types for Python packages and suites"
11
11
  authors = [
12
12
  { name = "weeger", email = "contact@wexample.com" },
@@ -27,9 +27,9 @@ dependencies = [
27
27
  "pylint",
28
28
  "pyright",
29
29
  "wexample-api>=6.8.0",
30
- "wexample-filestate-python>=9.1.0",
31
- "wexample-wex-addon-ai>=19.0.0",
32
- "wexample-wex-addon-app>=34.0.0",
30
+ "wexample-filestate-python>=9.1.4",
31
+ "wexample-wex-addon-ai>=19.0.2",
32
+ "wexample-wex-addon-app>=34.2.0",
33
33
  ]
34
34
 
35
35
  [project.readme]
@@ -39,12 +39,22 @@ class PypiRegistryGateway(AbstractGateway):
39
39
  def has_version(self, package: str, version: str) -> bool:
40
40
  """Return True iff `package==version` is published on this index.
41
41
 
42
- Uses the PEP 503 Simple index and matches the version string against
43
- the HTML body. Returns False on 404 (unknown package, or version not
44
- yet propagated through the registry's CDN).
42
+ Uses the Simple index and matches the version string against its
43
+ body. Returns False on 404 (unknown package, or version not yet
44
+ propagated through the registry's CDN).
45
+
46
+ Asked for exactly as pip asks for it: PyPI's CDN caches each
47
+ representation of the page apart, and they do not refresh together.
48
+ The gzipped HTML one stayed without a release for over ten minutes
49
+ after pip's JSON one listed it, so a check reading the former waited
50
+ on a version pip could already install.
45
51
  """
46
52
  response = self.make_request(
47
53
  endpoint=f"simple/{package}/",
54
+ headers={
55
+ "Accept": "application/vnd.pypi.simple.v1+json, "
56
+ "application/vnd.pypi.simple.v1+html; q=0.1, text/html; q=0.01",
57
+ },
48
58
  expected_status_codes=_HAS_VERSION_STATUS_CODES,
49
59
  fatal_if_unexpected=False,
50
60
  quiet=True,
@@ -0,0 +1,4 @@
1
+ include:
2
+ - remote: 'https://gitlab.wexample.com/wexample-public/ci-cd/-/raw/main/.gitlab-ci.type.python.package.yml'
3
+ variables:
4
+ MAIN_BRANCH_NAME: main
@@ -58,6 +58,18 @@ class PythonPackageWorkdir(PythonWorkdir):
58
58
  "Install: pipx install pdm — then run: wex core::env/configure"
59
59
  )
60
60
 
61
+ def get_gitlab_registry_url(self) -> str | None:
62
+ """The GitLab PyPI registry of the group, when the suite publishes there.
63
+
64
+ `python.gitlab_registry.url`, the group's endpoint without `/simple`:
65
+ `https://gitlab.example.com/api/v4/groups/<group>/-/packages/pypi`.
66
+ Installs read its `/simple` index; each package uploads to its own
67
+ project's registry, which the group one gathers.
68
+ """
69
+ return self.search_app_or_suite_runtime_config(
70
+ "python.gitlab_registry.url", default=None
71
+ ).get_str_or_none()
72
+
61
73
  def get_required_knowledge_pages(self) -> dict[str, str]:
62
74
  return {
63
75
  **super().get_required_knowledge_pages(),
@@ -77,22 +89,28 @@ class PythonPackageWorkdir(PythonWorkdir):
77
89
  raw_value = super().prepare_value(raw_value=raw_value)
78
90
  children = raw_value.get("children")
79
91
 
80
- # Add .gitlab-ci.yml for private GitLab registry packages.
81
- # Both callbacks are evaluated after configure() completes, so base_name
82
- # and runtime config are fully available at that point.
92
+ # Every package is tested by GitLab at each push, the way a consumer
93
+ # installs it: the file only includes the job, which lives in the ci-cd
94
+ # repository. A package published to the private GitLab registry gets
95
+ # the job publishing it on a tag instead, and no tests: the base
96
+ # template's workflow runs no tag pipeline. Created when absent, never
97
+ # rewritten. The callback is evaluated after configure() completes, so
98
+ # the runtime config is available at that point.
83
99
  children.append(
84
100
  {
85
101
  "name": ".gitlab-ci.yml",
86
102
  "type": DiskItemType.FILE,
87
- "should_exist": lambda _target, _self=self: bool(
88
- _self.search_app_or_suite_runtime_config(
89
- "pdm.repository.url", default=None
90
- ).get_str_or_none()
91
- ),
92
- "default_content": lambda _: file_read(
103
+ "should_exist": True,
104
+ "default_content": lambda _, _self=self: file_read(
93
105
  module_get_path(wexample_wex_addon_dev_python)
94
106
  / "resources"
95
- / "package_publish_gitlab.yml"
107
+ / (
108
+ "package_publish_gitlab.yml"
109
+ if _self.search_app_or_suite_runtime_config(
110
+ "pdm.repository.url", default=None
111
+ ).get_str_or_none()
112
+ else "package_gitlab_ci.yml"
113
+ )
96
114
  ),
97
115
  }
98
116
  )
@@ -414,8 +432,9 @@ class PythonPackageWorkdir(PythonWorkdir):
414
432
  self.push_to_deployment_remote(branch_name=GIT_BRANCH_MAIN)
415
433
 
416
434
  def _publish(self, force: bool = False) -> None:
417
- from wexample_filestate_python.common.pipy_gateway import PipyGateway
418
- from wexample_helpers.helper.shell import shell_run
435
+ from wexample_helpers.exception.shell_command_failed_exception import (
436
+ ShellCommandFailedException,
437
+ )
419
438
  from wexample_helpers_git.helper.git import (
420
439
  git_push_tag,
421
440
  git_tag_annotated,
@@ -443,10 +462,75 @@ class PythonPackageWorkdir(PythonWorkdir):
443
462
  git_push_tag(tag, cwd=cwd, remote=remote, inherit_stdio=True)
444
463
  return
445
464
 
446
- # TODO: align public PyPI packages with the private registry approach — publish
447
- # via a GitLab CI pipeline triggered by a git tag rather than running
448
- # `pdm publish` locally.
449
- # PyPI public: publish locally
465
+ # Our own registry first, where the release counts: what installs read
466
+ # (wex, the apps) and what the publication waits for. PyPI then only
467
+ # mirrors it, and a refusal there no longer stops the suite.
468
+ if self.get_gitlab_registry_url():
469
+ self._publish_to_gitlab_registry(force=force)
470
+ try:
471
+ self._publish_to_pypi(force=force)
472
+ except ShellCommandFailedException as exception:
473
+ self.warning(
474
+ f"PyPI refused {package_name} {version}, published on the GitLab "
475
+ f"registry all the same: {exception}"
476
+ )
477
+ return
478
+
479
+ self._publish_to_pypi(force=force)
480
+
481
+ def _publish_to_gitlab_registry(self, force: bool = False) -> None:
482
+ import re
483
+ from urllib.parse import quote
484
+
485
+ from wexample_helpers.helper.shell import shell_run
486
+ from wexample_helpers_git.helper.git import git_get_remote_url
487
+
488
+ from wexample_wex_addon_dev_python.common.pypi_registry_gateway import (
489
+ PypiRegistryGateway,
490
+ )
491
+
492
+ package_name = self.get_package_name()
493
+ version = self.get_setup_version()
494
+ registry_url = self.get_gitlab_registry_url()
495
+
496
+ index = PypiRegistryGateway(base_url=registry_url, io=self.io, timeout=10)
497
+ if index.has_version(package_name, version) and not force:
498
+ self.log(f"{package_name} {version} is already on the GitLab registry.")
499
+ return
500
+
501
+ # The project is the package's origin: ssh://git@host:port/<group>/<name>.git
502
+ project_path = re.sub(
503
+ r"^(ssh://[^/]+/|git@[^:]+:|https?://[^/]+/)",
504
+ "",
505
+ git_get_remote_url(cwd=self.get_path()),
506
+ ).removesuffix(".git")
507
+ project = quote(project_path, safe="")
508
+ api_url = registry_url.split("/groups/", 1)[0]
509
+
510
+ self.subtitle("Publishing to the GitLab registry")
511
+ shell_run(
512
+ [
513
+ "pdm",
514
+ "publish",
515
+ "--repository",
516
+ f"{api_url}/projects/{project}/packages/pypi",
517
+ # GitLab authenticates the token alone; the name is required, not read.
518
+ "--username",
519
+ "__token__",
520
+ "--password",
521
+ self.get_env_parameter_or_suite_fallback("GITLAB_API_TOKEN"),
522
+ ],
523
+ inherit_stdio=True,
524
+ cwd=self.get_path(),
525
+ )
526
+
527
+ def _publish_to_pypi(self, force: bool = False) -> None:
528
+ from wexample_filestate_python.common.pipy_gateway import PipyGateway
529
+ from wexample_helpers.helper.shell import shell_run
530
+
531
+ package_name = self.get_package_name()
532
+ version = self.get_setup_version()
533
+
450
534
  client = PipyGateway(parent_io_handler=self)
451
535
  if client.package_release_exists(package_name=package_name, version=version):
452
536
  self.warning(
@@ -487,8 +571,12 @@ class PythonPackageWorkdir(PythonWorkdir):
487
571
  PypiRegistryGateway,
488
572
  )
489
573
 
574
+ # The GitLab registry, when the suite publishes there, is what installs
575
+ # read: it serves a version as soon as it is uploaded, where PyPI's CDN
576
+ # can lag for many minutes.
490
577
  repository_url = (
491
- self.search_app_or_suite_runtime_config(
578
+ self.get_gitlab_registry_url()
579
+ or self.search_app_or_suite_runtime_config(
492
580
  "pdm.repository.url", default=None
493
581
  ).get_str_or_none()
494
582
  or "https://pypi.org"
@@ -476,6 +476,23 @@ class PythonWorkdir(
476
476
 
477
477
  pyproject_path = self.get_path() / "pyproject.toml"
478
478
 
479
+ # The suite's GitLab registry beside PyPI: the wexample packages are
480
+ # there first. Written into requirements.txt, so `pip install -r` reads
481
+ # it too. Best match across both, as pip does: a package published
482
+ # before the registry existed is only on PyPI.
483
+ index_arguments: list[str] = []
484
+ registry_url = self.search_app_or_suite_runtime_config(
485
+ "python.gitlab_registry.url", default=None
486
+ ).get_str_or_none()
487
+ if registry_url:
488
+ index_arguments = [
489
+ "--extra-index-url",
490
+ f"{registry_url}/simple",
491
+ "--index-strategy",
492
+ "unsafe-best-match",
493
+ "--emit-index-url",
494
+ ]
495
+
479
496
  def _run_uv_compile() -> None:
480
497
  result = subprocess.run(
481
498
  [
@@ -494,6 +511,7 @@ class PythonWorkdir(
494
511
  # long as they satisfy constraints — causing stale
495
512
  # transitives even after their direct dependents bumped.
496
513
  "--upgrade",
514
+ *index_arguments,
497
515
  ],
498
516
  capture_output=True,
499
517
  text=True,