ducktools-classbuilder 0.7.2__tar.gz → 0.7.4__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 (92) hide show
  1. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/.github/workflows/auto_test.yml +2 -2
  2. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/PKG-INFO +3 -2
  3. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/pyproject.toml +6 -6
  4. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/src/ducktools/classbuilder/__init__.py +0 -5
  5. ducktools_classbuilder-0.7.4/src/ducktools/classbuilder/_version.py +2 -0
  6. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/src/ducktools/classbuilder/annotations.py +39 -2
  7. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/src/ducktools_classbuilder.egg-info/PKG-INFO +3 -2
  8. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/src/ducktools_classbuilder.egg-info/SOURCES.txt +0 -1
  9. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/src/ducktools_classbuilder.egg-info/requires.txt +3 -1
  10. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/prefab/shared/test_creation.py +0 -9
  11. ducktools_classbuilder-0.7.2/src/ducktools/classbuilder/_version.py +0 -2
  12. ducktools_classbuilder-0.7.2/tests/prefab/shared/examples/fails/creation_1.py +0 -6
  13. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/.github/dependabot.yml +0 -0
  14. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/.github/workflows/publish_to_pypi.yml +0 -0
  15. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/.github/workflows/publish_to_testpypi.yml +0 -0
  16. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/.gitignore +0 -0
  17. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/.readthedocs.yaml +0 -0
  18. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/LICENSE.md +0 -0
  19. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/MANIFEST.in +0 -0
  20. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/README.md +0 -0
  21. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/docs/Makefile +0 -0
  22. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/docs/api.md +0 -0
  23. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/docs/approach_vs_tool.md +0 -0
  24. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/docs/conf.py +0 -0
  25. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/docs/extension_examples.md +0 -0
  26. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/docs/generated_code.md +0 -0
  27. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/docs/index.md +0 -0
  28. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/docs/make.bat +0 -0
  29. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/docs/perf/performance_tests.md +0 -0
  30. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/docs/prefab/index.md +0 -0
  31. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/docs/tutorial.md +0 -0
  32. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/docs_code/docs_ex10_frozen_attributes.py +0 -0
  33. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/docs_code/docs_ex1_basic.py +0 -0
  34. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/docs_code/docs_ex2_register.py +0 -0
  35. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/docs_code/docs_ex3_iterable.py +0 -0
  36. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/docs_code/docs_ex5_frozen.py +0 -0
  37. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/docs_code/docs_ex7_posonly.py +0 -0
  38. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/docs_code/docs_ex8_converters.py +0 -0
  39. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/docs_code/docs_ex9_annotated.py +0 -0
  40. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/docs_code/tutorial_code.py +0 -0
  41. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/perf/cluegen.py +0 -0
  42. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/perf/dataklasses.py +0 -0
  43. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/perf/hyperfine_testmaker.py +0 -0
  44. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/perf/perf_profile.py +0 -0
  45. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/setup.cfg +0 -0
  46. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/src/ducktools/classbuilder/__init__.pyi +0 -0
  47. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/src/ducktools/classbuilder/annotations.pyi +0 -0
  48. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/src/ducktools/classbuilder/prefab.py +0 -0
  49. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/src/ducktools/classbuilder/prefab.pyi +0 -0
  50. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/src/ducktools/classbuilder/py.typed +0 -0
  51. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/src/ducktools_classbuilder.egg-info/dependency_links.txt +0 -0
  52. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/src/ducktools_classbuilder.egg-info/top_level.txt +0 -0
  53. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/annotations/test_annotated.py +0 -0
  54. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/annotations/test_annotations_module.py +0 -0
  55. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/annotations/test_future_annotations.py +0 -0
  56. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/conftest.py +0 -0
  57. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/prefab/dynamic/test_compare_attrib.py +0 -0
  58. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/prefab/dynamic/test_construction.py +0 -0
  59. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/prefab/dynamic/test_frozen.py +0 -0
  60. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/prefab/dynamic/test_internals.py +0 -0
  61. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/prefab/dynamic/test_pre_post_init.py +0 -0
  62. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/prefab/dynamic/test_private.py +0 -0
  63. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/prefab/dynamic/test_slots_novalues.py +0 -0
  64. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/prefab/dynamic/test_slotted_class.py +0 -0
  65. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/prefab/dynamic/test_subclass_implementation.py +0 -0
  66. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/prefab/shared/conftest.py +0 -0
  67. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/prefab/shared/examples/creation.py +0 -0
  68. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/prefab/shared/examples/creation_empty.py +0 -0
  69. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/prefab/shared/examples/dunders.py +0 -0
  70. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/prefab/shared/examples/fails/creation_2.py +0 -0
  71. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/prefab/shared/examples/fails/creation_3.py +0 -0
  72. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/prefab/shared/examples/fails/creation_5.py +0 -0
  73. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/prefab/shared/examples/fails/inheritance_1.py +0 -0
  74. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/prefab/shared/examples/fails/inheritance_2.py +0 -0
  75. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/prefab/shared/examples/funcs_prefabs.py +0 -0
  76. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/prefab/shared/examples/hint_syntax.py +0 -0
  77. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/prefab/shared/examples/inheritance.py +0 -0
  78. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/prefab/shared/examples/init_ex.py +0 -0
  79. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/prefab/shared/examples/kw_only.py +0 -0
  80. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/prefab/shared/examples/repr_func.py +0 -0
  81. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/prefab/shared/test_dunders.py +0 -0
  82. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/prefab/shared/test_funcs.py +0 -0
  83. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/prefab/shared/test_hint_syntax.py +0 -0
  84. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/prefab/shared/test_inheritance.py +0 -0
  85. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/prefab/shared/test_init.py +0 -0
  86. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/prefab/shared/test_kw_only.py +0 -0
  87. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/prefab/shared/test_repr.py +0 -0
  88. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/py312_tests/test_generic_annotations.py +0 -0
  89. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/py314_tests/test_forwardref_annotations.py +0 -0
  90. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/test_core.py +0 -0
  91. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/tests/test_field_flags.py +0 -0
  92. {ducktools_classbuilder-0.7.2 → ducktools_classbuilder-0.7.4}/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-dev", "3.12", "3.11", "3.10", "pypy-3.10", "3.9", "3.8"]
