ducktools-classbuilder 0.4.0__tar.gz → 0.5.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.

Potentially problematic release.


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

Files changed (59) hide show
  1. {ducktools_classbuilder-0.4.0/src/ducktools_classbuilder.egg-info → ducktools_classbuilder-0.5.0}/PKG-INFO +16 -15
  2. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/README.md +15 -14
  3. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/docs/api.md +10 -1
  4. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/docs/extension_examples.md +258 -157
  5. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/src/ducktools/classbuilder/__init__.py +58 -33
  6. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/src/ducktools/classbuilder/__init__.pyi +19 -17
  7. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/src/ducktools/classbuilder/prefab.py +27 -25
  8. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/src/ducktools/classbuilder/prefab.pyi +10 -10
  9. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0/src/ducktools_classbuilder.egg-info}/PKG-INFO +16 -15
  10. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/tests/test_annotated.py +8 -12
  11. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/tests/test_core.py +9 -6
  12. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/LICENSE.md +0 -0
  13. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/MANIFEST.in +0 -0
  14. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/docs/Makefile +0 -0
  15. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/docs/approach_vs_tool.md +0 -0
  16. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/docs/conf.py +0 -0
  17. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/docs/index.md +0 -0
  18. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/docs/make.bat +0 -0
  19. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/docs/perf/performance_tests.md +0 -0
  20. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/docs/prefab/index.md +0 -0
  21. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/pyproject.toml +0 -0
  22. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/setup.cfg +0 -0
  23. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/src/ducktools/classbuilder/py.typed +0 -0
  24. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/src/ducktools_classbuilder.egg-info/SOURCES.txt +0 -0
  25. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/src/ducktools_classbuilder.egg-info/dependency_links.txt +0 -0
  26. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/src/ducktools_classbuilder.egg-info/requires.txt +0 -0
  27. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/src/ducktools_classbuilder.egg-info/top_level.txt +0 -0
  28. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/tests/prefab/dynamic/test_compare_attrib.py +0 -0
  29. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/tests/prefab/dynamic/test_construction.py +0 -0
  30. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/tests/prefab/dynamic/test_internals.py +0 -0
  31. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/tests/prefab/dynamic/test_pre_post_init.py +0 -0
  32. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/tests/prefab/dynamic/test_slots_novalues.py +0 -0
  33. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/tests/prefab/dynamic/test_slotted_class.py +0 -0
  34. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/tests/prefab/shared/conftest.py +0 -0
  35. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/tests/prefab/shared/examples/creation.py +0 -0
  36. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/tests/prefab/shared/examples/creation_empty.py +0 -0
  37. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/tests/prefab/shared/examples/dunders.py +0 -0
  38. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/tests/prefab/shared/examples/fails/creation_1.py +0 -0
  39. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/tests/prefab/shared/examples/fails/creation_2.py +0 -0
  40. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/tests/prefab/shared/examples/fails/creation_3.py +0 -0
  41. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/tests/prefab/shared/examples/fails/creation_5.py +0 -0
  42. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/tests/prefab/shared/examples/fails/inheritance_1.py +0 -0
  43. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/tests/prefab/shared/examples/fails/inheritance_2.py +0 -0
  44. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/tests/prefab/shared/examples/frozen_prefabs.py +0 -0
  45. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/tests/prefab/shared/examples/funcs_prefabs.py +0 -0
  46. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/tests/prefab/shared/examples/hint_syntax.py +0 -0
  47. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/tests/prefab/shared/examples/inheritance.py +0 -0
  48. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/tests/prefab/shared/examples/init_ex.py +0 -0
  49. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/tests/prefab/shared/examples/kw_only.py +0 -0
  50. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/tests/prefab/shared/examples/repr_func.py +0 -0
  51. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/tests/prefab/shared/test_creation.py +0 -0
  52. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/tests/prefab/shared/test_dunders.py +0 -0
  53. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/tests/prefab/shared/test_frozen.py +0 -0
  54. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/tests/prefab/shared/test_funcs.py +0 -0
  55. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/tests/prefab/shared/test_hint_syntax.py +0 -0
  56. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/tests/prefab/shared/test_inheritance.py +0 -0
  57. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/tests/prefab/shared/test_init.py +0 -0
  58. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/tests/prefab/shared/test_kw_only.py +0 -0
  59. {ducktools_classbuilder-0.4.0 → ducktools_classbuilder-0.5.0}/tests/prefab/shared/test_repr.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ducktools-classbuilder
