wexample-wex-addon-dev-python 0.0.63__py3-none-any.whl → 0.0.64__py3-none-any.whl

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.
@@ -2,6 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  from typing import TYPE_CHECKING
4
4
 
5
+ from wexample_wex_core.const.globals import COMMAND_TYPE_ADDON
5
6
  from wexample_wex_core.const.middleware import (
6
7
  MIDDLEWARE_OPTION_VALUE_ALLWAYS,
7
8
  MIDDLEWARE_OPTION_VALUE_OPTIONAL,
@@ -32,8 +33,9 @@ if TYPE_CHECKING:
32
33
  show_progress=MIDDLEWARE_OPTION_VALUE_ALLWAYS,
33
34
  )
34
35
  @command(
36
+ type=COMMAND_TYPE_ADDON,
35
37
  description="Check python code on every file: "
36
- "bash cli/wex python::code/check --file ../../pip/wex-core/wexample_wex_core/ -sof"
38
+ "python::code/check --file ../../pip/wex-core/wexample_wex_core/ -sof",
37
39
  )
38
40
  def python__code__check(
39
41
  context: ExecutionContext,
@@ -2,6 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  from typing import TYPE_CHECKING
4
4
 
5
+ from wexample_wex_core.const.globals import COMMAND_TYPE_ADDON
5
6
  from wexample_wex_core.decorator.command import command
6
7
  from wexample_wex_core.decorator.middleware import middleware
7
8
  from wexample_wex_core.decorator.option import option
@@ -26,7 +27,7 @@ if TYPE_CHECKING:
26
27
  @middleware(
27
28
  name="each_python_file", should_exist=True, expand_glob=True, recursive=True
28
29
  )
29
- @command()
30
+ @command(type=COMMAND_TYPE_ADDON)
30
31
  def python__code__format(
31
32
  kernel: Kernel,
32
33
  file: str,
@@ -2,13 +2,14 @@ from __future__ import annotations
2
2
 
3
3
  from typing import TYPE_CHECKING
4
4
 
5
+ from wexample_wex_core.const.globals import COMMAND_TYPE_ADDON
5
6
  from wexample_wex_core.decorator.command import command
6
7
 
7
8
  if TYPE_CHECKING:
8
9
  from wexample_wex_core.context.execution_context import ExecutionContext
9
10
 
10
11
 
11
- @command(description="Check python code on every file.")
12
+ @command(type=COMMAND_TYPE_ADDON, description="Check python code on every file.")
12
13
  def python__examples__validate(
13
14
  context: ExecutionContext,
14
15
  ) -> None:
@@ -5,18 +5,20 @@ from typing import TYPE_CHECKING
5
5
  from wexample_filestate.item.file.toml_file import TomlFile
6
6
  from wexample_helpers.decorator.base_class import base_class
7
7
  from wexample_wex_addon_app.const.path import APP_PATH_README
8
+ from wexample_wex_addon_app.item.file.mixin.app_dependencies_config_file_mixin import (
9
+ AppDependenciesConfigFileMixin,
10
+ )
8
11
 
9
12
  if TYPE_CHECKING:
13
+ from packaging.requirements import Requirement
10
14
  from tomlkit import TOMLDocument
11
15
 
12
16
 
13
17
  @base_class
14
- class PythonPyprojectTomlFile(TomlFile):
15
- def add_dependency(
18
+ class PythonPyprojectTomlFile(AppDependenciesConfigFileMixin, TomlFile):
19
+ def add_dependency_from_spec(
16
20
  self,
17
- package_name: str,
18
- version: str,
19
- operator: str = "==",
21
+ spec: Requirement,
20
22
  optional: bool = False,
21
23
  group: None | str = None,
22
24
  ) -> bool:
@@ -24,13 +26,11 @@ class PythonPyprojectTomlFile(TomlFile):
24
26
  from packaging.utils import canonicalize_name
25
27
  from wexample_filestate_python.helpers.toml import toml_sort_string_array
26
28
 
27
- spec = f"{package_name}{operator}{version}"
28
- new_req = Requirement(spec)
29
- new_name = canonicalize_name(new_req.name)
29
+ new_name = canonicalize_name(spec.name)
30
30
 
31
31
  deps = self._get_deps_array(optional=optional, group=group)
32
32
 
33
- # Look for existing dependency
33
+ # Look for existing dependency (string-based)
34
34
  old_spec = next(
35
35
  (d for d in deps if canonicalize_name(Requirement(d).name) == new_name),
36
36
  None,
@@ -40,8 +40,11 @@ class PythonPyprojectTomlFile(TomlFile):
40
40
  if old_spec:
41
41
  deps.remove(old_spec)
42
42
 
43
+ # Convert Requirement → string
44
+ new_spec_str = str(spec)
45
+
43
46
  # Add new version
44
- deps.append(spec)
47
+ deps.append(new_spec_str)
45
48
 
46
49
  # Sort array
47
50
  toml_sort_string_array(deps)
@@ -49,7 +52,23 @@ class PythonPyprojectTomlFile(TomlFile):
49
52
  # Save file
50
53
  self.write_parsed()
51
54
 
52
- return old_spec != spec
55
+ return old_spec != new_spec_str
56
+
57
+ def add_dependency_from_string(
58
+ self,
59
+ package_name: str,
60
+ version: str,
61
+ operator: str = "==",
62
+ optional: bool = False,
63
+ group: None | str = None,
64
+ ) -> bool:
65
+ from packaging.requirements import Requirement
66
+
67
+ return self.add_dependency_from_spec(
68
+ spec=Requirement(f"{package_name}{operator}{version}"),
69
+ optional=optional,
70
+ group=group,
71
+ )
53
72
 
54
73
  def dumps(self, content: TOMLDocument | dict | None = None) -> str:
55
74
  """Serialize a TOMLDocument (preferred) or a plain dict to TOML.
@@ -164,7 +164,7 @@ class PythonPackageWorkdir(PythonWorkdir):
164
164
  pkg = suite_workdir.get_package(dep_name)
165
165
  if pkg:
166
166
  # Get dependencies of this suite package and recurse
167
- pkg_dependencies = pkg.list_dependencies_names()
167
+ pkg_dependencies = pkg.get_dependencies_versions().keys()
168
168
  collect_recursive(pkg_dependencies)
169
169
 
170
170
  # Start with direct dependencies from pyproject.toml
@@ -210,7 +210,9 @@ class PythonPackageWorkdir(PythonWorkdir):
210
210
  # Package is part of a suite that may have a venv configured.
211
211
  if suite_workdir:
212
212
  # Get all dependencies from pyproject.toml
213
- pyproject_toml_dependencies = toml_file.list_dependencies_names()
213
+ pyproject_toml_dependencies = (
214
+ toml_file.get_dependencies_versions().keys()
215
+ )
214
216
 
215
217
  # Get all packages from the suite ordered by dependencies (leaf -> trunk)
216
218
  suite_packages = suite_workdir.get_ordered_packages()
@@ -290,24 +292,54 @@ class PythonPackageWorkdir(PythonWorkdir):
290
292
  from wexample_filestate_python.common.pipy_gateway import PipyGateway
291
293
  from wexample_helpers.helpers.shell import shell_run
292
294
 
293
- client = PipyGateway(parent_io_handler=self)
295
+ # Retrieve custom repository configuration
296
+ repository_url = self.search_app_or_suite_runtime_config(
297
+ "pdm.repository.url", default=None
298
+ )
299
+
300
+ repository_token = self.search_app_or_suite_runtime_config(
301
+ "pdm.repository.token", default=None
302
+ )
303
+
304
+ repository_username = self.search_app_or_suite_runtime_config(
305
+ "pdm.repository.username", default="__token__"
306
+ )
294
307
 
295
308
  package_name = self.get_package_name()
296
309
  version = self.get_project_version()
297
- if client.package_release_exists(package_name=package_name, version=version):
298
- self.warning(
299
- f'Trying to publish an existing release for package "{package_name}" version {version}'
300
- )
310
+
311
+ # Only check if package exists on PyPI if no custom repository is configured
312
+ if not repository_url:
313
+ client = PipyGateway(parent_io_handler=self)
314
+ if client.package_release_exists(
315
+ package_name=package_name, version=version
316
+ ):
317
+ self.warning(
318
+ f'Trying to publish an existing release for package "{package_name}" version {version}'
319
+ )
320
+ if not force:
321
+ return
322
+
323
+ # Build the publish command
324
+ publish_cmd = ["pdm", "publish"]
325
+
326
+ # Add custom repository URL if provided
327
+ if repository_url:
328
+ publish_cmd += ["--repository", repository_url]
329
+ self.subtitle(f"Publishing to custom repository: {repository_url}")
301
330
  else:
302
- # Map token to PyPI's token-based authentication if provided
303
- username = "__token__"
304
- password = self.get_env_parameter_or_suite_fallback("PIPY_TOKEN")
305
-
306
- # Build the publish command, adding credentials only when given
307
- publish_cmd = ["pdm", "publish"]
308
- if username is not None:
309
- publish_cmd += ["--username", username]
310
- if password is not None:
311
- publish_cmd += ["--password", password]
312
-
313
- shell_run(publish_cmd, inherit_stdio=True, cwd=self.get_path())
331
+ self.subtitle("Publishing to PyPI")
332
+
333
+ # Add credentials
334
+ # Priority: custom token > env variable fallback
335
+ username = repository_username or "__token__"
336
+ password = repository_token or self.get_env_parameter_or_suite_fallback(
337
+ "PIPY_TOKEN"
338
+ )
339
+
340
+ if username:
341
+ publish_cmd += ["--username", username]
342
+ if password:
343
+ publish_cmd += ["--password", password]
344
+
345
+ shell_run(publish_cmd, inherit_stdio=True, cwd=self.get_path())
@@ -243,10 +243,10 @@ class PythonWorkdir(CodeBaseWorkdir):
243
243
 
244
244
  return raw_value
245
245
 
246
- def save_dependency(self, package_name: str, version: str) -> bool:
246
+ def save_dependency(self, package: CodeBaseWorkdir, version: str) -> bool:
247
247
  """Add or update a dependency with strict version."""
248
248
  config = self.get_app_config_file()
249
- updated = config.add_dependency(package_name=package_name, version=version)
249
+ updated = config.add_dependency(package=package, version=version)
250
250
 
251
251
  if updated:
252
252
  config.write_parsed()
@@ -298,47 +298,6 @@ class PythonWorkdir(CodeBaseWorkdir):
298
298
  if report_path.exists():
299
299
  self.info(f"Report: @path{{{report_path}}}")
300
300
 
301
- def update_dependencies(self, dependencies_map: dict[str, str]) -> None:
302
- """Update dependencies versions based on the provided map.
303
-
304
- Args:
305
- dependencies_map: Dictionary mapping package names to their new versions.
306
- Example: {"wexample-helpers": "0.2.3", "attrs": "23.1.0"}
307
- """
308
- from packaging.requirements import Requirement
309
- from packaging.utils import canonicalize_name
310
-
311
- config_file = self.get_app_config_file()
312
-
313
- # Canonicalize the keys in dependencies_map for consistent matching
314
- canonical_map = {
315
- canonicalize_name(name): version
316
- for name, version in dependencies_map.items()
317
- }
318
-
319
- # Get current dependencies
320
- current_deps = config_file.list_dependencies_names()
321
-
322
- # Update each dependency if it's in the map
323
- for dep_spec in current_deps:
324
- try:
325
- req = Requirement(dep_spec)
326
- canonical_name = canonicalize_name(req.name)
327
-
328
- # If this dependency is in our update map, update it
329
- if canonical_name in canonical_map:
330
- new_version = canonical_map[canonical_name]
331
- # Use add_dependency which handles removal of old version
332
- config_file.add_dependency(
333
- package_name=req.name, version=new_version
334
- )
335
- except Exception:
336
- # Skip unparsable dependencies
337
- continue
338
-
339
- # Save the updated config
340
- config_file.write_parsed()
341
-
342
301
  def _create_init_children_factory(self) -> ChildrenFileFactoryOption:
343
302
  from wexample_filestate.const.disk import DiskItemType
344
303
  from wexample_filestate.const.globals import NAME_PATTERN_NO_LEADING_DOT
@@ -517,7 +476,7 @@ class PythonWorkdir(CodeBaseWorkdir):
517
476
  toml_file = self.get_app_config_file()
518
477
  # Get all dependencies from pyproject.toml
519
478
  python_install_dependencies_in_venv(
520
- venv_path=venv_path, names=toml_file.list_dependencies_names()
479
+ venv_path=venv_path, names=toml_file.get_dependencies_versions().keys()
521
480
  )
522
481
 
523
482
  def _on_test_event(self, event: Event) -> None:
@@ -0,0 +1,110 @@
1
+ Metadata-Version: 2.1
2
+ Name: wexample-wex-addon-dev-python
3
+ Version: 0.0.64
4
+ Summary: Python dev addon for wex
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: cattrs>=23.1.0
14
+ Requires-Dist: networkx
15
+ Requires-Dist: pylint
16
+ Requires-Dist: pyright
17
+ Requires-Dist: wexample-filestate-python==0.0.59
18
+ Requires-Dist: wexample-wex-addon-app==0.0.56
19
+ Provides-Extra: dev
20
+ Requires-Dist: pytest; extra == "dev"
21
+ Requires-Dist: pytest-cov; extra == "dev"
22
+ Description-Content-Type: text/markdown
23
+
24
+ # wexample-wex-addon-dev-python
25
+
26
+ Version: 0.0.64
27
+
28
+ Python dev addon for wex
29
+
30
+ ## Table of Contents
31
+
32
+ - [Status Compatibility](#status-compatibility)
33
+ - [Tests](#tests)
34
+ - [Roadmap](#roadmap)
35
+ - [Useful Links](#useful-links)
36
+
37
+
38
+ ## Status & Compatibility
39
+
40
+ **Maturity**: Production-ready
41
+
42
+ **Python Support**: >=3.10
43
+
44
+ **OS Support**: Linux, macOS, Windows
45
+
46
+ **Status**: Actively maintained
47
+
48
+ ## Tests
49
+
50
+ This project uses `pytest` for testing and `pytest-cov` for code coverage analysis.
51
+
52
+ ### Installation
53
+
54
+ First, install the required testing dependencies:
55
+ ```bash
56
+ .venv/bin/python -m pip install pytest pytest-cov
57
+ ```
58
+
59
+ ### Basic Usage
60
+
61
+ Run all tests with coverage:
62
+ ```bash
63
+ .venv/bin/python -m pytest --cov --cov-report=html
64
+ ```
65
+
66
+ ### Common Commands
67
+ ```bash
68
+ # Run tests with coverage for a specific module
69
+ .venv/bin/python -m pytest --cov=your_module
70
+
71
+ # Show which lines are not covered
72
+ .venv/bin/python -m pytest --cov=your_module --cov-report=term-missing
73
+
74
+ # Generate an HTML coverage report
75
+ .venv/bin/python -m pytest --cov=your_module --cov-report=html
76
+
77
+ # Combine terminal and HTML reports
78
+ .venv/bin/python -m pytest --cov=your_module --cov-report=term-missing --cov-report=html
79
+
80
+ # Run specific test file with coverage
81
+ .venv/bin/python -m pytest tests/test_file.py --cov=your_module --cov-report=term-missing
82
+ ```
83
+
84
+ ### Viewing HTML Reports
85
+
86
+ After generating an HTML report, open `htmlcov/index.html` in your browser to view detailed line-by-line coverage information.
87
+
88
+ ### Coverage Threshold
89
+
90
+ To enforce a minimum coverage percentage:
91
+ ```bash
92
+ .venv/bin/python -m pytest --cov=your_module --cov-fail-under=80
93
+ ```
94
+
95
+ This will cause the test suite to fail if coverage drops below 80%.
96
+
97
+ ## Known Limitations & Roadmap
98
+
99
+ Current limitations and planned features are tracked in the GitHub issues.
100
+
101
+ See the [project roadmap](https://github.com/wexample/python-wex_addon_dev_python/issues) for upcoming features and improvements.
102
+
103
+ ## Useful Links
104
+
105
+ - **Homepage**: https://github.com/wexample/python-wex-addon-dev-python
106
+ - **Documentation**: [docs.wexample.com](https://docs.wexample.com)
107
+ - **Issue Tracker**: https://github.com/wexample/python-wex-addon-dev-python/issues
108
+ - **Discussions**: https://github.com/wexample/python-wex-addon-dev-python/discussions
109
+ - **PyPI**: [pypi.org/project/wexample-wex-addon-dev-python](https://pypi.org/project/wexample-wex-addon-dev-python/)
110
+
@@ -1,23 +1,23 @@
1
- wexample_wex_addon_dev_python-0.0.63.dist-info/METADATA,sha256=PLQFvaRQQdEWjXJqFeaka-gjx7ip9AJwkVG1yVnEqJM,8124
2
- wexample_wex_addon_dev_python-0.0.63.dist-info/WHEEL,sha256=tsUv_t7BDeJeRHaSrczbGeuK-TtDpGsWi_JfpzD255I,90
3
- wexample_wex_addon_dev_python-0.0.63.dist-info/entry_points.txt,sha256=6OYgBcLyFCUgeqLgnvMyOJxPCWzgy7se4rLPKtNonMs,34
1
+ wexample_wex_addon_dev_python-0.0.64.dist-info/METADATA,sha256=dy01AAsK4CFE28-yfpF9e4bps_j6NfoJLhTDLUZxv54,3128
2
+ wexample_wex_addon_dev_python-0.0.64.dist-info/WHEEL,sha256=Wb0ASbVj8JvWHpOiIpPi7ucfIgJeCi__PzivviEAQFc,90
3
+ wexample_wex_addon_dev_python-0.0.64.dist-info/entry_points.txt,sha256=6OYgBcLyFCUgeqLgnvMyOJxPCWzgy7se4rLPKtNonMs,34
4
4
  wexample_wex_addon_dev_python/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  wexample_wex_addon_dev_python/__pycache__/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
6
  wexample_wex_addon_dev_python/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
7
  wexample_wex_addon_dev_python/commands/code/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
- wexample_wex_addon_dev_python/commands/code/check.py,sha256=wCL9KM64kCJ76OaxVDus7fjqiEhtLI8jUHFtSLG89u4,3324
8
+ wexample_wex_addon_dev_python/commands/code/check.py,sha256=Bm5ON0UA7QmFTfO70QkfkqjzpGJu3fAw3tQjzdxbW7I,3404
9
9
  wexample_wex_addon_dev_python/commands/code/check/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
10
  wexample_wex_addon_dev_python/commands/code/check/mypy.py,sha256=hZ1taOAofaFgqhtbHLXA14-4cFkVcw6QUi9PmpbEKuk,1401
11
11
  wexample_wex_addon_dev_python/commands/code/check/pylint.py,sha256=cSnirIVrMH9-_ETAiIVdjCvHQWcNJzCwwAfvcxNBodM,3328
12
12
  wexample_wex_addon_dev_python/commands/code/check/pyright.py,sha256=jCKZxQ5Ln2Vh1QlhKqz3i0djnQwWbNHzDcttu41jhsI,3619
13
- wexample_wex_addon_dev_python/commands/code/format.py,sha256=7Xep5RCgbt_JNKM9FROipuEFYfXojJjJDRNRKfqTkoM,2444
13
+ wexample_wex_addon_dev_python/commands/code/format.py,sha256=7HnXLl2-b_ZYsuj45wDr1ue9AL7g7gOo12fLkV1dilE,2530
14
14
  wexample_wex_addon_dev_python/commands/code/format/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
15
15
  wexample_wex_addon_dev_python/commands/code/format/black.py,sha256=wo3BEODFD6BUrmnfheESMyLppLPwtvcgkOVfvHWdAZs,1462
16
16
  wexample_wex_addon_dev_python/commands/code/format/isort.py,sha256=pRYYPZWFza6e_HgKYpYplzV5hwJvbM3NNJ_-A3x1yV8,1540
17
17
  wexample_wex_addon_dev_python/commands/examples/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
18
  wexample_wex_addon_dev_python/commands/examples/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
19
  wexample_wex_addon_dev_python/commands/examples/utils/some_example_type.py,sha256=zusGlLOLkt2EpPFk38FIRA6d_5Q92Y7-TLj8ofHhQk0,121
20
- wexample_wex_addon_dev_python/commands/examples/validate.py,sha256=jHiWkEtETkVSYJKuvUJRNqd9Ag81z3sPdUbX6FUpEng,664
20
+ wexample_wex_addon_dev_python/commands/examples/validate.py,sha256=IgUHNpkdc_Z76HGDWmCvztP7B3ars0Cu2Yknq9MGt0o,752
21
21
  wexample_wex_addon_dev_python/commands/release/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
22
  wexample_wex_addon_dev_python/config_value/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
23
  wexample_wex_addon_dev_python/config_value/__pycache__/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -29,7 +29,7 @@ wexample_wex_addon_dev_python/const/python.py,sha256=jxdPt5CnD0dcp4SmobEc_c7XcCk
29
29
  wexample_wex_addon_dev_python/file/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
30
  wexample_wex_addon_dev_python/file/__pycache__/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
31
  wexample_wex_addon_dev_python/file/python_app_iml_file.py,sha256=l6YHEILxSGFjOvYWY20zIyAODjOIfuyHsuCfSMw0jVE,1201
32
- wexample_wex_addon_dev_python/file/python_pyproject_toml_file.py,sha256=GM89r1ZwN88MUMysItqlIrPCN-r-Rc9hvahRMjA2Ny0,15323
32
+ wexample_wex_addon_dev_python/file/python_pyproject_toml_file.py,sha256=31KcRaewYzK1mHYFLSltyZ9WhuEzV98I5vllmmGWGkU,15952
33
33
  wexample_wex_addon_dev_python/middleware/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
34
  wexample_wex_addon_dev_python/middleware/__pycache__/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
35
  wexample_wex_addon_dev_python/middleware/each_python_file_middleware.py,sha256=UzNEpedCYf31aNONFl0SuSJnoXRzhJhgEiTCaPark6E,2311
@@ -40,7 +40,7 @@ wexample_wex_addon_dev_python/resources/readme_templates/__init__.py,sha256=47DE
40
40
  wexample_wex_addon_dev_python/resources/readme_templates/tests.md.j2,sha256=tKLcDwx7jhQkryXIxWr12AK-hKEaP6Rusu2MrluiABs,1289
41
41
  wexample_wex_addon_dev_python/workdir/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
42
42
  wexample_wex_addon_dev_python/workdir/__pycache__/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
- wexample_wex_addon_dev_python/workdir/python_package_workdir.py,sha256=djUfgI1MCn9KOgYCYiwFIpZaGQ28spaiOz6t8gL6FoA,11780
43
+ wexample_wex_addon_dev_python/workdir/python_package_workdir.py,sha256=4jMZRHYGpBg5FqJuYK5j1A9VS7X4spIlDD-MgHKz7b4,12750
44
44
  wexample_wex_addon_dev_python/workdir/python_packages_suite_workdir.py,sha256=ICHHewLpsXiheYzGDEahphBryH98ZVezWzSAy6A5w5I,2874
45
- wexample_wex_addon_dev_python/workdir/python_workdir.py,sha256=ERpSw5qti1NmHiufOix6bS5lW2vIvclr82SKwlWOhKk,19681
46
- wexample_wex_addon_dev_python-0.0.63.dist-info/RECORD,,
45
+ wexample_wex_addon_dev_python/workdir/python_workdir.py,sha256=jChU8h4fj5NmZxdrI2SP5c6erlmf5WTG_FKk_pjL66w,18084
46
+ wexample_wex_addon_dev_python-0.0.64.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: pdm-backend (2.4.6)
2
+ Generator: pdm-backend (2.4.7)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -1,250 +0,0 @@
1
- Metadata-Version: 2.1
2
- Name: wexample-wex-addon-dev-python
3
- Version: 0.0.63
4
- Summary: Python dev addon for wex
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: cattrs>=23.1.0
14
- Requires-Dist: networkx
15
- Requires-Dist: pylint
16
- Requires-Dist: pyright
17
- Requires-Dist: wexample-filestate-python==0.0.58
18
- Requires-Dist: wexample-wex-addon-app==0.0.55
19
- Requires-Dist: wexample-wex-core==6.0.67
20
- Provides-Extra: dev
21
- Requires-Dist: pytest; extra == "dev"
22
- Requires-Dist: pytest-cov; extra == "dev"
23
- Description-Content-Type: text/markdown
24
-
25
- # wexample-wex-addon-dev-python
26
-
27
- Version: 0.0.63
28
-
29
- Python dev addon for wex
30
-
31
- ## Table of Contents
32
-
33
- - [Status Compatibility](#status-compatibility)
34
- - [Api Reference](#api-reference)
35
- - [Tests](#tests)
36
- - [Code Quality](#code-quality)
37
- - [Versioning](#versioning)
38
- - [Changelog](#changelog)
39
- - [Migration Notes](#migration-notes)
40
- - [Roadmap](#roadmap)
41
- - [Security](#security)
42
- - [Privacy](#privacy)
43
- - [Support](#support)
44
- - [Contribution Guidelines](#contribution-guidelines)
45
- - [Maintainers](#maintainers)
46
- - [License](#license)
47
- - [Useful Links](#useful-links)
48
- - [Suite Integration](#suite-integration)
49
- - [Compatibility Matrix](#compatibility-matrix)
50
- - [Dependencies](#dependencies)
51
- - [Suite Signature](#suite-signature)
52
-
53
-
54
- ## Status & Compatibility
55
-
56
- **Maturity**: Production-ready
57
-
58
- **Python Support**: >=3.10
59
-
60
- **OS Support**: Linux, macOS, Windows
61
-
62
- **Status**: Actively maintained
63
-
64
- ## API Reference
65
-
66
- Full API documentation is available in the source code docstrings.
67
-
68
- Key modules and classes are documented with type hints for better IDE support.
69
-
70
- ## Tests
71
-
72
- This project uses `pytest` for testing and `pytest-cov` for code coverage analysis.
73
-
74
- ### Installation
75
-
76
- First, install the required testing dependencies:
77
- ```bash
78
- .venv/bin/python -m pip install pytest pytest-cov
79
- ```
80
-
81
- ### Basic Usage
82
-
83
- Run all tests with coverage:
84
- ```bash
85
- .venv/bin/python -m pytest --cov --cov-report=html
86
- ```
87
-
88
- ### Common Commands
89
- ```bash
90
- # Run tests with coverage for a specific module
91
- .venv/bin/python -m pytest --cov=your_module
92
-
93
- # Show which lines are not covered
94
- .venv/bin/python -m pytest --cov=your_module --cov-report=term-missing
95
-
96
- # Generate an HTML coverage report
97
- .venv/bin/python -m pytest --cov=your_module --cov-report=html
98
-
99
- # Combine terminal and HTML reports
100
- .venv/bin/python -m pytest --cov=your_module --cov-report=term-missing --cov-report=html
101
-
102
- # Run specific test file with coverage
103
- .venv/bin/python -m pytest tests/test_file.py --cov=your_module --cov-report=term-missing
104
- ```
105
-
106
- ### Viewing HTML Reports
107
-
108
- After generating an HTML report, open `htmlcov/index.html` in your browser to view detailed line-by-line coverage information.
109
-
110
- ### Coverage Threshold
111
-
112
- To enforce a minimum coverage percentage:
113
- ```bash
114
- .venv/bin/python -m pytest --cov=your_module --cov-fail-under=80
115
- ```
116
-
117
- This will cause the test suite to fail if coverage drops below 80%.
118
-
119
- ## Code Quality & Typing
120
-
121
- All the suite packages follow strict quality standards:
122
-
123
- - **Type hints**: Full type coverage with mypy validation
124
- - **Code formatting**: Enforced with black and isort
125
- - **Linting**: Comprehensive checks with custom scripts and tools
126
- - **Testing**: High test coverage requirements
127
-
128
- These standards ensure reliability and maintainability across the suite.
129
-
130
- ## Versioning & Compatibility Policy
131
-
132
- Wexample packages follow **Semantic Versioning** (SemVer):
133
-
134
- - **MAJOR**: Breaking changes
135
- - **MINOR**: New features, backward compatible
136
- - **PATCH**: Bug fixes, backward compatible
137
-
138
- We maintain backward compatibility within major versions and provide clear migration guides for breaking changes.
139
-
140
- ## Changelog
141
-
142
- See [CHANGELOG.md](CHANGELOG.md) for detailed version history and release notes.
143
-
144
- Major changes are documented with migration guides when applicable.
145
-
146
- ## Migration Notes
147
-
148
- When upgrading between major versions, refer to the migration guides in the documentation.
149
-
150
- Breaking changes are clearly documented with upgrade paths and examples.
151
-
152
- ## Known Limitations & Roadmap
153
-
154
- Current limitations and planned features are tracked in the GitHub issues.
155
-
156
- See the [project roadmap](https://github.com/wexample/python-wex_addon_dev_python/issues) for upcoming features and improvements.
157
-
158
- ## Security Policy
159
-
160
- ### Reporting Vulnerabilities
161
-
162
- If you discover a security vulnerability, please email contact@wexample.com.
163
-
164
- **Do not** open public issues for security vulnerabilities.
165
-
166
- We take security seriously and will respond promptly to verified reports.
167
-
168
- ## Privacy & Telemetry
169
-
170
- This package does **not** collect any telemetry or usage data.
171
-
172
- Your privacy is respected — no data is transmitted to external services.
173
-
174
- ## Support Channels
175
-
176
- - **GitHub Issues**: Bug reports and feature requests
177
- - **GitHub Discussions**: Questions and community support
178
- - **Documentation**: Comprehensive guides and API reference
179
- - **Email**: contact@wexample.com for general inquiries
180
-
181
- Community support is available through GitHub Discussions.
182
-
183
- ## Contribution Guidelines
184
-
185
- We welcome contributions to the Wexample suite!
186
-
187
- ### How to Contribute
188
-
189
- 1. **Fork** the repository
190
- 2. **Create** a feature branch
191
- 3. **Make** your changes
192
- 4. **Test** thoroughly
193
- 5. **Submit** a pull request
194
-
195
- ## Maintainers & Authors
196
-
197
- Maintained by the Wexample team and community contributors.
198
-
199
- See [CONTRIBUTORS.md](CONTRIBUTORS.md) for the full list of contributors.
200
-
201
- ## License
202
-
203
- This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
204
-
205
- Free to use in both personal and commercial projects.
206
-
207
- ## Useful Links
208
-
209
- - **Homepage**: https://github.com/wexample/python-wex-addon-dev-python
210
- - **Documentation**: [docs.wexample.com](https://docs.wexample.com)
211
- - **Issue Tracker**: https://github.com/wexample/python-wex-addon-dev-python/issues
212
- - **Discussions**: https://github.com/wexample/python-wex-addon-dev-python/discussions
213
- - **PyPI**: [pypi.org/project/wexample-wex-addon-dev-python](https://pypi.org/project/wexample-wex-addon-dev-python/)
214
-
215
- ## Integration in the Suite
216
-
217
- This package is part of the Wexample Suite — a collection of high-quality, modular tools designed to work seamlessly together across multiple languages and environments.
218
-
219
- ### Related Packages
220
-
221
- The suite includes packages for configuration management, file handling, prompts, and more. Each package can be used independently or as part of the integrated suite.
222
-
223
- Visit the [Wexample Suite documentation](https://docs.wexample.com) for the complete package ecosystem.
224
-
225
- ## Compatibility Matrix
226
-
227
- This package is part of the Wexample suite and is compatible with other suite packages.
228
-
229
- Refer to each package's documentation for specific version compatibility requirements.
230
-
231
- ## Dependencies
232
-
233
- - attrs: >=23.1.0
234
- - cattrs: >=23.1.0
235
- - networkx:
236
- - pylint:
237
- - pyright:
238
- - wexample-filestate-python: ==0.0.58
239
- - wexample-wex-addon-app: ==0.0.55
240
- - wexample-wex-core: ==6.0.67
241
-
242
-
243
- # About us
244
-
245
- [Wexample](https://wexample.com) stands as a cornerstone of the digital ecosystem — a collective of seasoned engineers, researchers, and creators driven by a relentless pursuit of technological excellence. More than a media platform, it has grown into a vibrant community where innovation meets craftsmanship, and where every line of code reflects a commitment to clarity, durability, and shared intelligence.
246
-
247
- This packages suite embodies this spirit. Trusted by professionals and enthusiasts alike, it delivers a consistent, high-quality foundation for modern development — open, elegant, and battle-tested. Its reputation is built on years of collaboration, refinement, and rigorous attention to detail, making it a natural choice for those who demand both robustness and beauty in their tools.
248
-
249
- Wexample cultivates a culture of mastery. Each package, each contribution carries the mark of a community that values precision, ethics, and innovation — a community proud to shape the future of digital craftsmanship.
250
-