GeneralManager 0.5.2__tar.gz → 0.6.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 (91) hide show
  1. {generalmanager-0.5.2 → generalmanager-0.6.1}/GeneralManager.egg-info/PKG-INFO +2 -2
  2. {generalmanager-0.5.2 → generalmanager-0.6.1}/GeneralManager.egg-info/SOURCES.txt +11 -0
  3. {generalmanager-0.5.2 → generalmanager-0.6.1}/PKG-INFO +2 -2
  4. {generalmanager-0.5.2 → generalmanager-0.6.1}/pyproject.toml +12 -20
  5. {generalmanager-0.5.2 → generalmanager-0.6.1}/src/general_manager/api/graphql.py +2 -1
  6. generalmanager-0.6.1/src/general_manager/bucket/baseBucket.py +240 -0
  7. generalmanager-0.5.2/src/general_manager/interface/calculationInterface.py → generalmanager-0.6.1/src/general_manager/bucket/calculationBucket.py +200 -126
  8. generalmanager-0.6.1/src/general_manager/bucket/databaseBucket.py +235 -0
  9. generalmanager-0.5.2/src/general_manager/manager/groupManager.py → generalmanager-0.6.1/src/general_manager/bucket/groupBucket.py +121 -128
  10. {generalmanager-0.5.2 → generalmanager-0.6.1}/src/general_manager/cache/modelDependencyCollector.py +5 -8
  11. {generalmanager-0.5.2 → generalmanager-0.6.1}/src/general_manager/interface/baseInterface.py +13 -103
  12. generalmanager-0.6.1/src/general_manager/interface/calculationInterface.py +120 -0
  13. generalmanager-0.5.2/src/general_manager/interface/databaseInterface.py → generalmanager-0.6.1/src/general_manager/interface/databaseBasedInterface.py +141 -348
  14. generalmanager-0.6.1/src/general_manager/interface/databaseInterface.py +106 -0
  15. generalmanager-0.6.1/src/general_manager/interface/readOnlyInterface.py +107 -0
  16. {generalmanager-0.5.2 → generalmanager-0.6.1}/src/general_manager/manager/generalManager.py +11 -10
  17. generalmanager-0.6.1/src/general_manager/manager/groupManager.py +125 -0
  18. {generalmanager-0.5.2 → generalmanager-0.6.1}/src/general_manager/manager/meta.py +19 -5
  19. {generalmanager-0.5.2 → generalmanager-0.6.1}/src/general_manager/permission/basePermission.py +4 -6
  20. generalmanager-0.6.1/src/general_manager/permission/fileBasedPermission.py +0 -0
  21. generalmanager-0.6.1/tests/test_baseBucket.py +325 -0
  22. generalmanager-0.6.1/tests/test_baseInterface.py +273 -0
  23. generalmanager-0.6.1/tests/test_calculationBucket.py +373 -0
  24. generalmanager-0.6.1/tests/test_calculationInterface.py +124 -0
  25. generalmanager-0.6.1/tests/test_databaseBasedInterface.py +274 -0
  26. generalmanager-0.6.1/tests/test_databaseBucket.py +333 -0
  27. {generalmanager-0.5.2 → generalmanager-0.6.1}/tests/test_generalManager.py +16 -16
  28. {generalmanager-0.5.2 → generalmanager-0.6.1}/tests/test_generalManagerMeta.py +4 -3
  29. {generalmanager-0.5.2 → generalmanager-0.6.1}/tests/test_groupManager.py +1 -1
  30. generalmanager-0.5.2/src/general_manager/interface/__init__.py +0 -3
  31. generalmanager-0.5.2/tests/test_baseInterface.py +0 -604
  32. {generalmanager-0.5.2 → generalmanager-0.6.1}/GeneralManager.egg-info/dependency_links.txt +0 -0
  33. {generalmanager-0.5.2 → generalmanager-0.6.1}/GeneralManager.egg-info/requires.txt +0 -0
  34. {generalmanager-0.5.2 → generalmanager-0.6.1}/GeneralManager.egg-info/top_level.txt +0 -0
  35. {generalmanager-0.5.2 → generalmanager-0.6.1}/LICENSE +0 -0
  36. {generalmanager-0.5.2 → generalmanager-0.6.1}/README.md +0 -0
  37. {generalmanager-0.5.2 → generalmanager-0.6.1}/setup.cfg +0 -0
  38. {generalmanager-0.5.2 → generalmanager-0.6.1}/src/general_manager/__init__.py +0 -0
  39. {generalmanager-0.5.2 → generalmanager-0.6.1}/src/general_manager/api/mutation.py +0 -0
  40. {generalmanager-0.5.2 → generalmanager-0.6.1}/src/general_manager/api/property.py +0 -0
  41. {generalmanager-0.5.2 → generalmanager-0.6.1}/src/general_manager/apps.py +0 -0
  42. {generalmanager-0.5.2 → generalmanager-0.6.1}/src/general_manager/auxiliary/__init__.py +0 -0
  43. {generalmanager-0.5.2 → generalmanager-0.6.1}/src/general_manager/auxiliary/argsToKwargs.py +0 -0
  44. {generalmanager-0.5.2 → generalmanager-0.6.1}/src/general_manager/auxiliary/filterParser.py +0 -0
  45. {generalmanager-0.5.2 → generalmanager-0.6.1}/src/general_manager/auxiliary/jsonEncoder.py +0 -0
  46. {generalmanager-0.5.2 → generalmanager-0.6.1}/src/general_manager/auxiliary/makeCacheKey.py +0 -0
  47. {generalmanager-0.5.2 → generalmanager-0.6.1}/src/general_manager/auxiliary/noneToZero.py +0 -0
  48. {generalmanager-0.5.2 → generalmanager-0.6.1}/src/general_manager/auxiliary/pathMapping.py +0 -0
  49. {generalmanager-0.5.2 → generalmanager-0.6.1}/src/general_manager/cache/cacheDecorator.py +0 -0
  50. {generalmanager-0.5.2 → generalmanager-0.6.1}/src/general_manager/cache/cacheTracker.py +0 -0
  51. {generalmanager-0.5.2 → generalmanager-0.6.1}/src/general_manager/cache/dependencyIndex.py +0 -0
  52. {generalmanager-0.5.2 → generalmanager-0.6.1}/src/general_manager/cache/signals.py +0 -0
  53. {generalmanager-0.5.2 → generalmanager-0.6.1}/src/general_manager/factory/__init__.py +0 -0
  54. {generalmanager-0.5.2 → generalmanager-0.6.1}/src/general_manager/factory/autoFactory.py +0 -0
  55. {generalmanager-0.5.2 → generalmanager-0.6.1}/src/general_manager/factory/factories.py +0 -0
  56. {generalmanager-0.5.2 → generalmanager-0.6.1}/src/general_manager/factory/factoryMethods.py +0 -0
  57. /generalmanager-0.5.2/src/general_manager/permission/fileBasedPermission.py → /generalmanager-0.6.1/src/general_manager/interface/__init__.py +0 -0
  58. {generalmanager-0.5.2 → generalmanager-0.6.1}/src/general_manager/manager/__init__.py +0 -0
  59. {generalmanager-0.5.2 → generalmanager-0.6.1}/src/general_manager/manager/input.py +0 -0
  60. {generalmanager-0.5.2 → generalmanager-0.6.1}/src/general_manager/measurement/__init__.py +0 -0
  61. {generalmanager-0.5.2 → generalmanager-0.6.1}/src/general_manager/measurement/measurement.py +0 -0
  62. {generalmanager-0.5.2 → generalmanager-0.6.1}/src/general_manager/measurement/measurementField.py +0 -0
  63. {generalmanager-0.5.2 → generalmanager-0.6.1}/src/general_manager/permission/__init__.py +0 -0
  64. {generalmanager-0.5.2 → generalmanager-0.6.1}/src/general_manager/permission/managerBasedPermission.py +0 -0
  65. {generalmanager-0.5.2 → generalmanager-0.6.1}/src/general_manager/permission/permissionChecks.py +0 -0
  66. {generalmanager-0.5.2 → generalmanager-0.6.1}/src/general_manager/permission/permissionDataManager.py +0 -0
  67. {generalmanager-0.5.2 → generalmanager-0.6.1}/src/general_manager/rule/__init__.py +0 -0
  68. {generalmanager-0.5.2 → generalmanager-0.6.1}/src/general_manager/rule/handler.py +0 -0
  69. {generalmanager-0.5.2 → generalmanager-0.6.1}/src/general_manager/rule/rule.py +0 -0
  70. {generalmanager-0.5.2 → generalmanager-0.6.1}/tests/test_argsToKwargs.py +0 -0
  71. {generalmanager-0.5.2 → generalmanager-0.6.1}/tests/test_autoFactory.py +0 -0
  72. {generalmanager-0.5.2 → generalmanager-0.6.1}/tests/test_basePermission.py +0 -0
  73. {generalmanager-0.5.2 → generalmanager-0.6.1}/tests/test_cacheDecorator.py +0 -0
  74. {generalmanager-0.5.2 → generalmanager-0.6.1}/tests/test_cacheTracker.py +0 -0
  75. {generalmanager-0.5.2 → generalmanager-0.6.1}/tests/test_dependencyIndex.py +0 -0
  76. {generalmanager-0.5.2 → generalmanager-0.6.1}/tests/test_factories.py +0 -0
  77. {generalmanager-0.5.2 → generalmanager-0.6.1}/tests/test_factoryMethods.py +0 -0
  78. {generalmanager-0.5.2 → generalmanager-0.6.1}/tests/test_filterParser.py +0 -0
  79. {generalmanager-0.5.2 → generalmanager-0.6.1}/tests/test_graph_ql.py +0 -0
  80. {generalmanager-0.5.2 → generalmanager-0.6.1}/tests/test_input.py +0 -0
  81. {generalmanager-0.5.2 → generalmanager-0.6.1}/tests/test_jsonEncoder.py +0 -0
  82. {generalmanager-0.5.2 → generalmanager-0.6.1}/tests/test_makeCacheKey.py +0 -0
  83. {generalmanager-0.5.2 → generalmanager-0.6.1}/tests/test_managerBasedPermission.py +0 -0
  84. {generalmanager-0.5.2 → generalmanager-0.6.1}/tests/test_measurement.py +0 -0
  85. {generalmanager-0.5.2 → generalmanager-0.6.1}/tests/test_measurement_field.py +0 -0
  86. {generalmanager-0.5.2 → generalmanager-0.6.1}/tests/test_modelDependencyCollector.py +0 -0
  87. {generalmanager-0.5.2 → generalmanager-0.6.1}/tests/test_noneToZero.py +0 -0
  88. {generalmanager-0.5.2 → generalmanager-0.6.1}/tests/test_rule_handler.py +0 -0
  89. {generalmanager-0.5.2 → generalmanager-0.6.1}/tests/test_rules.py +0 -0
  90. {generalmanager-0.5.2 → generalmanager-0.6.1}/tests/test_settings.py +0 -0
  91. {generalmanager-0.5.2 → generalmanager-0.6.1}/tests/test_signals.py +0 -0
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: GeneralManager
3
- Version: 0.5.2
4
- Summary: Kurzbeschreibung deines Pakets
3
+ Version: 0.6.1
4
+ Summary: Modular Django-based data management framework with ORM, GraphQL, fine-grained permissions, rule validation, calculations and caching.
5
5
  Author-email: Tim Kleindick <tkleindick@yahoo.de>
