GeneralManager 0.10.1__py3-none-any.whl → 0.10.3__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.
@@ -6,6 +6,7 @@ from general_manager.api.graphql import GraphQL
6
6
  from general_manager.manager.generalManager import GeneralManager
7
7
 
8
8
  from general_manager.utils.formatString import snake_to_camel
9
+ from typing import TypeAliasType
9
10
 
10
11
 
11
12
  def graphQlMutation(needs_role: Optional[str] = None, auth_required: bool = False):
@@ -56,15 +57,17 @@ def graphQlMutation(needs_role: Optional[str] = None, auth_required: bool = Fals
56
57
  required = False
57
58
  # extract inner type
58
59
  ann = [a for a in get_args(ann) if a is not type(None)][0]
60
+ kwargs["required"] = False
59
61
 
60
62
  # Resolve list types to List scalar
61
63
  if get_origin(ann) is list or get_origin(ann) is List:
62
64
  inner = get_args(ann)[0]
63
65
  field = graphene.List(
64
- GraphQL._mapFieldToGrapheneBaseType(inner)(**kwargs)
66
+ GraphQL._mapFieldToGrapheneBaseType(inner),
67
+ **kwargs,
65
68
  )
66
69
  else:
67
- if isinstance(ann, GeneralManager):
70
+ if inspect.isclass(ann) and issubclass(ann, GeneralManager):
68
71
  field = graphene.ID(**kwargs)
69
72
  else:
70
73
  field = GraphQL._mapFieldToGrapheneBaseType(ann)(**kwargs)
@@ -89,13 +92,20 @@ def graphQlMutation(needs_role: Optional[str] = None, auth_required: bool = Fals
89
92
  else [return_ann]
90
93
  )
91
94
  for out in out_types:
92
- if not isinstance(out, type):
95
+ is_named_type = isinstance(out, TypeAliasType)
96
+ is_type = isinstance(out, type)
97
+ if not is_type and not is_named_type:
93
98
  raise TypeError(
94
99
  f"Mutation {fn.__name__} return type {out} is not a type"
95
100
  )
96
101
  name = out.__name__
97
102
  field_name = name[0].lower() + name[1:]
98
- outputs[field_name] = GraphQL._mapFieldToGrapheneRead(out, field_name)
103
+
104
+ basis_type = out.__value__ if is_named_type else out
105
+
106
+ outputs[field_name] = GraphQL._mapFieldToGrapheneRead(
107
+ basis_type, field_name
108
+ )
99
109
 
100
110
  # Define mutate method
101
111
  def _mutate(root, info, **kwargs):
@@ -15,6 +15,7 @@ if TYPE_CHECKING:
15
15
  from general_manager.manager.generalManager import GeneralManager
16
16
  from general_manager.manager.groupManager import GroupManager
17
17
  from general_manager.bucket.groupBucket import GroupBucket
18
+ from general_manager.interface.baseInterface import InterfaceBase
18
19
 
19
20
 
20
21
  class Bucket(ABC, Generic[GeneralManagerType]):
@@ -22,7 +23,7 @@ class Bucket(ABC, Generic[GeneralManagerType]):
22
23
  def __init__(self, manager_class: Type[GeneralManagerType]):
23
24
  """
24
25
  Initializes the Bucket with a specified manager class.
25
-
26
+
26
27
  Args:
27
28
  manager_class: The class of manager objects this bucket will manage.
28
29
  """
@@ -34,7 +35,7 @@ class Bucket(ABC, Generic[GeneralManagerType]):
34
35
  def __eq__(self, other: object) -> bool:
35
36
  """
36
37
  Checks if this Bucket is equal to another by comparing class, data, and manager class.
37
-
38
+
38
39
  Returns:
39
40
  True if both objects are of the same class and have equal internal data and manager class; otherwise, False.
40
41
  """
@@ -45,7 +46,7 @@ class Bucket(ABC, Generic[GeneralManagerType]):
45
46
  def __reduce__(self) -> str | tuple[Any, ...]:
46
47
  """
47
48
  Prepares the object for pickling by returning the class and initialization arguments.
48
-
49
+
49
50
  Returns:
50
51
  A tuple containing the class and a tuple of arguments needed to reconstruct the object during unpickling.
51
52
  """
@@ -56,14 +57,18 @@ class Bucket(ABC, Generic[GeneralManagerType]):
56
57
 
57
58
  @abstractmethod
58
59
  def __or__(
59
- self, other: Bucket[GeneralManagerType] | GeneralManager[GeneralManagerType]
60
+ self,
61
+ other: (
62
+ Bucket[GeneralManagerType]
63
+ | GeneralManager[GeneralManagerType, InterfaceBase]
64
+ ),
60
65
  ) -> Bucket[GeneralManagerType]:
61
66
  """
62
67
  Returns a new bucket representing the union of this bucket and another bucket or manager instance.
63
-
68
+
64
69
  Args:
65
70
  other: Another bucket or a single manager instance to combine with this bucket.
66
-
71
+
67
72
  Returns:
68
73
  A new bucket containing all unique items from both sources.
69
74
  """
@@ -72,10 +77,10 @@ class Bucket(ABC, Generic[GeneralManagerType]):
72
77
  @abstractmethod
73
78
  def __iter__(
74
79
  self,
75
- ) -> Generator[GeneralManagerType | GroupManager[GeneralManagerType]]:
80
+ ) -> Generator[GeneralManagerType | GroupManager[GeneralManagerType], None, None]:
76
81
  """
77
82
  Returns an iterator over the items in the bucket.
78
-
83
+
79
84
  Yields:
80
85
  Instances of the managed type or group manager contained in the bucket.
81
86
  """
