wexample-filestate-python 6.7.0__tar.gz → 6.8.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 (87) hide show
  1. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/PKG-INFO +2 -2
  2. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/README.md +1 -1
  3. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/pyproject.toml +1 -1
  4. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/utils/python_class_attributes_utils.py +26 -1
  5. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/__init__.py +0 -0
  6. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/__pycache__/__init__.py +0 -0
  7. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/common/__init__.py +0 -0
  8. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/common/__pycache__/__init__.py +0 -0
  9. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/common/pipy_gateway.py +0 -0
  10. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/config_option/__init__.py +0 -0
  11. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/config_option/__pycache__/__init__.py +0 -0
  12. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/config_option/mixin/__init__.py +0 -0
  13. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/config_option/mixin/__pycache__/__init__.py +0 -0
  14. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/config_option/mixin/with_stdout_wrapping_mixin.py +0 -0
  15. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/config_value/__init__.py +0 -0
  16. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/config_value/__pycache__/__init__.py +0 -0
  17. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/config_value/python_config_value.py +0 -0
  18. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/const/__init__.py +0 -0
  19. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/const/__pycache__/__init__.py +0 -0
  20. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/const/name_pattern.py +0 -0
  21. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/const/path.py +0 -0
  22. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/const/python_file.py +0 -0
  23. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/event/__init__.py +0 -0
  24. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/event/src/__init__.py +0 -0
  25. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/event/src/wexample_event/__init__.py +0 -0
  26. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/file/__init__.py +0 -0
  27. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/file/__pycache__/__init__.py +0 -0
  28. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/file/python_file.py +0 -0
  29. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/helpers/__init__.py +0 -0
  30. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/helpers/__pycache__/__init__.py +0 -0
  31. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/helpers/package.py +0 -0
  32. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/helpers/python/__init__.py +0 -0
  33. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/helpers/toml.py +0 -0
  34. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/option/__init__.py +0 -0
  35. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/option/__pycache__/__init__.py +0 -0
  36. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/option/python/__init__.py +0 -0
  37. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/option/python/abstract_python_file_content_option.py +0 -0
  38. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/option/python/add_future_annotations_option.py +0 -0
  39. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/option/python/add_return_types_option.py +0 -0
  40. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/option/python/class_name_matches_file_name_option.py +0 -0
  41. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/option/python/fix_attrs_option.py +0 -0
  42. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/option/python/fix_blank_lines_option.py +0 -0
  43. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/option/python/format_option.py +0 -0
  44. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/option/python/fstringify_option.py +0 -0
  45. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/option/python/modernize_typing_option.py +0 -0
  46. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/option/python/order_class_attributes_option.py +0 -0
  47. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/option/python/order_class_docstring_option.py +0 -0
  48. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/option/python/order_class_methods_option.py +0 -0
  49. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/option/python/order_constants_option.py +0 -0
  50. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/option/python/order_iterable_items_option.py +0 -0
  51. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/option/python/order_main_guard_option.py +0 -0
  52. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/option/python/order_module_docstring_option.py +0 -0
  53. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/option/python/order_module_functions_option.py +0 -0
  54. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/option/python/order_module_metadata_option.py +0 -0
  55. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/option/python/order_type_checking_block_option.py +0 -0
  56. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/option/python/relocate_imports_option.py +0 -0
  57. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/option/python/remove_unused_option.py +0 -0
  58. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/option/python/sort_imports_option.py +0 -0
  59. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/option/python/unquote_annotations_option.py +0 -0
  60. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/option/python_option.py +0 -0
  61. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/options_provider/__init__.py +0 -0
  62. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/options_provider/__pycache__/__init__.py +0 -0
  63. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/options_provider/python_options_provider.py +0 -0
  64. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/py.typed +0 -0
  65. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/utils/__init__.py +0 -0
  66. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/utils/__pycache__/__init__.py +0 -0
  67. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/utils/cst_cache.py +0 -0
  68. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/utils/python_attrs_utils.py +0 -0
  69. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/utils/python_blank_lines_utils.py +0 -0
  70. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/utils/python_class_docstring_utils.py +0 -0
  71. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/utils/python_class_methods_utils.py +0 -0
  72. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/utils/python_constants_utils.py +0 -0
  73. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/utils/python_docstring_utils.py +0 -0
  74. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/utils/python_functions_utils.py +0 -0
  75. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/utils/python_iterable_utils.py +0 -0
  76. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/utils/python_main_guard_utils.py +0 -0
  77. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/utils/python_module_metadata_utils.py +0 -0
  78. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/utils/python_type_checking_utils.py +0 -0
  79. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/utils/relocate_imports/__init__.py +0 -0
  80. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/utils/relocate_imports/__pycache__/__init__.py +0 -0
  81. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/utils/relocate_imports/python_import_rewriter.py +0 -0
  82. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/utils/relocate_imports/python_localize_runtime_imports.py +0 -0
  83. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/utils/relocate_imports/python_parser_import_index.py +0 -0
  84. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/utils/relocate_imports/python_runtime_symbol_collector.py +0 -0
  85. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/src/wexample_filestate_python/utils/relocate_imports/python_usage_collector.py +0 -0
  86. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/tests/tests/__init__.py +0 -0
  87. {wexample_filestate_python-6.7.0 → wexample_filestate_python-6.8.0}/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.0
3
+ Version: 6.8.0
4
4
  Summary: Helpers for Python.
5
5
  Author-Email: weeger <contact@wexample.com>
6
6
  License: MIT
@@ -28,7 +28,7 @@ Description-Content-Type: text/markdown
28
28
 
29
29
  # filestate_python
30
30
 
31
- Version: 6.7.0
31
+ Version: 6.8.0
32
32
 
33
33
  Helpers for Python.
34
34
 
@@ -1,6 +1,6 @@
1
1
  # filestate_python
2
2
 
3
- Version: 6.7.0
3
+ Version: 6.8.0
4
4
 
5
5
  Helpers for Python.
6
6
 
@@ -6,7 +6,7 @@ build-backend = "pdm.backend"
6
6
 
7
7
  [project]
8
8
  name = "wexample-filestate-python"
9
- version = "6.7.0"
9
+ version = "6.8.0"
10
10
  description = "Helpers for Python."
11
11
  authors = [
12
12
  { name = "weeger", email = "contact@wexample.com" },
@@ -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