ramifice 0.8.13__py3-none-any.whl → 0.8.15__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.
- ramifice/commons/many.py +2 -2
- ramifice/commons/one.py +3 -3
- ramifice/commons/unit_manager.py +12 -8
- ramifice/fields/__init__.py +31 -0
- ramifice/fields/bool_field.py +1 -1
- ramifice/fields/choice_float_dyn_field.py +1 -1
- ramifice/fields/choice_float_field.py +1 -1
- ramifice/fields/choice_float_mult_dyn_field.py +1 -1
- ramifice/fields/choice_float_mult_field.py +1 -1
- ramifice/fields/choice_int_dyn_field.py +1 -1
- ramifice/fields/choice_int_field.py +1 -1
- ramifice/fields/choice_int_mult_dyn_field.py +1 -1
- ramifice/fields/choice_int_mult_field.py +1 -1
- ramifice/fields/choice_text_dyn_field.py +1 -1
- ramifice/fields/choice_text_field.py +1 -1
- ramifice/fields/choice_text_mult_dyn_field.py +1 -1
- ramifice/fields/choice_text_mult_field.py +1 -1
- ramifice/fields/color_field.py +1 -1
- ramifice/fields/date_field.py +1 -1
- ramifice/fields/date_time_field.py +1 -1
- ramifice/fields/email_field.py +1 -1
- ramifice/fields/file_field.py +1 -1
- ramifice/fields/float_field.py +1 -1
- ramifice/fields/id_field.py +1 -1
- ramifice/fields/image_field.py +1 -1
- ramifice/fields/integer_field.py +1 -1
- ramifice/fields/ip_field.py +1 -1
- ramifice/fields/password_field.py +1 -1
- ramifice/fields/phone_field.py +1 -1
- ramifice/fields/slug_field.py +1 -1
- ramifice/fields/text_field.py +1 -1
- ramifice/fields/url_field.py +1 -1
- ramifice/models/decorator.py +25 -27
- ramifice/paladins/check.py +1 -1
- ramifice/paladins/delete.py +5 -5
- ramifice/paladins/groups/__init__.py +13 -0
- ramifice/paladins/groups/slug_group.py +2 -2
- ramifice/paladins/password.py +3 -3
- ramifice/paladins/refrash.py +1 -1
- ramifice/paladins/save.py +3 -12
- ramifice/paladins/tools.py +2 -2
- ramifice/utils/errors.py +42 -5
- ramifice/utils/fixtures.py +2 -2
- ramifice/utils/migration.py +4 -4
- ramifice/utils/mixins/__init__.py +7 -0
- ramifice/utils/translations.py +1 -1
- ramifice/utils/unit.py +1 -1
- {ramifice-0.8.13.dist-info → ramifice-0.8.15.dist-info}/METADATA +7 -2
- ramifice-0.8.15.dist-info/RECORD +84 -0
- ramifice-0.8.13.dist-info/RECORD +0 -84
- {ramifice-0.8.13.dist-info → ramifice-0.8.15.dist-info}/WHEEL +0 -0
- {ramifice-0.8.13.dist-info → ramifice-0.8.15.dist-info}/licenses/LICENSE +0 -0
ramifice/commons/many.py
CHANGED
@@ -16,7 +16,7 @@ from ramifice.commons.tools import (
|
|
16
16
|
password_to_none,
|
17
17
|
)
|
18
18
|
from ramifice.utils import constants, translations
|
19
|
-
from ramifice.utils.errors import
|
19
|
+
from ramifice.utils.errors import ForbiddenDeleteDocError
|
20
20
|
|
21
21
|
logger = logging.getLogger(__name__)
|
22
22
|
|
@@ -251,7 +251,7 @@ class ManyMixin:
|
|
251
251
|
+ "Documents of this Model cannot be removed from the database!"
|
252
252
|
)
|
253
253
|
logger.error(msg)
|
254
|
-
raise
|
254
|
+
raise ForbiddenDeleteDocError(msg)
|
255
255
|
# Get collection for current model.
|
256
256
|
collection: AsyncCollection = constants.MONGO_DATABASE[cls.META["collection_name"]]
|
257
257
|
# Correcting filter.
|
ramifice/commons/one.py
CHANGED
@@ -14,7 +14,7 @@ from ramifice.commons.tools import (
|
|
14
14
|
password_to_none,
|
15
15
|
)
|
16
16
|
from ramifice.utils import constants, translations
|
17
|
-
from ramifice.utils.errors import
|
17
|
+
from ramifice.utils.errors import ForbiddenDeleteDocError
|
18
18
|
|
19
19
|
logger = logging.getLogger(__name__)
|
20
20
|
|
@@ -133,7 +133,7 @@ class OneMixin:
|
|
133
133
|
+ "Documents of this Model cannot be removed from the database!"
|
134
134
|
)
|
135
135
|
logger.error(msg)
|
136
|
-
raise
|
136
|
+
raise ForbiddenDeleteDocError(msg)
|
137
137
|
# Get collection for current model.
|
138
138
|
collection: AsyncCollection = constants.MONGO_DATABASE[cls.META["collection_name"]]
|
139
139
|
# Correcting filter.
|
@@ -171,7 +171,7 @@ class OneMixin:
|
|
171
171
|
+ "Documents of this Model cannot be removed from the database!"
|
172
172
|
)
|
173
173
|
logger.error(msg)
|
174
|
-
raise
|
174
|
+
raise ForbiddenDeleteDocError(msg)
|
175
175
|
# Get collection for current model.
|
176
176
|
collection: AsyncCollection = constants.MONGO_DATABASE[cls.META["collection_name"]]
|
177
177
|
# Correcting filter.
|
ramifice/commons/unit_manager.py
CHANGED
@@ -11,7 +11,11 @@ from typing import Any
|
|
11
11
|
from pymongo.asynchronous.collection import AsyncCollection
|
12
12
|
|
13
13
|
from ramifice.utils import constants, translations
|
14
|
-
from ramifice.utils.errors import
|
14
|
+
from ramifice.utils.errors import (
|
15
|
+
NotPossibleAddUnitError,
|
16
|
+
NotPossibleDeleteUnitError,
|
17
|
+
PanicError,
|
18
|
+
)
|
15
19
|
from ramifice.utils.unit import Unit
|
16
20
|
|
17
21
|
logger = logging.getLogger(__name__)
|
@@ -41,7 +45,7 @@ class UnitMixin:
|
|
41
45
|
# Check the presence of a Model state.
|
42
46
|
if model_state is None:
|
43
47
|
msg = "Error: Model State - Not found!"
|
44
|
-
logger.
|
48
|
+
logger.critical(msg)
|
45
49
|
raise PanicError(msg)
|
46
50
|
# Get language list.
|
47
51
|
lang_list = translations.LANGUAGES
|
@@ -50,7 +54,7 @@ class UnitMixin:
|
|
50
54
|
title = unit.title
|
51
55
|
if len(title) != len(lang_list):
|
52
56
|
msg = "Unit.title => There are no translations for some languages!"
|
53
|
-
logger.
|
57
|
+
logger.critical(msg)
|
54
58
|
raise PanicError(msg)
|
55
59
|
title = {lang: title[lang] for lang in lang_list}
|
56
60
|
target_value = unit.value
|
@@ -69,11 +73,11 @@ class UnitMixin:
|
|
69
73
|
if is_unit_exists:
|
70
74
|
main_lang = translations.DEFAULT_LOCALE
|
71
75
|
msg = (
|
72
|
-
"Error: It is
|
76
|
+
"Error: It is not possible to add Unit - "
|
73
77
|
+ f"Unit `{title[main_lang]}: {target_value}` is exists!"
|
74
78
|
)
|
75
79
|
logger.error(msg)
|
76
|
-
raise
|
80
|
+
raise NotPossibleAddUnitError(msg)
|
77
81
|
choices.append({"title": title, "value": target_value})
|
78
82
|
else:
|
79
83
|
choices = [{"title": title, "value": target_value}]
|
@@ -83,15 +87,15 @@ class UnitMixin:
|
|
83
87
|
if choices is None:
|
84
88
|
msg = "Error: It is not possible to delete Unit - Units is not exists!"
|
85
89
|
logger.error(msg)
|
86
|
-
raise
|
90
|
+
raise NotPossibleDeleteUnitError(msg)
|
87
91
|
if not is_unit_exists:
|
88
92
|
main_lang = translations.DEFAULT_LOCALE
|
89
93
|
msg = (
|
90
94
|
"Error: It is not possible to delete Unit."
|
91
95
|
+ f"Unit `{title[main_lang]}: {target_value}` is not exists!"
|
92
96
|
)
|
93
|
-
logger.
|
94
|
-
raise
|
97
|
+
logger.erro(msg)
|
98
|
+
raise NotPossibleDeleteUnitError(msg)
|
95
99
|
choices = [item for item in choices if item["value"] != target_value]
|
96
100
|
model_state["data_dynamic_fields"][unit_field] = choices or None
|
97
101
|
# Update state of current Model in super collection.
|
ramifice/fields/__init__.py
CHANGED
@@ -1,5 +1,36 @@
|
|
1
1
|
"""Ramifice - Available field types."""
|
2
2
|
|
3
|
+
__all__ = (
|
4
|
+
"BooleanField",
|
5
|
+
"ChoiceFloatDynField",
|
6
|
+
"ChoiceFloatField",
|
7
|
+
"ChoiceFloatMultDynField",
|
8
|
+
"ChoiceFloatMultField",
|
9
|
+
"ChoiceIntDynField",
|
10
|
+
"ChoiceIntField",
|
11
|
+
"ChoiceIntMultDynField",
|
12
|
+
"ChoiceIntMultField",
|
13
|
+
"ChoiceTextDynField",
|
14
|
+
"ChoiceTextField",
|
15
|
+
"ChoiceTextMultDynField",
|
16
|
+
"ChoiceTextMultField",
|
17
|
+
"ColorField",
|
18
|
+
"DateField",
|
19
|
+
"DateTimeField",
|
20
|
+
"EmailField",
|
21
|
+
"FileField",
|
22
|
+
"FloatField",
|
23
|
+
"IDField",
|
24
|
+
"ImageField",
|
25
|
+
"IntegerField",
|
26
|
+
"IPField",
|
27
|
+
"PasswordField",
|
28
|
+
"PhoneField",
|
29
|
+
"SlugField",
|
30
|
+
"TextField",
|
31
|
+
"URLField",
|
32
|
+
)
|
33
|
+
|
3
34
|
from ramifice.fields.bool_field import BooleanField
|
4
35
|
from ramifice.fields.choice_float_dyn_field import ChoiceFloatDynField
|
5
36
|
from ramifice.fields.choice_float_field import ChoiceFloatField
|
ramifice/fields/bool_field.py
CHANGED
@@ -43,7 +43,7 @@ class BooleanField(Field, JsonMixin):
|
|
43
43
|
if warning is not None and not isinstance(warning, list):
|
44
44
|
raise AssertionError("Parameter `warning` - Not а `list` type!")
|
45
45
|
except AssertionError as err:
|
46
|
-
logger.
|
46
|
+
logger.critical(str(err))
|
47
47
|
raise err
|
48
48
|
|
49
49
|
Field.__init__(
|
@@ -55,7 +55,7 @@ class ChoiceFloatDynField(Field, ChoiceGroup, JsonMixin):
|
|
55
55
|
if not isinstance(readonly, bool):
|
56
56
|
raise AssertionError("Parameter `readonly` - Not а `bool` type!")
|
57
57
|
except AssertionError as err:
|
58
|
-
logger.
|
58
|
+
logger.critical(str(err))
|
59
59
|
raise err
|
60
60
|
|
61
61
|
Field.__init__(
|
@@ -92,7 +92,7 @@ class ChoiceFloatField(Field, ChoiceGroup, JsonMixin):
|
|
92
92
|
if not isinstance(readonly, bool):
|
93
93
|
raise AssertionError("Parameter `readonly` - Not а `bool` type!")
|
94
94
|
except AssertionError as err:
|
95
|
-
logger.
|
95
|
+
logger.critical(str(err))
|
96
96
|
raise err
|
97
97
|
|
98
98
|
def has_value(self, is_migrate: bool = False) -> bool:
|
@@ -54,7 +54,7 @@ class ChoiceFloatMultDynField(Field, ChoiceGroup, JsonMixin):
|
|
54
54
|
if not isinstance(readonly, bool):
|
55
55
|
raise AssertionError("Parameter `readonly` - Not а `bool` type!")
|
56
56
|
except AssertionError as err:
|
57
|
-
logger.
|
57
|
+
logger.critical(str(err))
|
58
58
|
raise err
|
59
59
|
|
60
60
|
Field.__init__(
|
@@ -98,7 +98,7 @@ class ChoiceFloatMultField(Field, ChoiceGroup, JsonMixin):
|
|
98
98
|
if not isinstance(readonly, bool):
|
99
99
|
raise AssertionError("Parameter `readonly` - Not а `bool` type!")
|
100
100
|
except AssertionError as err:
|
101
|
-
logger.
|
101
|
+
logger.critical(str(err))
|
102
102
|
raise err
|
103
103
|
|
104
104
|
def has_value(self, is_migrate: bool = False) -> bool:
|
@@ -55,7 +55,7 @@ class ChoiceIntDynField(Field, ChoiceGroup, JsonMixin):
|
|
55
55
|
if not isinstance(readonly, bool):
|
56
56
|
raise AssertionError("Parameter `readonly` - Not а `bool` type!")
|
57
57
|
except AssertionError as err:
|
58
|
-
logger.
|
58
|
+
logger.critical(str(err))
|
59
59
|
raise err
|
60
60
|
|
61
61
|
Field.__init__(
|
@@ -92,7 +92,7 @@ class ChoiceIntField(Field, ChoiceGroup, JsonMixin):
|
|
92
92
|
if not isinstance(readonly, bool):
|
93
93
|
raise AssertionError("Parameter `readonly` - Not а `bool` type!")
|
94
94
|
except AssertionError as err:
|
95
|
-
logger.
|
95
|
+
logger.critical(str(err))
|
96
96
|
raise err
|
97
97
|
|
98
98
|
def has_value(self, is_migrate: bool = False) -> bool:
|
@@ -54,7 +54,7 @@ class ChoiceIntMultDynField(Field, ChoiceGroup, JsonMixin):
|
|
54
54
|
if not isinstance(readonly, bool):
|
55
55
|
raise AssertionError("Parameter `readonly` - Not а `bool` type!")
|
56
56
|
except AssertionError as err:
|
57
|
-
logger.
|
57
|
+
logger.critical(str(err))
|
58
58
|
raise err
|
59
59
|
|
60
60
|
Field.__init__(
|
@@ -98,7 +98,7 @@ class ChoiceIntMultField(Field, ChoiceGroup, JsonMixin):
|
|
98
98
|
if not isinstance(readonly, bool):
|
99
99
|
raise AssertionError("Parameter `readonly` - Not а `bool` type!")
|
100
100
|
except AssertionError as err:
|
101
|
-
logger.
|
101
|
+
logger.critical(str(err))
|
102
102
|
raise err
|
103
103
|
|
104
104
|
def has_value(self, is_migrate: bool = False) -> bool:
|
@@ -55,7 +55,7 @@ class ChoiceTextDynField(Field, ChoiceGroup, JsonMixin):
|
|
55
55
|
if not isinstance(readonly, bool):
|
56
56
|
raise AssertionError("Parameter `readonly` - Not а `bool` type!")
|
57
57
|
except AssertionError as err:
|
58
|
-
logger.
|
58
|
+
logger.critical(str(err))
|
59
59
|
raise err
|
60
60
|
|
61
61
|
Field.__init__(
|
@@ -97,7 +97,7 @@ class ChoiceTextField(Field, ChoiceGroup, JsonMixin):
|
|
97
97
|
if not isinstance(readonly, bool):
|
98
98
|
raise AssertionError("Parameter `readonly` - Not а `bool` type!")
|
99
99
|
except AssertionError as err:
|
100
|
-
logger.
|
100
|
+
logger.critical(str(err))
|
101
101
|
raise err
|
102
102
|
|
103
103
|
def has_value(self, is_migrate: bool = False) -> bool:
|
@@ -54,7 +54,7 @@ class ChoiceTextMultDynField(Field, ChoiceGroup, JsonMixin):
|
|
54
54
|
if not isinstance(readonly, bool):
|
55
55
|
raise AssertionError("Parameter `readonly` - Not а `bool` type!")
|
56
56
|
except AssertionError as err:
|
57
|
-
logger.
|
57
|
+
logger.critical(str(err))
|
58
58
|
raise err
|
59
59
|
|
60
60
|
Field.__init__(
|
@@ -98,7 +98,7 @@ class ChoiceTextMultField(Field, ChoiceGroup, JsonMixin):
|
|
98
98
|
if not isinstance(readonly, bool):
|
99
99
|
raise AssertionError("Parameter `readonly` - Not а `bool` type!")
|
100
100
|
except AssertionError as err:
|
101
|
-
logger.
|
101
|
+
logger.critical(str(err))
|
102
102
|
raise err
|
103
103
|
|
104
104
|
def has_value(self, is_migrate: bool = False) -> bool:
|
ramifice/fields/color_field.py
CHANGED
@@ -71,7 +71,7 @@ class ColorField(Field, TextGroup, JsonMixin):
|
|
71
71
|
if not isinstance(unique, bool):
|
72
72
|
raise AssertionError("Parameter `unique` - Not а `bool` type!")
|
73
73
|
except AssertionError as err:
|
74
|
-
logger.
|
74
|
+
logger.critical(str(err))
|
75
75
|
raise err
|
76
76
|
|
77
77
|
Field.__init__(
|
ramifice/fields/date_field.py
CHANGED
@@ -75,7 +75,7 @@ class DateField(Field, DateGroup):
|
|
75
75
|
if not isinstance(readonly, bool):
|
76
76
|
raise AssertionError("Parameter `readonly` - Not а `bool` type!")
|
77
77
|
except AssertionError as err:
|
78
|
-
logger.
|
78
|
+
logger.critical(str(err))
|
79
79
|
raise err
|
80
80
|
|
81
81
|
Field.__init__(
|
@@ -75,7 +75,7 @@ class DateTimeField(Field, DateGroup):
|
|
75
75
|
if not isinstance(readonly, bool):
|
76
76
|
raise AssertionError("Parameter `readonly` - Not а `bool` type!")
|
77
77
|
except AssertionError as err:
|
78
|
-
logger.
|
78
|
+
logger.critical(str(err))
|
79
79
|
raise err
|
80
80
|
|
81
81
|
Field.__init__(
|
ramifice/fields/email_field.py
CHANGED
@@ -67,7 +67,7 @@ class EmailField(Field, TextGroup, JsonMixin):
|
|
67
67
|
if not isinstance(unique, bool):
|
68
68
|
raise AssertionError("Parameter `unique` - Not а `bool` type!")
|
69
69
|
except AssertionError as err:
|
70
|
-
logger.
|
70
|
+
logger.critical(str(err))
|
71
71
|
raise err
|
72
72
|
|
73
73
|
Field.__init__(
|
ramifice/fields/file_field.py
CHANGED
@@ -75,7 +75,7 @@ class FileField(Field, FileGroup, JsonMixin):
|
|
75
75
|
if not isinstance(accept, str):
|
76
76
|
raise AssertionError("Parameter `accept` - Not а `str` type!")
|
77
77
|
except AssertionError as err:
|
78
|
-
logger.
|
78
|
+
logger.critical(str(err))
|
79
79
|
raise err
|
80
80
|
|
81
81
|
Field.__init__(
|
ramifice/fields/float_field.py
CHANGED
@@ -81,7 +81,7 @@ class FloatField(Field, NumberGroup, JsonMixin):
|
|
81
81
|
if not isinstance(unique, bool):
|
82
82
|
raise AssertionError("Parameter `unique` - Not а `bool` type!")
|
83
83
|
except AssertionError as err:
|
84
|
-
logger.
|
84
|
+
logger.critical(str(err))
|
85
85
|
raise err
|
86
86
|
|
87
87
|
Field.__init__(
|
ramifice/fields/id_field.py
CHANGED
ramifice/fields/image_field.py
CHANGED
@@ -103,7 +103,7 @@ class ImageField(Field, FileGroup, JsonMixin):
|
|
103
103
|
if not isinstance(accept, str):
|
104
104
|
raise AssertionError("Parameter `accept` - Not а `str` type!")
|
105
105
|
except AssertionError as err:
|
106
|
-
logger.
|
106
|
+
logger.critical(str(err))
|
107
107
|
raise err
|
108
108
|
|
109
109
|
Field.__init__(
|
ramifice/fields/integer_field.py
CHANGED
@@ -81,7 +81,7 @@ class IntegerField(Field, NumberGroup, JsonMixin):
|
|
81
81
|
if not isinstance(unique, bool):
|
82
82
|
raise AssertionError("Parameter `unique` - Not а `bool` type!")
|
83
83
|
except AssertionError as err:
|
84
|
-
logger.
|
84
|
+
logger.critical(str(err))
|
85
85
|
raise err
|
86
86
|
|
87
87
|
Field.__init__(
|
ramifice/fields/ip_field.py
CHANGED
@@ -66,7 +66,7 @@ class IPField(Field, TextGroup, JsonMixin):
|
|
66
66
|
if not isinstance(unique, bool):
|
67
67
|
raise AssertionError("Parameter `unique` - Not а `bool` type!")
|
68
68
|
except AssertionError as err:
|
69
|
-
logger.
|
69
|
+
logger.critical(str(err))
|
70
70
|
raise err
|
71
71
|
|
72
72
|
Field.__init__(
|
ramifice/fields/phone_field.py
CHANGED
@@ -72,7 +72,7 @@ class PhoneField(Field, TextGroup, JsonMixin):
|
|
72
72
|
if not isinstance(unique, bool):
|
73
73
|
raise AssertionError("Parameter `unique` - Not а `bool` type!")
|
74
74
|
except AssertionError as err:
|
75
|
-
logger.
|
75
|
+
logger.critical(str(err))
|
76
76
|
raise err
|
77
77
|
|
78
78
|
Field.__init__(
|
ramifice/fields/slug_field.py
CHANGED
@@ -53,7 +53,7 @@ class SlugField(Field, TextGroup, JsonMixin):
|
|
53
53
|
if not isinstance(slug_sources, list):
|
54
54
|
raise AssertionError("Parameter `slug_sources` - Not а `list` type!")
|
55
55
|
except AssertionError as err:
|
56
|
-
logger.
|
56
|
+
logger.critical(str(err))
|
57
57
|
raise err
|
58
58
|
|
59
59
|
Field.__init__(
|
ramifice/fields/text_field.py
CHANGED
@@ -67,7 +67,7 @@ class TextField(Field, JsonMixin):
|
|
67
67
|
if not isinstance(multi_language, bool):
|
68
68
|
raise AssertionError("Parameter `multi_language` - Not а `int` type!")
|
69
69
|
except AssertionError as err:
|
70
|
-
logger.
|
70
|
+
logger.critical(str(err))
|
71
71
|
raise err
|
72
72
|
|
73
73
|
Field.__init__(
|
ramifice/fields/url_field.py
CHANGED
@@ -79,7 +79,7 @@ class URLField(Field, TextGroup, JsonMixin):
|
|
79
79
|
if not isinstance(unique, bool):
|
80
80
|
raise AssertionError("Parameter `unique` - Not а `bool` type!")
|
81
81
|
except AssertionError as err:
|
82
|
-
logger.
|
82
|
+
logger.critical(str(err))
|
83
83
|
raise err
|
84
84
|
|
85
85
|
Field.__init__(
|
ramifice/models/decorator.py
CHANGED
@@ -29,36 +29,34 @@ def model(
|
|
29
29
|
is_delete_doc: bool = True,
|
30
30
|
) -> Any:
|
31
31
|
"""Ramifice - Decorator for converting Python Classe into Ramifice Model."""
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
logger.error(msg)
|
55
|
-
raise AssertionError(msg)
|
32
|
+
try:
|
33
|
+
if not isinstance(service_name, str):
|
34
|
+
msg = "Parameter `service_name` - Must be `str` type!"
|
35
|
+
raise AssertionError(msg)
|
36
|
+
if not isinstance(fixture_name, (str, type(None))):
|
37
|
+
msg = "Parameter `fixture_name` - Must be `str | None` type!"
|
38
|
+
raise AssertionError(msg)
|
39
|
+
if not isinstance(db_query_docs_limit, int):
|
40
|
+
msg = "Parameter `db_query_docs_limit` - Must be `int` type!"
|
41
|
+
raise AssertionError(msg)
|
42
|
+
if not isinstance(is_create_doc, bool):
|
43
|
+
msg = "Parameter `is_create_doc` - Must be `bool` type!"
|
44
|
+
raise AssertionError(msg)
|
45
|
+
if not isinstance(is_update_doc, bool):
|
46
|
+
msg = "Parameter `is_update_doc` - Must be `bool` type!"
|
47
|
+
raise AssertionError(msg)
|
48
|
+
if not isinstance(is_delete_doc, bool):
|
49
|
+
msg = "Parameter `is_delete_doc` - Must be `bool` type!"
|
50
|
+
raise AssertionError(msg)
|
51
|
+
except AssertionError as err:
|
52
|
+
logger.critical(str(err))
|
53
|
+
raise err
|
56
54
|
|
57
55
|
def decorator(cls: Any) -> Any:
|
58
56
|
if REGEX["service_name"].match(service_name) is None:
|
59
57
|
regex_str: str = "^[A-Z][a-zA-Z0-9]{0,24}$"
|
60
58
|
msg = f"Does not match the regular expression: {regex_str}"
|
61
|
-
logger.
|
59
|
+
logger.critical(msg)
|
62
60
|
raise DoesNotMatchRegexError(regex_str)
|
63
61
|
if fixture_name is not None:
|
64
62
|
fixture_path = f"config/fixtures/{fixture_name}.yml"
|
@@ -69,7 +67,7 @@ def model(
|
|
69
67
|
+ f"META param: `fixture_name` => "
|
70
68
|
+ f"Fixture the `{fixture_path}` not exists!"
|
71
69
|
)
|
72
|
-
logger.
|
70
|
+
logger.critical(msg)
|
73
71
|
raise PanicError(msg)
|
74
72
|
|
75
73
|
attrs = {key: val for key, val in cls.__dict__.items()}
|
@@ -110,7 +108,7 @@ def caching(cls: Any, service_name: str) -> dict[str, Any]:
|
|
110
108
|
if REGEX["model_name"].match(model_name) is None:
|
111
109
|
regex_str: str = "^[A-Z][a-zA-Z0-9]{0,24}$"
|
112
110
|
msg = f"Does not match the regular expression: {regex_str}"
|
113
|
-
logger.
|
111
|
+
logger.critical(msg)
|
114
112
|
raise DoesNotMatchRegexError(regex_str)
|
115
113
|
#
|
116
114
|
metadata["model_name"] = model_name
|
ramifice/paladins/check.py
CHANGED
ramifice/paladins/delete.py
CHANGED
@@ -11,7 +11,7 @@ from anyio import to_thread
|
|
11
11
|
from pymongo.asynchronous.collection import AsyncCollection
|
12
12
|
|
13
13
|
from ramifice.utils import constants
|
14
|
-
from ramifice.utils.errors import PanicError
|
14
|
+
from ramifice.utils.errors import ForbiddenDeleteDocError, PanicError
|
15
15
|
|
16
16
|
logger = logging.getLogger(__name__)
|
17
17
|
|
@@ -39,8 +39,8 @@ class DeleteMixin:
|
|
39
39
|
+ "META param: `is_delete_doc` (False) => "
|
40
40
|
+ "Documents of this Model cannot be removed from the database!"
|
41
41
|
)
|
42
|
-
logger.
|
43
|
-
raise
|
42
|
+
logger.warning(msg)
|
43
|
+
raise ForbiddenDeleteDocError(msg)
|
44
44
|
# Get documet ID.
|
45
45
|
doc_id = self._id.value
|
46
46
|
if doc_id is None:
|
@@ -49,7 +49,7 @@ class DeleteMixin:
|
|
49
49
|
+ "Field: `_id` > "
|
50
50
|
+ "Param: `value` => ID is missing."
|
51
51
|
)
|
52
|
-
logger.
|
52
|
+
logger.critical(msg)
|
53
53
|
raise PanicError(msg)
|
54
54
|
# Run hook.
|
55
55
|
await self.pre_delete()
|
@@ -74,7 +74,7 @@ class DeleteMixin:
|
|
74
74
|
+ "Method: `delete` => "
|
75
75
|
+ "The document was not deleted, the document is absent in the database."
|
76
76
|
)
|
77
|
-
logger.
|
77
|
+
logger.critical(msg)
|
78
78
|
raise PanicError(msg)
|
79
79
|
# Delete orphaned files and add None to field.value.
|
80
80
|
file_data: dict[str, Any] | None = None
|
@@ -1,5 +1,18 @@
|
|
1
1
|
"""Ramifice - Groups - Model instance methods for specific processing of fields."""
|
2
2
|
|
3
|
+
__all__ = (
|
4
|
+
"BoolGroupMixin",
|
5
|
+
"ChoiceGroupMixin",
|
6
|
+
"DateGroupMixin",
|
7
|
+
"FileGroupMixin",
|
8
|
+
"IDGroupMixin",
|
9
|
+
"ImgGroupMixin",
|
10
|
+
"NumGroupMixin",
|
11
|
+
"PassGroupMixin",
|
12
|
+
"SlugGroupMixin",
|
13
|
+
"TextGroupMixin",
|
14
|
+
)
|
15
|
+
|
3
16
|
from ramifice.paladins.groups.bool_group import BoolGroupMixin
|
4
17
|
from ramifice.paladins.groups.choice_group import ChoiceGroupMixin
|
5
18
|
from ramifice.paladins.groups.date_group import DateGroupMixin
|
@@ -51,7 +51,7 @@ class SlugGroupMixin:
|
|
51
51
|
+ "This field is specified in slug_sources. "
|
52
52
|
+ "This field should be mandatory or assign a default value."
|
53
53
|
)
|
54
|
-
logger.
|
54
|
+
logger.critical(err_msg)
|
55
55
|
raise PanicError(err_msg)
|
56
56
|
# Insert result.
|
57
57
|
if params["is_save"]:
|
@@ -69,7 +69,7 @@ class SlugGroupMixin:
|
|
69
69
|
+ f"Parameter: `slug_sources` => "
|
70
70
|
+ "At least one field should be unique!"
|
71
71
|
)
|
72
|
-
logger.
|
72
|
+
logger.critical(err_msg)
|
73
73
|
raise PanicError(err_msg)
|
74
74
|
# Add value to map.
|
75
75
|
params["result_map"][field_name] = value
|
ramifice/paladins/password.py
CHANGED
@@ -32,7 +32,7 @@ class PasswordMixin:
|
|
32
32
|
+ "Method: `verify_password` => "
|
33
33
|
+ "Cannot get document ID - ID field is empty."
|
34
34
|
)
|
35
|
-
logger.
|
35
|
+
logger.critical(msg)
|
36
36
|
raise PanicError(msg)
|
37
37
|
# Get collection for current Model.
|
38
38
|
collection: AsyncCollection = constants.MONGO_DATABASE[cls_model.META["collection_name"]]
|
@@ -44,7 +44,7 @@ class PasswordMixin:
|
|
44
44
|
+ "Method: `verify_password` => "
|
45
45
|
+ f"There is no document with ID `{self._id.value}` in the database."
|
46
46
|
)
|
47
|
-
logger.
|
47
|
+
logger.critical(msg)
|
48
48
|
raise PanicError(msg)
|
49
49
|
# Get password hash.
|
50
50
|
hash: str | None = mongo_doc.get(field_name)
|
@@ -54,7 +54,7 @@ class PasswordMixin:
|
|
54
54
|
+ "Method: `verify_password` => "
|
55
55
|
+ f"The model does not have a field `{field_name}`."
|
56
56
|
)
|
57
|
-
logger.
|
57
|
+
logger.critical(msg)
|
58
58
|
raise PanicError(msg)
|
59
59
|
# Password verification.
|
60
60
|
is_valid: bool = False
|
ramifice/paladins/refrash.py
CHANGED
@@ -29,7 +29,7 @@ class RefrashMixin:
|
|
29
29
|
+ "Method: `refrash_from_db` => "
|
30
30
|
+ f"A document with an identifier `{self._id.value}` is not exists in the database!"
|
31
31
|
)
|
32
|
-
logger.
|
32
|
+
logger.critical(msg)
|
33
33
|
raise PanicError(msg)
|
34
34
|
self.inject()
|
35
35
|
refresh_from_mongo_doc(self, mongo_doc)
|
ramifice/paladins/save.py
CHANGED
@@ -63,7 +63,7 @@ class SaveMixin:
|
|
63
63
|
+ "Method: `save` => "
|
64
64
|
+ "Geted value is None - it is impossible to refresh the current Model."
|
65
65
|
)
|
66
|
-
logger.
|
66
|
+
logger.critical(msg)
|
67
67
|
raise PanicError(msg)
|
68
68
|
refresh_from_mongo_doc(self, mongo_doc)
|
69
69
|
else:
|
@@ -80,23 +80,14 @@ class SaveMixin:
|
|
80
80
|
# Refresh Model.
|
81
81
|
mongo_doc = await collection.find_one({"_id": checked_data["_id"]})
|
82
82
|
if mongo_doc is None:
|
83
|
-
msg = (
|
84
|
-
f"Model: `{self.full_model_name()}` > "
|
85
|
-
+ "Method: `save` => "
|
86
|
-
+ "Geted value is None - it is impossible to refresh the current Model."
|
87
|
-
)
|
88
|
-
logger.error(msg)
|
89
|
-
raise PanicError(msg)
|
90
|
-
if mongo_doc is not None:
|
91
|
-
refresh_from_mongo_doc(self, mongo_doc)
|
92
|
-
else:
|
93
83
|
msg = (
|
94
84
|
f"Model: `{self.full_model_name()}` > "
|
95
85
|
+ "Method: `save` => "
|
96
86
|
+ "The document was not created."
|
97
87
|
)
|
98
|
-
logger.
|
88
|
+
logger.critical(msg)
|
99
89
|
raise PanicError(msg)
|
90
|
+
refresh_from_mongo_doc(self, mongo_doc)
|
100
91
|
#
|
101
92
|
# If everything is completed successfully.
|
102
93
|
return True
|
ramifice/paladins/tools.py
CHANGED
@@ -44,7 +44,7 @@ def panic_type_error(value_type: str, params: dict[str, Any]) -> None:
|
|
44
44
|
+ f"Field: `{params['field_data'].name}` > "
|
45
45
|
+ f"Parameter: `value` => Must be `{value_type}` type!"
|
46
46
|
)
|
47
|
-
logger.
|
47
|
+
logger.critical(msg)
|
48
48
|
raise errors.PanicError(msg)
|
49
49
|
|
50
50
|
|
@@ -60,7 +60,7 @@ def accumulate_error(err_msg: str, params: dict[str, Any]) -> None:
|
|
60
60
|
+ f"Field: `{params['field_data'].name}`"
|
61
61
|
+ f" => {err_msg}"
|
62
62
|
)
|
63
|
-
logger.
|
63
|
+
logger.critical(msg)
|
64
64
|
raise errors.PanicError(msg)
|
65
65
|
|
66
66
|
|
ramifice/utils/errors.py
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
class RamificeException(Exception):
|
5
5
|
"""Ramifice - Root Exception for Ramifice."""
|
6
6
|
|
7
|
-
def __init__(self, *args, **kwargs) -> None: # type: ignore[no-untyped-def]
|
7
|
+
def __init__(self, *args, **kwargs) -> None: # type: ignore[no-untyped-def]# noqa: D107
|
8
8
|
super().__init__(*args, **kwargs)
|
9
9
|
|
10
10
|
|
@@ -35,7 +35,7 @@ class DoesNotMatchRegexError(RamificeException):
|
|
35
35
|
class NoModelsForMigrationError(RamificeException):
|
36
36
|
"""Ramifice - Exception raised if no Models for migration."""
|
37
37
|
|
38
|
-
def __init__(self): #
|
38
|
+
def __init__(self) -> None: # noqa: D107
|
39
39
|
self.message = "No Models for Migration!"
|
40
40
|
super().__init__(self.message)
|
41
41
|
|
@@ -53,10 +53,47 @@ class PanicError(RamificeException):
|
|
53
53
|
|
54
54
|
|
55
55
|
class OldPassNotMatchError(RamificeException):
|
56
|
-
"""Ramifice - Exception raised
|
57
|
-
|
58
|
-
|
56
|
+
"""Ramifice - Exception is raised when trying to update the password.
|
57
|
+
|
58
|
+
Hint: If old password does not match.
|
59
|
+
"""
|
59
60
|
|
60
61
|
def __init__(self) -> None: # noqa: D107
|
61
62
|
self.message = "Old password does not match!"
|
62
63
|
super().__init__(self.message)
|
64
|
+
|
65
|
+
|
66
|
+
class ForbiddenDeleteDocError(RamificeException):
|
67
|
+
"""Ramifice - Exception is raised when trying to delete the document.
|
68
|
+
|
69
|
+
Attributes:
|
70
|
+
message -- explanation of the error
|
71
|
+
"""
|
72
|
+
|
73
|
+
def __init__(self, message: str) -> None: # noqa: D107
|
74
|
+
self.message = message
|
75
|
+
super().__init__(self.message)
|
76
|
+
|
77
|
+
|
78
|
+
class NotPossibleAddUnitError(RamificeException):
|
79
|
+
"""Ramifice - Exception is raised when not possible to add Unit.
|
80
|
+
|
81
|
+
Attributes:
|
82
|
+
message -- explanation of the error
|
83
|
+
"""
|
84
|
+
|
85
|
+
def __init__(self, message: str) -> None: # noqa: D107
|
86
|
+
self.message = message
|
87
|
+
super().__init__(self.message)
|
88
|
+
|
89
|
+
|
90
|
+
class NotPossibleDeleteUnitError(RamificeException):
|
91
|
+
"""Ramifice - Exception is raised when not possible to delete Unit.
|
92
|
+
|
93
|
+
Attributes:
|
94
|
+
message -- explanation of the error
|
95
|
+
"""
|
96
|
+
|
97
|
+
def __init__(self, message: str) -> None: # noqa: D107
|
98
|
+
self.message = message
|
99
|
+
super().__init__(self.message)
|
ramifice/utils/fixtures.py
CHANGED
@@ -40,7 +40,7 @@ async def apply_fixture(
|
|
40
40
|
+ f"META param: `fixture_name` ({fixture_name}) => "
|
41
41
|
+ "It seems that fixture is empty or it has incorrect contents!"
|
42
42
|
)
|
43
|
-
logger.
|
43
|
+
logger.critical(msg)
|
44
44
|
raise PanicError(msg)
|
45
45
|
|
46
46
|
if data_yaml is not None:
|
@@ -75,7 +75,7 @@ async def apply_fixture(
|
|
75
75
|
print(colored(fixture_path, "blue", attrs=["bold"]))
|
76
76
|
inst_model.print_err()
|
77
77
|
msg = f"Fixture `{fixture_name}` failed."
|
78
|
-
logger.
|
78
|
+
logger.critical(msg)
|
79
79
|
raise PanicError(msg)
|
80
80
|
# Get data for document.
|
81
81
|
checked_data: dict[str, Any] = result_check["data"]
|
ramifice/utils/migration.py
CHANGED
@@ -32,7 +32,7 @@ class Migration:
|
|
32
32
|
if db_name_regex.match(database_name) is None:
|
33
33
|
regex_str: str = "^[a-zA-Z][-_a-zA-Z0-9]{0,59}$"
|
34
34
|
msg: str = f"Does not match the regular expression: {regex_str}"
|
35
|
-
logger.
|
35
|
+
logger.critical(msg)
|
36
36
|
raise DoesNotMatchRegexError(regex_str)
|
37
37
|
#
|
38
38
|
constants.DATABASE_NAME = database_name
|
@@ -42,8 +42,8 @@ class Migration:
|
|
42
42
|
self.model_list: list[Any] = Model.__subclasses__()
|
43
43
|
# Raise the exception if there are no models for migration.
|
44
44
|
if len(self.model_list) == 0:
|
45
|
-
logger.
|
46
|
-
raise NoModelsForMigrationError()
|
45
|
+
logger.critical("No Models for Migration!")
|
46
|
+
raise NoModelsForMigrationError()
|
47
47
|
|
48
48
|
async def reset(self) -> None:
|
49
49
|
"""Ramifice - Reset the condition of the models in a super collection.
|
@@ -175,7 +175,7 @@ class Migration:
|
|
175
175
|
print(colored("\n!!!>>MIGRATION<<!!!", "red", attrs=["bold"]))
|
176
176
|
inst_model.print_err()
|
177
177
|
msg: str = "Migration failed."
|
178
|
-
logger.
|
178
|
+
logger.critical(msg)
|
179
179
|
raise PanicError(msg)
|
180
180
|
# Get checked data.
|
181
181
|
checked_data = result_check["data"]
|
@@ -1,5 +1,12 @@
|
|
1
1
|
"""Ramifice - Set of mixins for Models and Fields."""
|
2
2
|
|
3
|
+
__all__ = (
|
4
|
+
"AddValidMixin",
|
5
|
+
"HooksMixin",
|
6
|
+
"IndexMixin",
|
7
|
+
"JsonMixin",
|
8
|
+
)
|
9
|
+
|
3
10
|
from ramifice.utils.mixins.add_valid import AddValidMixin
|
4
11
|
from ramifice.utils.mixins.hooks import HooksMixin
|
5
12
|
from ramifice.utils.mixins.indexing import IndexMixin
|
ramifice/utils/translations.py
CHANGED
@@ -59,7 +59,7 @@ def add_languages(
|
|
59
59
|
global DEFAULT_LOCALE, LANGUAGES
|
60
60
|
if not default_locale in languages:
|
61
61
|
msg = "DEFAULT_LOCALE is not included in the LANGUAGES!"
|
62
|
-
logger.
|
62
|
+
logger.critical(msg)
|
63
63
|
raise PanicError(msg)
|
64
64
|
DEFAULT_LOCALE = default_locale
|
65
65
|
LANGUAGES = languages
|
ramifice/utils/unit.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: ramifice
|
3
|
-
Version: 0.8.
|
3
|
+
Version: 0.8.15
|
4
4
|
Summary: ORM-pseudo-like API MongoDB for Python language.
|
5
5
|
Project-URL: Homepage, https://github.com/kebasyaty/ramifice
|
6
6
|
Project-URL: Documentation, https://kebasyaty.github.io/ramifice/
|
@@ -62,6 +62,11 @@ Description-Content-Type: text/markdown
|
|
62
62
|
<a href="https://docs.astral.sh/ruff/" alt="Code style: Ruff"><img src="https://img.shields.io/badge/code%20style-Ruff-FDD835.svg" alt="Code style: Ruff"></a>
|
63
63
|
<a href="https://github.com/kebasyaty/ramifice" alt="PyPI implementation"><img src="https://img.shields.io/pypi/implementation/ramifice" alt="PyPI implementation"></a>
|
64
64
|
<a href="https://github.com/kebasyaty/ramifice" alt="GitHub repository"><img src="https://img.shields.io/badge/--ecebeb?logo=github&logoColor=000000" alt="GitHub repository"></a>
|
65
|
+
<br>
|
66
|
+
<a href="https://pypi.org/project/ramifice"><img src="https://img.shields.io/pypi/format/ramifice" alt="Format"></a>
|
67
|
+
<a href="https://github.com/kebasyaty/ramifice"><img src="https://img.shields.io/github/languages/top/kebasyaty/ramifice" alt="Top"></a>
|
68
|
+
<a href="https://github.com/kebasyaty/ramifice"><img src="https://img.shields.io/github/repo-size/kebasyaty/ramifice" alt="Size"></a>
|
69
|
+
<a href="https://github.com/kebasyaty/ramifice"><img src="https://img.shields.io/github/last-commit/kebasyaty/ramifice/main" alt="Last commit"></a>
|
65
70
|
</p>
|
66
71
|
<p align="center">
|
67
72
|
Ramifice is built around <a href="https://pypi.org/project/pymongo/" alt="PyMongo">PyMongo</a>.
|
@@ -145,7 +150,7 @@ class User:
|
|
145
150
|
"""Model of User."""
|
146
151
|
|
147
152
|
def fields(self) -> None:
|
148
|
-
"""
|
153
|
+
"""Adding fields."""
|
149
154
|
# For custom translations.
|
150
155
|
gettext = translations.gettext
|
151
156
|
# ngettext = translations.ngettext
|
@@ -0,0 +1,84 @@
|
|
1
|
+
ramifice/__init__.py,sha256=Xejr_t4cimFFNKS6xXvAeLRue1vTB5kZWGeYbHXDUDw,1116
|
2
|
+
ramifice/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
3
|
+
ramifice/commons/__init__.py,sha256=F5tnz0bz7IcwOT9wkPmyWL7cDDUI1BUVSfC73G56dfs,567
|
4
|
+
ramifice/commons/general.py,sha256=HuErflr-dZ2pWhaSy81IGllFfGxlj8yrdnaAEGUtK3M,5554
|
5
|
+
ramifice/commons/indexes.py,sha256=Ay1Y7Ft8t6Yuw7_LHtK5K87BNAac2WYsY2zzvPEu_zw,3784
|
6
|
+
ramifice/commons/many.py,sha256=Scqzrh5l3aMXGkiKi8RngWLM6CR2T1dtuqE6QOY8r3Q,9490
|
7
|
+
ramifice/commons/one.py,sha256=KTX2q2XdO3ognREOJnKRrjfc9gUpfcxpN5eCrHA90zI,7067
|
8
|
+
ramifice/commons/tools.py,sha256=Cs1RRWolxBrGXwTWLuqYmkOgDLYoKJmfctf_MgZPams,2505
|
9
|
+
ramifice/commons/unit_manager.py,sha256=_K0dYu8iBXh9WFzZq3p8YnHj9xQOlSIUg_s_8LyNeRg,5001
|
10
|
+
ramifice/fields/__init__.py,sha256=7lmcAu-7zsndVgjUJ329HFgAgCtg036lC9ifH5xpaJk,2371
|
11
|
+
ramifice/fields/bool_field.py,sha256=DNC2Tw7sClOhLaR03180hdR1IK8Q7f90c0XYAHmPhFI,2411
|
12
|
+
ramifice/fields/choice_float_dyn_field.py,sha256=W3SPcGzys0vUz1VKNCcQ5Oq4oq4zYyXx_iYRcgj63Zc,3493
|
13
|
+
ramifice/fields/choice_float_field.py,sha256=xn-0PViaQE0VSykBj1VuhqbF7rHWhPjtOXL-5gCkPoc,4339
|
14
|
+
ramifice/fields/choice_float_mult_dyn_field.py,sha256=0RtO16glK-yjjligRyErssX2GWgOFSshPQmnREz7kQM,3560
|
15
|
+
ramifice/fields/choice_float_mult_field.py,sha256=s7ZqNTac5Mv1Zn7nD8JCp8aXAylPuyIUiCuM4AxnQ9A,4709
|
16
|
+
ramifice/fields/choice_int_dyn_field.py,sha256=XpL3mNs2usP7ii2qetaOL263pnnVmJ4GPeBQvkSW1a8,3485
|
17
|
+
ramifice/fields/choice_int_field.py,sha256=AyZMyprppzDQXU3NoCbUOqvApK_GFtNPFCUbA8t-aRI,4325
|
18
|
+
ramifice/fields/choice_int_mult_dyn_field.py,sha256=BnI7pqION2OKqss2YPUmC1Qh1KFR9waiJcNGB_TVJGQ,3554
|
19
|
+
ramifice/fields/choice_int_mult_field.py,sha256=vP0CbOW2TDjEX_mvKpaWQGrF1LBnl-Cs48tWMpq9srM,4701
|
20
|
+
ramifice/fields/choice_text_dyn_field.py,sha256=Jh4RISEP6kdoQw4WPbWbhMG1hCBCHLxGdYEPGESjJP0,3476
|
21
|
+
ramifice/fields/choice_text_field.py,sha256=eedLdbIg-X-YN8msLa4I8qC2dHRtpFsdJb_pmJ7nWt4,4545
|
22
|
+
ramifice/fields/choice_text_mult_dyn_field.py,sha256=0ANNnJ6XBuvZEmh6VChImQ8nPKEzd0hFptWSn0Mm5So,3545
|
23
|
+
ramifice/fields/choice_text_mult_field.py,sha256=ouz-PXJV7oQyY5wXe5noixqcT6MNQShnF_U2WwNZHLI,4692
|
24
|
+
ramifice/fields/color_field.py,sha256=o_m9al63D0GwR0XSfpR-WXEwvbC8Y9t4iFhpZC5iNSg,3940
|
25
|
+
ramifice/fields/date_field.py,sha256=qkq50h5V0osjwa1UVGaqvqmEHudcWOyTq07nJF65yxQ,5746
|
26
|
+
ramifice/fields/date_time_field.py,sha256=QtZs87wae5Ih1rCqIqATVkNguFgw3t1pwUhkD5mdf78,5785
|
27
|
+
ramifice/fields/email_field.py,sha256=8dK3KOHGXtfdA5b-UDhdaCo0Gb1L2CiE5myZSCdJ6bs,3853
|
28
|
+
ramifice/fields/file_field.py,sha256=jxWPzF799ygKM0LXpBoTdslv4nw7CXvaLZyXXCGF4r8,8785
|
29
|
+
ramifice/fields/float_field.py,sha256=tLmNzc4IAlx_ClqhqOFoFdTyvAVeehAzb8WYs8fd6yI,5086
|
30
|
+
ramifice/fields/id_field.py,sha256=5DVR7sVDqLtpKM9HU2tyjKJCNp4PkWs6iw3EGy_xm3c,4550
|
31
|
+
ramifice/fields/image_field.py,sha256=W8WwynhviX-pQX1p_hFEqEWDXkMn-nOZ3dovxcAp5KY,12305
|
32
|
+
ramifice/fields/integer_field.py,sha256=ABFjWPoCzmeRQjrrH9mnqOeAoUHLSKeD-pysYUwQt-0,5060
|
33
|
+
ramifice/fields/ip_field.py,sha256=BhFu9KZOg1UhpzAktFAuPiTUhc2ketJLwml6S7q_Sic,3757
|
34
|
+
ramifice/fields/password_field.py,sha256=lpFVuG-sIEDFARpnx48_-MHYoW9Wk8fdHV_oxtzkzAQ,3615
|
35
|
+
ramifice/fields/phone_field.py,sha256=RLH52_lSchgAFhVe4-fg9gp-UFR60o9MBzSfOQJV158,4043
|
36
|
+
ramifice/fields/slug_field.py,sha256=JkIxYDVwGod2jNMg_UCIA8IXOHo7sOzh0WRnWTspZGk,3052
|
37
|
+
ramifice/fields/text_field.py,sha256=YHRPtobZpNlZL-k48I99bRx7E-uOQvuysbbj8bqrZ_I,4518
|
38
|
+
ramifice/fields/url_field.py,sha256=YqaGJRU4lViw2DMIcyhcQNLiaoO77-YvuyhUWWp8KsI,4405
|
39
|
+
ramifice/fields/general/__init__.py,sha256=j3Onqv8DAR5vMf7GLvLdBDYe5i2WaxF6aHgus0NZBMw,51
|
40
|
+
ramifice/fields/general/choice_group.py,sha256=u-xmgr88oYo2gPxmBaCk9Lzxh6dWxYj_N8hiEoOENgM,1014
|
41
|
+
ramifice/fields/general/date_group.py,sha256=RCNl5qrOwJ1AoysgpwR2mq87l0UJU0Ep7MmliLyTtjM,1263
|
42
|
+
ramifice/fields/general/field.py,sha256=bNVZrl4Vw0ZBHHdijAUAbIl78jIB4loWRUYMcdg6i0E,1430
|
43
|
+
ramifice/fields/general/file_group.py,sha256=SmF8OHKXsyZtWr90n8iCAXBXFQrjRV2HdDc_n1ngITk,1064
|
44
|
+
ramifice/fields/general/number_group.py,sha256=jspiA9hWiU_hNhXbTku2rZG3UezrhEVBGopNgooJ4ig,813
|
45
|
+
ramifice/fields/general/text_group.py,sha256=hYVX4-ipD2_eyj-WpHIHnFrpQevySaVd4twffUsrOLo,1164
|
46
|
+
ramifice/models/__init__.py,sha256=y5jRhSzcPuEVUWr1u--o1GyjFb7irlf5Rn2gPvQ3IPg,26
|
47
|
+
ramifice/models/decorator.py,sha256=PX6b8DTP_Qz1SjyPcZ1vGDS4AGRZ6ZD8z8y6497j-DM,6685
|
48
|
+
ramifice/models/model.py,sha256=m19E7h3Fv2F7oDotc1z_n_NglFN7KmXOrNL0r4Jg_y4,7352
|
49
|
+
ramifice/paladins/__init__.py,sha256=I2FzvCrp6upv_GPLfDqaVLwIT6-3Dp_K9i51tFUXDuc,673
|
50
|
+
ramifice/paladins/check.py,sha256=mxvnHR9EG7eQrGOE7wph1lCUq3jf2RF0Ovhhtz7W3g8,6974
|
51
|
+
ramifice/paladins/delete.py,sha256=Ynew5zvEBRJNmss5I8hSIp7KgBHpSvDEJCwOfMH5MUU,3723
|
52
|
+
ramifice/paladins/password.py,sha256=hdEfSwz0a9FJ5IIYpyD9bmV_kNGvXP4OV5Ea-V0Yx98,3341
|
53
|
+
ramifice/paladins/refrash.py,sha256=0qst0ii2ThH-VJduSI1zgkuZQGLnR8IiIu5rTVxzM9U,1254
|
54
|
+
ramifice/paladins/save.py,sha256=Tv6TP4Hv0sNIk_aSzLrS6f6kH29A8cFn-f_bzCqP71M,3748
|
55
|
+
ramifice/paladins/tools.py,sha256=GubR4JwvFu1IAPaH7fr_Fpehd2JoY9qO23Kg8uoXiJU,2984
|
56
|
+
ramifice/paladins/validation.py,sha256=DglGT-GnL7XM__77vNXkOAmdBMUVw8HyIJJ5rmKuPns,1808
|
57
|
+
ramifice/paladins/groups/__init__.py,sha256=R4cr9Xt2N-TvNIsoJ4h9J10Zqcuyqk9v3lE_rMEe52o,969
|
58
|
+
ramifice/paladins/groups/bool_group.py,sha256=hOD2wbz6VFS7KhxuevV5ApKXkmTJB18S-5s92PwOmHM,874
|
59
|
+
ramifice/paladins/groups/choice_group.py,sha256=ODB7m8PFY-fM68LTRujN7yUL9oJvMt39p25aVBJxWCc,1881
|
60
|
+
ramifice/paladins/groups/date_group.py,sha256=I7W2HFJ96IJh8lpMyHa--_msyNityN2cGbWMky-ShAc,3845
|
61
|
+
ramifice/paladins/groups/file_group.py,sha256=Rtj75Q8V7ie8Nf96Z-QYj2Ah65HK8BQIwbFvSFJxeLE,3048
|
62
|
+
ramifice/paladins/groups/id_group.py,sha256=cXVM65IGo7UTrTezc_6NsSfHK7SXGekQgY1YHQT6Gug,1354
|
63
|
+
ramifice/paladins/groups/img_group.py,sha256=M-fzE1tX0BVYqvT9KCqdTo5FbS5f-nSXdomyNWrvTNw,6204
|
64
|
+
ramifice/paladins/groups/num_group.py,sha256=WJR6Jaxd_YmEvWdgEXzDFZsiiF0OqOstw6_NaRGbLSU,2382
|
65
|
+
ramifice/paladins/groups/pass_group.py,sha256=1_FYXA96yan4xCvoY-ABX02T8gyrPP5Pjr4Np_expi8,1953
|
66
|
+
ramifice/paladins/groups/slug_group.py,sha256=QCO0ry0-E7bO9tsD4NajPMMbB0chGmuLyzdJCLnY1EI,2539
|
67
|
+
ramifice/paladins/groups/text_group.py,sha256=2CyhZxQgFDv-uGRKIxgngB15_BfgPmhxp4N_X7WXsSQ,4538
|
68
|
+
ramifice/utils/__init__.py,sha256=wdOon9X-38jYpgOy1qyN-u7IzbGEXXuXudnzj5xFQGI,54
|
69
|
+
ramifice/utils/constants.py,sha256=VFvzFaOfzzhfoLMrI9nH9Dz_P5ktI8cOdqTINFHUEo4,2624
|
70
|
+
ramifice/utils/errors.py,sha256=L_eZttzoLvv5_ukCan7vTmCbYcSbuGfOvfd4q4Cy17s,2953
|
71
|
+
ramifice/utils/fixtures.py,sha256=R6lHvNp5hvA6Bryom2XNu3CvT-zwXpBGH8AZa3gRC1Q,3357
|
72
|
+
ramifice/utils/migration.py,sha256=IZ3MFJD2n61uJ0Nl90Ll28GJwjUJf_2IOVbATTHDS_A,11529
|
73
|
+
ramifice/utils/tools.py,sha256=LZyA715HnkNO7TcBu4Ia29A6Ko3n-F2BRULzIyNKt9o,3279
|
74
|
+
ramifice/utils/translations.py,sha256=Jh0nzwcn3bhUU2TjPAQboe3_pkVyhYQYdeINyC5SQo8,4701
|
75
|
+
ramifice/utils/unit.py,sha256=ToBeu92tzOY32fuzLdxScNeYXvGIDr0nx7yTv2DShVo,2604
|
76
|
+
ramifice/utils/mixins/__init__.py,sha256=fTsjH8h4OGvFC4zGawLLbU2i-c2OBdPftC3A-ZT5Pbw,379
|
77
|
+
ramifice/utils/mixins/add_valid.py,sha256=vYq4wGdpfA4iLMts7G0NvDALZBwupOScsajDFWCmmYg,472
|
78
|
+
ramifice/utils/mixins/hooks.py,sha256=h8coNstWWHI4VwPgpjx0NWTj93-5NDAGtav0VFh-fk4,1031
|
79
|
+
ramifice/utils/mixins/indexing.py,sha256=WVLxmkLKg-C_LHn2hq6LJuOkSr9eS-XUUvCMgK-pKYo,387
|
80
|
+
ramifice/utils/mixins/json_converter.py,sha256=qBqFYol3Pbq1kX33EWB6FsYUL3AGSdYNtQE97HQ9jy4,1225
|
81
|
+
ramifice-0.8.15.dist-info/METADATA,sha256=vQ7R_-JH-IBtlnJYLSNYMVM0jCmS25dLfvJNOrimQdM,20928
|
82
|
+
ramifice-0.8.15.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
83
|
+
ramifice-0.8.15.dist-info/licenses/LICENSE,sha256=LrEL0aTZx90HDwFUQCJutORiDjJL9AnuVvCtspXIqt4,1095
|
84
|
+
ramifice-0.8.15.dist-info/RECORD,,
|
ramifice-0.8.13.dist-info/RECORD
DELETED
@@ -1,84 +0,0 @@
|
|
1
|
-
ramifice/__init__.py,sha256=Xejr_t4cimFFNKS6xXvAeLRue1vTB5kZWGeYbHXDUDw,1116
|
2
|
-
ramifice/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
3
|
-
ramifice/commons/__init__.py,sha256=F5tnz0bz7IcwOT9wkPmyWL7cDDUI1BUVSfC73G56dfs,567
|
4
|
-
ramifice/commons/general.py,sha256=HuErflr-dZ2pWhaSy81IGllFfGxlj8yrdnaAEGUtK3M,5554
|
5
|
-
ramifice/commons/indexes.py,sha256=Ay1Y7Ft8t6Yuw7_LHtK5K87BNAac2WYsY2zzvPEu_zw,3784
|
6
|
-
ramifice/commons/many.py,sha256=ekOp7XxusTA7u6GKErtV8fEeQ5mzCV3IJz_jiA045GM,9464
|
7
|
-
ramifice/commons/one.py,sha256=xSMghkeRgheIY4U9vl9om7_ASihrkQ41AXS4m7W3z2M,7028
|
8
|
-
ramifice/commons/tools.py,sha256=Cs1RRWolxBrGXwTWLuqYmkOgDLYoKJmfctf_MgZPams,2505
|
9
|
-
ramifice/commons/unit_manager.py,sha256=9XrWZtbt9CzZMUDz4mqL3McvJ8RkseMSJpNGgxoGSeA,4875
|
10
|
-
ramifice/fields/__init__.py,sha256=g1Nrv2E1XrdGO9xIiyhhjIRDh-KyOwLSvDuMCOfmBBw,1721
|
11
|
-
ramifice/fields/bool_field.py,sha256=azPiI2Fq6PkBGILeDo2wrIepzPERRPMrFvE7z7FxnvM,2408
|
12
|
-
ramifice/fields/choice_float_dyn_field.py,sha256=a2HS4PlIPQs9Ya3foyMthFqWZT45p8tIJ9NIllV9Zgk,3490
|
13
|
-
ramifice/fields/choice_float_field.py,sha256=lfDgF57LFHKcr2HyC-V8SZkuiyWUSIWEefzU_CYBE-Q,4336
|
14
|
-
ramifice/fields/choice_float_mult_dyn_field.py,sha256=zcSyyOfXHD9RE78cxnG4ACpAKrYm1n93LRwIooWTd4U,3557
|
15
|
-
ramifice/fields/choice_float_mult_field.py,sha256=WlRSb5o8Jn2F9xYBXH0u1xpuXQdNJFNED4b2PuVnD_s,4706
|
16
|
-
ramifice/fields/choice_int_dyn_field.py,sha256=wg90Pdf9gHri0VLpTLbI_ztJvFsdiN9dqJJskO1hMN4,3482
|
17
|
-
ramifice/fields/choice_int_field.py,sha256=2vM9WVXYdk9nYgGajmf_B8m3J17zRqOmncqF9_jFOYs,4322
|
18
|
-
ramifice/fields/choice_int_mult_dyn_field.py,sha256=Vn_Ua8lV-5YN6VRfHaquq299ZBlyENv88_wdqR4tnCU,3551
|
19
|
-
ramifice/fields/choice_int_mult_field.py,sha256=dv-qwE_yT_dedJicwCQM0O_jahexSlw_R1RtKGyuZ3E,4698
|
20
|
-
ramifice/fields/choice_text_dyn_field.py,sha256=lSmD-JW4w1NdVa_GhUcCZ4Su5pmRmoMtebgRgiwCfso,3473
|
21
|
-
ramifice/fields/choice_text_field.py,sha256=5choPzao1Np74e-5iRWBHL9VxkVe93XRJYqtZgY11mE,4542
|
22
|
-
ramifice/fields/choice_text_mult_dyn_field.py,sha256=8wqlU0sTJ48Joeh1yyrAE8LnRH2GSBUOWzcjqvWU7lY,3542
|
23
|
-
ramifice/fields/choice_text_mult_field.py,sha256=gbHqd0awF_h1KlEecGVzIiXNs5pdR4_VKqbFzzJjTt8,4689
|
24
|
-
ramifice/fields/color_field.py,sha256=lbSHIsf3i42S5vvTCgO9IBYgywK6EeF58TNTG71C1Xw,3937
|
25
|
-
ramifice/fields/date_field.py,sha256=vu8tiQMdwrcG0MEsBKJ7WibVY2te1goWO1m6HSb36LU,5743
|
26
|
-
ramifice/fields/date_time_field.py,sha256=ntAwhSUcVSy_-Py1IuTtZpeVqafqKmxqJPFhROMbG4s,5782
|
27
|
-
ramifice/fields/email_field.py,sha256=V_Nw6tHrWQ11-8KDn-AzA6SGyMVnSMmFEhmQdsBYke4,3850
|
28
|
-
ramifice/fields/file_field.py,sha256=YK3HU2jfiFXMkuq9m_ZBJZY4nppEJwCg4h0d9e_WQOw,8782
|
29
|
-
ramifice/fields/float_field.py,sha256=PK1YTiY2prSyMUg_TgtryAAECzmripF5VWe_trFWjEo,5083
|
30
|
-
ramifice/fields/id_field.py,sha256=osYwdJgHBSR4w4dPc1PcZmt58fq7wjrhzFoLtZ3SP9M,4547
|
31
|
-
ramifice/fields/image_field.py,sha256=gmIrtYkic7bpvOv0I-snMi1WxgyPdJlnmJWd4oIvuTk,12302
|
32
|
-
ramifice/fields/integer_field.py,sha256=Djjym6ceLtkhKzeHHCOv9Zx5egTTJhVWQpVTljxN4-4,5057
|
33
|
-
ramifice/fields/ip_field.py,sha256=nMo3t5xgg_cgU5NjsDaUko4I-MCdm9I4wg5ybV03-VM,3754
|
34
|
-
ramifice/fields/password_field.py,sha256=I6yn8Iyez-V3M8czHi25lLrR8zabGX87ozZGgq-ulBw,3612
|
35
|
-
ramifice/fields/phone_field.py,sha256=jCZkIu1FIMUA6oEGOFmrdULJM50Ag5p8wbGOnDfKKag,4040
|
36
|
-
ramifice/fields/slug_field.py,sha256=E5ZxEx8_4y6sO-neBbbodKSb4vjNg2DPO-ioLyVydxE,3049
|
37
|
-
ramifice/fields/text_field.py,sha256=qPwQ_IW6TdkK7kIV6GWTVsw1OJu6Cb-7w3UtH0Ksx1o,4515
|
38
|
-
ramifice/fields/url_field.py,sha256=10H0pg4Du5goT9mKs53A4PgMDQSCkcJB9R7tE9UrdWc,4402
|
39
|
-
ramifice/fields/general/__init__.py,sha256=j3Onqv8DAR5vMf7GLvLdBDYe5i2WaxF6aHgus0NZBMw,51
|
40
|
-
ramifice/fields/general/choice_group.py,sha256=u-xmgr88oYo2gPxmBaCk9Lzxh6dWxYj_N8hiEoOENgM,1014
|
41
|
-
ramifice/fields/general/date_group.py,sha256=RCNl5qrOwJ1AoysgpwR2mq87l0UJU0Ep7MmliLyTtjM,1263
|
42
|
-
ramifice/fields/general/field.py,sha256=bNVZrl4Vw0ZBHHdijAUAbIl78jIB4loWRUYMcdg6i0E,1430
|
43
|
-
ramifice/fields/general/file_group.py,sha256=SmF8OHKXsyZtWr90n8iCAXBXFQrjRV2HdDc_n1ngITk,1064
|
44
|
-
ramifice/fields/general/number_group.py,sha256=jspiA9hWiU_hNhXbTku2rZG3UezrhEVBGopNgooJ4ig,813
|
45
|
-
ramifice/fields/general/text_group.py,sha256=hYVX4-ipD2_eyj-WpHIHnFrpQevySaVd4twffUsrOLo,1164
|
46
|
-
ramifice/models/__init__.py,sha256=y5jRhSzcPuEVUWr1u--o1GyjFb7irlf5Rn2gPvQ3IPg,26
|
47
|
-
ramifice/models/decorator.py,sha256=U4uubmFUCipkiILvej5VrH4qwow3DGG_DG444hX6Ju0,6667
|
48
|
-
ramifice/models/model.py,sha256=m19E7h3Fv2F7oDotc1z_n_NglFN7KmXOrNL0r4Jg_y4,7352
|
49
|
-
ramifice/paladins/__init__.py,sha256=I2FzvCrp6upv_GPLfDqaVLwIT6-3Dp_K9i51tFUXDuc,673
|
50
|
-
ramifice/paladins/check.py,sha256=kZXibFqTkMnMdujAVlcGRVaMZlOQ0od5N0lWExu_FEc,6971
|
51
|
-
ramifice/paladins/delete.py,sha256=PRd-xraM9gMdCSFemGX5A8YAdg08RKVqerBGrvFwfJk,3677
|
52
|
-
ramifice/paladins/password.py,sha256=MyDZN94yUqpAmD2jt6Hk5714bYcXQZGszNVjm33e-M8,3332
|
53
|
-
ramifice/paladins/refrash.py,sha256=QyvWm_nRdbrtRuyESLZbaoEkqO8n1cs1tvsIfSu6mC8,1251
|
54
|
-
ramifice/paladins/save.py,sha256=XlJUKkMySE7_9w1H9L-u7L-J9Uj88njVzTHzfI9rYu8,4121
|
55
|
-
ramifice/paladins/tools.py,sha256=sdQQkyi3VaS0v_bVHRy6bt_pPmu0r1iorT9MX9_ThIw,2978
|
56
|
-
ramifice/paladins/validation.py,sha256=DglGT-GnL7XM__77vNXkOAmdBMUVw8HyIJJ5rmKuPns,1808
|
57
|
-
ramifice/paladins/groups/__init__.py,sha256=JCsgvspyx4dg9vNNONIlGzlL4Dnejm5N4rynOG8LLPo,723
|
58
|
-
ramifice/paladins/groups/bool_group.py,sha256=hOD2wbz6VFS7KhxuevV5ApKXkmTJB18S-5s92PwOmHM,874
|
59
|
-
ramifice/paladins/groups/choice_group.py,sha256=ODB7m8PFY-fM68LTRujN7yUL9oJvMt39p25aVBJxWCc,1881
|
60
|
-
ramifice/paladins/groups/date_group.py,sha256=I7W2HFJ96IJh8lpMyHa--_msyNityN2cGbWMky-ShAc,3845
|
61
|
-
ramifice/paladins/groups/file_group.py,sha256=Rtj75Q8V7ie8Nf96Z-QYj2Ah65HK8BQIwbFvSFJxeLE,3048
|
62
|
-
ramifice/paladins/groups/id_group.py,sha256=cXVM65IGo7UTrTezc_6NsSfHK7SXGekQgY1YHQT6Gug,1354
|
63
|
-
ramifice/paladins/groups/img_group.py,sha256=M-fzE1tX0BVYqvT9KCqdTo5FbS5f-nSXdomyNWrvTNw,6204
|
64
|
-
ramifice/paladins/groups/num_group.py,sha256=WJR6Jaxd_YmEvWdgEXzDFZsiiF0OqOstw6_NaRGbLSU,2382
|
65
|
-
ramifice/paladins/groups/pass_group.py,sha256=1_FYXA96yan4xCvoY-ABX02T8gyrPP5Pjr4Np_expi8,1953
|
66
|
-
ramifice/paladins/groups/slug_group.py,sha256=0H1baGmX572t3v6E68rwS3AvDyfGPJMldZgPVNZtyPI,2533
|
67
|
-
ramifice/paladins/groups/text_group.py,sha256=2CyhZxQgFDv-uGRKIxgngB15_BfgPmhxp4N_X7WXsSQ,4538
|
68
|
-
ramifice/utils/__init__.py,sha256=wdOon9X-38jYpgOy1qyN-u7IzbGEXXuXudnzj5xFQGI,54
|
69
|
-
ramifice/utils/constants.py,sha256=VFvzFaOfzzhfoLMrI9nH9Dz_P5ktI8cOdqTINFHUEo4,2624
|
70
|
-
ramifice/utils/errors.py,sha256=OBoTuVLkMbtt-wdOZKY6eByNwAmaQvu1FHhfUi-aU9k,1978
|
71
|
-
ramifice/utils/fixtures.py,sha256=fmC87O0EE-EHsDqSOMD0mCSehKncMazzPuIfm7cO1tI,3351
|
72
|
-
ramifice/utils/migration.py,sha256=Q_kDRdMMtkYX4mB8RoLD2sIOej8rr9yhqz-Aip57VYU,11553
|
73
|
-
ramifice/utils/tools.py,sha256=LZyA715HnkNO7TcBu4Ia29A6Ko3n-F2BRULzIyNKt9o,3279
|
74
|
-
ramifice/utils/translations.py,sha256=hIEXrc_53zx8wMnC7RnsIkqmh_SWJcxKQGl-TXGy3c4,4698
|
75
|
-
ramifice/utils/unit.py,sha256=7I48948JfUSxHS78aN7VfFi5nMi5DUi2cgaDu15dn7s,2601
|
76
|
-
ramifice/utils/mixins/__init__.py,sha256=1W6HoabjN73crpzJ_rmhI10KM9C2RbPZn5Em6Gi9Aig,283
|
77
|
-
ramifice/utils/mixins/add_valid.py,sha256=vYq4wGdpfA4iLMts7G0NvDALZBwupOScsajDFWCmmYg,472
|
78
|
-
ramifice/utils/mixins/hooks.py,sha256=h8coNstWWHI4VwPgpjx0NWTj93-5NDAGtav0VFh-fk4,1031
|
79
|
-
ramifice/utils/mixins/indexing.py,sha256=WVLxmkLKg-C_LHn2hq6LJuOkSr9eS-XUUvCMgK-pKYo,387
|
80
|
-
ramifice/utils/mixins/json_converter.py,sha256=qBqFYol3Pbq1kX33EWB6FsYUL3AGSdYNtQE97HQ9jy4,1225
|
81
|
-
ramifice-0.8.13.dist-info/METADATA,sha256=MPb7W8bLK3cwGVfNc8iZai1EiXoy35pc_a8pccd9_Z8,20361
|
82
|
-
ramifice-0.8.13.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
83
|
-
ramifice-0.8.13.dist-info/licenses/LICENSE,sha256=LrEL0aTZx90HDwFUQCJutORiDjJL9AnuVvCtspXIqt4,1095
|
84
|
-
ramifice-0.8.13.dist-info/RECORD,,
|
File without changes
|
File without changes
|