GeneralManager 0.14.1__py3-none-any.whl → 0.15.0__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.
Files changed (62) hide show
  1. general_manager/__init__.py +49 -0
  2. general_manager/api/__init__.py +36 -0
  3. general_manager/api/graphql.py +92 -43
  4. general_manager/api/mutation.py +35 -10
  5. general_manager/api/property.py +26 -3
  6. general_manager/apps.py +23 -16
  7. general_manager/bucket/__init__.py +32 -0
  8. general_manager/bucket/baseBucket.py +76 -64
  9. general_manager/bucket/calculationBucket.py +188 -108
  10. general_manager/bucket/databaseBucket.py +130 -49
  11. general_manager/bucket/groupBucket.py +113 -60
  12. general_manager/cache/__init__.py +38 -0
  13. general_manager/cache/cacheDecorator.py +29 -17
  14. general_manager/cache/cacheTracker.py +34 -15
  15. general_manager/cache/dependencyIndex.py +117 -33
  16. general_manager/cache/modelDependencyCollector.py +17 -8
  17. general_manager/cache/signals.py +17 -6
  18. general_manager/factory/__init__.py +34 -5
  19. general_manager/factory/autoFactory.py +57 -60
  20. general_manager/factory/factories.py +39 -14
  21. general_manager/factory/factoryMethods.py +38 -1
  22. general_manager/interface/__init__.py +36 -0
  23. general_manager/interface/baseInterface.py +71 -27
  24. general_manager/interface/calculationInterface.py +18 -10
  25. general_manager/interface/databaseBasedInterface.py +102 -71
  26. general_manager/interface/databaseInterface.py +66 -20
  27. general_manager/interface/models.py +10 -4
  28. general_manager/interface/readOnlyInterface.py +44 -30
  29. general_manager/manager/__init__.py +36 -3
  30. general_manager/manager/generalManager.py +73 -47
  31. general_manager/manager/groupManager.py +72 -17
  32. general_manager/manager/input.py +23 -15
  33. general_manager/manager/meta.py +53 -53
  34. general_manager/measurement/__init__.py +37 -2
  35. general_manager/measurement/measurement.py +135 -58
  36. general_manager/measurement/measurementField.py +161 -61
  37. general_manager/permission/__init__.py +32 -1
  38. general_manager/permission/basePermission.py +29 -12
  39. general_manager/permission/managerBasedPermission.py +32 -26
  40. general_manager/permission/mutationPermission.py +32 -3
  41. general_manager/permission/permissionChecks.py +9 -1
  42. general_manager/permission/permissionDataManager.py +49 -15
  43. general_manager/permission/utils.py +14 -3
  44. general_manager/rule/__init__.py +27 -1
  45. general_manager/rule/handler.py +90 -5
  46. general_manager/rule/rule.py +40 -27
  47. general_manager/utils/__init__.py +44 -2
  48. general_manager/utils/argsToKwargs.py +17 -9
  49. general_manager/utils/filterParser.py +29 -30
  50. general_manager/utils/formatString.py +2 -0
  51. general_manager/utils/jsonEncoder.py +14 -1
  52. general_manager/utils/makeCacheKey.py +18 -12
  53. general_manager/utils/noneToZero.py +8 -6
  54. general_manager/utils/pathMapping.py +92 -29
  55. general_manager/utils/public_api.py +49 -0
  56. general_manager/utils/testing.py +135 -69
  57. {generalmanager-0.14.1.dist-info → generalmanager-0.15.0.dist-info}/METADATA +10 -2
  58. generalmanager-0.15.0.dist-info/RECORD +62 -0
  59. generalmanager-0.14.1.dist-info/RECORD +0 -58
  60. {generalmanager-0.14.1.dist-info → generalmanager-0.15.0.dist-info}/WHEEL +0 -0
  61. {generalmanager-0.14.1.dist-info → generalmanager-0.15.0.dist-info}/licenses/LICENSE +0 -0
  62. {generalmanager-0.14.1.dist-info → generalmanager-0.15.0.dist-info}/top_level.txt +0 -0
@@ -1,40 +1,41 @@
1
- from graphene_django.utils.testing import GraphQLTransactionTestCase
2
- from general_manager.apps import GeneralmanagerConfig
3
- from importlib import import_module
4
- from django.db import connection
5
- from django.conf import settings
6
- from typing import cast
7
- from django.db import models
8
- from general_manager.manager.generalManager import GeneralManager
9
- from general_manager.manager.meta import GeneralManagerMeta
10
- from general_manager.api.graphql import GraphQL
11
- from django.apps import apps as global_apps
12
- from contextlib import suppress
13
-
14
-
15
- from unittest.mock import ANY
16
- from general_manager.cache.cacheDecorator import _SENTINEL
1
+ """Test utilities for GeneralManager GraphQL integrations."""
17
2
 
3
+ from contextlib import suppress
4
+ from importlib import import_module
5
+ from typing import Any, Callable, cast
18
6
 
