GeneralManager 0.10.3__py3-none-any.whl → 0.10.5__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 +5 -8
- general_manager/bucket/calculationBucket.py +8 -9
- general_manager/bucket/databaseBucket.py +18 -31
- 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/calculationInterface.py +23 -12
- 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
- {generalmanager-0.10.3.dist-info → generalmanager-0.10.5.dist-info}/METADATA +1 -1
- {generalmanager-0.10.3.dist-info → generalmanager-0.10.5.dist-info}/RECORD +19 -19
- {generalmanager-0.10.3.dist-info → generalmanager-0.10.5.dist-info}/WHEEL +0 -0
- {generalmanager-0.10.3.dist-info → generalmanager-0.10.5.dist-info}/licenses/LICENSE +0 -0
- {generalmanager-0.10.3.dist-info → generalmanager-0.10.5.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"
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: GeneralManager
|
3
|
-
Version: 0.10.
|
3
|
+
Version: 0.10.5
|
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=
|
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
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
13
|
general_manager/cache/modelDependencyCollector.py,sha256=S4jzH7qLfqiTRAgqM-CnsC1f3YOgoKCEvMXnQu2R3Eo,2439
|
14
|
-
general_manager/cache/signals.py,sha256=
|
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=
|
21
|
-
general_manager/interface/calculationInterface.py,sha256=
|
22
|
-
general_manager/interface/databaseBasedInterface.py,sha256=
|
20
|
+
general_manager/interface/baseInterface.py,sha256=cFsDU-nhj_O6Gir3eO0ukGKNn9Pplhe6gEMccHNi4O0,8648
|
21
|
+
general_manager/interface/calculationInterface.py,sha256=fTD3WQpsn3ImaxGW5S-JwVJyJJPoPp2mR6lAambdB8U,4755
|
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
|
@@ -49,8 +49,8 @@ general_manager/utils/makeCacheKey.py,sha256=UlFsxHXgsYy69AAelkF6GDvY4h7AImT2bBn
|
|
49
49
|
general_manager/utils/noneToZero.py,sha256=KfQtMQnrT6vsYST0K7lv6pVujkDcK3XL8czHYOhgqKQ,539
|
50
50
|
general_manager/utils/pathMapping.py,sha256=nrz5owQg2a69Yig1eCXorR9U0NSw7NmBAk5OkeoHTdA,6842
|
51
51
|
general_manager/utils/testing.py,sha256=ElZ8p4iZHxsHjDN8Lm5TmI6527CW747ltDOmtY6gAhk,11872
|
52
|
-
generalmanager-0.10.
|
53
|
-
generalmanager-0.10.
|
54
|
-
generalmanager-0.10.
|
55
|
-
generalmanager-0.10.
|
56
|
-
generalmanager-0.10.
|
52
|
+
generalmanager-0.10.5.dist-info/licenses/LICENSE,sha256=YGFm0ieb4KpkMRRt2qnWue6uFh0cUMtobwEBkHwajhc,1450
|
53
|
+
generalmanager-0.10.5.dist-info/METADATA,sha256=J4d2QlGnTmwb45tsUO0gGrcphQRym-xeRiJh-1-KwQA,6206
|
54
|
+
generalmanager-0.10.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
55
|
+
generalmanager-0.10.5.dist-info/top_level.txt,sha256=sTDtExP9ga-YP3h3h42yivUY-A2Q23C2nw6LNKOho4I,16
|
56
|
+
generalmanager-0.10.5.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|