GeneralManager 0.10.2__py3-none-any.whl → 0.10.4__py3-none-any.whl
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.
- general_manager/api/graphql.py +31 -38
- general_manager/apps.py +6 -6
- general_manager/bucket/baseBucket.py +33 -31
- general_manager/bucket/calculationBucket.py +9 -10
- general_manager/bucket/databaseBucket.py +22 -28
- general_manager/bucket/groupBucket.py +1 -1
- general_manager/cache/modelDependencyCollector.py +6 -4
- general_manager/cache/signals.py +21 -9
- general_manager/factory/autoFactory.py +34 -34
- general_manager/factory/factories.py +73 -43
- general_manager/interface/baseInterface.py +3 -3
- general_manager/interface/databaseBasedInterface.py +63 -43
- general_manager/manager/generalManager.py +52 -42
- general_manager/manager/meta.py +19 -10
- general_manager/measurement/measurementField.py +19 -3
- general_manager/utils/testing.py +66 -7
- {generalmanager-0.10.2.dist-info → generalmanager-0.10.4.dist-info}/METADATA +1 -1
- {generalmanager-0.10.2.dist-info → generalmanager-0.10.4.dist-info}/RECORD +21 -21
- {generalmanager-0.10.2.dist-info → generalmanager-0.10.4.dist-info}/WHEEL +0 -0
- {generalmanager-0.10.2.dist-info → generalmanager-0.10.4.dist-info}/licenses/LICENSE +0 -0
- {generalmanager-0.10.2.dist-info → generalmanager-0.10.4.dist-info}/top_level.txt +0 -0
@@ -1,5 +1,5 @@
|
|
1
1
|
from __future__ import annotations
|
2
|
-
from typing import
|
2
|
+
from typing import Type, Any, TYPE_CHECKING, Self
|
3
3
|
from general_manager.manager.meta import GeneralManagerMeta
|
4
4
|
|
5
5
|
from general_manager.api.property import GraphQLProperty
|
@@ -9,17 +9,9 @@ from general_manager.bucket.baseBucket import Bucket
|
|
9
9
|
|
10
10
|
if TYPE_CHECKING:
|
11
11
|
from general_manager.permission.basePermission import BasePermission
|
12
|
-
from general_manager.interface.baseInterface import (
|
13
|
-
InterfaceBase,
|
14
|
-
)
|
15
|
-
GeneralManagerType = TypeVar("GeneralManagerType", bound="GeneralManager")
|
16
|
-
InterfaceType = TypeVar("InterfaceType", bound="InterfaceBase", covariant=True)
|
17
12
|
|
18
13
|
|
19
|
-
class GeneralManager(
|
20
|
-
Generic[GeneralManagerType, InterfaceType], metaclass=GeneralManagerMeta
|
21
|
-
):
|
22
|
-
Interface: Type[InterfaceType]
|
14
|
+
class GeneralManager(metaclass=GeneralManagerMeta):
|
23
15
|
Permission: Type[BasePermission]
|
24
16
|
_attributes: dict[str, Any]
|
25
17
|
|
@@ -49,18 +41,15 @@ class GeneralManager(
|
|
49
41
|
|
50
42
|
def __or__(
|
51
43
|
self,
|
52
|
-
other:
|
53
|
-
|
54
|
-
| Bucket[GeneralManagerType]
|
55
|
-
),
|
56
|
-
) -> Bucket[GeneralManagerType]:
|
44
|
+
other: Self | Bucket[Self],
|
45
|
+
) -> Bucket[Self]:
|
57
46
|
"""
|
58
|
-
|
47
|
+
Returns a Bucket containing the union of this manager and another manager of the same class or a Bucket.
|
59
48
|
|
60
|
-
If
|
49
|
+
If `other` is a Bucket, the result is the union of the Bucket and this manager. If `other` is a manager of the same class, the result is a Bucket containing both managers. Raises a TypeError if `other` is not a supported type.
|
61
50
|
|
62
51
|
Returns:
|
63
|
-
Bucket[
|
52
|
+
Bucket[Self]: A Bucket containing the combined managers.
|
64
53
|
"""
|
65
54
|
if isinstance(other, Bucket):
|
66
55
|
return other | self
|
@@ -90,20 +79,20 @@ class GeneralManager(
|
|
90
79
|
creator_id: int | None = None,
|
91
80
|
history_comment: str | None = None,
|
92
81
|
ignore_permission: bool = False,
|
93
|
-
**kwargs:
|
94
|
-
) ->
|
82
|
+
**kwargs: Any,
|
83
|
+
) -> Self:
|
95
84
|
"""
|
96
|
-
|
85
|
+
Create a new managed object via the underlying interface and return a manager instance representing it.
|
97
86
|
|
98
|
-
Performs a permission check
|
87
|
+
Performs a permission check unless `ignore_permission` is True. All additional keyword arguments are passed to the interface's `create` method.
|
99
88
|
|
100
89
|
Parameters:
|
101
|
-
creator_id (int | None): Optional
|
102
|
-
history_comment (str | None): Optional comment for audit or history
|
103
|
-
ignore_permission (bool): If True,
|
90
|
+
creator_id (int | None): Optional ID of the user creating the object.
|
91
|
+
history_comment (str | None): Optional comment for audit or history purposes.
|
92
|
+
ignore_permission (bool): If True, bypasses the permission check.
|
104
93
|
|
105
94
|
Returns:
|
106
|
-
|
95
|
+
Self: Manager instance for the newly created object.
|
107
96
|
"""
|
108
97
|
if not ignore_permission:
|
109
98
|
cls.Permission.checkCreatePermission(kwargs, cls, creator_id)
|
@@ -118,19 +107,19 @@ class GeneralManager(
|
|
118
107
|
creator_id: int | None = None,
|
119
108
|
history_comment: str | None = None,
|
120
109
|
ignore_permission: bool = False,
|
121
|
-
**kwargs:
|
122
|
-
) ->
|
110
|
+
**kwargs: Any,
|
111
|
+
) -> Self:
|
123
112
|
"""
|
124
|
-
Update the
|
113
|
+
Update the managed object with new data and return a new manager instance reflecting the changes.
|
125
114
|
|
126
115
|
Parameters:
|
127
|
-
creator_id (int | None):
|
116
|
+
creator_id (int | None): Identifier of the user performing the update, if applicable.
|
128
117
|
history_comment (str | None): Optional comment describing the update.
|
129
|
-
ignore_permission (bool): If True,
|
130
|
-
**kwargs:
|
118
|
+
ignore_permission (bool): If True, bypasses permission checks.
|
119
|
+
**kwargs: Fields and values to update on the managed object.
|
131
120
|
|
132
121
|
Returns:
|
133
|
-
|
122
|
+
Self: A new manager instance representing the updated object.
|
134
123
|
"""
|
135
124
|
if not ignore_permission:
|
136
125
|
self.Permission.checkUpdatePermission(kwargs, self, creator_id)
|
@@ -147,17 +136,17 @@ class GeneralManager(
|
|
147
136
|
creator_id: int | None = None,
|
148
137
|
history_comment: str | None = None,
|
149
138
|
ignore_permission: bool = False,
|
150
|
-
) ->
|
139
|
+
) -> Self:
|
151
140
|
"""
|
152
|
-
|
141
|
+
Deactivate the managed object and return a new manager instance representing its deactivated state.
|
153
142
|
|
154
143
|
Parameters:
|
155
|
-
creator_id (int | None): Optional
|
156
|
-
history_comment (str | None): Optional comment
|
157
|
-
ignore_permission (bool): If True,
|
144
|
+
creator_id (int | None): Optional ID of the user performing the deactivation.
|
145
|
+
history_comment (str | None): Optional comment explaining the deactivation.
|
146
|
+
ignore_permission (bool): If True, bypasses permission checks.
|
158
147
|
|
159
148
|
Returns:
|
160
|
-
|
149
|
+
Self: A new manager instance for the deactivated object.
|
161
150
|
"""
|
162
151
|
if not ignore_permission:
|
163
152
|
self.Permission.checkDeletePermission(self, creator_id)
|
@@ -167,21 +156,42 @@ class GeneralManager(
|
|
167
156
|
return self.__class__(**self.identification)
|
168
157
|
|
169
158
|
@classmethod
|
170
|
-
def filter(cls, **kwargs: Any) -> Bucket[
|
159
|
+
def filter(cls, **kwargs: Any) -> Bucket[Self]:
|
160
|
+
"""
|
161
|
+
Return a bucket of managed objects matching the specified filter criteria.
|
162
|
+
|
163
|
+
Parameters:
|
164
|
+
kwargs: Field lookups used to filter the managed objects.
|
165
|
+
|
166
|
+
Returns:
|
167
|
+
Bucket[Self]: A collection of manager instances matching the filter conditions.
|
168
|
+
"""
|
171
169
|
DependencyTracker.track(
|
172
170
|
cls.__name__, "filter", f"{cls.__parse_identification(kwargs)}"
|
173
171
|
)
|
174
172
|
return cls.Interface.filter(**kwargs)
|
175
173
|
|
176
174
|
@classmethod
|
177
|
-
def exclude(cls, **kwargs: Any) -> Bucket[
|
175
|
+
def exclude(cls, **kwargs: Any) -> Bucket[Self]:
|
176
|
+
"""
|
177
|
+
Return a bucket of managed objects excluding those that match the specified criteria.
|
178
|
+
|
179
|
+
Parameters:
|
180
|
+
kwargs: Field-value pairs used to determine which objects to exclude.
|
181
|
+
|
182
|
+
Returns:
|
183
|
+
Bucket[Self]: A collection of managed objects not matching the exclusion criteria.
|
184
|
+
"""
|
178
185
|
DependencyTracker.track(
|
179
186
|
cls.__name__, "exclude", f"{cls.__parse_identification(kwargs)}"
|
180
187
|
)
|
181
188
|
return cls.Interface.exclude(**kwargs)
|
182
189
|
|
183
190
|
@classmethod
|
184
|
-
def all(cls) -> Bucket[
|
191
|
+
def all(cls) -> Bucket[Self]:
|
192
|
+
"""
|
193
|
+
Return a bucket containing all managed objects of this class.
|
194
|
+
"""
|
185
195
|
return cls.Interface.filter()
|
186
196
|
|
187
197
|
@staticmethod
|
general_manager/manager/meta.py
CHANGED
@@ -18,7 +18,7 @@ class _nonExistent:
|
|
18
18
|
|
19
19
|
class GeneralManagerMeta(type):
|
20
20
|
all_classes: list[Type[GeneralManager]] = []
|
21
|
-
read_only_classes: list[Type[GeneralManager
|
21
|
+
read_only_classes: list[Type[GeneralManager]] = []
|
22
22
|
pending_graphql_interfaces: list[Type[GeneralManager]] = []
|
23
23
|
pending_attribute_initialization: list[Type[GeneralManager]] = []
|
24
24
|
Interface: type[InterfaceBase]
|
@@ -70,20 +70,24 @@ class GeneralManagerMeta(type):
|
|
70
70
|
attributes: Iterable[str], new_class: Type[GeneralManager]
|
71
71
|
):
|
72
72
|
"""
|
73
|
-
Dynamically assigns property descriptors to a class for each
|
74
|
-
|
75
|
-
For each attribute,
|
76
|
-
- Returns the field type from the class's interface when accessed on the class.
|
73
|
+
Dynamically creates and assigns property descriptors to a class for each given attribute name.
|
74
|
+
|
75
|
+
For each attribute, adds a property to the class that:
|
76
|
+
- Returns the field type from the class's interface when accessed on the class itself.
|
77
77
|
- Retrieves the value from the instance's `_attributes` dictionary when accessed on an instance.
|
78
|
-
-
|
78
|
+
- If the attribute value is callable, invokes it with the instance's interface and returns the result.
|
79
79
|
- Raises `AttributeError` if the attribute is missing or if an error occurs during callable invocation.
|
80
|
+
|
81
|
+
Parameters:
|
82
|
+
attributes (Iterable[str]): Names of attributes for which to create property descriptors.
|
83
|
+
new_class (Type[GeneralManager]): The class to which the properties will be added.
|
80
84
|
"""
|
81
85
|
|
82
86
|
def desciptorMethod(attr_name: str, new_class: type):
|
83
87
|
"""
|
84
|
-
|
85
|
-
|
86
|
-
When accessed on the class, returns the field type from the associated interface. When accessed on an instance, retrieves the attribute value from the instance's `_attributes` dictionary,
|
88
|
+
Create a property descriptor for dynamic attribute access and callable resolution.
|
89
|
+
|
90
|
+
When accessed on the class, returns the field type from the class's associated interface. When accessed on an instance, retrieves the attribute value from the instance's `_attributes` dictionary; if the value is callable, it is invoked with the instance's interface. Raises `AttributeError` if the attribute is missing or if a callable attribute raises an exception.
|
87
91
|
"""
|
88
92
|
|
89
93
|
class Descriptor(Generic[GeneralManagerType]):
|
@@ -93,9 +97,14 @@ class GeneralManagerMeta(type):
|
|
93
97
|
|
94
98
|
def __get__(
|
95
99
|
self,
|
96
|
-
instance:
|
100
|
+
instance: GeneralManagerType | None,
|
97
101
|
owner: type | None = None,
|
98
102
|
):
|
103
|
+
"""
|
104
|
+
Retrieve the value of a dynamically defined attribute from an instance or its interface.
|
105
|
+
|
106
|
+
When accessed on the class, returns the field type from the associated interface. When accessed on an instance, retrieves the attribute value from the instance's `_attributes` dictionary. If the attribute is callable, it is invoked with the instance's interface. Raises `AttributeError` if the attribute is missing or if a callable attribute raises an exception.
|
107
|
+
"""
|
99
108
|
if instance is None:
|
100
109
|
return self.new_class.Interface.getFieldType(self.attr_name)
|
101
110
|
attribute = instance._attributes.get(attr_name, _nonExistent)
|
@@ -19,9 +19,20 @@ class MeasurementField(models.Field): # type: ignore
|
|
19
19
|
null: bool = False,
|
20
20
|
blank: bool = False,
|
21
21
|
editable: bool = True,
|
22
|
-
*args:
|
23
|
-
**kwargs:
|
22
|
+
*args: Any,
|
23
|
+
**kwargs: Any,
|
24
24
|
):
|
25
|
+
"""
|
26
|
+
Initialize a MeasurementField to store values in a specified base unit and retain the original unit.
|
27
|
+
|
28
|
+
Parameters:
|
29
|
+
base_unit (str): The canonical unit in which values are stored (e.g., 'meter').
|
30
|
+
null (bool, optional): Whether the field allows NULL values.
|
31
|
+
blank (bool, optional): Whether the field allows blank values.
|
32
|
+
editable (bool, optional): Whether the field is editable in Django admin and forms.
|
33
|
+
|
34
|
+
The field internally manages a DecimalField for the value (in the base unit) and a CharField for the original unit.
|
35
|
+
"""
|
25
36
|
self.base_unit = base_unit # E.g., 'meter' for length units
|
26
37
|
# Determine the dimensionality of the base unit
|
27
38
|
self.base_dimension = ureg.parse_expression(self.base_unit).dimensionality
|
@@ -45,8 +56,13 @@ class MeasurementField(models.Field): # type: ignore
|
|
45
56
|
super().__init__(null=null, blank=blank, *args, **kwargs)
|
46
57
|
|
47
58
|
def contribute_to_class(
|
48
|
-
self, cls: type, name: str, private_only: bool = False, **kwargs:
|
59
|
+
self, cls: type, name: str, private_only: bool = False, **kwargs: Any
|
49
60
|
) -> None:
|
61
|
+
"""
|
62
|
+
Integrates the MeasurementField into the Django model class, setting up internal fields for value and unit storage.
|
63
|
+
|
64
|
+
This method assigns unique attribute names for the value and unit fields, attaches them to the model, and sets the descriptor for the custom field on the model class.
|
65
|
+
"""
|
50
66
|
self.name = name
|
51
67
|
self.value_attr = f"{name}_value"
|
52
68
|
self.unit_attr = f"{name}_unit"
|
general_manager/utils/testing.py
CHANGED
@@ -6,8 +6,10 @@ from django.conf import settings
|
|
6
6
|
from typing import cast
|
7
7
|
from django.db import models
|
8
8
|
from general_manager.manager.generalManager import GeneralManager
|
9
|
+
from general_manager.manager.meta import GeneralManagerMeta
|
9
10
|
from general_manager.api.graphql import GraphQL
|
10
11
|
from django.apps import apps as global_apps
|
12
|
+
from contextlib import suppress
|
11
13
|
|
12
14
|
|
13
15
|
from unittest.mock import ANY
|
@@ -70,7 +72,7 @@ class GMTestCaseMeta(type):
|
|
70
72
|
def __new__(mcs, name, bases, attrs):
|
71
73
|
"""
|
72
74
|
Creates a new test case class with a customized setUpClass method for GeneralManager and GraphQL integration tests.
|
73
|
-
|
75
|
+
|
74
76
|
The generated setUpClass ensures the test environment is properly initialized by resetting GraphQL registries, applying any user-defined setup, clearing default GraphQL URL patterns, creating missing database tables for specified GeneralManager models and their history, initializing GeneralManager and GraphQL configurations, and invoking the base GraphQLTransactionTestCase setup.
|
75
77
|
"""
|
76
78
|
user_setup = attrs.get("setUpClass")
|
@@ -81,7 +83,7 @@ class GMTestCaseMeta(type):
|
|
81
83
|
def wrapped_setUpClass(cls):
|
82
84
|
"""
|
83
85
|
Performs setup for a test case class by resetting GraphQL internals, configuring fallback app lookup, clearing default GraphQL URL patterns, ensuring database tables exist for specified GeneralManager models and their history, initializing GeneralManager and GraphQL configurations, and invoking the base test case setup.
|
84
|
-
|
86
|
+
|
85
87
|
Skips database table creation for any GeneralManager class lacking an `Interface` or `_model` attribute.
|
86
88
|
"""
|
87
89
|
GraphQL._query_class = None
|
@@ -139,12 +141,12 @@ class LoggingCache(LocMemCache):
|
|
139
141
|
def get(self, key, default=None, version=None):
|
140
142
|
"""
|
141
143
|
Retrieve a value from the cache and log whether it was a cache hit or miss.
|
142
|
-
|
144
|
+
|
143
145
|
Parameters:
|
144
146
|
key (str): The cache key to retrieve.
|
145
147
|
default: The value to return if the key is not found.
|
146
148
|
version: Optional cache version.
|
147
|
-
|
149
|
+
|
148
150
|
Returns:
|
149
151
|
The cached value if found; otherwise, the default value.
|
150
152
|
"""
|
@@ -155,7 +157,7 @@ class LoggingCache(LocMemCache):
|
|
155
157
|
def set(self, key, value, timeout=None, version=None):
|
156
158
|
"""
|
157
159
|
Store a value in the cache and log the set operation.
|
158
|
-
|
160
|
+
|
159
161
|
Parameters:
|
160
162
|
key (str): The cache key to set.
|
161
163
|
value (Any): The value to store in the cache.
|
@@ -189,11 +191,68 @@ class GeneralManagerTransactionTestCase(
|
|
189
191
|
setattr(caches._connections, "default", LoggingCache("test-cache", {})) # type: ignore
|
190
192
|
self.__resetCacheCounter()
|
191
193
|
|
194
|
+
@classmethod
|
195
|
+
def tearDownClass(cls) -> None:
|
196
|
+
"""Clean up dynamic managers and restore patched globals."""
|
197
|
+
# remove GraphQL URL pattern added during setUpClass
|
198
|
+
_default_graphql_url_clear()
|
199
|
+
|
200
|
+
# drop generated tables and unregister models from Django's app registry
|
201
|
+
existing = connection.introspection.table_names()
|
202
|
+
with connection.schema_editor() as editor:
|
203
|
+
for manager_class in cls.general_manager_classes:
|
204
|
+
interface = getattr(manager_class, "Interface", None)
|
205
|
+
model = getattr(interface, "_model", None)
|
206
|
+
if not model:
|
207
|
+
continue
|
208
|
+
model = cast(type[models.Model], model)
|
209
|
+
if model._meta.db_table in existing:
|
210
|
+
editor.delete_model(model)
|
211
|
+
history_model = getattr(model, "history", None)
|
212
|
+
if history_model and history_model.model._meta.db_table in existing:
|
213
|
+
editor.delete_model(history_model.model)
|
214
|
+
|
215
|
+
app_label = model._meta.app_label
|
216
|
+
model_key = model.__name__.lower()
|
217
|
+
global_apps.all_models[app_label].pop(model_key, None)
|
218
|
+
app_config = global_apps.get_app_config(app_label)
|
219
|
+
with suppress(LookupError):
|
220
|
+
app_config.models.pop(model_key, None)
|
221
|
+
if history_model:
|
222
|
+
hist_key = history_model.model.__name__.lower()
|
223
|
+
global_apps.all_models[app_label].pop(hist_key, None)
|
224
|
+
with suppress(LookupError):
|
225
|
+
app_config.models.pop(hist_key, None)
|
226
|
+
|
227
|
+
global_apps.clear_cache()
|
228
|
+
|
229
|
+
# remove classes from metaclass registries
|
230
|
+
GeneralManagerMeta.all_classes = [
|
231
|
+
gm
|
232
|
+
for gm in GeneralManagerMeta.all_classes
|
233
|
+
if gm not in cls.general_manager_classes
|
234
|
+
]
|
235
|
+
GeneralManagerMeta.pending_graphql_interfaces = [
|
236
|
+
gm
|
237
|
+
for gm in GeneralManagerMeta.pending_graphql_interfaces
|
238
|
+
if gm not in cls.general_manager_classes
|
239
|
+
]
|
240
|
+
GeneralManagerMeta.pending_attribute_initialization = [
|
241
|
+
gm
|
242
|
+
for gm in GeneralManagerMeta.pending_attribute_initialization
|
243
|
+
if gm not in cls.general_manager_classes
|
244
|
+
]
|
245
|
+
|
246
|
+
# reset fallback app lookup
|
247
|
+
global_apps.get_containing_app_config = _original_get_app
|
248
|
+
|
249
|
+
super().tearDownClass()
|
250
|
+
|
192
251
|
#
|
193
252
|
def assertCacheMiss(self):
|
194
253
|
"""
|
195
254
|
Assert that a cache miss occurred, followed by a cache set operation.
|
196
|
-
|
255
|
+
|
197
256
|
Checks that the cache's `get` method was called and did not find a value, and that the `set` method was subsequently called to store a value. Resets the cache operation log after the assertion.
|
198
257
|
"""
|
199
258
|
ops = getattr(caches["default"], "ops")
|
@@ -208,7 +267,7 @@ class GeneralManagerTransactionTestCase(
|
|
208
267
|
def assertCacheHit(self):
|
209
268
|
"""
|
210
269
|
Assert that a cache get operation resulted in a cache hit and no cache set operation occurred.
|
211
|
-
|
270
|
+
|
212
271
|
Raises an assertion error if the cache did not return a value for a get operation or if a set operation was performed. Resets the cache operation log after the check.
|
213
272
|
"""
|
214
273
|
ops = getattr(caches["default"], "ops")
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: GeneralManager
|
3
|
-
Version: 0.10.
|
3
|
+
Version: 0.10.4
|
4
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
|
@@ -1,36 +1,36 @@
|
|
1
1
|
general_manager/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
|
-
general_manager/apps.py,sha256=
|
3
|
-
general_manager/api/graphql.py,sha256=
|
2
|
+
general_manager/apps.py,sha256=ii-48klC2kBRjxtdQU9-RtPq66lZ8fDa7BmqyH-mbzk,9904
|
3
|
+
general_manager/api/graphql.py,sha256=N7UbhLA2RGfzE8GCt8Ld_sQ-yiQTxAAnO0Qt8nBLWlg,31171
|
4
4
|
general_manager/api/mutation.py,sha256=RvKp4OnV70q4Dqmu407Cd0FXgD12WdbRgzYCS4qd_bg,5990
|
5
5
|
general_manager/api/property.py,sha256=oc93p1P8dcIvrNorRuqD1EJVsd6eYttYhZuAS0s28gs,696
|
6
|
-
general_manager/bucket/baseBucket.py,sha256=
|
7
|
-
general_manager/bucket/calculationBucket.py,sha256=
|
8
|
-
general_manager/bucket/databaseBucket.py,sha256=
|
9
|
-
general_manager/bucket/groupBucket.py,sha256=
|
6
|
+
general_manager/bucket/baseBucket.py,sha256=UjEai7cVxgDJysoVY2-7s3YULW7bi-sx2mPqRKFWyTw,7728
|
7
|
+
general_manager/bucket/calculationBucket.py,sha256=a41YVdfhxKf_gpWlRKjXYmS1YuO-6VC0hn60RyLKByU,18777
|
8
|
+
general_manager/bucket/databaseBucket.py,sha256=Rfgh81BZoQk4Ng4DG34edf0CZP2SJrFy59sKpBR8VUM,9179
|
9
|
+
general_manager/bucket/groupBucket.py,sha256=PGmYh7cg9oC-wcY33krHVhwjpUvSH3slCamwvdT87H8,10951
|
10
10
|
general_manager/cache/cacheDecorator.py,sha256=XQvs322lDDafecS6osPKmf7DyuZgDq8kuQaYpMeXXYg,3264
|
11
11
|
general_manager/cache/cacheTracker.py,sha256=rRw3OhBDf86hTC2Xbt1ocRgZqwu8_kXk4lczamcADFg,2955
|
12
12
|
general_manager/cache/dependencyIndex.py,sha256=lxD7IfnWVsBNt9l0_yDfJlHDRHAFC7N7p-Typ2tJp88,11044
|
13
|
-
general_manager/cache/modelDependencyCollector.py,sha256=
|
14
|
-
general_manager/cache/signals.py,sha256=
|
13
|
+
general_manager/cache/modelDependencyCollector.py,sha256=S4jzH7qLfqiTRAgqM-CnsC1f3YOgoKCEvMXnQu2R3Eo,2439
|
14
|
+
general_manager/cache/signals.py,sha256=WolIvusPjGaIomOelYCmY6HyaiMyWLVAaQ1iF_D955g,2272
|
15
15
|
general_manager/factory/__init__.py,sha256=wbPIGyBlWBHa7aGWUd-1IUMPWUS-M6YqtPUL1iKXW8U,93
|
16
|
-
general_manager/factory/autoFactory.py,sha256=
|
17
|
-
general_manager/factory/factories.py,sha256=
|
16
|
+
general_manager/factory/autoFactory.py,sha256=Lf3E9qi3mggIGK6ww_JxdZbK5BzWPWIEMvtFfNa3gUo,9776
|
17
|
+
general_manager/factory/factories.py,sha256=cJEV79SRHNNqtBXgE0ix5KOxdAkmPmq_8YlwJ_IJ_CM,8295
|
18
18
|
general_manager/factory/factoryMethods.py,sha256=9Bag891j0XHe3dUBAFi7gUKcKeUwcBZN3cDLBobyBiI,3225
|
19
19
|
general_manager/interface/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
20
|
-
general_manager/interface/baseInterface.py,sha256=
|
20
|
+
general_manager/interface/baseInterface.py,sha256=cFsDU-nhj_O6Gir3eO0ukGKNn9Pplhe6gEMccHNi4O0,8648
|
21
21
|
general_manager/interface/calculationInterface.py,sha256=Kg_OqLw67tcLwdzYNLq31eKVLzkM7taw-8Mzmk0CYi0,4232
|
22
|
-
general_manager/interface/databaseBasedInterface.py,sha256=
|
22
|
+
general_manager/interface/databaseBasedInterface.py,sha256=_E4HoHmU8A_5_voSpeGp8AkiWbHGF3ZY1zO9phIezh8,21647
|
23
23
|
general_manager/interface/databaseInterface.py,sha256=rhKVXhg0ztdIxKikTWtgjrkA7cwZTOYlEsRh0RWajDQ,6732
|
24
24
|
general_manager/interface/models.py,sha256=gGYW5f1AUBpBakV3O0qsZwqMiWxZGdKRYXWaCBjt1oI,3334
|
25
25
|
general_manager/interface/readOnlyInterface.py,sha256=TkfbOeaa2wCq5kCv0a3IwJWcYOTVbtNsdNWmGAz0Mns,11217
|
26
26
|
general_manager/manager/__init__.py,sha256=l3RYp62aEhj3Y975_XUTIzo35LUnkTJHkb_hgChnXXI,111
|
27
|
-
general_manager/manager/generalManager.py,sha256=
|
27
|
+
general_manager/manager/generalManager.py,sha256=24eRdJW8BYPchYySxFNMywwk9LOhrab5Y4QiQWXZWT8,8730
|
28
28
|
general_manager/manager/groupManager.py,sha256=8dpZUfm7aFL4lraUWv4qbbDRClQZaYxw4prclhBZYZs,4367
|
29
29
|
general_manager/manager/input.py,sha256=-pJXGJ-g2-OxZfl4Buj3mQkf05fN4p8MsR2Lh9BQcEo,3208
|
30
|
-
general_manager/manager/meta.py,sha256
|
30
|
+
general_manager/manager/meta.py,sha256=-9celpo-oZmkTb8TnHfvcd_4XWTy1cn2UO-jp13NFmQ,6387
|
31
31
|
general_manager/measurement/__init__.py,sha256=X97meFujBldE5v0WMF7SmKeGpC5R0JTczfLo_Lq1Xek,84
|
32
32
|
general_manager/measurement/measurement.py,sha256=emd1z3IDClK7nrIrUL_JXPxNhJEq2HnXq6qNYv9ubcM,16090
|
33
|
-
general_manager/measurement/measurementField.py,sha256=
|
33
|
+
general_manager/measurement/measurementField.py,sha256=ixkZR_t--HGckK2iYi6sXOOa_Vbni4QRxK5Ngmy5YKc,6863
|
34
34
|
general_manager/permission/__init__.py,sha256=5UlDERN60Vn8obGVkT-cOM8kHjzmoxgK5w5FgTCDhGE,59
|
35
35
|
general_manager/permission/basePermission.py,sha256=14iKo6qVmaUdg1sAz-gSZyNtpVKAAapIhutVAMDf93c,6056
|
36
36
|
general_manager/permission/fileBasedPermission.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -48,9 +48,9 @@ general_manager/utils/jsonEncoder.py,sha256=TDsgFQvheITHZgdmn-m8tk1_QCzpT0XwEHo7
|
|
48
48
|
general_manager/utils/makeCacheKey.py,sha256=UlFsxHXgsYy69AAelkF6GDvY4h7AImT2bBn6iD6dvi4,1110
|
49
49
|
general_manager/utils/noneToZero.py,sha256=KfQtMQnrT6vsYST0K7lv6pVujkDcK3XL8czHYOhgqKQ,539
|
50
50
|
general_manager/utils/pathMapping.py,sha256=nrz5owQg2a69Yig1eCXorR9U0NSw7NmBAk5OkeoHTdA,6842
|
51
|
-
general_manager/utils/testing.py,sha256=
|
52
|
-
generalmanager-0.10.
|
53
|
-
generalmanager-0.10.
|
54
|
-
generalmanager-0.10.
|
55
|
-
generalmanager-0.10.
|
56
|
-
generalmanager-0.10.
|
51
|
+
general_manager/utils/testing.py,sha256=ElZ8p4iZHxsHjDN8Lm5TmI6527CW747ltDOmtY6gAhk,11872
|
52
|
+
generalmanager-0.10.4.dist-info/licenses/LICENSE,sha256=YGFm0ieb4KpkMRRt2qnWue6uFh0cUMtobwEBkHwajhc,1450
|
53
|
+
generalmanager-0.10.4.dist-info/METADATA,sha256=VC1eU13WK0cNkbOCrhOb7WK78u1E6ra_Xa71NsZ0TTA,6206
|
54
|
+
generalmanager-0.10.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
55
|
+
generalmanager-0.10.4.dist-info/top_level.txt,sha256=sTDtExP9ga-YP3h3h42yivUY-A2Q23C2nw6LNKOho4I,16
|
56
|
+
generalmanager-0.10.4.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|