wexample-filestate-python 6.7.1__tar.gz → 6.8.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 (87) hide show
  1. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/PKG-INFO +4 -4
  2. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/README.md +2 -2
  3. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/pyproject.toml +2 -2
  4. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/utils/python_class_attributes_utils.py +26 -1
  5. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/__init__.py +0 -0
  6. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/__pycache__/__init__.py +0 -0
  7. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/common/__init__.py +0 -0
  8. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/common/__pycache__/__init__.py +0 -0
  9. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/common/pipy_gateway.py +0 -0
  10. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/config_option/__init__.py +0 -0
  11. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/config_option/__pycache__/__init__.py +0 -0
  12. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/config_option/mixin/__init__.py +0 -0
  13. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/config_option/mixin/__pycache__/__init__.py +0 -0
  14. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/config_option/mixin/with_stdout_wrapping_mixin.py +0 -0
  15. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/config_value/__init__.py +0 -0
  16. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/config_value/__pycache__/__init__.py +0 -0
  17. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/config_value/python_config_value.py +0 -0
  18. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/const/__init__.py +0 -0
  19. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/const/__pycache__/__init__.py +0 -0
  20. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/const/name_pattern.py +0 -0
  21. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/const/path.py +0 -0
  22. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/const/python_file.py +0 -0
  23. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/event/__init__.py +0 -0
  24. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/event/src/__init__.py +0 -0
  25. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/event/src/wexample_event/__init__.py +0 -0
  26. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/file/__init__.py +0 -0
  27. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/file/__pycache__/__init__.py +0 -0
  28. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/file/python_file.py +0 -0
  29. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/helpers/__init__.py +0 -0
  30. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/helpers/__pycache__/__init__.py +0 -0
  31. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/helpers/package.py +0 -0
  32. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/helpers/python/__init__.py +0 -0
  33. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/helpers/toml.py +0 -0
  34. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/option/__init__.py +0 -0
  35. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/option/__pycache__/__init__.py +0 -0
  36. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/option/python/__init__.py +0 -0
  37. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/option/python/abstract_python_file_content_option.py +0 -0
  38. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/option/python/add_future_annotations_option.py +0 -0
  39. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/option/python/add_return_types_option.py +0 -0
  40. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/option/python/class_name_matches_file_name_option.py +0 -0
  41. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/option/python/fix_attrs_option.py +0 -0
  42. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/option/python/fix_blank_lines_option.py +0 -0
  43. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/option/python/format_option.py +0 -0
  44. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/option/python/fstringify_option.py +0 -0
  45. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/option/python/modernize_typing_option.py +0 -0
  46. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/option/python/order_class_attributes_option.py +0 -0
  47. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/option/python/order_class_docstring_option.py +0 -0
  48. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/option/python/order_class_methods_option.py +0 -0
  49. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/option/python/order_constants_option.py +0 -0
  50. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/option/python/order_iterable_items_option.py +0 -0
  51. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/option/python/order_main_guard_option.py +0 -0
  52. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/option/python/order_module_docstring_option.py +0 -0
  53. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/option/python/order_module_functions_option.py +0 -0
  54. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/option/python/order_module_metadata_option.py +0 -0
  55. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/option/python/order_type_checking_block_option.py +0 -0
  56. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/option/python/relocate_imports_option.py +0 -0
  57. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/option/python/remove_unused_option.py +0 -0
  58. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/option/python/sort_imports_option.py +0 -0
  59. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/option/python/unquote_annotations_option.py +0 -0
  60. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/option/python_option.py +0 -0
  61. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/options_provider/__init__.py +0 -0
  62. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/options_provider/__pycache__/__init__.py +0 -0
  63. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/options_provider/python_options_provider.py +0 -0
  64. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/py.typed +0 -0
  65. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/utils/__init__.py +0 -0
  66. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/utils/__pycache__/__init__.py +0 -0
  67. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/utils/cst_cache.py +0 -0
  68. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/utils/python_attrs_utils.py +0 -0
  69. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/utils/python_blank_lines_utils.py +0 -0
  70. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/utils/python_class_docstring_utils.py +0 -0
  71. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/utils/python_class_methods_utils.py +0 -0
  72. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/utils/python_constants_utils.py +0 -0
  73. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/utils/python_docstring_utils.py +0 -0
  74. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/utils/python_functions_utils.py +0 -0
  75. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/utils/python_iterable_utils.py +0 -0
  76. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/utils/python_main_guard_utils.py +0 -0
  77. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/utils/python_module_metadata_utils.py +0 -0
  78. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/utils/python_type_checking_utils.py +0 -0
  79. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/utils/relocate_imports/__init__.py +0 -0
  80. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/utils/relocate_imports/__pycache__/__init__.py +0 -0
  81. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/utils/relocate_imports/python_import_rewriter.py +0 -0
  82. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/utils/relocate_imports/python_localize_runtime_imports.py +0 -0
  83. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/utils/relocate_imports/python_parser_import_index.py +0 -0
  84. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/utils/relocate_imports/python_runtime_symbol_collector.py +0 -0
  85. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/src/wexample_filestate_python/utils/relocate_imports/python_usage_collector.py +0 -0
  86. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/tests/tests/__init__.py +0 -0
  87. {wexample_filestate_python-6.7.1 → wexample_filestate_python-6.8.1}/tests/wexample_tests/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: wexample-filestate-python
