ducktools-classbuilder 0.8.2__tar.gz → 0.8.3__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.

Potentially problematic release.


This version of ducktools-classbuilder might be problematic. Click here for more details.

Files changed (89) hide show
  1. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/.github/workflows/auto_test.yml +1 -1
  2. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/PKG-INFO +1 -1
  3. ducktools_classbuilder-0.8.3/src/ducktools/classbuilder/_version.py +2 -0
  4. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/src/ducktools/classbuilder/annotations.py +12 -45
  5. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/src/ducktools_classbuilder.egg-info/PKG-INFO +1 -1
  6. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/src/ducktools_classbuilder.egg-info/SOURCES.txt +1 -0
  7. ducktools_classbuilder-0.8.3/tests/py314_tests/_test_support.py +42 -0
  8. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/py314_tests/test_forwardref_annotations.py +5 -3
  9. ducktools_classbuilder-0.8.2/src/ducktools/classbuilder/_version.py +0 -2
  10. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/.github/dependabot.yml +0 -0
  11. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/.github/workflows/publish_to_pypi.yml +0 -0
  12. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/.github/workflows/publish_to_testpypi.yml +0 -0
  13. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/.gitignore +0 -0
  14. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/.readthedocs.yaml +0 -0
  15. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/LICENSE +0 -0
  16. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/MANIFEST.in +0 -0
  17. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/README.md +0 -0
  18. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/docs/Makefile +0 -0
  19. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/docs/api.md +0 -0
  20. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/docs/approach_vs_tool.md +0 -0
  21. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/docs/conf.py +0 -0
  22. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/docs/extension_examples.md +0 -0
  23. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/docs/generated_code.md +0 -0
  24. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/docs/index.md +0 -0
  25. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/docs/make.bat +0 -0
  26. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/docs/perf/performance_tests.md +0 -0
  27. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/docs/prefab/index.md +0 -0
  28. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/docs/tutorial.md +0 -0
  29. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/docs_code/docs_ex10_frozen_attributes.py +0 -0
  30. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/docs_code/docs_ex1_basic.py +0 -0
  31. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/docs_code/docs_ex2_register.py +0 -0
  32. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/docs_code/docs_ex3_iterable.py +0 -0
  33. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/docs_code/docs_ex5_frozen.py +0 -0
  34. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/docs_code/docs_ex7_posonly.py +0 -0
  35. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/docs_code/docs_ex8_converters.py +0 -0
  36. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/docs_code/docs_ex9_annotated.py +0 -0
  37. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/docs_code/index_example.py +0 -0
  38. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/docs_code/tutorial_code.py +0 -0
  39. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/pyproject.toml +0 -0
  40. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/setup.cfg +0 -0
  41. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/src/ducktools/classbuilder/__init__.py +0 -0
  42. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/src/ducktools/classbuilder/__init__.pyi +0 -0
  43. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/src/ducktools/classbuilder/annotations.pyi +0 -0
  44. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/src/ducktools/classbuilder/prefab.py +0 -0
  45. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/src/ducktools/classbuilder/prefab.pyi +0 -0
  46. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/src/ducktools/classbuilder/py.typed +0 -0
  47. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/src/ducktools_classbuilder.egg-info/dependency_links.txt +0 -0
  48. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/src/ducktools_classbuilder.egg-info/requires.txt +0 -0
  49. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/src/ducktools_classbuilder.egg-info/top_level.txt +0 -0
  50. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/annotations/test_annotated.py +0 -0
  51. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/annotations/test_annotations_module.py +0 -0
  52. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/annotations/test_future_annotations.py +0 -0
  53. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/conftest.py +0 -0
  54. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/prefab/dynamic/test_compare_attrib.py +0 -0
  55. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/prefab/dynamic/test_construction.py +0 -0
  56. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/prefab/dynamic/test_frozen.py +0 -0
  57. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/prefab/dynamic/test_internals.py +0 -0
  58. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/prefab/dynamic/test_pre_post_init.py +0 -0
  59. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/prefab/dynamic/test_private.py +0 -0
  60. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/prefab/dynamic/test_slots_novalues.py +0 -0
  61. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/prefab/dynamic/test_slotted_class.py +0 -0
  62. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/prefab/dynamic/test_subclass_implementation.py +0 -0
  63. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/prefab/shared/conftest.py +0 -0
  64. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/prefab/shared/examples/creation.py +0 -0
  65. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/prefab/shared/examples/creation_empty.py +0 -0
  66. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/prefab/shared/examples/dunders.py +0 -0
  67. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/prefab/shared/examples/fails/creation_2.py +0 -0
  68. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/prefab/shared/examples/fails/creation_3.py +0 -0
  69. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/prefab/shared/examples/fails/creation_5.py +0 -0
  70. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/prefab/shared/examples/fails/inheritance_1.py +0 -0
  71. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/prefab/shared/examples/fails/inheritance_2.py +0 -0
  72. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/prefab/shared/examples/funcs_prefabs.py +0 -0
  73. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/prefab/shared/examples/hint_syntax.py +0 -0
  74. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/prefab/shared/examples/inheritance.py +0 -0
  75. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/prefab/shared/examples/init_ex.py +0 -0
  76. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/prefab/shared/examples/kw_only.py +0 -0
  77. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/prefab/shared/examples/repr_func.py +0 -0
  78. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/prefab/shared/test_creation.py +0 -0
  79. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/prefab/shared/test_dunders.py +0 -0
  80. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/prefab/shared/test_funcs.py +0 -0
  81. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/prefab/shared/test_hint_syntax.py +0 -0
  82. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/prefab/shared/test_inheritance.py +0 -0
  83. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/prefab/shared/test_init.py +0 -0
  84. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/prefab/shared/test_kw_only.py +0 -0
  85. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/prefab/shared/test_repr.py +0 -0
  86. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/py312_tests/test_generic_annotations.py +0 -0
  87. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/test_core.py +0 -0
  88. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/test_field_flags.py +0 -0
  89. {ducktools_classbuilder-0.8.2 → ducktools_classbuilder-0.8.3}/tests/test_slotmakermeta.py +0 -0