6
6
  License-Expression: MIT
7
7
  Requires-Python: >=3.12
@@ -18,6 +18,10 @@ src/general_manager/auxiliary/jsonEncoder.py
18
18
  src/general_manager/auxiliary/makeCacheKey.py
19
19
  src/general_manager/auxiliary/noneToZero.py
20
20
  src/general_manager/auxiliary/pathMapping.py
21
+ src/general_manager/bucket/baseBucket.py
22
+ src/general_manager/bucket/calculationBucket.py
23
+ src/general_manager/bucket/databaseBucket.py
24
+ src/general_manager/bucket/groupBucket.py
21
25
  src/general_manager/cache/cacheDecorator.py
22
26
  src/general_manager/cache/cacheTracker.py
23
27
  src/general_manager/cache/dependencyIndex.py
@@ -30,7 +34,9 @@ src/general_manager/factory/factoryMethods.py
30
34
  src/general_manager/interface/__init__.py
31
35
  src/general_manager/interface/baseInterface.py
32
36
  src/general_manager/interface/calculationInterface.py
37
+ src/general_manager/interface/databaseBasedInterface.py
33
38
  src/general_manager/interface/databaseInterface.py
39
+ src/general_manager/interface/readOnlyInterface.py
34
40
  src/general_manager/manager/__init__.py