@@ -85,10 +90,10 @@ class Bucket(ABC, Generic[GeneralManagerType]):
85
90
  def filter(self, **kwargs: Any) -> Bucket[GeneralManagerType]:
86
91
  """
87
92
  Returns a new bucket containing only items that match the specified filter criteria.
88
-
93
+
89
94
  Args:
90
95
  **kwargs: Field-value pairs used to filter items in the bucket.
91
-
96
+
92
97
  Returns:
93
98
  A new Bucket instance with items matching the given criteria.
94
99
  """
@@ -98,10 +103,10 @@ class Bucket(ABC, Generic[GeneralManagerType]):
98
103
  def exclude(self, **kwargs: Any) -> Bucket[GeneralManagerType]:
99
104
  """
100
105
  Returns a new Bucket excluding items that match the specified criteria.
101
-
106
+
102
107
  Args:
103
108
  **kwargs: Field-value pairs specifying the exclusion criteria.
104
-
109
+
105
110
  Returns:
106
111
  A new Bucket instance with items matching the criteria excluded.
107
112
  """
@@ -111,7 +116,7 @@ class Bucket(ABC, Generic[GeneralManagerType]):
111
116
  def first(self) -> GeneralManagerType | GroupManager[GeneralManagerType] | None:
112
117
  """
113
118
  Returns the first item in the bucket, or None if the bucket is empty.
114
-
119
+
115
120
  Returns:
116
121
  The first GeneralManager or GroupManager instance, or None if no items exist.
117
122
  """
@@ -121,7 +126,7 @@ class Bucket(ABC, Generic[GeneralManagerType]):
121
126
  def last(self) -> GeneralManagerType | GroupManager[GeneralManagerType] | None:
122
127
  """
123
128
  Returns the last item in the bucket, or None if the bucket is empty.
124
-
129
+
125
130
  Returns:
126
131
  The last GeneralManager or GroupManager instance, or None if no items exist.
127
132
  """
@@ -131,7 +136,7 @@ class Bucket(ABC, Generic[GeneralManagerType]):
131
136
  def count(self) -> int:
132
137
  """
133
138
  Returns the number of items in the bucket.
134
-
139
+
135
140
  Subclasses must implement this method to provide the count of contained elements.
136
141
  """
137
142
  raise NotImplementedError
@@ -140,7 +145,7 @@ class Bucket(ABC, Generic[GeneralManagerType]):
140
145
  def all(self) -> Bucket[GeneralManagerType]:
141
146
  """
142
147
  Returns a bucket containing all items managed by this instance.
143
-
148
+
144
149
  Subclasses must implement this method to provide access to the complete collection without filters or exclusions applied.
145
150
  """
