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.
@@ -1,5 +1,5 @@
1
1
  from __future__ import annotations
2
- from typing import Generic, Type, Any, TYPE_CHECKING, TypeVar
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
- GeneralManager[GeneralManagerType, InterfaceType]
54
- | Bucket[GeneralManagerType]
55
- ),
56
- ) -> Bucket[GeneralManagerType]:
44
+ other: Self | Bucket[Self],
45
+ ) -> Bucket[Self]:
57
46
  """
58
- Combine this manager with another manager of the same class or a Bucket using the union operator.
47
+ Returns a Bucket containing the union of this manager and another manager of the same class or a Bucket.
59
48
 
60
- If combined with a Bucket, returns the union of the Bucket and this manager. If combined with another manager of the same class, returns a Bucket containing both instances. Raises a TypeError for unsupported types.
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[GeneralManagerType]: A Bucket containing the union of the involved managers.
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: dict[str, Any],
94
- ) -> GeneralManager[GeneralManagerType, InterfaceType]:
82
+ **kwargs: Any,
83
+ ) -> Self:
95
84
  """
96
- Creates a new managed object using the underlying interface and returns a corresponding manager instance.
85
+ Create a new managed object via the underlying interface and return a manager instance representing it.
97
86
 
98
- Performs a permission check if a `Permission` class is defined and permission checks are not ignored. Passes all provided arguments to the interface's `create` method.
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 identifier for the creator of the object.
102
- history_comment (str | None): Optional comment for audit or history tracking.
103
- ignore_permission (bool): If True, skips the permission check.
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
- GeneralManager[GeneralManagerType, InterfaceType]: A new manager instance for the created object.
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: dict[str, Any],
122
- ) -> GeneralManager[GeneralManagerType, InterfaceType]:
110
+ **kwargs: Any,
111
+ ) -> Self:
123
112
  """
124
- Update the underlying interface object with new data and return a new manager instance.
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): Optional identifier for the user performing the update.
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, skips permission checks.
130
- **kwargs: Additional fields to update on the interface object.
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
- GeneralManager[GeneralManagerType, InterfaceType]: A new manager instance reflecting the updated object.
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
- ) -> GeneralManager[GeneralManagerType, InterfaceType]:
139
+ ) -> Self:
151
140
  """
152
- Deactivates the underlying interface object and returns a new manager instance.
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 identifier for the user performing the deactivation.
156
- history_comment (str | None): Optional comment describing the reason for deactivation.
157
- ignore_permission (bool): If True, skips permission checks.
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
- GeneralManager[GeneralManagerType, InterfaceType]: A new instance representing the deactivated object.
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[GeneralManagerType]:
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[GeneralManagerType]:
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[GeneralManagerType]:
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
@@ -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[Any, ReadOnlyInterface]]] = []
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 specified attribute name.
74
-
75
- For each attribute, creates a descriptor that:
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
- - Invokes the attribute with the instance's interface if it is callable.
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
- Creates a property descriptor for an attribute, enabling dynamic access and callable resolution.
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, invoking it with the instance's interface if the value is callable. Raises `AttributeError` if the attribute is missing or if a callable attribute raises an exception.
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: GeneralManager[GeneralManagerType, InterfaceBase] | None,
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: list[Any],
23
- **kwargs: dict[str, Any],
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: dict[str, Any]
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"
@@ -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.2
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=dNzdcOTLs53y7JAGjQ7rqY1VWLtwO43NTTGJhbmbq1s,9906
3
- general_manager/api/graphql.py,sha256=ZMzlpgmyn2X9Zwxo12r-b5UZ2R-u1pXys_nhNczxyX8,31622
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=65oQbSE6C8TE0yVPP_Aoi_Fwq0Uo2TLVPWMG6l2qxyQ,7836
7
- general_manager/bucket/calculationBucket.py,sha256=7AjoqdTOrbUCfWu7kZDjtu7vaFFJ7SPHELvtOZ8wfQg,18578
8
- general_manager/bucket/databaseBucket.py,sha256=V_xiPa8ErnPHVh_-i-oaH8qCa818UJxm5CVl80SVc1U,9060
9
- general_manager/bucket/groupBucket.py,sha256=55QdUaH_qO1JFJ2Jc1f2WcxniiLE5LB3vNwbnksKk8A,10939
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=lIqBvo0QygoxxZPJ32_vMs_-eJaVJDznGyrEmxPV41E,2436
14
- general_manager/cache/signals.py,sha256=ZHeXKFMN7tj9t0J-vSqf_05_NhGqEF2sZtbZO3vaRqI,1234
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=WBhSuMVsxkPAPLhlZhYXwHVIqiomUveS7vMxw1ON_8Q,9376
17
- general_manager/factory/factories.py,sha256=F6_nYFyJRYYc3LQApfoVFdctfLzsWUDHKafn6xjckB8,7224
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=IWEtY--IuFiB3cjrCgtyXBTMpAPTayiFDnRQY7JZeaw,8600
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=fm5G-AVuTzAa59YwQRiFRGvy-DqsZZ3AfIBG9mls4sg,20398
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=jzLLAZTKgUOrzzOTXiWQsYj0FQk6Md8ggIQz0ie44qo,8793
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=EruJhpaYA1glWvb07HuTPAL919K3z7clU5_x2dG0ryA,5585
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=iq9Hqe6ZGX8CxXm4nIqTAWTRkQVptzpqE9ExX-jFyNs,5928
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=IdVvrgLuYIvHRgdSj_j9mC-damQ-2ivSJ7Ngguez5vo,9366
52
- generalmanager-0.10.2.dist-info/licenses/LICENSE,sha256=YGFm0ieb4KpkMRRt2qnWue6uFh0cUMtobwEBkHwajhc,1450
53
- generalmanager-0.10.2.dist-info/METADATA,sha256=HRmeeeiPsxm_UGNOm_-MfW7m94hKL4IIxkM_5_8oGAA,6206
54
- generalmanager-0.10.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
55
- generalmanager-0.10.2.dist-info/top_level.txt,sha256=sTDtExP9ga-YP3h3h42yivUY-A2Q23C2nw6LNKOho4I,16
56
- generalmanager-0.10.2.dist-info/RECORD,,
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,,