35
41
  src/general_manager/manager/generalManager.py
36
42
  src/general_manager/manager/groupManager.py
@@ -50,10 +56,15 @@ src/general_manager/rule/handler.py
50
56
  src/general_manager/rule/rule.py
51
57
  tests/test_argsToKwargs.py
52
58
  tests/test_autoFactory.py
59
+ tests/test_baseBucket.py
53
60
  tests/test_baseInterface.py
54
61
  tests/test_basePermission.py
55
62
  tests/test_cacheDecorator.py
56
63
  tests/test_cacheTracker.py
64
+ tests/test_calculationBucket.py
65
+ tests/test_calculationInterface.py
66
+ tests/test_databaseBasedInterface.py
67
+ tests/test_databaseBucket.py
57
68
  tests/test_dependencyIndex.py
58
69
  tests/test_factories.py
59
70
  tests/test_factoryMethods.py
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: GeneralManager
3
- Version: 0.5.2
4
- Summary: Kurzbeschreibung deines Pakets
3
+ Version: 0.6.1
4
+ Summary: Modular Django-based data management framework with ORM, GraphQL, fine-grained permissions, rule validation, calculations and caching.
5
5
  Author-email: Tim Kleindick <tkleindick@yahoo.de>
6
6
  License-Expression: MIT