@@ -14,7 +14,7 @@ jobs:
14
14
  fail-fast: false
15
15
  matrix:
16
16
  os: [ubuntu-latest]
17
- python-version: ["3.13", "3.12", "3.11", "3.10", "pypy-3.10", "3.9", "3.8"]
17
+ python-version: ["3.14-dev", "3.13", "3.12", "3.11", "3.10", "pypy-3.10", "3.9", "3.8"]
18
18
 
19
19
  steps:
20
20
  - uses: actions/checkout@v4
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ducktools-classbuilder
3
- Version: 0.8.2
3
+ Version: 0.8.3
4
4
  Summary: Toolkit for creating class boilerplate generators
5
5
  Author: David C Ellis
6
6
  Project-URL: Homepage, https://github.com/davidcellis/ducktools-classbuilder
@@ -0,0 +1,2 @@
1
+ __version__ = "0.8.3"
2
+ __version_tuple__ = (0, 8, 3)
@@ -23,39 +23,12 @@ import sys
23
23
 
24
24
 
25
25
  class _LazyAnnotationLib:
26
- def __init__(self):
27
- if sys.version_info < (3, 14):
28
- self.annotationlib_unavailable = True
29
- else:
30
- self.annotationlib_unavailable = None
31
-
32
26
  def __getattr__(self, item):
33
- if self.annotationlib_unavailable:
34
- raise ImportError("'annotationlib' is not available")
35
-
36
- try:
37
- import annotationlib
38
- except ImportError:
39
- self.annotationlib_unavailable = True
40
- raise ImportError("'annotationlib' is not available")
41
- else:
42
- self.Format = annotationlib.Format
43
- self.call_annotate_function = annotationlib.call_annotate_function
44
-
45
- # This function keeps getting changed and renamed
46
- get_ns_annotate = getattr(annotationlib, "get_annotate_from_class_namespace", None)
47
- if get_ns_annotate is None:
48
- get_ns_annotate = getattr(annotationlib, "get_annotate_function")
49
- self.get_ns_annotate = get_ns_annotate
27
+ global _lazyannotationlib
28
+ import annotationlib
29
+ _lazyannotationlib = annotationlib
30
+ return getattr(annotationlib, item)
50
31
 
51
- if item == "Format":
52
- return self.Format
53
- elif item == "call_annotate_function":
54
- return self.call_annotate_function
55
- elif item == "get_ns_annotate":
56
- return get_ns_annotate
57
-
58
- raise AttributeError(f"{item!r} is not available from this lazy importer")
59
32
 
60
33
  _lazy_annotationlib = _LazyAnnotationLib()
61
34
 
@@ -72,19 +45,14 @@ def get_ns_annotations(ns):
72
45
  annotations = ns.get("__annotations__")
73
46
  if annotations is not None:
74
47
  annotations = annotations.copy()