3
- Version: 0.4.0
3
+ Version: 0.5.0
4
4
  Summary: Toolkit for creating class boilerplate generators
5
5
  Author: David C Ellis
6
6
  License: MIT License
@@ -69,11 +69,12 @@ Install from PyPI with:
69
69
  In order to create a class decorator using `ducktools.classbuilder` there are
70
70
  a few things you need to prepare.
71
71
 
72
- 1. A field gathering function to analyse the class and collect valid `Field`s.
72
+ 1. A field gathering function to analyse the class and collect valid `Field`s and provide
73
+ any modifications that need to be applied to the class attributes.
73
74
  * An example `slot_gatherer` is included.
74
75
  2. Code generators that can make use of the gathered `Field`s to create magic method
75
- source code.
76
- * Example `init_maker`, `repr_maker` and `eq_maker` generators are included.
76
+ source code. To be made into descriptors by `MethodMaker`.
77
+ * Example `init_generator`, `repr_generator` and `eq_generator` generators are included.
77
78
  3. A function that calls the `builder` function to apply both of these steps.
78
79
 
79
80
  A field gathering function needs to take the original class as an argument and
@@ -91,25 +92,26 @@ class[^1] where keyword arguments define the names and values for the fields.
91
92
 
92
93
  Code generator functions need to be converted to descriptors before being used.
93
94
  This is done using the provided `MethodMaker` descriptor class.
94
- ex: `init_desc = MethodMaker("__init__", init_maker)`
95
+ ex: `init_maker = MethodMaker("__init__", init_generator)`.
95
96
 
96
97
  These parts can then be used to make a basic class boilerplate generator by
97
98
  providing them to the `builder` function.
98
99
 
99
100
  ```python
100
101
  from ducktools.classbuilder import (
101
- builder,
102
- slot_gatherer,
103
- init_maker, eq_maker, repr_maker,
102
+ builder,
103
+ slot_gatherer,
104
+ init_generator, eq_generator, repr_generator,
104
105
  MethodMaker,
105
106
  )
106
107
 
107
- init_desc = MethodMaker("__init__", init_maker)
108
- repr_desc = MethodMaker("__repr__", repr_maker)
109
- eq_desc = MethodMaker("__eq__", eq_maker)
108
+ init_maker = MethodMaker("__init__", init_generator)
109
+ repr_maker = MethodMaker("__repr__", repr_generator)
110
+ eq_maker = MethodMaker("__eq__", eq_generator)
111
+
110
112
 
111
113
  def slotclass(cls):
112
- return builder(cls, gatherer=slot_gatherer, methods={init_desc, repr_desc, eq_desc})
114
+ return builder(cls, gatherer=slot_gatherer, methods={init_maker, repr_maker, eq_maker})
113
115
  ```
114
116
 
115
117
  ## Slot Class Usage ##
@@ -238,9 +240,8 @@ It will copy values provided as the `type` to `Field` into the
238
240
  Values provided to `doc` will be placed in the final `__slots__`
239
241
  field so they are present on the class if `help(...)` is called.
240
242
 
241
- A fairly basic `annotations_gatherer` and `annotationclass` are included
242
- in `extras.py` which can be used to generate classbuilders that rely on
243
- annotations.
243
+ A fairly basic `annotations_gatherer` and `annotationclass` are also included
244
+ and can be used to generate classbuilders that rely on annotations.
244
245
 
245
246
  If you want something with more features you can look at the `prefab.py`
246
247
  implementation which provides a 'prebuilt' implementation.
@@ -20,11 +20,12 @@ Install from PyPI with:
20
20
  In order to create a class decorator using `ducktools.classbuilder` there are