146
151
  raise NotImplementedError
@@ -151,13 +156,13 @@ class Bucket(ABC, Generic[GeneralManagerType]):
151
156
  ) -> GeneralManagerType | GroupManager[GeneralManagerType]:
152
157
  """
153
158
  Retrieves a single item matching the specified criteria.
154
-
159
+
155
160
  Args:
156
161
  **kwargs: Field-value pairs used to identify the item.
157
-
162
+
158
163
  Returns:
159
164
  The matching GeneralManager or GroupManager instance.
160
-
165
+
161
166
  Raises:
162
167
  NotImplementedError: If the method is not implemented by a subclass.
163
168
  """
@@ -173,13 +178,13 @@ class Bucket(ABC, Generic[GeneralManagerType]):
173
178
  ):
174
179
  """
175
180
  Retrieves an item or a slice from the bucket.
176
-
181
+
177
182
  Args:
178
183
  item: An integer index to retrieve a single element, or a slice to retrieve a subset.
179
-
184
+
180
185
  Returns:
181
186
  A single manager instance if an integer is provided, or a new Bucket containing the sliced elements if a slice is provided.
182
-
187
+
183
188
  Raises:
184
189
  NotImplementedError: This method must be implemented by subclasses.
185
190
  """
@@ -189,7 +194,7 @@ class Bucket(ABC, Generic[GeneralManagerType]):
189
194
  def __len__(self) -> int:
190
195
  """
191
196
  Returns the number of items in the bucket.
192
-
197
+
193
198
  Subclasses must implement this method to provide the count of contained elements.
194
199
  """
195
200
  raise NotImplementedError
@@ -198,12 +203,12 @@ class Bucket(ABC, Generic[GeneralManagerType]):
198
203
  def __contains__(self, item: GeneralManagerType) -> bool:
199
204
  """
200
205
  Checks whether the specified item is present in the bucket.
201
-
206
+
202
207
  Args:
203
- item: The manager instance to check for membership.
204
-
208
+ item: The manager instance to check for membership.
209
+
205
210
  Returns:
206
- True if the item is contained in the bucket, otherwise False.
211
+ True if the item is contained in the bucket, otherwise False.
207
212
  """
208
213
  raise NotImplementedError
209
214
 
@@ -215,11 +220,11 @@ class Bucket(ABC, Generic[GeneralManagerType]):
215
220
  ) -> Bucket[GeneralManagerType]:
216
221
  """
217
222
  Returns a new Bucket with items sorted by the specified key or keys.
218
-
223
+
219
224
  Args:
220
225
  key: A string or tuple of strings specifying the attribute(s) to sort by.
221
226
  reverse: If True, sorts in descending order. Defaults to False.
222
-
227
+
223
228
  Returns:
224
229
  A new Bucket instance with items sorted according to the given key(s).
225
230
  """
@@ -228,10 +233,10 @@ class Bucket(ABC, Generic[GeneralManagerType]):
228
233
  def group_by(self, *group_by_keys: str) -> GroupBucket[GeneralManagerType]:
229
234
  """
230
235
  Groups the bucket's data by one or more specified keys.
231
-
236
+
232
237
  Args:
233
238
  *group_by_keys: One or more attribute names to group the data by.
234
-
239
+
235
240
  Returns:
236
241
  A GroupBucket instance containing the grouped data.
237
242
  """
@@ -190,7 +190,7 @@ class CalculationBucket(Bucket[GeneralManagerType]):
190
190
  """
191
191
  return self
192
192
 
193
- def __iter__(self) -> Generator[GeneralManagerType]:
193
+ def __iter__(self) -> Generator[GeneralManagerType, None, None]:
194
194
  """
195
195
  Yields manager instances for each valid combination of input parameters.
196
196
 
@@ -4,6 +4,7 @@ from typing import (
4
4
  Any,
5
5
  Generator,
6
6
  TypeVar,
7
+ TYPE_CHECKING,
7
8
  )
8
9
  from django.db import models