7
7
  Requires-Python: >=3.12
@@ -1,18 +1,13 @@
1
1
  [build-system]
2
- requires = [
3
- "setuptools>=42",
4
- "wheel",
5
- ]
2
+ requires = ["setuptools>=42", "wheel"]
6
3
  build-backend = "setuptools.build_meta"
7
4
 
8
5
  [project]
9
6
  name = "GeneralManager"
10
- version = "0.5.2"
11
- description = "Kurzbeschreibung deines Pakets"
7
+ version = "0.6.1"
8
+ description = "Modular Django-based data management framework with ORM, GraphQL, fine-grained permissions, rule validation, calculations and caching."
12
9
  readme = "README.md"
13
- authors = [
14
- { name = "Tim Kleindick", email = "tkleindick@yahoo.de" },
15
- ]
10
+ authors = [{ name = "Tim Kleindick", email = "tkleindick@yahoo.de" }]
16
11
  license = "MIT"
17
12
  license-files = ["LICENSE"]
18
13
  requires-python = ">=3.12"
@@ -46,19 +41,16 @@ dependencies = [
46
41
  ]
47
42
 
48
43
  [tool.setuptools.packages.find]
49
- where = [
50
- "src",
51
- "general_manager",
52
- ]
44
+ where = ["src", "general_manager"]
53
45
 
54
46
  [tool.semantic_release]
55
- allow_zero_version = true
56
- major_on_zero = false
57
- version_toml = ["pyproject.toml:project.version"]
58
- branch = "main"
59
- build_command = "python -m build"
60
- upload_to_PyPI = true
61
- upload_to_release = true
47
+ allow_zero_version = true
48
+ major_on_zero = false
49
+ version_toml = ["pyproject.toml:project.version"]
50
+ branch = "main"
51
+ build_command = "python -m build"
52
+ upload_to_PyPI = true
53
+ upload_to_release = true
62
54
 
63
55
  [tool.semantic_release.remote]
64
56
  ignore_token_for_push = true
@@ -9,7 +9,8 @@ import json
9
9
  from general_manager.measurement.measurement import Measurement
10
10
  from general_manager.manager.generalManager import GeneralManagerMeta, GeneralManager
11
11
  from general_manager.api.property import GraphQLProperty
12
- from general_manager.interface.baseInterface import InterfaceBase, Bucket
12
+ from general_manager.bucket.baseBucket import Bucket
13
+ from general_manager.interface.baseInterface import InterfaceBase
13
14
 
14
15
  if TYPE_CHECKING:
15
16
  from general_manager.permission.basePermission import BasePermission