3
- Version: 6.7.1
3
+ Version: 6.8.1
4
4
  Summary: Helpers for Python.
5
5
  Author-Email: weeger <contact@wexample.com>
6
6
  License: MIT
@@ -20,7 +20,7 @@ Requires-Dist: packaging
20
20
  Requires-Dist: pyupgrade
21
21
  Requires-Dist: tomli
22
22
  Requires-Dist: wexample-api>=6.1.0
23
- Requires-Dist: wexample-filestate>=11.1.0
23
+ Requires-Dist: wexample-filestate>=11.2.0
24
24
  Provides-Extra: dev
25
25
  Requires-Dist: pytest; extra == "dev"
26
26
  Requires-Dist: pytest-cov; extra == "dev"
@@ -28,7 +28,7 @@ Description-Content-Type: text/markdown
28
28
 
29
29
  # filestate_python
30
30
 
31
- Version: 6.7.1
31
+ Version: 6.8.1
32
32
 
33
33
  Helpers for Python.
34
34
 
@@ -119,7 +119,7 @@ Visit the [Wexample Suite documentation](https://docs.wexample.com) for the comp
119
119
  - pyupgrade:
120
120
  - tomli:
121
121
  - wexample-api: >=6.1.0
122
- - wexample-filestate: >=11.1.0
122
+ - wexample-filestate: >=11.2.0
123
123
 
124
124
  ## Versioning & Compatibility Policy
125
125
 
@@ -1,6 +1,6 @@
1
1
  # filestate_python
2
2
 
3
- Version: 6.7.1
3
+ Version: 6.8.1
4
4
 
5
5
  Helpers for Python.
6
6
 
@@ -91,7 +91,7 @@ Visit the [Wexample Suite documentation](https://docs.wexample.com) for the comp
91
91
  - pyupgrade:
92
92
  - tomli:
93
93
  - wexample-api: >=6.1.0
94
- - wexample-filestate: >=11.1.0
94
+ - wexample-filestate: >=11.2.0
95
95
 
96
96
  ## Versioning & Compatibility Policy
97
97
 
@@ -6,7 +6,7 @@ build-backend = "pdm.backend"
6
6
 
7
7
  [project]
8
8
  name = "wexample-filestate-python"
9
- version = "6.7.1"
9
+ version = "6.8.1"
10
10
  description = "Helpers for Python."
11
11
  authors = [
12
12
  { name = "weeger", email = "contact@wexample.com" },
@@ -29,7 +29,7 @@ dependencies = [
29
29
  "pyupgrade",
30
30
  "tomli",
31
31
  "wexample-api>=6.1.0",
32
- "wexample-filestate>=11.1.0",
32
+ "wexample-filestate>=11.2.0",
33
33
  ]
34
34
 
35
35
  [project.readme]
@@ -229,10 +229,24 @@ def _is_comment_line(node: cst.CSTNode) -> bool:
229
229
 
230
230
 
231
231
  def _is_dataclass(classdef: cst.ClassDef) -> bool:
232
- """Detect if class has a @dataclass decorator (dataclass or dataclasses.dataclass)."""
232
+ """Detect if class needs "required-first" field ordering.
233
+
234
+ Triggers on:
235
+ - ``@dataclass`` / ``@dataclasses.dataclass`` decorator (incl. parenthesized form)
236
+ - ``NamedTuple`` / ``typing.NamedTuple`` in the base classes
237
+
238
+ For both kinds, Python enforces that fields without a default appear
239
+ before fields with a default. The plain alphabetical sort applied
240
+ otherwise would silently swap them and raise ``TypeError`` at class
241
+ creation time (NamedTuple) or produce surprising defaults (dataclass).
242
+ """
243
+ # Decorators: @dataclass, @dataclasses.dataclass, @dataclass(...), @dataclasses.dataclass(...)
233
244
  for dec in classdef.decorators:
234
245
  try:
235
246
  expr = dec.decorator
247
+ # Unwrap parenthesized decorator calls like @dataclass(frozen=True)
248
+ if isinstance(expr, cst.Call):
249
+ expr = expr.func
236
250
  if isinstance(expr, cst.Name) and expr.value == "dataclass":
237
251
  return True
238
252
  if isinstance(expr, cst.Attribute) and isinstance(expr.attr, cst.Name):
@@ -240,6 +254,17 @@ def _is_dataclass(classdef: cst.ClassDef) -> bool:
240
254
  return True
241
255
  except Exception:
242
256
  continue
257
+ # Base classes: NamedTuple / typing.NamedTuple
258
+ for base in classdef.bases:
259
+ try:
260
+ expr = base.value
261
+ if isinstance(expr, cst.Name) and expr.value == "NamedTuple":
262
+ return True
263
+ if isinstance(expr, cst.Attribute) and isinstance(expr.attr, cst.Name):
264
+ if expr.attr.value == "NamedTuple":
265
+ return True
266
+ except Exception:
267
+ continue
243
268
  return False
244
269
 
245
270