19
- from django.test import override_settings
7
+ from django.apps import AppConfig, apps as global_apps
8
+ from django.conf import settings
20
9
  from django.core.cache import caches
21
10
  from django.core.cache.backends.locmem import LocMemCache
11
+ from django.db import connection, models
12
+ from django.test import override_settings
13
+ from graphene_django.utils.testing import GraphQLTransactionTestCase # type: ignore[import]
14
+ from unittest.mock import ANY
15
+
16
+ from general_manager.api.graphql import GraphQL
17
+ from general_manager.apps import GeneralmanagerConfig
18
+ from general_manager.cache.cacheDecorator import _SENTINEL
19
+ from general_manager.manager.generalManager import GeneralManager
20
+ from general_manager.manager.meta import GeneralManagerMeta
22
21
 
23
- _original_get_app = global_apps.get_containing_app_config
22
+ _original_get_app: Callable[[str], AppConfig | None] = (
23
+ global_apps.get_containing_app_config
24
+ )
24
25
 
25
26
 
26
- def createFallbackGetApp(fallback_app: str):
27
+ def createFallbackGetApp(fallback_app: str) -> Callable[[str], AppConfig | None]:
27
28
  """
28
- Creates a fallback function for getting the app config, which returns the specified fallback app if the original lookup fails.
29
+ Create an app-config lookup that falls back to a specific Django app.
29
30
 
30
31
  Parameters:
31
- fallback_app (str): The name of the app to return if the original lookup fails.
32
+ fallback_app (str): App label used when the default lookup cannot resolve the object.
32
33
 
33
34
  Returns:
34
- function: A function that attempts to get the app config for a given object name, falling back to the specified app if not found.
35
+ Callable[[str], Any]: Function returning either the resolved configuration or the fallback app configuration when available.
35
36
  """
36
37
 
37
- def _fallback_get_app(object_name: str):
38
+ def _fallback_get_app(object_name: str) -> AppConfig | None:
38
39
  cfg = _original_get_app(object_name)
39
40
  if cfg is not None:
40
41
  return cfg
@@ -46,11 +47,14 @@ def createFallbackGetApp(fallback_app: str):
46
47
  return _fallback_get_app
47
48
 
48
49
 
49
- def _default_graphql_url_clear():
50
+ def _default_graphql_url_clear() -> None:
50
51
  """
51
- Removes the first URL pattern for the GraphQL view from the project's root URL configuration.
52
+ Remove the default GraphQL URL pattern from Django's root URL configuration.
53
+
54
+ The lookup searches for the first URL pattern whose view class is `GraphQLView` and removes it from the URL list.
52
55
 
53
- This function searches the root URL patterns for a pattern whose callback is a `GraphQLView` and removes it, effectively clearing the default GraphQL endpoint from the URL configuration.
56
+ Returns:
57
+ None
54
58
  """
55
59
  urlconf = import_module(settings.ROOT_URLCONF)
56
60
  for pattern in urlconf.urlpatterns:
@@ -69,22 +73,41 @@ class GMTestCaseMeta(type):
69
73
  then performs GM environment initialization, then super().setUpClass().
70
74
  """
71
75
 
72
- def __new__(mcs, name, bases, attrs):
76
+ def __new__(
77
+ mcs: type["GMTestCaseMeta"],
78
+ name: str,
79
+ bases: tuple[type, ...],
80
+ attrs: dict[str, object],
81
+ ) -> type:
73
82
  """
74
- Creates a new test case class with a customized setUpClass method for GeneralManager and GraphQL integration tests.
83
+ Construct a new test case class that wires GeneralManager-specific initialisation into `setUpClass`.
84
+
85
+ Parameters:
86
+ name (str): Name of the dynamically created test case class.
87
+ bases (tuple[type, ...]): Base classes that the new test case should inherit.
88
+ attrs (dict[str, Any]): Namespace containing class attributes, potentially including a custom `setUpClass`.
75
89
 
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.
90
+ Returns:
91
+ type: Newly constructed class with an augmented `setUpClass` implementation.
77
92
  """
78
93
  user_setup = attrs.get("setUpClass")
79
- fallback_app = attrs.get("fallback_app", "general_manager")
94
+ fallback_app = cast(str | None, attrs.get("fallback_app", "general_manager"))
80
95
  # MERKE dir das echte GraphQLTransactionTestCase.setUpClass
81
96
  base_setup = GraphQLTransactionTestCase.setUpClass
82
97
 
83
- def wrapped_setUpClass(cls):
98
+ def wrapped_setUpClass(
99
+ cls: type["GeneralManagerTransactionTestCase"],
100
+ ) -> None:
84
101
  """
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.
102
+ Prepare the test harness with GeneralManager-specific setup prior to executing tests.
103
+
104
+ The method resets GraphQL registries, configures optional fallback app lookups, synchronises database tables for managed models, and finally invokes the parent `setUpClass`.
105
+
106
+ Parameters:
107
+ cls (type[GeneralManagerTransactionTestCase]): Test case subclass whose environment is being initialised.
86
108
 