21
21
  a few things you need to prepare.
22
22
 
23
- 1. A field gathering function to analyse the class and collect valid `Field`s.
23
+ 1. A field gathering function to analyse the class and collect valid `Field`s and provide
24
+ any modifications that need to be applied to the class attributes.
24
25
  * An example `slot_gatherer` is included.
25
26
  2. Code generators that can make use of the gathered `Field`s to create magic method
26
- source code.
27
- * Example `init_maker`, `repr_maker` and `eq_maker` generators are included.
27
+ source code. To be made into descriptors by `MethodMaker`.
28
+ * Example `init_generator`, `repr_generator` and `eq_generator` generators are included.
28
29
  3. A function that calls the `builder` function to apply both of these steps.
29
30
 
30
31
  A field gathering function needs to take the original class as an argument and
@@ -42,25 +43,26 @@ class[^1] where keyword arguments define the names and values for the fields.
42
43
 
43
44
  Code generator functions need to be converted to descriptors before being used.
44
45
  This is done using the provided `MethodMaker` descriptor class.
45
- ex: `init_desc = MethodMaker("__init__", init_maker)`
46
+ ex: `init_maker = MethodMaker("__init__", init_generator)`.
46
47
 
47
48
  These parts can then be used to make a basic class boilerplate generator by
48
49
  providing them to the `builder` function.
49
50
 
50
51
  ```python
51
52
  from ducktools.classbuilder import (
52
- builder,
53
- slot_gatherer,
54
- init_maker, eq_maker, repr_maker,
53
+ builder,
54
+ slot_gatherer,
55
+ init_generator, eq_generator, repr_generator,
55
56
  MethodMaker,
56
57
  )
57
58
 
58
- init_desc = MethodMaker("__init__", init_maker)
59
- repr_desc = MethodMaker("__repr__", repr_maker)
60
- eq_desc = MethodMaker("__eq__", eq_maker)
59
+ init_maker = MethodMaker("__init__", init_generator)
60
+ repr_maker = MethodMaker("__repr__", repr_generator)
61
+ eq_maker = MethodMaker("__eq__", eq_generator)
62
+
61
63
 
62
64
  def slotclass(cls):
63
- return builder(cls, gatherer=slot_gatherer, methods={init_desc, repr_desc, eq_desc})
65
+ return builder(cls, gatherer=slot_gatherer, methods={init_maker, repr_maker, eq_maker})
64
66
  ```
65
67
 
66
68
  ## Slot Class Usage ##
@@ -189,9 +191,8 @@ It will copy values provided as the `type` to `Field` into the
189
191
  Values provided to `doc` will be placed in the final `__slots__`
190
192
  field so they are present on the class if `help(...)` is called.
191
193
 
192
- A fairly basic `annotations_gatherer` and `annotationclass` are included
193
- in `extras.py` which can be used to generate classbuilders that rely on
194
- annotations.
194
+ A fairly basic `annotations_gatherer` and `annotationclass` are also included
195
+ and can be used to generate classbuilders that rely on annotations.
195
196
 
196
197
  If you want something with more features you can look at the `prefab.py`
197
198
  implementation which provides a 'prebuilt' implementation.
@@ -14,6 +14,11 @@
14
14
  .. autofunction:: ducktools.classbuilder::slotclass
15
15
  ```
16
16
 
17
+ ```{eval-rst}
18
+ .. autofunction:: ducktools.classbuilder::annotationclass
19
+ ```
20
+
21
+
17
22
  ## Builder functions and classes ##
18
23
 
19
24
  ```{eval-rst}
@@ -33,7 +38,11 @@
33
38
  ```
34
39
 
35
40
  ```{eval-rst}
36
- .. autofunction:: ducktools.classbuilder::slot_gatherer
41
+ .. autofunction:: ducktools.classbuilder::make_slot_gatherer
42
+ ```
43
+
44
+ ```{eval-rst}
45
+ .. autofunction:: ducktools.classbuilder::make_annotation_gatherer
37
46
  ```
38
47
 
39
48
  ```{eval-rst}