9
10
  from general_manager.interface.baseInterface import (
@@ -15,6 +16,9 @@ from general_manager.manager.generalManager import GeneralManager
15
16
 
16
17
  modelsModel = TypeVar("modelsModel", bound=models.Model)
17
18
 
19
+ if TYPE_CHECKING:
20
+ from general_manager.interface.databaseInterface import DatabaseInterface
21
+
18
22
 
19
23
  class DatabaseBucket(Bucket[GeneralManagerType]):
20
24
 
@@ -40,7 +44,7 @@ class DatabaseBucket(Bucket[GeneralManagerType]):
40
44
  self.filters = {**(filter_definitions or {})}
41
45
  self.excludes = {**(exclude_definitions or {})}
42
46
 
43
- def __iter__(self) -> Generator[GeneralManagerType]:
47
+ def __iter__(self) -> Generator[GeneralManagerType, None, None]:
44
48
  """
45
49
  Yields manager instances for each item in the underlying queryset.
46
50
 
@@ -51,7 +55,10 @@ class DatabaseBucket(Bucket[GeneralManagerType]):
51
55
 
52
56
  def __or__(
53
57
  self,
54
- other: Bucket[GeneralManagerType] | GeneralManager[GeneralManagerType],
58
+ other: (
59
+ Bucket[GeneralManagerType]
60
+ | GeneralManager[GeneralManagerType, DatabaseInterface]
61
+ ),
55
62
  ) -> DatabaseBucket[GeneralManagerType]:
56
63
  """
57
64
  Combines this bucket with another bucket or manager instance using the union operator.
@@ -117,7 +117,7 @@ class GroupBucket(Bucket[GeneralManagerType]):
117
117
  self._basis_data | other._basis_data,
118
118
  )
119
119
 
120
- def __iter__(self) -> Generator[GroupManager[GeneralManagerType]]:
120
+ def __iter__(self) -> Generator[GroupManager[GeneralManagerType], None, None]:
121
121
  """
122
122
  Yields each grouped manager in the current GroupBucket.
123
123
 
@@ -11,15 +11,17 @@ from general_manager.cache.dependencyIndex import (
11
11
  class ModelDependencyCollector:
12
12
 
13
13
  @staticmethod
14
- def collect(obj) -> Generator[tuple[general_manager_name, filter_type, str]]:
14
+ def collect(
15
+ obj,
16
+ ) -> Generator[tuple[general_manager_name, filter_type, str], None, None]:
15
17
  """
16
18
  Recursively extracts dependency information from Django model-related objects.
17
-
19
+
18
20
  Inspects the input object and its nested structures to identify instances of GeneralManager and Bucket, yielding a tuple for each dependency found. Each tuple contains the manager class name, the dependency type ("identification", "filter", or "exclude"), and the string representation of the dependency value.
19
-
21
+
20
22
  Args:
21
23
  obj: The object or collection to inspect for model dependencies.
22
-
24
+
23
25
  Yields:
24
26
  Tuples of (manager class name, dependency type, dependency value) for each dependency discovered.