75
- else:
76
- try:
77
- # See if we're using PEP-649 annotations
78
- annotate = ns.get("__annotate__") # Works in the early alphas
79
- if not annotate:
80
- annotate = _lazy_annotationlib.get_ns_annotate(ns)
81
- if annotate:
82
- annotations = _lazy_annotationlib.call_annotate_function(
83
- annotate,
84
- format=_lazy_annotationlib.Format.FORWARDREF
85
- )
86
- except ImportError:
87
- pass
48
+ elif sys.version_info >= (3, 14):
49
+ # See if we're using PEP-649 annotations
50
+ annotate = _lazy_annotationlib.get_annotate_from_class_namespace(ns)
51
+ if annotate:
52
+ annotations = _lazy_annotationlib.call_annotate_function(
53
+ annotate,
54
+ format=_lazy_annotationlib.Format.FORWARDREF
55
+ )
88
56
 
89
57
  if annotations is None:
90
58
  annotations = {}
@@ -125,4 +93,3 @@ def is_classvar(hint):
125
93
  ):
126
94
  return True
127
95
  return False
128
-
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ducktools-classbuilder
3
- Version: 0.8.2
3
+ Version: 0.8.3
4
4
  Summary: Toolkit for creating class boilerplate generators
5
5
  Author: David C Ellis
6
6
  Project-URL: Homepage, https://github.com/davidcellis/ducktools-classbuilder
@@ -82,4 +82,5 @@ tests/prefab/shared/examples/fails/creation_5.py
82
82
  tests/prefab/shared/examples/fails/inheritance_1.py
83
83
  tests/prefab/shared/examples/fails/inheritance_2.py
84
84
  tests/py312_tests/test_generic_annotations.py
85
+ tests/py314_tests/_test_support.py
85
86
  tests/py314_tests/test_forwardref_annotations.py
@@ -0,0 +1,42 @@
1
+ from annotationlib import ForwardRef
2
+
3
+ # From test/support/__init__.py
4
+ class EqualToForwardRef:
5
+ """Helper to ease use of annotationlib.ForwardRef in tests.
6
+
7
+ This checks only attributes that can be set using the constructor.
8
+
9
+ """
10
+
11
+ def __init__(
12
+ self,
13
+ arg,
14
+ *,
15
+ module=None,
16
+ owner=None,
17
+ is_class=False,
18
+ ):
19
+ self.__forward_arg__ = arg
20
+ self.__forward_is_class__ = is_class
21
+ self.__forward_module__ = module
22
+ self.__owner__ = owner
23
+
24
+ def __eq__(self, other):
25
+ if not isinstance(other, (EqualToForwardRef, ForwardRef)):
26
+ return NotImplemented
27
+ return (
28
+ self.__forward_arg__ == other.__forward_arg__
29
+ and self.__forward_module__ == other.__forward_module__
30
+ and self.__forward_is_class__ == other.__forward_is_class__
31
+ and self.__owner__ == other.__owner__
32
+ )
33
+
34
+ def __repr__(self):
35
+ extra = []
36
+ if self.__forward_module__ is not None:
37
+ extra.append(f", module={self.__forward_module__!r}")
38
+ if self.__forward_is_class__:
39
+ extra.append(", is_class=True")
40
+ if self.__owner__ is not None:
41
+ extra.append(f", owner={self.__owner__!r}")
42
+ return f"EqualToForwardRef({self.__forward_arg__!r}{''.join(extra)})"
@@ -1,12 +1,14 @@
1
1
  # Bare forwardrefs only work in 3.14 or later
2
2
 
3
3
  from ducktools.classbuilder.annotations import get_ns_annotations
4
- from annotationlib import ForwardRef
5
4
 
6
5
  from pathlib import Path
7
6
 
7
+ from _test_support import EqualToForwardRef
8
+
8
9
  global_type = int
9
10
 
11
+
10
12
  def test_bare_forwardref():
11
13
  class Ex:
12
14
  a: str
@@ -15,7 +17,7 @@ def test_bare_forwardref():
15
17
 
16
18
  annos = get_ns_annotations(Ex.__dict__)
17
19
 
18
- assert annos == {'a': str, 'b': Path, 'c': ForwardRef("plain_forwardref")}
20
+ assert annos == {'a': str, 'b': Path, 'c': EqualToForwardRef("plain_forwardref")}
19
21
 
20
22
 
21
23
  def test_inner_outer_ref():
@@ -38,7 +40,7 @@ def test_inner_outer_ref():
38
40
  cls, annos = make_func()
39
41
 
40
42
  # Forwardref given as string if used before it can be evaluated
41
- assert annos == {"a_val": str, "b_val": int, "c_val": ForwardRef("hyper_type")}
43
+ assert annos == {"a_val": str, "b_val": int, "c_val": EqualToForwardRef("hyper_type")}
42
44
 
43
45
  # Correctly evaluated if it exists
44
46
  assert get_ns_annotations(cls.__dict__) == {
@@ -1,2 +0,0 @@
1
- __version__ = "0.8.2"
2
- __version_tuple__ = (0, 8, 2)