17
+ python-version: ["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
@@ -42,7 +42,7 @@ jobs:
42
42
  - name: Install dependencies
43
43
  run: |
44
44
  python -m pip install --upgrade pip
45
- python -m pip install -e .[testing]
45
+ python -m pip install -e .[testing,type_checking]
46
46
  - name: Check type stub files
47
47
  run: |
48
48
  python -m mypy.stubtest ducktools.classbuilder
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ducktools-classbuilder
3
- Version: 0.7.2
3
+ Version: 0.7.4
4
4
  Summary: Toolkit for creating class boilerplate generators
5
5
  Author: David C Ellis
6
6
  License: MIT License
@@ -41,8 +41,9 @@ License-File: LICENSE.md
41
41
  Provides-Extra: testing
42
42
  Requires-Dist: pytest>=8.2; extra == "testing"
43
43
  Requires-Dist: pytest-cov; extra == "testing"
44
- Requires-Dist: mypy; extra == "testing"
45
44
  Requires-Dist: typing_extensions; extra == "testing"
45
+ Provides-Extra: type-checking
46
+ Requires-Dist: mypy; extra == "type-checking"
46
47
  Provides-Extra: performance-tests
47
48
  Requires-Dist: attrs; extra == "performance-tests"
48
49
  Requires-Dist: pydantic; extra == "performance-tests"
@@ -27,6 +27,12 @@ classifiers = [
27
27
  dynamic = ['version']
28
28
  license = {file = "LICENSE.md"}
29
29
 
30
+ [project.optional-dependencies]
31
+ testing = ["pytest>=8.2", "pytest-cov", "typing_extensions"]
32
+ type_checking = ["mypy"]
33
+ performance_tests = ["attrs", "pydantic"]
34
+ docs = ["sphinx", "myst-parser", "sphinx_rtd_theme"]
35
+
30
36
  [tool.setuptools.packages.find]
31
37
  where = ["src"]
32
38
 
@@ -34,12 +40,6 @@ where = ["src"]
34
40
  version_file = "src/ducktools/classbuilder/_version.py"
35
41
  version_file_template = "__version__ = \"{version}\"\n__version_tuple__ = {version_tuple}\n"
36
42
 
37
-
38
- [project.optional-dependencies]
39
- testing = ["pytest>=8.2", "pytest-cov", "mypy", "typing_extensions"]
40
- performance_tests = ["attrs", "pydantic"]
41
- docs = ["sphinx", "myst-parser", "sphinx_rtd_theme"]
42
-
43
43
  [project.urls]
44
44
  "Homepage" = "https://github.com/davidcellis/ducktools-classbuilder"
45
45
 
@@ -654,11 +654,6 @@ class Field(metaclass=SlotMakerMeta):
654
654
  f"{cls_name} cannot define both a default value and a default factory."
655
655
  )
656
656
 
657
- if self.kw_only and not self.init:
658
- raise AttributeError(
659
- f"{cls_name} cannot be keyword only if it is not in init."
660
- )
661
-
662
657
  @classmethod
663
658
  def from_field(cls, fld, /, **kwargs):
664
659
  """
@@ -0,0 +1,2 @@
1
+ __version__ = "0.7.4"
2
+ __version_tuple__ = (0, 7, 4)
@@ -37,6 +37,36 @@ del _cell_factory
37
37
  # End evil stuff from types.py
38
38
 
39
39
 
40
+ class _Stringlike(str):
41
+ # There are typing operators that are not supported by strings
42
+ # This adds the 'or' operator '|'
43
+
44
+ def __or__(self, other):
45
+ if isinstance(other, str):
46
+ other_r = other
47
+ elif name := getattr(other, "__name__", None):
48
+ other_r = name
49
+ else:
50
+ other_r = str(other)
51
+
52
+ return type(self)(f"{self} | {other_r}")
53
+
54
+ def __ror__(self, other):
55
+ if isinstance(other, str):
56
+ other_r = other
57
+ elif name := getattr(other, "__name__", None):
58
+ other_r = name
59
+ else:
60
+ other_r = str(other)
61
+
62
+ return type(self)(f"{other_r} | {self}")
63
+
64
+ def __repr__(self):
65
+ base = super().__repr__()
66
+ clsname = type(self).__name__
67
+ return f"{clsname}({base})"
68
+
69
+
40
70
  class _StringGlobs(dict):
41
71
  """
42
72
  Based on the fake globals dictionary used for annotations
@@ -47,7 +77,7 @@ class _StringGlobs(dict):
47
77
  is not found.
48
78
  """
49
79
  def __missing__(self, key):
50
- return key
80
+ return _Stringlike(key)
51
81
 
52
82
  def __repr__(self):
53
83
  cls_name = self.__class__.__name__
@@ -165,7 +195,14 @@ def call_annotate_func(annotate):
165
195
  closure = None
166
196
 
167
197
  new_annotate = _FunctionType(annotate.__code__, globs, closure=closure)
168
- return new_annotate(1)
198
+
199
+ # Convert _Stringlike back to str
200
+ annos = {
201
+ k: str(v) if isinstance(v, _Stringlike) else v
202
+ for k, v in new_annotate(1).items()
203
+ }
204
+
205
+ return annos
169
206
 
170
207
 
171
208
  def get_ns_annotations(ns, eval_str=True):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ducktools-classbuilder
3
- Version: 0.7.2
3
+ Version: 0.7.4
4
4
  Summary: Toolkit for creating class boilerplate generators
5
5
  Author: David C Ellis
6
6
  License: MIT License
@@ -41,8 +41,9 @@ License-File: LICENSE.md
41
41
  Provides-Extra: testing
42
42
  Requires-Dist: pytest>=8.2; extra == "testing"
43
43
  Requires-Dist: pytest-cov; extra == "testing"
44
- Requires-Dist: mypy; extra == "testing"
45
44
  Requires-Dist: typing_extensions; extra == "testing"
45
+ Provides-Extra: type-checking
46
+ Requires-Dist: mypy; extra == "type-checking"
46
47
  Provides-Extra: performance-tests
47
48
  Requires-Dist: attrs; extra == "performance-tests"
48
49
  Requires-Dist: pydantic; extra == "performance-tests"
@@ -79,7 +79,6 @@ tests/prefab/shared/examples/inheritance.py
79
79
  tests/prefab/shared/examples/init_ex.py
80
80
  tests/prefab/shared/examples/kw_only.py
81
81
  tests/prefab/shared/examples/repr_func.py
82
- tests/prefab/shared/examples/fails/creation_1.py
83
82
  tests/prefab/shared/examples/fails/creation_2.py
84
83
  tests/prefab/shared/examples/fails/creation_3.py
85
84
  tests/prefab/shared/examples/fails/creation_5.py
@@ -11,5 +11,7 @@ pydantic
11
11
  [testing]
12
12
  pytest>=8.2
13
13
  pytest-cov
14
- mypy
15
14
  typing_extensions
15
+
16
+ [type_checking]
17
+ mypy
@@ -144,15 +144,6 @@ class TestClassVar:
144
144
 
145
145
 
146
146
  class TestExceptions:
147
- def test_kw_not_in_init(self):
148
- with pytest.raises(AttributeError) as e_info:
149
- from fails.creation_1 import Construct
150
-
151
- assert (
152
- e_info.value.args[0]
153
- == "Attribute cannot be keyword only if it is not in init."
154
- )
155
-
156
147
  def test_positional_after_kw_error(self):
157
148
  with pytest.raises(SyntaxError) as e_info:
158
149
  from fails.creation_2 import FailSyntax
@@ -1,2 +0,0 @@
1
- __version__ = "0.7.2"
2
- __version_tuple__ = (0, 7, 2)
@@ -1,6 +0,0 @@
1
- from ducktools.classbuilder.prefab import prefab, attribute
2
-
3
-
4
- @prefab
5
- class Construct:
6
- x = attribute(default="test", kw_only=True, init=False)