25
27
  """
@@ -1,14 +1,11 @@
1
1
  from __future__ import annotations
2
- from typing import Type, ClassVar, Any, Callable, TYPE_CHECKING, TypeVar, Generic
2
+ from typing import Type, Any, Callable, TYPE_CHECKING, TypeVar, Generic
3
3
  from django.db import models
4
- from django.conf import settings
5
4
  from datetime import datetime, timedelta
6
- from simple_history.models import HistoricalRecords # type: ignore
7
5
  from general_manager.measurement.measurement import Measurement
8
6
  from general_manager.measurement.measurementField import MeasurementField
9
7
  from decimal import Decimal
10
8
  from general_manager.factory.autoFactory import AutoFactory
11
- from django.core.exceptions import ValidationError
12
9
  from general_manager.interface.baseInterface import (
13
10
  InterfaceBase,
14
11
  classPostCreationMethod,
@@ -30,8 +27,6 @@ from general_manager.interface.models import (
30
27
  )
31
28
 
32
29
  if TYPE_CHECKING:
33
- from general_manager.manager.generalManager import GeneralManager
34
- from django.contrib.auth.models import AbstractUser
35
30
  from general_manager.rule.rule import Rule
36
31
 
37
32
  modelsModel = TypeVar("modelsModel", bound=models.Model)
@@ -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.1
3
+ Version: 0.10.3
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,16 +1,16 @@
1
1
  general_manager/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  general_manager/apps.py,sha256=dNzdcOTLs53y7JAGjQ7rqY1VWLtwO43NTTGJhbmbq1s,9906
3
3
  general_manager/api/graphql.py,sha256=ZMzlpgmyn2X9Zwxo12r-b5UZ2R-u1pXys_nhNczxyX8,31622
4
- general_manager/api/mutation.py,sha256=muoQxXFCSJl4CGWQ9sqmyt4WzHB9H4lqDc0Qgtpg7II,5653
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=eZZcSiOfmSz9AiGczO9qIkcKML0swWRoef7g_fqgiPo,7776
7
+ general_manager/bucket/calculationBucket.py,sha256=Ae1HauVFz_CwEAqR3TM9cK6C8uhGwG2DuY2A3UQJ-Go,18590
8
+ general_manager/bucket/databaseBucket.py,sha256=g34SdOW_fyFmYToXsD-bSGTAgQKECfGPe_XNWxrWfNY,9243
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
13
+ general_manager/cache/modelDependencyCollector.py,sha256=S4jzH7qLfqiTRAgqM-CnsC1f3YOgoKCEvMXnQu2R3Eo,2439
14
14
  general_manager/cache/signals.py,sha256=ZHeXKFMN7tj9t0J-vSqf_05_NhGqEF2sZtbZO3vaRqI,1234
15
15
  general_manager/factory/__init__.py,sha256=wbPIGyBlWBHa7aGWUd-1IUMPWUS-M6YqtPUL1iKXW8U,93
16
16
  general_manager/factory/autoFactory.py,sha256=WBhSuMVsxkPAPLhlZhYXwHVIqiomUveS7vMxw1ON_8Q,9376
@@ -19,7 +19,7 @@ general_manager/factory/factoryMethods.py,sha256=9Bag891j0XHe3dUBAFi7gUKcKeUwcBZ
19
19
  general_manager/interface/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
20
  general_manager/interface/baseInterface.py,sha256=IWEtY--IuFiB3cjrCgtyXBTMpAPTayiFDnRQY7JZeaw,8600
21
21
  general_manager/interface/calculationInterface.py,sha256=Kg_OqLw67tcLwdzYNLq31eKVLzkM7taw-8Mzmk0CYi0,4232
22
- general_manager/interface/databaseBasedInterface.py,sha256=OpKHpN509mcS86q3WgyAp7gQBwEqmA3BQPCFgF5q_Ig,20686
22
+ general_manager/interface/databaseBasedInterface.py,sha256=fm5G-AVuTzAa59YwQRiFRGvy-DqsZZ3AfIBG9mls4sg,20398
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
@@ -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.1.dist-info/licenses/LICENSE,sha256=YGFm0ieb4KpkMRRt2qnWue6uFh0cUMtobwEBkHwajhc,1450
53
- generalmanager-0.10.1.dist-info/METADATA,sha256=1s7xiuMN9uzioICRAl19thEixmRzZPtD70aYJ6psR-w,6206
54
- generalmanager-0.10.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
55
- generalmanager-0.10.1.dist-info/top_level.txt,sha256=sTDtExP9ga-YP3h3h42yivUY-A2Q23C2nw6LNKOho4I,16
56
- generalmanager-0.10.1.dist-info/RECORD,,
51
+ general_manager/utils/testing.py,sha256=ElZ8p4iZHxsHjDN8Lm5TmI6527CW747ltDOmtY6gAhk,11872
52
+ generalmanager-0.10.3.dist-info/licenses/LICENSE,sha256=YGFm0ieb4KpkMRRt2qnWue6uFh0cUMtobwEBkHwajhc,1450
53
+ generalmanager-0.10.3.dist-info/METADATA,sha256=nN3-3BbG3VNq_h5ONUpu4bmyNDslto9RxpSXbGW60so,6206
54
+ generalmanager-0.10.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
55
+ generalmanager-0.10.3.dist-info/top_level.txt,sha256=sTDtExP9ga-YP3h3h42yivUY-A2Q23C2nw6LNKOho4I,16
56
+ generalmanager-0.10.3.dist-info/RECORD,,