87
- Skips database table creation for any GeneralManager class lacking an `Interface` or `_model` attribute.
109
+ Returns:
110
+ None
88
111
  """
89
112
  GraphQL._query_class = None
90
113
  GraphQL._mutation_class = None
@@ -94,13 +117,21 @@ class GMTestCaseMeta(type):
94
117
  GraphQL.graphql_filter_type_registry = {}
95
118
 
96
119
  if fallback_app is not None:
97
- global_apps.get_containing_app_config = createFallbackGetApp(
98
- fallback_app
120
+ setattr(
121
+ global_apps,
122
+ "get_containing_app_config",
123
+ createFallbackGetApp(fallback_app),
99
124
  )
100
125
 
101
126
  # 1) user-defined setUpClass (if any)
102
127
  if user_setup:
103
- user_setup.__func__(cls)
128
+ if isinstance(user_setup, classmethod):
129
+ user_setup.__func__(cls)
130
+ else:
131
+ cast(
132
+ Callable[[type["GeneralManagerTransactionTestCase"]], None],
133
+ user_setup,
134
+ )(cls)
104
135
  # 2) clear URL patterns
105
136
  _default_graphql_url_clear()
106
137
  # 3) register models & create tables
@@ -131,38 +162,52 @@ class GMTestCaseMeta(type):
131
162
 
132
163
 
133
164
  class LoggingCache(LocMemCache):
134
- def __init__(self, *args, **kwargs):
165
+ """An in-memory cache backend that records its get and set operations."""
166
+
167
+ def __init__(self, location: str, params: dict[str, Any]) -> None:
168
+ """Initialise the cache backend and the operation log store."""
169
+ super().__init__(location, params)
170
+ self.ops: list[tuple[str, object, bool] | tuple[str, object]] = []
171
+
172
+ def get(
173
+ self,
174
+ key: str,
175
+ default: object = None,
176
+ version: int | None = None,
177
+ ) -> object:
135
178
  """
136
- Initialize the LoggingCache and set up an empty list to record cache operations.
137
- """
138
- super().__init__(*args, **kwargs)
139
- self.ops = []
140
-
141
- def get(self, key, default=None, version=None):
142
- """
143
- Retrieve a value from the cache and log whether it was a cache hit or miss.
179
+ Retrieve a value from the cache and record whether it was a hit or miss.
144
180
 
145
181
  Parameters:
146
- key (str): The cache key to retrieve.
147
- default: The value to return if the key is not found.
148
- version: Optional cache version.
182
+ key (str): Cache key identifying the stored value.
183
+ default (Any): Fallback returned when the key is absent.
184
+ version (int | None): Optional cache version used for the lookup.
149
185
 
150
186
  Returns:
151
- The cached value if found; otherwise, the default value.
187
+ Any: Cached value when present; otherwise, the provided default.
152
188
  """
153
189
  val = super().get(key, default)
154
190
  self.ops.append(("get", key, val is not _SENTINEL))
155
191
  return val
156
192
 
157
- def set(self, key, value, timeout=None, version=None):
193
+ def set(
194
+ self,
195
+ key: str,
196
+ value: object,
197
+ timeout: int | None = None,
198
+ version: int | None = None,
199
+ ) -> None:
158
200
  """
159
- Store a value in the cache and log the set operation.
201
+ Store a value in the cache and append the operation to the log.
160
202
 
161
203
  Parameters:
162
- key (str): The cache key to set.
163
- value (Any): The value to store in the cache.
164
- timeout (Optional[int]): The cache timeout in seconds.
165
- version (Optional[int]): The cache version (unused).
204
+ key (str): Cache key identifying the entry to write.
205
+ value (Any): Object stored under the given key.
206
+ timeout (int | None): Expiration time in seconds.
207
+ version (int | None): Optional cache version identifier.
208
+
209
+ Returns:
210
+ None
166
211
  """
167
212
  super().set(key, value, timeout)
168
213
  self.ops.append(("set", key))
@@ -185,15 +230,25 @@ class GeneralManagerTransactionTestCase(
185
230
 
186
231
  def setUp(self) -> None:
187
232
  """