@@ -0,0 +1,240 @@
1
+ from __future__ import annotations
2
+ from abc import ABC, abstractmethod
3
+ from typing import (
4
+ Type,
5
+ Generator,
6
+ TYPE_CHECKING,
7
+ Any,
8
+ Generic,
9
+ TypeVar,
10
+ )
11
+
12
+ GeneralManagerType = TypeVar("GeneralManagerType", bound="GeneralManager")
13
+
14
+ if TYPE_CHECKING:
15
+ from general_manager.manager.generalManager import GeneralManager
16
+ from general_manager.manager.groupManager import GroupManager
17
+ from general_manager.bucket.groupBucket import GroupBucket
18
+
19
+
20
+ class Bucket(ABC, Generic[GeneralManagerType]):
21
+
22
+ def __init__(self, manager_class: Type[GeneralManagerType]):
23
+ """
24
+ Initializes the Bucket with a specified manager class.
25
+
26
+ Args:
27
+ manager_class: The class of manager objects this bucket will manage.
28
+ """
29
+ self._manager_class = manager_class
30
+ self._data = None
31
+ self.excludes = {}
32
+ self.filters = {}
33
+
34
+ def __eq__(self, other: object) -> bool:
35
+ """
36
+ Checks if this Bucket is equal to another by comparing class, data, and manager class.
37
+
38
+ Returns:
39
+ True if both objects are of the same class and have equal internal data and manager class; otherwise, False.
40
+ """
41
+ if not isinstance(other, self.__class__):
42
+ return False
43
+ return self._data == other._data and self._manager_class == other._manager_class
44
+
45
+ def __reduce__(self) -> str | tuple[Any, ...]:
46
+ """
47
+ Prepares the object for pickling by returning the class and initialization arguments.
48
+
49
+ Returns:
50
+ A tuple containing the class and a tuple of arguments needed to reconstruct the object during unpickling.
51
+ """
52
+ return (
53
+ self.__class__,
54
+ (None, self._manager_class, self.filters, self.excludes),
55
+ )
56
+
57
+ @abstractmethod
58
+ def __or__(
59
+ self, other: Bucket[GeneralManagerType] | GeneralManager[GeneralManagerType]
60
+ ) -> Bucket[GeneralManagerType]:
61
+ """
62
+ Returns a new bucket representing the union of this bucket and another bucket or manager instance.
63
+
64
+ Args:
65
+ other: Another bucket or a single manager instance to combine with this bucket.
66
+
67
+ Returns:
68
+ A new bucket containing all unique items from both sources.
69
+ """
70
+ raise NotImplementedError
71
+
72
+ @abstractmethod
73
+ def __iter__(
74
+ self,
75
+ ) -> Generator[GeneralManagerType | GroupManager[GeneralManagerType]]:
76
+ """
77
+ Returns an iterator over the items in the bucket.
78
+
79
+ Yields:
80
+ Instances of the managed type or group manager contained in the bucket.
81
+ """
82
+ raise NotImplementedError
83
+
84
+ @abstractmethod
85
+ def filter(self, **kwargs: Any) -> Bucket[GeneralManagerType]:
86
+ """
87
+ Returns a new bucket containing only items that match the specified filter criteria.
88
+
89
+ Args:
90
+ **kwargs: Field-value pairs used to filter items in the bucket.
91
+
92
+ Returns:
93
+ A new Bucket instance with items matching the given criteria.
94
+ """
95
+ raise NotImplementedError
96
+
97
+ @abstractmethod
98
+ def exclude(self, **kwargs: Any) -> Bucket[GeneralManagerType]:
99
+ """
100
+ Returns a new Bucket excluding items that match the specified criteria.
101
+
102
+ Args:
103
+ **kwargs: Field-value pairs specifying the exclusion criteria.
104
+
105
+ Returns:
106
+ A new Bucket instance with items matching the criteria excluded.
107
+ """
108
+ raise NotImplementedError
109
+
110
+ @abstractmethod
111
+ def first(self) -> GeneralManagerType | GroupManager[GeneralManagerType] | None:
112
+ """
113
+ Returns the first item in the bucket, or None if the bucket is empty.
114
+
115
+ Returns:
116
+ The first GeneralManager or GroupManager instance, or None if no items exist.
117
+ """
118
+ raise NotImplementedError
119
+
120
+ @abstractmethod
121
+ def last(self) -> GeneralManagerType | GroupManager[GeneralManagerType] | None:
122
+ """
123
+ Returns the last item in the bucket, or None if the bucket is empty.
124
+
125
+ Returns:
126
+ The last GeneralManager or GroupManager instance, or None if no items exist.
127
+ """
128
+ raise NotImplementedError
129
+
130
+ @abstractmethod
131
+ def count(self) -> int:
132
+ """
133
+ Returns the number of items in the bucket.
134
+
135
+ Subclasses must implement this method to provide the count of contained elements.
136
+ """
137
+ raise NotImplementedError
138
+
139
+ @abstractmethod
140
+ def all(self) -> Bucket[GeneralManagerType]:
141
+ """
142
+ Returns a bucket containing all items managed by this instance.
143
+
144
+ Subclasses must implement this method to provide access to the complete collection without filters or exclusions applied.
145
+ """
146
+ raise NotImplementedError
147
+
148
+ @abstractmethod
149
+ def get(
150
+ self, **kwargs: Any
151
+ ) -> GeneralManagerType | GroupManager[GeneralManagerType]:
152
+ """
153
+ Retrieves a single item matching the specified criteria.
154
+
155
+ Args:
156
+ **kwargs: Field-value pairs used to identify the item.
157
+
158
+ Returns:
159
+ The matching GeneralManager or GroupManager instance.
160
+
161
+ Raises:
162
+ NotImplementedError: If the method is not implemented by a subclass.
163
+ """
164
+ raise NotImplementedError
165
+
166
+ @abstractmethod
167
+ def __getitem__(
168
+ self, item: int | slice
169
+ ) -> (
170
+ GeneralManagerType
171
+ | GroupManager[GeneralManagerType]
172
+ | Bucket[GeneralManagerType]
173
+ ):
174
+ """
175
+ Retrieves an item or a slice from the bucket.
176
+
177
+ Args:
178
+ item: An integer index to retrieve a single element, or a slice to retrieve a subset.
179
+
180
+ Returns:
181
+ A single manager instance if an integer is provided, or a new Bucket containing the sliced elements if a slice is provided.
182
+
183
+ Raises:
184
+ NotImplementedError: This method must be implemented by subclasses.
185
+ """
186
+ raise NotImplementedError
187
+
188
+ @abstractmethod
189
+ def __len__(self) -> int:
190
+ """
191
+ Returns the number of items in the bucket.
192
+
193
+ Subclasses must implement this method to provide the count of contained elements.
194
+ """
195
+ raise NotImplementedError
196
+
197
+ @abstractmethod
198
+ def __contains__(self, item: GeneralManagerType) -> bool:
199
+ """
200
+ Checks whether the specified item is present in the bucket.
201
+
202
+ Args:
203
+ item: The manager instance to check for membership.
204
+
205
+ Returns:
206
+ True if the item is contained in the bucket, otherwise False.
207
+ """
208
+ raise NotImplementedError
209
+
210
+ @abstractmethod
211
+ def sort(
212
+ self,
213
+ key: tuple[str] | str,
214
+ reverse: bool = False,
215
+ ) -> Bucket[GeneralManagerType]:
216
+ """
217
+ Returns a new Bucket with items sorted by the specified key or keys.
218
+
219
+ Args:
220
+ key: A string or tuple of strings specifying the attribute(s) to sort by.
221
+ reverse: If True, sorts in descending order. Defaults to False.
222
+
223
+ Returns:
224
+ A new Bucket instance with items sorted according to the given key(s).
225
+ """
226
+ raise NotImplementedError
227
+
228
+ def group_by(self, *group_by_keys: str) -> GroupBucket[GeneralManagerType]:
229
+ """
230
+ Groups the bucket's data by one or more specified keys.
231
+
232
+ Args:
233
+ *group_by_keys: One or more attribute names to group the data by.
234
+
235
+ Returns:
236
+ A GroupBucket instance containing the grouped data.
237
+ """
238
+ from general_manager.bucket.groupBucket import GroupBucket
239
+
240
+ return GroupBucket(self._manager_class, group_by_keys, self)