GeneralManager 0.5.0__py3-none-any.whl → 0.5.2__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/interface/baseInterface.py +23 -10
- general_manager/interface/databaseInterface.py +8 -8
- general_manager/manager/groupManager.py +41 -26
- {generalmanager-0.5.0.dist-info → generalmanager-0.5.2.dist-info}/METADATA +42 -42
- {generalmanager-0.5.0.dist-info → generalmanager-0.5.2.dist-info}/RECORD +8 -8
- {generalmanager-0.5.0.dist-info → generalmanager-0.5.2.dist-info}/WHEEL +0 -0
- {generalmanager-0.5.0.dist-info → generalmanager-0.5.2.dist-info}/licenses/LICENSE +0 -0
- {generalmanager-0.5.0.dist-info → generalmanager-0.5.2.dist-info}/top_level.txt +0 -0
@@ -21,7 +21,7 @@ if TYPE_CHECKING:
|
|
21
21
|
from general_manager.manager.input import Input
|
22
22
|
from general_manager.manager.generalManager import GeneralManager
|
23
23
|
from general_manager.manager.meta import GeneralManagerMeta
|
24
|
-
from general_manager.manager.groupManager import
|
24
|
+
from general_manager.manager.groupManager import GroupManager, GroupBucket
|
25
25
|
|
26
26
|
|
27
27
|
GeneralManagerType = TypeVar("GeneralManagerType", bound="GeneralManager")
|
@@ -70,9 +70,17 @@ class InterfaceBase(ABC):
|
|
70
70
|
*args: Any,
|
71
71
|
**kwargs: dict[str, Any],
|
72
72
|
) -> dict[str, Any]:
|
73
|
+
"""
|
74
|
+
Parses and validates input arguments into a structured identification dictionary.
|
75
|
+
|
76
|
+
Converts positional and keyword arguments into a dictionary keyed by input field names, handling normalization of argument names and checking for unexpected or missing arguments. Processes input fields in dependency order, casting and validating each value. Raises a `TypeError` for unexpected or missing arguments and a `ValueError` if circular dependencies among input fields are detected.
|
77
|
+
|
78
|
+
Returns:
|
79
|
+
A dictionary mapping input field names to their validated and cast values.
|
80
|
+
"""
|
73
81
|
identification = {}
|
74
82
|
kwargs = args_to_kwargs(args, self.input_fields.keys(), kwargs)
|
75
|
-
#
|
83
|
+
# Check for extra arguments
|
76
84
|
extra_args = set(kwargs.keys()) - set(self.input_fields.keys())
|
77
85
|
if extra_args:
|
78
86
|
for extra_arg in extra_args:
|
@@ -85,7 +93,7 @@ class InterfaceBase(ABC):
|
|
85
93
|
if missing_args:
|
86
94
|
raise TypeError(f"Missing required arguments: {', '.join(missing_args)}")
|
87
95
|
|
88
|
-
#
|
96
|
+
# process input fields with dependencies
|
89
97
|
processed = set()
|
90
98
|
while len(processed) < len(self.input_fields):
|
91
99
|
progress_made = False
|
@@ -100,7 +108,7 @@ class InterfaceBase(ABC):
|
|
100
108
|
processed.add(name)
|
101
109
|
progress_made = True
|
102
110
|
if not progress_made:
|
103
|
-
#
|
111
|
+
# detect circular dependencies
|
104
112
|
unresolved = set(self.input_fields.keys()) - processed
|
105
113
|
raise ValueError(
|
106
114
|
f"Circular dependency detected among inputs: {', '.join(unresolved)}"
|
@@ -123,13 +131,18 @@ class InterfaceBase(ABC):
|
|
123
131
|
def _process_input(
|
124
132
|
self, name: str, value: Any, identification: dict[str, Any]
|
125
133
|
) -> None:
|
134
|
+
"""
|
135
|
+
Validates the type and allowed values of an input field.
|
136
|
+
|
137
|
+
Checks that the provided value matches the expected type for the input field and, in debug mode, verifies that the value is among the allowed possible values if specified. Raises a TypeError for invalid types or possible value definitions, and a ValueError if the value is not permitted.
|
138
|
+
"""
|
126
139
|
input_field = self.input_fields[name]
|
127
140
|
if not isinstance(value, input_field.type):
|
128
141
|
raise TypeError(
|
129
142
|
f"Invalid type for {name}: {type(value)}, expected: {input_field.type}"
|
130
143
|
)
|
131
144
|
if settings.DEBUG:
|
132
|
-
#
|
145
|
+
# `possible_values` can be a callable or an iterable
|
133
146
|
possible_values = input_field.possible_values
|
134
147
|
if possible_values is not None:
|
135
148
|
if callable(possible_values):
|
@@ -239,7 +252,7 @@ class Bucket(ABC, Generic[GeneralManagerType]):
|
|
239
252
|
@abstractmethod
|
240
253
|
def __iter__(
|
241
254
|
self,
|
242
|
-
) -> Generator[GeneralManagerType |
|
255
|
+
) -> Generator[GeneralManagerType | GroupManager[GeneralManagerType]]:
|
243
256
|
raise NotImplementedError
|
244
257
|
|
245
258
|
@abstractmethod
|
@@ -251,11 +264,11 @@ class Bucket(ABC, Generic[GeneralManagerType]):
|
|
251
264
|
raise NotImplementedError
|
252
265
|
|
253
266
|
@abstractmethod
|
254
|
-
def first(self) -> GeneralManagerType |
|
267
|
+
def first(self) -> GeneralManagerType | GroupManager[GeneralManagerType] | None:
|
255
268
|
raise NotImplementedError
|
256
269
|
|
257
270
|
@abstractmethod
|
258
|
-
def last(self) -> GeneralManagerType |
|
271
|
+
def last(self) -> GeneralManagerType | GroupManager[GeneralManagerType] | None:
|
259
272
|
raise NotImplementedError
|
260
273
|
|
261
274
|
@abstractmethod
|
@@ -269,7 +282,7 @@ class Bucket(ABC, Generic[GeneralManagerType]):
|
|
269
282
|
@abstractmethod
|
270
283
|
def get(
|
271
284
|
self, **kwargs: Any
|
272
|
-
) -> GeneralManagerType |
|
285
|
+
) -> GeneralManagerType | GroupManager[GeneralManagerType]:
|
273
286
|
raise NotImplementedError
|
274
287
|
|
275
288
|
@abstractmethod
|
@@ -277,7 +290,7 @@ class Bucket(ABC, Generic[GeneralManagerType]):
|
|
277
290
|
self, item: int | slice
|
278
291
|
) -> (
|
279
292
|
GeneralManagerType
|
280
|
-
|
|
293
|
+
| GroupManager[GeneralManagerType]
|
281
294
|
| Bucket[GeneralManagerType]
|
282
295
|
):
|
283
296
|
raise NotImplementedError
|
@@ -8,7 +8,6 @@ from typing import (
|
|
8
8
|
TYPE_CHECKING,
|
9
9
|
Generator,
|
10
10
|
TypeVar,
|
11
|
-
cast,
|
12
11
|
)
|
13
12
|
from django.db import models, transaction
|
14
13
|
from django.contrib.auth import get_user_model
|
@@ -646,13 +645,14 @@ class DatabaseBucket(Bucket[GeneralManagerType]):
|
|
646
645
|
self, basis: dict[str, list[Any]], **kwargs: Any
|
647
646
|
) -> dict[str, list[Any]]:
|
648
647
|
"""
|
649
|
-
|
648
|
+
Merges filter definitions by appending values from keyword arguments to the corresponding lists in the basis dictionary.
|
650
649
|
|
651
650
|
Args:
|
652
|
-
basis:
|
651
|
+
basis: A dictionary mapping filter keys to lists of values. Existing filter criteria.
|
652
|
+
**kwargs: Additional filter criteria to be merged, where each value is appended to the corresponding key's list.
|
653
653
|
|
654
654
|
Returns:
|
655
|
-
A dictionary
|
655
|
+
A dictionary with keys mapping to lists containing all values from both the original basis and the new keyword arguments.
|
656
656
|
"""
|
657
657
|
kwarg_filter: dict[str, list[Any]] = {}
|
658
658
|
for key, value in basis.items():
|
@@ -665,9 +665,9 @@ class DatabaseBucket(Bucket[GeneralManagerType]):
|
|
665
665
|
|
666
666
|
def filter(self, **kwargs: Any) -> DatabaseBucket[GeneralManagerType]:
|
667
667
|
"""
|
668
|
-
Returns a new bucket
|
668
|
+
Returns a new bucket containing manager instances matching the given filter criteria.
|
669
669
|
|
670
|
-
Additional filter keyword arguments are merged with
|
670
|
+
Additional filter keyword arguments are merged with existing filters to further restrict the queryset.
|
671
671
|
"""
|
672
672
|
merged_filter = self.__mergeFilterDefinitions(self.filters, **kwargs)
|
673
673
|
return self.__class__(
|
@@ -679,9 +679,9 @@ class DatabaseBucket(Bucket[GeneralManagerType]):
|
|
679
679
|
|
680
680
|
def exclude(self, **kwargs: Any) -> DatabaseBucket[GeneralManagerType]:
|
681
681
|
"""
|
682
|
-
Returns a new DatabaseBucket excluding items
|
682
|
+
Returns a new DatabaseBucket excluding items matching the given criteria.
|
683
683
|
|
684
|
-
Keyword arguments
|
684
|
+
Keyword arguments define field lookups to exclude from the queryset. The returned bucket contains only items that do not match these filters.
|
685
685
|
"""
|
686
686
|
merged_exclude = self.__mergeFilterDefinitions(self.excludes, **kwargs)
|
687
687
|
return self.__class__(
|
@@ -32,25 +32,37 @@ class GroupBucket(Bucket[GeneralManagerType]):
|
|
32
32
|
self._data = self.__buildGroupedManager(data)
|
33
33
|
self._basis_data = data
|
34
34
|
|
35
|
+
def __eq__(self, other: object) -> bool:
|
36
|
+
if not isinstance(other, self.__class__):
|
37
|
+
return False
|
38
|
+
return (
|
39
|
+
self._data == other._data
|
40
|
+
and self._manager_class == other._manager_class
|
41
|
+
and self._group_by_keys == other._group_by_keys
|
42
|
+
)
|
43
|
+
|
35
44
|
def __checkGroupByArguments(self, group_by_keys: tuple[str, ...]) -> None:
|
36
45
|
"""
|
37
|
-
|
38
|
-
|
46
|
+
Validates that all group-by keys are strings and valid attributes of the manager class.
|
47
|
+
|
48
|
+
Raises:
|
49
|
+
TypeError: If any group-by key is not a string.
|
50
|
+
ValueError: If any group-by key is not a valid attribute of the manager class.
|
39
51
|
"""
|
40
52
|
if not all(isinstance(arg, str) for arg in group_by_keys):
|
41
53
|
raise TypeError("groupBy() argument must be a string")
|
42
54
|
if not all(
|
43
|
-
arg in self._manager_class.Interface.getAttributes()
|
55
|
+
arg in self._manager_class.Interface.getAttributes()
|
44
56
|
for arg in group_by_keys
|
45
57
|
):
|
46
|
-
raise
|
58
|
+
raise ValueError(
|
47
59
|
f"groupBy() argument must be a valid attribute of {self._manager_class.__name__}"
|
48
60
|
)
|
49
61
|
|
50
62
|
def __buildGroupedManager(
|
51
63
|
self,
|
52
64
|
data: Bucket[GeneralManagerType],
|
53
|
-
) -> list[
|
65
|
+
) -> list[GroupManager[GeneralManagerType]]:
|
54
66
|
"""
|
55
67
|
This method builds the grouped manager.
|
56
68
|
It returns a GroupBucket with the grouped data.
|
@@ -63,11 +75,11 @@ class GroupBucket(Bucket[GeneralManagerType]):
|
|
63
75
|
group_by_values.add(json.dumps(group_by_value))
|
64
76
|
|
65
77
|
groups = []
|
66
|
-
for group_by_value in group_by_values:
|
78
|
+
for group_by_value in sorted(group_by_values):
|
67
79
|
group_by_value = json.loads(group_by_value)
|
68
80
|
grouped_manager_objects = data.filter(**group_by_value)
|
69
81
|
groups.append(
|
70
|
-
|
82
|
+
GroupManager(
|
71
83
|
self._manager_class, group_by_value, grouped_manager_objects
|
72
84
|
)
|
73
85
|
)
|
@@ -84,7 +96,7 @@ class GroupBucket(Bucket[GeneralManagerType]):
|
|
84
96
|
self._basis_data | other._basis_data,
|
85
97
|
)
|
86
98
|
|
87
|
-
def __iter__(self) -> Generator[
|
99
|
+
def __iter__(self) -> Generator[GroupManager[GeneralManagerType]]:
|
88
100
|
for grouped_manager in self._data:
|
89
101
|
yield grouped_manager
|
90
102
|
|
@@ -104,13 +116,13 @@ class GroupBucket(Bucket[GeneralManagerType]):
|
|
104
116
|
new_basis_data,
|
105
117
|
)
|
106
118
|
|
107
|
-
def first(self) ->
|
119
|
+
def first(self) -> GroupManager[GeneralManagerType] | None:
|
108
120
|
try:
|
109
121
|
return next(iter(self))
|
110
122
|
except StopIteration:
|
111
123
|
return None
|
112
124
|
|
113
|
-
def last(self) ->
|
125
|
+
def last(self) -> GroupManager[GeneralManagerType] | None:
|
114
126
|
items = list(self)
|
115
127
|
if items:
|
116
128
|
return items[-1]
|
@@ -122,7 +134,7 @@ class GroupBucket(Bucket[GeneralManagerType]):
|
|
122
134
|
def all(self) -> Bucket[GeneralManagerType]:
|
123
135
|
return self
|
124
136
|
|
125
|
-
def get(self, **kwargs: Any) ->
|
137
|
+
def get(self, **kwargs: Any) -> GroupManager[GeneralManagerType]:
|
126
138
|
first_value = self.filter(**kwargs).first()
|
127
139
|
if first_value is None:
|
128
140
|
raise ValueError(
|
@@ -132,7 +144,7 @@ class GroupBucket(Bucket[GeneralManagerType]):
|
|
132
144
|
|
133
145
|
def __getitem__(
|
134
146
|
self, item: int | slice
|
135
|
-
) ->
|
147
|
+
) -> GroupManager[GeneralManagerType] | GroupBucket[GeneralManagerType]:
|
136
148
|
if isinstance(item, int):
|
137
149
|
return self._data[item]
|
138
150
|
elif isinstance(item, slice):
|
@@ -162,12 +174,14 @@ class GroupBucket(Bucket[GeneralManagerType]):
|
|
162
174
|
if isinstance(key, str):
|
163
175
|
key = (key,)
|
164
176
|
if reverse:
|
165
|
-
sorted_data =
|
166
|
-
|
177
|
+
sorted_data = sorted(
|
178
|
+
self._data,
|
179
|
+
key=lambda x: tuple(getattr(x, k) for k in key),
|
180
|
+
reverse=True,
|
167
181
|
)
|
168
182
|
else:
|
169
|
-
sorted_data =
|
170
|
-
key=lambda x: tuple(
|
183
|
+
sorted_data = sorted(
|
184
|
+
self._data, key=lambda x: tuple(getattr(x, k) for k in key)
|
171
185
|
)
|
172
186
|
|
173
187
|
new_bucket = GroupBucket(
|
@@ -182,11 +196,13 @@ class GroupBucket(Bucket[GeneralManagerType]):
|
|
182
196
|
It returns a GroupBucket with the grouped data.
|
183
197
|
"""
|
184
198
|
return GroupBucket(
|
185
|
-
self._manager_class,
|
199
|
+
self._manager_class,
|
200
|
+
tuple([*self._group_by_keys, *group_by_keys]),
|
201
|
+
self._basis_data,
|
186
202
|
)
|
187
203
|
|
188
204
|
|
189
|
-
class
|
205
|
+
class GroupManager(Generic[GeneralManagerType]):
|
190
206
|
"""
|
191
207
|
This class is used to group the data of a GeneralManager.
|
192
208
|
It is used to create a new GeneralManager with the grouped data.
|
@@ -212,11 +228,6 @@ class GroupedManager(Generic[GeneralManagerType]):
|
|
212
228
|
and self._group_by_value == other._group_by_value
|
213
229
|
)
|
214
230
|
|
215
|
-
def __hash__(self) -> int:
|
216
|
-
return hash(
|
217
|
-
(self._manager_class, frozenset(self._group_by_value.items()), self._data)
|
218
|
-
)
|
219
|
-
|
220
231
|
def __repr__(self) -> str:
|
221
232
|
return f"{self.__class__.__name__}({self._manager_class}, {self._group_by_value}, {self._data})"
|
222
233
|
|
@@ -277,12 +288,16 @@ class GroupedManager(Generic[GeneralManagerType]):
|
|
277
288
|
for entry in total_data:
|
278
289
|
new_data.update(entry)
|
279
290
|
elif issubclass(data_type, str):
|
280
|
-
|
291
|
+
temp_data = []
|
292
|
+
for entry in total_data:
|
293
|
+
if entry not in temp_data:
|
294
|
+
temp_data.append(str(entry))
|
295
|
+
new_data = ", ".join(temp_data)
|
296
|
+
elif issubclass(data_type, bool):
|
297
|
+
new_data = any(total_data)
|
281
298
|
elif issubclass(data_type, (int, float, Measurement)):
|
282
299
|
new_data = sum(total_data)
|
283
300
|
elif issubclass(data_type, (datetime, date, time)):
|
284
301
|
new_data = max(total_data)
|
285
|
-
elif issubclass(data_type, bool):
|
286
|
-
new_data = any(total_data)
|
287
302
|
|
288
303
|
return new_data
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: GeneralManager
|
3
|
-
Version: 0.5.
|
3
|
+
Version: 0.5.2
|
4
4
|
Summary: Kurzbeschreibung deines Pakets
|
5
5
|
Author-email: Tim Kleindick <tkleindick@yahoo.de>
|
6
6
|
License-Expression: MIT
|
@@ -37,51 +37,51 @@ Dynamic: license-file
|
|
37
37
|
|
38
38
|
# GeneralManager
|
39
39
|
|
40
|
-
##
|
40
|
+
## Overview
|
41
41
|
|
42
|
-
|
42
|
+
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.
|
43
43
|
|
44
|
-
##
|
44
|
+
## Key Features
|
45
45
|
|
46
|
-
### 1. **
|
47
|
-
- **
|
48
|
-
- **
|
49
|
-
- **
|
46
|
+
### 1. **Data Management**
|
47
|
+
- **Flexibility**: Supports managing all kinds of data, not just projects and derivatives.
|
48
|
+
- **Database Integration**: Seamless integration with the Django ORM for database operations.
|
49
|
+
- **External Interfaces**: Support for interfaces to other programs, such as Excel.
|
50
50
|
|
51
|
-
### 2. **
|
52
|
-
- **Django
|
53
|
-
- **
|
51
|
+
### 2. **Data Modeling**
|
52
|
+
- **Django Models**: The data structure is based on Django models, extended by custom fields like `MeasurementField`.
|
53
|
+
- **Rules and Validations**: Define rules for data validation, e.g., ensuring that a project's start date is before its end date.
|
54
54
|
|
55
|
-
### 3. **GraphQL
|
56
|
-
-
|
57
|
-
-
|
55
|
+
### 3. **GraphQL Integration**
|
56
|
+
- Automatic generation of GraphQL interfaces for all models.
|
57
|
+
- Support for custom queries and mutations.
|
58
58
|
|
59
|
-
### 4. **
|
60
|
-
- **ManagerBasedPermission**:
|
61
|
-
-
|
59
|
+
### 4. **Permission System**
|
60
|
+
- **ManagerBasedPermission**: A flexible permission system based on user roles and attributes.
|
61
|
+
- Attribute-level CRUD permissions.
|
62
62
|
|
63
63
|
### 5. **Interfaces**
|
64
|
-
- **CalculationInterface**:
|
65
|
-
- **DatabaseInterface**:
|
66
|
-
- **ReadOnlyInterface**:
|
64
|
+
- **CalculationInterface**: Allows the implementation of calculation logic.
|
65
|
+
- **DatabaseInterface**: Provides a standardized interface for database operations.
|
66
|
+
- **ReadOnlyInterface**: For read-only data access.
|
67
67
|
|
68
|
-
### 6. **
|
69
|
-
- **
|
70
|
-
- **
|
68
|
+
### 6. **Data Distribution and Calculations**
|
69
|
+
- **Volume Distribution**: Automatically calculates and distributes volume over multiple years.
|
70
|
+
- **Commercial Calculations**: Calculates total volume, shipping costs, and revenue for projects.
|
71
71
|
|
72
|
-
##
|
72
|
+
## Usage
|
73
73
|
|
74
74
|
### Installation
|
75
75
|
|
76
|
-
|
76
|
+
Install the module via `pip`:
|
77
77
|
|
78
78
|
```bash
|
79
79
|
pip install GeneralManager
|
80
80
|
```
|
81
81
|
|
82
|
-
###
|
82
|
+
### Example Code
|
83
83
|
|
84
|
-
|
84
|
+
The following example demonstrates how to create a GeneralManager and generate sample data (in this case 10 projects):
|
85
85
|
|
86
86
|
```python
|
87
87
|
from general_manager import GeneralManager
|
@@ -134,11 +134,11 @@ class Project(GeneralManager):
|
|
134
134
|
Project.Factory.createBatch(10)
|
135
135
|
```
|
136
136
|
|
137
|
-
### GraphQL
|
137
|
+
### GraphQL Integration
|
138
138
|
|
139
|
-
|
139
|
+
The module automatically generates GraphQL endpoints for all models. You can run queries and mutations through the GraphQL URL defined in your Django settings.
|
140
140
|
|
141
|
-
|
141
|
+
Example of a GraphQL query:
|
142
142
|
|
143
143
|
```graphql
|
144
144
|
query {
|
@@ -154,26 +154,26 @@ query {
|
|
154
154
|
}
|
155
155
|
```
|
156
156
|
|
157
|
-
##
|
157
|
+
## Benefits
|
158
158
|
|
159
|
-
- **
|
160
|
-
- **
|
161
|
-
- **Integration**:
|
162
|
-
- **
|
163
|
-
- **
|
164
|
-
- **Caching**:
|
159
|
+
- **Modularity**: Easy to extend and adapt.
|
160
|
+
- **Flexibility**: Supports complex business logic and calculations.
|
161
|
+
- **Integration**: Seamless integration with Django and GraphQL.
|
162
|
+
- **Permissions**: Fine-grained permissions for users and attributes.
|
163
|
+
- **Data Validation**: Automatic validation of data through rules and constraints.
|
164
|
+
- **Caching**: Automatic cache generation with the `@cached` decorator to improve performance.
|
165
165
|
|
166
|
-
##
|
166
|
+
## Requirements
|
167
167
|
|
168
168
|
- Python >= 3.12
|
169
169
|
- Django >= 5.2
|
170
|
-
-
|
170
|
+
- Additional dependencies (see `requirements.txt`):
|
171
171
|
- `graphene`
|
172
172
|
- `numpy`
|
173
173
|
- `Pint`
|
174
174
|
- `factory_boy`
|
175
|
-
-
|
175
|
+
- and more.
|
176
176
|
|
177
|
-
##
|
177
|
+
## License
|
178
178
|
|
179
|
-
|
179
|
+
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.
|
@@ -20,12 +20,12 @@ general_manager/factory/autoFactory.py,sha256=WBhSuMVsxkPAPLhlZhYXwHVIqiomUveS7v
|
|
20
20
|
general_manager/factory/factories.py,sha256=F6_nYFyJRYYc3LQApfoVFdctfLzsWUDHKafn6xjckB8,7224
|
21
21
|
general_manager/factory/factoryMethods.py,sha256=9Bag891j0XHe3dUBAFi7gUKcKeUwcBZN3cDLBobyBiI,3225
|
22
22
|
general_manager/interface/__init__.py,sha256=6x5adQLefTugvrJeyPcAxstyqgLAYeaJ1EPdAbac9pE,213
|
23
|
-
general_manager/interface/baseInterface.py,sha256=
|
23
|
+
general_manager/interface/baseInterface.py,sha256=V8AzZ9CwswZAqc2aODmE_7DtqokOkOxzpXFVQ6qznMo,11271
|
24
24
|
general_manager/interface/calculationInterface.py,sha256=GzSNXjU6Z7bFz60gHyMKkI5xNUDIPuniV8wbyVtQT50,14250
|
25
|
-
general_manager/interface/databaseInterface.py,sha256=
|
25
|
+
general_manager/interface/databaseInterface.py,sha256=khzqoOcKrBSaYnZAdPmm9cdseNx4YdPRqx5B-81KGf4,28431
|
26
26
|
general_manager/manager/__init__.py,sha256=l3RYp62aEhj3Y975_XUTIzo35LUnkTJHkb_hgChnXXI,111
|
27
27
|
general_manager/manager/generalManager.py,sha256=L470Jevvh87doI5leUbTa9P6weIdekRZ6OTorqN-WpY,6091
|
28
|
-
general_manager/manager/groupManager.py,sha256=
|
28
|
+
general_manager/manager/groupManager.py,sha256=gT7cLq3d6PhsLfVGaIG5-fC7xnwN-4nT46N2WpnSesY,10588
|
29
29
|
general_manager/manager/input.py,sha256=iKawV3P1QICz-0AQUF00OvH7LZYxussg3svpvCUl8hE,2977
|
30
30
|
general_manager/manager/meta.py,sha256=Km4axFpDKI_Wx000dOok5jUwjJVqq5QJG9XhrWRw5mo,3624
|
31
31
|
general_manager/measurement/__init__.py,sha256=X97meFujBldE5v0WMF7SmKeGpC5R0JTczfLo_Lq1Xek,84
|
@@ -40,8 +40,8 @@ general_manager/permission/permissionDataManager.py,sha256=Ji7fsnuaKTa6M8yzCGyzr
|
|
40
40
|
general_manager/rule/__init__.py,sha256=4Har5cfPD1fmOsilTDod-ZUz3Com-tkl58jz7yY4fD0,23
|
41
41
|
general_manager/rule/handler.py,sha256=z8SFHTIZ0LbLh3fV56Mud0V4_OvWkqJjlHvFqau7Qfk,7334
|
42
42
|
general_manager/rule/rule.py,sha256=3FVCKGL7BTVoStdgOTdWQwuoVRIxAIAilV4VOzouDpc,10759
|
43
|
-
generalmanager-0.5.
|
44
|
-
generalmanager-0.5.
|
45
|
-
generalmanager-0.5.
|
46
|
-
generalmanager-0.5.
|
47
|
-
generalmanager-0.5.
|
43
|
+
generalmanager-0.5.2.dist-info/licenses/LICENSE,sha256=YGFm0ieb4KpkMRRt2qnWue6uFh0cUMtobwEBkHwajhc,1450
|
44
|
+
generalmanager-0.5.2.dist-info/METADATA,sha256=7fumKNtzVKr86HwflW_Sesa93yWWHXTJAyumR-TWDEU,6101
|
45
|
+
generalmanager-0.5.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
46
|
+
generalmanager-0.5.2.dist-info/top_level.txt,sha256=sTDtExP9ga-YP3h3h42yivUY-A2Q23C2nw6LNKOho4I,16
|
47
|
+
generalmanager-0.5.2.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|