188
- Prepares the test environment by replacing the default cache with a LoggingCache and resetting the cache operations log.
233
+ Prepare the test environment with a cache backend that records operations.
234
+
235
+ The method installs `LoggingCache` as the default cache and clears any previous operation history so tests can assert cache behaviour.
236
+
237
+ Returns:
238
+ None
189
239
  """
190
240
  super().setUp()
191
- setattr(caches._connections, "default", LoggingCache("test-cache", {})) # type: ignore
241
+ setattr(caches._connections, "default", LoggingCache("test-cache", {})) # type: ignore[attr-defined]
192
242
  self.__resetCacheCounter()
193
243
 
194
244
  @classmethod
195
245
  def tearDownClass(cls) -> None:
196
- """Clean up dynamic managers and restore patched globals."""
246
+ """
247
+ Remove dynamically registered managers and restore patched global state.
248
+
249
+ Returns:
250
+ None
251
+ """
197
252
  # remove GraphQL URL pattern added during setUpClass
198
253
  _default_graphql_url_clear()
199
254
 
@@ -244,18 +299,22 @@ class GeneralManagerTransactionTestCase(
244
299
  ]
245
300
 
246
301
  # reset fallback app lookup
247
- global_apps.get_containing_app_config = _original_get_app
302
+ setattr(global_apps, "get_containing_app_config", _original_get_app)
248
303
 
249
304
  super().tearDownClass()
250
305
 
251
306
  #
252
- def assertCacheMiss(self):
307
+ def assertCacheMiss(self) -> None:
253
308
  """
254
- Assert that a cache miss occurred, followed by a cache set operation.
309
+ Assert that a cache retrieval missed and was followed by a write.
255
310
 
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.
311
+ The expectation is a `get` operation returning no value and a subsequent `set` operation storing the computed result. The cache operation log is cleared afterwards.
312
+
313
+ Returns:
314
+ None
257
315
  """
258
- ops = getattr(caches["default"], "ops")
316
+ cache_backend = cast(LoggingCache, caches["default"])
317
+ ops = cache_backend.ops
259
318
  self.assertIn(
260
319
  ("get", ANY, False),
261
320
  ops,
@@ -264,13 +323,17 @@ class GeneralManagerTransactionTestCase(
264
323
  self.assertIn(("set", ANY), ops, "Cache.set should have stored the value")
265
324
  self.__resetCacheCounter()
266
325
 
267
- def assertCacheHit(self):
326
+ def assertCacheHit(self) -> None:
268
327
  """
269
- Assert that a cache get operation resulted in a cache hit and no cache set operation occurred.
328
+ Assert that a cache lookup succeeded without triggering a write.
329
+
330
+ The expectation is a `get` operation that returns a cached value and no recorded `set` operation. The cache operation log is cleared afterwards.
270
331
 
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.
332
+ Returns:
333
+ None
272
334
  """
273
- ops = getattr(caches["default"], "ops")
335
+ cache_backend = cast(LoggingCache, caches["default"])
336
+ ops = cache_backend.ops
274
337
  self.assertIn(
275
338
  ("get", ANY, True),
276
339
  ops,
@@ -284,8 +347,11 @@ class GeneralManagerTransactionTestCase(
284
347
  )
285
348
  self.__resetCacheCounter()
286
349
 
287
- def __resetCacheCounter(self):
350
+ def __resetCacheCounter(self) -> None:
288
351
  """
289
352
  Clear the log of cache operations recorded by the LoggingCache instance.
353
+
354
+ Returns:
355
+ None
290
356
  """
291
- caches["default"].ops = [] # type: ignore
357
+ cast(LoggingCache, caches["default"]).ops = []
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: GeneralManager
3
- Version: 0.14.1
3
+ Version: 0.15.0
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: MIT License
@@ -26,7 +26,9 @@ License: MIT License
26
26
  SOFTWARE.
27
27
  Classifier: License :: OSI Approved :: MIT License
28
28
  Classifier: Programming Language :: Python :: 3
29
+ Classifier: Programming Language :: Python :: 3 :: Only
29
30
  Classifier: Programming Language :: Python :: 3.12
31
+ Classifier: Programming Language :: Python :: 3.13
30
32
  Classifier: Framework :: Django
31
33
  Classifier: Intended Audience :: Developers
32
34
  Classifier: Operating System :: OS Independent
@@ -63,6 +65,12 @@ Dynamic: license-file
63
65
 
64
66
  # GeneralManager
65
67
 
68
+ [![PyPI](https://img.shields.io/pypi/v/GeneralManager.svg)](https://pypi.org/project/GeneralManager/)
69
+ [![Python](https://img.shields.io/pypi/pyversions/GeneralManager.svg)](https://pypi.org/project/GeneralManager/)
70
+ [![Build](https://github.com/TimKleindick/general_manager/actions/workflows/test.yml/badge.svg?branch=main)](https://github.com/TimKleindick/general_manager/actions/workflows/test.yml)
71
+ [![Coverage](https://img.shields.io/codecov/c/github/TimKleindick/general_manager)](https://app.codecov.io/gh/TimKleindick/general_manager)
72
+ [![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
73
+
66
74
  ## Overview
67
75
 
68
76
  GeneralManager is a powerful and flexible framework designed for managing and processing data. It provides a modular structure that enables developers to implement complex business logic efficiently. The module is written entirely in Python and uses Django as the backend framework.
@@ -202,4 +210,4 @@ query {
202
210
 
203
211
  ## License
204
212
 
205
- This project is distributed under the **Non-Commercial MIT License**. It may only be used for non-commercial purposes. For further details see the [LICENSE](./LICENSE) file.
213
+ This project is distributed under the **MIT License**. For further details see the [LICENSE](./LICENSE) file.
@@ -0,0 +1,62 @@
1
+ general_manager/__init__.py,sha256=eLtLAiM-uBx-zrYZYqriRBs4CBtBI1Id8O3GdLT4CVU,1486
2
+ general_manager/apps.py,sha256=On2nTp2-QwNcOpYfIzjNE0Xnum4BMk_5YHbEloBIM-U,10351
3
+ general_manager/api/__init__.py,sha256=p46Gsgkm6htz85mz-NvSwurWJqsngLvPfuLjNjcrOfc,971
4
+ general_manager/api/graphql.py,sha256=4pox3eRXWtZG9VshSgCJVrJ_9ONUUuzWhmXwetV5EgI,42798
5
+ general_manager/api/mutation.py,sha256=6T-UHElnTxWubG99-Svy7AeFlHuXaKc8nKvRPADmI0E,7347
6
+ general_manager/api/property.py,sha256=tT-eAKcuPhy0q_v0fKL4gPXcCVASC5M15_DYWMCQXjc,4358
7
+ general_manager/bucket/__init__.py,sha256=XEmEkXHgVWlJpMVLAgsWtXGrWC7CKz2dCCUMReGvrro,894
8
+ general_manager/bucket/baseBucket.py,sha256=wSQijZrs1joA-8IGh2AwD4KARSgYqSL4AxXq3KwOz6A,8126
9
+ general_manager/bucket/calculationBucket.py,sha256=nH2VATcS3z07LGpKiWUEf3CiYnPjNeJPYhYo6ZSBNqk,25996
10
+ general_manager/bucket/databaseBucket.py,sha256=5k0Q7iDJUgnOqQMg2SG35nM16C7_E5TzNMGJc0BVzXM,17127
11
+ general_manager/bucket/groupBucket.py,sha256=-cN9jA_AOsnrpwmjiy6jTB_TFoUqLMeM1SdJ6DlSXag,12103
12
+ general_manager/cache/__init__.py,sha256=DKqJ3yvm1_GDcteoLcgYCsJNiTFiDzWx1P4eKVsxky0,1186
13
+ general_manager/cache/cacheDecorator.py,sha256=kgUvJHcC8tilqf1JH2QvyG-158AT_rmuKf6pgUy1IBs,3406
14
+ general_manager/cache/cacheTracker.py,sha256=rb637hGHOe79sehpTZLhfO979qrYLw3ATufo7kr_VvM,2991
15
+ general_manager/cache/dependencyIndex.py,sha256=gaSbEpw9qdIMgf_5jRryuTAvq9x3hwMxP2bi5S4xj84,13206
16
+ general_manager/cache/modelDependencyCollector.py,sha256=iFiuuQKO3-sEcUxbpA1svxL2TMkr8F6afAtRXK5fUBk,2645
17
+ general_manager/cache/signals.py,sha256=pKibv1EL7fYL4KB7O13TpqVTKZLnqo6A620vKlXaNkg,2015
18
+ general_manager/factory/__init__.py,sha256=YSL7_YQ4tu-ljH0g6AKCFtFz7EAZ7kv320CozJLFXIo,933
19
+ general_manager/factory/autoFactory.py,sha256=j5jy5FASG8xhToE1yCwQ8c53XLsKBtPLFYPWS17K9Fk,8441
20
+ general_manager/factory/factories.py,sha256=7rmO7tIBDiBpRoXUbPleNHYuXs0owAMGcoOsFTKr3KA,8475
21
+ general_manager/factory/factoryMethods.py,sha256=gFHctepxvdNJKASuNvj5RrDCheIpBYQHh3D0n7OeIsM,5018
22
+ general_manager/interface/__init__.py,sha256=26nMPWnUN2iFXP-gcbkGrjtCHpNNjwj004hw9SML8wo,1007
23
+ general_manager/interface/baseInterface.py,sha256=Gg1r1rzgn2AM2IC4lDUg2Q5m8AwlX-c_9RVKgALeGa4,10797
24
+ general_manager/interface/calculationInterface.py,sha256=5xr4pnn3XNYXlEBgsI9YbSjCXBGeVA11x7pgicPqgW8,5079
25
+ general_manager/interface/databaseBasedInterface.py,sha256=lRAmjaTUHKk250S4F2WKe--52xvYiip3pfIrG1mfB-g,24096
26
+ general_manager/interface/databaseInterface.py,sha256=vDj2mgWnIrsvcu1_HBq018303WndhqUL0o2qnNsQ6hM,8356
27
+ general_manager/interface/models.py,sha256=rtuhOKeSgD2DboeZIMAQU99JyCOT7SuiuGqWvDjAQqk,3576
28
+ general_manager/interface/readOnlyInterface.py,sha256=UcaCClVJv8IT-EBm__IN4jU6td_sXRRCN_Y_OKngs_4,11392
29
+ general_manager/manager/__init__.py,sha256=KguPL7lFPShjJ1IeaEnLtrj4bs71cVvypB87N_i3tPs,988
30
+ general_manager/manager/generalManager.py,sha256=A6kYjM2duxT0AAeN0er87gRWjLmcPmEjPmNHTQgACgs,9577
31
+ general_manager/manager/groupManager.py,sha256=3Wl40cBRc1hL35zBCQDi8V2AIERh_dtbUeL1h1ZCnak,6428
32
+ general_manager/manager/input.py,sha256=UoVU0FDXHDEmuOk7mppx63DuwbPK2_qolcILar2Kk6U,3031
33
+ general_manager/manager/meta.py,sha256=iGYwuVrM0SWyvzVPLTS0typ8VT38QoxFuWhA1b1FBnA,5032
34
+ general_manager/measurement/__init__.py,sha256=90liIpMQ7lcPI7pYt_sgOAOBIRmS2yFi0dIvIgKvo-I,922
35
+ general_manager/measurement/measurement.py,sha256=FOtnOASNV6qhYsIsN-VX9JuGWwvpmJqusMgYxkEHhqE,16876
36
+ general_manager/measurement/measurementField.py,sha256=4W12etl4OukuQOf2K016KZ9K7LtzgEE1FEIW2jySzRM,13227
37
+ general_manager/permission/__init__.py,sha256=COPiaYkgSQ0FGeu7ncJ0z40I9sdgvUVOj9Lmz_3MazM,897
38
+ general_manager/permission/basePermission.py,sha256=Gv-6HkX_MXqm1RZxKvK_J-9cuSOEOYn5yYWAzL8PjlA,6728
39
+ general_manager/permission/fileBasedPermission.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
+ general_manager/permission/managerBasedPermission.py,sha256=KgTUl7_oDjCuQlPrgTkjoduA9w04TWAK1jWZ1T0PiwE,7795
41
+ general_manager/permission/mutationPermission.py,sha256=QuGpdX8lyM-_xxclYXXwDVxJ_WSEKvwLIJaFdtcmvSE,4197
42
+ general_manager/permission/permissionChecks.py,sha256=l09zokWPwZKUTlJOxtE5r_ZdPDDIDxGoAbydL4wHmII,2253
43
+ general_manager/permission/permissionDataManager.py,sha256=Jf5JiqKH4CdnxeNGqfB3NnkjL5qzERaYvj7qprw_05c,3190
44
+ general_manager/permission/utils.py,sha256=gnKSSiet5U5Zm9o7E5-QdN29tX_VX6sv82K5evGVzPk,1629
45
+ general_manager/rule/__init__.py,sha256=lVMv9kZMYQML6NVdtOBSWKQH3EkHsAA-dJDuuPGkSPg,657
46
+ general_manager/rule/handler.py,sha256=h85-Oazhc4gpWNl8ieR4pDEtu8a8lTeJcbiEj11C4Nw,11349
47
+ general_manager/rule/rule.py,sha256=uo1XT_5lN11t5AmFg5v5AsIC1-JkmqannQvAPHmyQXY,11303
48
+ general_manager/utils/__init__.py,sha256=jtFF_ygTnTgzpF07GdE6EcfLpJgAeIAbfAmLcLq7sLk,1443
49
+ general_manager/utils/argsToKwargs.py,sha256=XYIEgPBeIvJoNWeqmO6djRrqo3IcnPcoSUbfWrUByI0,1294
50
+ general_manager/utils/filterParser.py,sha256=6GzcpCzMRkmJkNs6SttJqS4DQHa_-nYheyhSWDrhIrg,5100
51
+ general_manager/utils/formatString.py,sha256=McmsBaB1DnA4YVKswXn5rqNRPHUEiX6dID69YBzfoh0,1511
52
+ general_manager/utils/jsonEncoder.py,sha256=Jw7iA50GEOjxk_AiebXJ9PNl_KijnvEOLG7oISZ07KE,1048
53
+ general_manager/utils/makeCacheKey.py,sha256=T9YTHDW8VN50iW_Yzklm9Xw-mp1Q7PKMphQ8lLKkqdA,1252
54
+ general_manager/utils/noneToZero.py,sha256=e3zk8Ofh3AsYW8spYmZWiv7FjOsr0jvfB9AOQbaPMWY,665
55
+ general_manager/utils/pathMapping.py,sha256=3BWRUM1EimUKeh8i_UK6nYsKtOJDykgmZgCA9dgYjqU,9531
56
+ general_manager/utils/public_api.py,sha256=SNTI_tRMcbv0qMttm-wMBoAEkqSEFMTI6ZHMajOnDlg,1437
57
+ general_manager/utils/testing.py,sha256=BCquJ5RNiLbRFdcrgYP227TxSRfQKgpkvmWvsJqJAjk,13276
58
+ generalmanager-0.15.0.dist-info/licenses/LICENSE,sha256=OezwCA4X2-xXmRDvMaqHvHCeUmGtyCYjZ8F3XUxSGwc,1069
59
+ generalmanager-0.15.0.dist-info/METADATA,sha256=Om4uQtLbEq_FZp1GRm4nkFvtSr30mO1-hoLwcXe5uZU,8359
60
+ generalmanager-0.15.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
61
+ generalmanager-0.15.0.dist-info/top_level.txt,sha256=sTDtExP9ga-YP3h3h42yivUY-A2Q23C2nw6LNKOho4I,16
62
+ generalmanager-0.15.0.dist-info/RECORD,,
@@ -1,58 +0,0 @@
1
- general_manager/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- general_manager/apps.py,sha256=9wmfr2jw9kzIx41fNByAUmte_67s3R_CEM90eX9jcao,10087
3
- general_manager/api/graphql.py,sha256=tcQPiUBfTsBSf5iqllPhFE1nMhFof6ql9m3tfxwLEEY,43016
4
- general_manager/api/mutation.py,sha256=ExUizC5EJ1u_CyXi-i8WTY0Qh3w4X6dr-0XUq_n1sgM,6978
5
- general_manager/api/property.py,sha256=6tLW7E74S57K3vUv1xWhxAqn2L_3qi73VhTNs9YbnKw,3104
6
- general_manager/bucket/baseBucket.py,sha256=RdEaUhbCVPGI9l9B3l9lC9Ma2pGjQx6NL1rlCEIPXEc,8243
7
- general_manager/bucket/calculationBucket.py,sha256=y8xIQLAIWPN6e7zO0__M2vP0ynOjrBLRrr2MzcVUBsc,24978
8
- general_manager/bucket/databaseBucket.py,sha256=n9JaJm6qrd18Y7IGK6x700Z30qtw35VH7zOf1O6nvOs,15007
9
- general_manager/bucket/groupBucket.py,sha256=CoXQoHtXcNa_KLnvUOMG1j1TcCNeenlIMb-ORrK08LQ,11381
10
- general_manager/cache/cacheDecorator.py,sha256=XQvs322lDDafecS6osPKmf7DyuZgDq8kuQaYpMeXXYg,3264
11
- general_manager/cache/cacheTracker.py,sha256=rRw3OhBDf86hTC2Xbt1ocRgZqwu8_kXk4lczamcADFg,2955
12
- general_manager/cache/dependencyIndex.py,sha256=lxD7IfnWVsBNt9l0_yDfJlHDRHAFC7N7p-Typ2tJp88,11044
13
- general_manager/cache/modelDependencyCollector.py,sha256=S4jzH7qLfqiTRAgqM-CnsC1f3YOgoKCEvMXnQu2R3Eo,2439
14
- general_manager/cache/signals.py,sha256=WolIvusPjGaIomOelYCmY6HyaiMyWLVAaQ1iF_D955g,2272
15
- general_manager/factory/__init__.py,sha256=wbPIGyBlWBHa7aGWUd-1IUMPWUS-M6YqtPUL1iKXW8U,93
16
- general_manager/factory/autoFactory.py,sha256=Lf3E9qi3mggIGK6ww_JxdZbK5BzWPWIEMvtFfNa3gUo,9776
17
- general_manager/factory/factories.py,sha256=cJEV79SRHNNqtBXgE0ix5KOxdAkmPmq_8YlwJ_IJ_CM,8295
18
- general_manager/factory/factoryMethods.py,sha256=9Bag891j0XHe3dUBAFi7gUKcKeUwcBZN3cDLBobyBiI,3225
19
- general_manager/interface/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
- general_manager/interface/baseInterface.py,sha256=DPBIljlmoOQqsKBf0jy-nC9RlrHz98tBru-iaibaDFc,9562
21
- general_manager/interface/calculationInterface.py,sha256=fTD3WQpsn3ImaxGW5S-JwVJyJJPoPp2mR6lAambdB8U,4755
22
- general_manager/interface/databaseBasedInterface.py,sha256=uB4_kJ1kNSK-QnUrFKR0zrDP-UulBKeeHIslXqEdU4Q,23058
23
- general_manager/interface/databaseInterface.py,sha256=NHXOJycY40pywzE1d_5Fi-pLVnmLR4OQwhAIHsgkM_g,7249
24
- general_manager/interface/models.py,sha256=iYuSTMWKGrH5cjmxTii8HRpSmUUMhtw6xvatRzB4zuA,3315
25
- general_manager/interface/readOnlyInterface.py,sha256=TkfbOeaa2wCq5kCv0a3IwJWcYOTVbtNsdNWmGAz0Mns,11217
26
- general_manager/manager/__init__.py,sha256=l3RYp62aEhj3Y975_XUTIzo35LUnkTJHkb_hgChnXXI,111
27
- general_manager/manager/generalManager.py,sha256=4Qn9TYpZpqh5qC95BEAQhpiZgDrRXrAJjO2BbbXUdNg,9129
28
- general_manager/manager/groupManager.py,sha256=8dpZUfm7aFL4lraUWv4qbbDRClQZaYxw4prclhBZYZs,4367
29
- general_manager/manager/input.py,sha256=-pJXGJ-g2-OxZfl4Buj3mQkf05fN4p8MsR2Lh9BQcEo,3208
30
- general_manager/manager/meta.py,sha256=-9celpo-oZmkTb8TnHfvcd_4XWTy1cn2UO-jp13NFmQ,6387
31
- general_manager/measurement/__init__.py,sha256=X97meFujBldE5v0WMF7SmKeGpC5R0JTczfLo_Lq1Xek,84
32
- general_manager/measurement/measurement.py,sha256=wrxwbmaKOUuvwyDa6wUZ5t2mF2mTtXdy6urzA7Q7k_M,16169
33
- general_manager/measurement/measurementField.py,sha256=hesh8YMQqBuX-thcMUcawHpQWEKUqRapn-3tbNgvoPA,11466
34
- general_manager/permission/__init__.py,sha256=5UlDERN60Vn8obGVkT-cOM8kHjzmoxgK5w5FgTCDhGE,59
35
- general_manager/permission/basePermission.py,sha256=DeiAX2sQQhtdquO13jys2MSkp0kPdg2oo7PSqB9q5Bw,5653
36
- general_manager/permission/fileBasedPermission.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
- general_manager/permission/managerBasedPermission.py,sha256=CANZu5sU-GhzoFdR87aJ0rX0_rC4a38nqV76IpzIPQQ,7893
38
- general_manager/permission/mutationPermission.py,sha256=qaawnyuqmnGKOcgkZuaCKK6rawEiVRxLdZbWEZFM1d4,3084
39
- general_manager/permission/permissionChecks.py,sha256=s4XBQtfWK_6_AByVRFbEE3_UD4rXU_9y58L5oeSPXLM,1876
40
- general_manager/permission/permissionDataManager.py,sha256=EzF-XKJZKvKdNpF77ATYJ_VXSF09L-HTFe8h8p-JdB4,1784
41
- general_manager/permission/utils.py,sha256=_cznQLk-wmK35pqs3dtgY6I94Ahyz_bTSmpkT0-MQnI,1277
42
- general_manager/rule/__init__.py,sha256=4Har5cfPD1fmOsilTDod-ZUz3Com-tkl58jz7yY4fD0,23
43
- general_manager/rule/handler.py,sha256=z8SFHTIZ0LbLh3fV56Mud0V4_OvWkqJjlHvFqau7Qfk,7334
44
- general_manager/rule/rule.py,sha256=3FVCKGL7BTVoStdgOTdWQwuoVRIxAIAilV4VOzouDpc,10759
45
- general_manager/utils/__init__.py,sha256=4IwKJzsNxGduF-Ej0u1BNHVaMhkql8PjHbVtx9DOTSY,76
46
- general_manager/utils/argsToKwargs.py,sha256=l_yJCan6UhwKpTBpIwG3FvOKXt4pJeD6rZuYP47U9Ss,892
47
- general_manager/utils/filterParser.py,sha256=wmR4YzsnYgjI2Co5eyvCFROldotAraHx_GiCDJo79IY,5410
48
- general_manager/utils/formatString.py,sha256=gZSbsKvpywBmf5bIx6YW43LmNJcqsCP7ZfrB7YPvaFo,1436
49
- general_manager/utils/jsonEncoder.py,sha256=TDsgFQvheITHZgdmn-m8tk1_QCzpT0XwEHo7bY3Qe-M,638
50
- general_manager/utils/makeCacheKey.py,sha256=UlFsxHXgsYy69AAelkF6GDvY4h7AImT2bBn6iD6dvi4,1110
51
- general_manager/utils/noneToZero.py,sha256=KfQtMQnrT6vsYST0K7lv6pVujkDcK3XL8czHYOhgqKQ,539
52
- general_manager/utils/pathMapping.py,sha256=pswtxZbvj4MdDN6o-y1qTjl6XFHvjDTe-H3NZyFTrPQ,6926
53
- general_manager/utils/testing.py,sha256=ElZ8p4iZHxsHjDN8Lm5TmI6527CW747ltDOmtY6gAhk,11872
54
- generalmanager-0.14.1.dist-info/licenses/LICENSE,sha256=OezwCA4X2-xXmRDvMaqHvHCeUmGtyCYjZ8F3XUxSGwc,1069
55
- generalmanager-0.14.1.dist-info/METADATA,sha256=MeVaDd1vot7gn7RxNVtaCjNbj28aVeAwDHuWW7Ke5O0,7696
56
- generalmanager-0.14.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
57
- generalmanager-0.14.1.dist-info/top_level.txt,sha256=sTDtExP9ga-YP3h3h42yivUY-A2Q23C2nw6LNKOho4I,16
58
- generalmanager-0.14.1.dist-info/RECORD,,