ramifice 0.8.27__py3-none-any.whl → 0.8.28__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 +4 -8
- ramifice/commons/one.py +1 -3
- ramifice/commons/unit_manager.py +2 -4
- ramifice/fields/choice_float_field.py +2 -5
- ramifice/fields/choice_float_mult_field.py +3 -8
- ramifice/fields/choice_int_field.py +2 -5
- ramifice/fields/choice_int_mult_field.py +3 -8
- ramifice/fields/choice_text_field.py +3 -8
- ramifice/fields/choice_text_mult_field.py +3 -8
- ramifice/fields/color_field.py +1 -3
- ramifice/fields/date_field.py +1 -3
- ramifice/fields/date_time_field.py +1 -3
- ramifice/fields/email_field.py +1 -3
- ramifice/fields/float_field.py +3 -5
- ramifice/fields/image_field.py +1 -1
- ramifice/fields/integer_field.py +3 -5
- ramifice/fields/ip_field.py +1 -3
- ramifice/fields/phone_field.py +1 -3
- ramifice/fields/url_field.py +1 -3
- ramifice/models/decorator.py +1 -3
- ramifice/paladins/check.py +1 -3
- ramifice/paladins/groups/date_group.py +1 -3
- ramifice/paladins/groups/file_group.py +1 -3
- ramifice/paladins/groups/img_group.py +1 -3
- ramifice/paladins/groups/num_group.py +2 -6
- ramifice/paladins/save.py +2 -8
- ramifice/utils/fixtures.py +1 -1
- ramifice/utils/migration.py +7 -18
- ramifice/utils/unit.py +1 -4
- {ramifice-0.8.27.dist-info → ramifice-0.8.28.dist-info}/METADATA +2 -1
- {ramifice-0.8.27.dist-info → ramifice-0.8.28.dist-info}/RECORD +33 -33
- {ramifice-0.8.27.dist-info → ramifice-0.8.28.dist-info}/WHEEL +0 -0
- {ramifice-0.8.27.dist-info → ramifice-0.8.28.dist-info}/licenses/LICENSE +0 -0
ramifice/commons/many.py
CHANGED
@@ -148,9 +148,7 @@ class ManyMixin:
|
|
148
148
|
session=session,
|
149
149
|
allow_disk_use=allow_disk_use,
|
150
150
|
)
|
151
|
-
inst_model_dict = {
|
152
|
-
key: val for key, val in cls().__dict__.items() if not callable(val) and not val.ignored
|
153
|
-
}
|
151
|
+
inst_model_dict = {key: val for key, val in cls().__dict__.items() if not callable(val) and not val.ignored}
|
154
152
|
lang = translations.CURRENT_LOCALE
|
155
153
|
async for mongo_doc in cursor:
|
156
154
|
doc_list.append(
|
@@ -158,7 +156,7 @@ class ManyMixin:
|
|
158
156
|
inst_model_dict,
|
159
157
|
mongo_doc,
|
160
158
|
lang,
|
161
|
-
)
|
159
|
+
),
|
162
160
|
)
|
163
161
|
return doc_list
|
164
162
|
|
@@ -218,9 +216,7 @@ class ManyMixin:
|
|
218
216
|
session=session,
|
219
217
|
allow_disk_use=allow_disk_use,
|
220
218
|
)
|
221
|
-
inst_model_dict = {
|
222
|
-
key: val for key, val in cls().__dict__.items() if not callable(val) and not val.ignored
|
223
|
-
}
|
219
|
+
inst_model_dict = {key: val for key, val in cls().__dict__.items() if not callable(val) and not val.ignored}
|
224
220
|
lang = translations.CURRENT_LOCALE
|
225
221
|
async for mongo_doc in cursor:
|
226
222
|
doc_list.append(
|
@@ -228,7 +224,7 @@ class ManyMixin:
|
|
228
224
|
inst_model_dict,
|
229
225
|
mongo_doc,
|
230
226
|
lang,
|
231
|
-
)
|
227
|
+
),
|
232
228
|
)
|
233
229
|
return orjson.dumps(doc_list).decode("utf-8") if len(doc_list) > 0 else None
|
234
230
|
|
ramifice/commons/one.py
CHANGED
@@ -60,9 +60,7 @@ class OneMixin:
|
|
60
60
|
# Get document.
|
61
61
|
raw_doc = None
|
62
62
|
mongo_doc = await collection.find_one(filter, *args, **kwargs)
|
63
|
-
inst_model_dict = {
|
64
|
-
key: val for key, val in cls().__dict__.items() if not callable(val) and not val.ignored
|
65
|
-
}
|
63
|
+
inst_model_dict = {key: val for key, val in cls().__dict__.items() if not callable(val) and not val.ignored}
|
66
64
|
if mongo_doc is not None:
|
67
65
|
raw_doc = mongo_doc_to_raw_doc(
|
68
66
|
inst_model_dict,
|
ramifice/commons/unit_manager.py
CHANGED
@@ -35,12 +35,10 @@ class UnitMixin:
|
|
35
35
|
"""
|
36
36
|
# Get access to super collection.
|
37
37
|
# (Contains Model state and dynamic field data.)
|
38
|
-
super_collection: AsyncCollection = constants.MONGO_DATABASE[
|
39
|
-
constants.SUPER_COLLECTION_NAME
|
40
|
-
]
|
38
|
+
super_collection: AsyncCollection = constants.MONGO_DATABASE[constants.SUPER_COLLECTION_NAME]
|
41
39
|
# Get Model state.
|
42
40
|
model_state: dict[str, Any] | None = await super_collection.find_one(
|
43
|
-
filter={"collection_name": cls.META["collection_name"]}
|
41
|
+
filter={"collection_name": cls.META["collection_name"]},
|
44
42
|
)
|
45
43
|
# Check the presence of a Model state.
|
46
44
|
if model_state is None:
|
@@ -75,15 +75,12 @@ class ChoiceFloatField(Field, ChoiceGroup, JsonMixin):
|
|
75
75
|
if not isinstance(choices, list):
|
76
76
|
raise AssertionError("Parameter `choices` - Not а `list` type!")
|
77
77
|
if len(choices) == 0:
|
78
|
-
raise AssertionError(
|
79
|
-
"The `choices` parameter should not contain an empty list!"
|
80
|
-
)
|
78
|
+
raise AssertionError("The `choices` parameter should not contain an empty list!")
|
81
79
|
if default is not None and not isinstance(default, float):
|
82
80
|
raise AssertionError("Parameter `default` - Not а `float` type!")
|
83
81
|
if default is not None and choices is not None and not self.has_value():
|
84
82
|
raise AssertionError(
|
85
|
-
"Parameter `default` does not coincide with "
|
86
|
-
+ "list of permissive values in `choicees`."
|
83
|
+
"Parameter `default` does not coincide with " + "list of permissive values in `choicees`.",
|
87
84
|
)
|
88
85
|
if not isinstance(label, str):
|
89
86
|
raise AssertionError("Parameter `default` - Not а `str` type!")
|
@@ -76,20 +76,15 @@ class ChoiceFloatMultField(Field, ChoiceGroup, JsonMixin):
|
|
76
76
|
if not isinstance(choices, list):
|
77
77
|
raise AssertionError("Parameter `choices` - Not а `list` type!")
|
78
78
|
if len(choices) == 0:
|
79
|
-
raise AssertionError(
|
80
|
-
"The `choices` parameter should not contain an empty list!"
|
81
|
-
)
|
79
|
+
raise AssertionError("The `choices` parameter should not contain an empty list!")
|
82
80
|
if default is not None:
|
83
81
|
if not isinstance(default, list):
|
84
82
|
raise AssertionError("Parameter `default` - Not а `list` type!")
|
85
83
|
if len(default) == 0:
|
86
|
-
raise AssertionError(
|
87
|
-
"The `default` parameter should not contain an empty list!"
|
88
|
-
)
|
84
|
+
raise AssertionError("The `default` parameter should not contain an empty list!")
|
89
85
|
if choices is not None and not self.has_value():
|
90
86
|
raise AssertionError(
|
91
|
-
"Parameter `default` does not coincide with "
|
92
|
-
+ "list of permissive values in `choicees`."
|
87
|
+
"Parameter `default` does not coincide with " + "list of permissive values in `choicees`.",
|
93
88
|
)
|
94
89
|
if not isinstance(label, str):
|
95
90
|
raise AssertionError("Parameter `default` - Not а `str` type!")
|
@@ -75,15 +75,12 @@ class ChoiceIntField(Field, ChoiceGroup, JsonMixin):
|
|
75
75
|
if not isinstance(choices, list):
|
76
76
|
raise AssertionError("Parameter `choices` - Not а `list` type!")
|
77
77
|
if len(choices) == 0:
|
78
|
-
raise AssertionError(
|
79
|
-
"The `choices` parameter should not contain an empty list!"
|
80
|
-
)
|
78
|
+
raise AssertionError("The `choices` parameter should not contain an empty list!")
|
81
79
|
if default is not None and not isinstance(default, int):
|
82
80
|
raise AssertionError("Parameter `default` - Not а `str` type!")
|
83
81
|
if default is not None and choices is not None and not self.has_value():
|
84
82
|
raise AssertionError(
|
85
|
-
"Parameter `default` does not coincide with "
|
86
|
-
+ "list of permissive values in `choicees`."
|
83
|
+
"Parameter `default` does not coincide with " + "list of permissive values in `choicees`.",
|
87
84
|
)
|
88
85
|
if not isinstance(label, str):
|
89
86
|
raise AssertionError("Parameter `default` - Not а `str` type!")
|
@@ -76,20 +76,15 @@ class ChoiceIntMultField(Field, ChoiceGroup, JsonMixin):
|
|
76
76
|
if not isinstance(choices, list):
|
77
77
|
raise AssertionError("Parameter `choices` - Not а `list` type!")
|
78
78
|
if len(choices) == 0:
|
79
|
-
raise AssertionError(
|
80
|
-
"The `choices` parameter should not contain an empty list!"
|
81
|
-
)
|
79
|
+
raise AssertionError("The `choices` parameter should not contain an empty list!")
|
82
80
|
if default is not None:
|
83
81
|
if not isinstance(default, list):
|
84
82
|
raise AssertionError("Parameter `default` - Not а `list` type!")
|
85
83
|
if len(default) == 0:
|
86
|
-
raise AssertionError(
|
87
|
-
"The `default` parameter should not contain an empty list!"
|
88
|
-
)
|
84
|
+
raise AssertionError("The `default` parameter should not contain an empty list!")
|
89
85
|
if choices is not None and not self.has_value():
|
90
86
|
raise AssertionError(
|
91
|
-
"Parameter `default` does not coincide with "
|
92
|
-
+ "list of permissive values in `choicees`."
|
87
|
+
"Parameter `default` does not coincide with " + "list of permissive values in `choicees`.",
|
93
88
|
)
|
94
89
|
if not isinstance(label, str):
|
95
90
|
raise AssertionError("Parameter `default` - Not а `str` type!")
|
@@ -75,20 +75,15 @@ class ChoiceTextField(Field, ChoiceGroup, JsonMixin):
|
|
75
75
|
if not isinstance(choices, list):
|
76
76
|
raise AssertionError("Parameter `choices` - Not а `list` type!")
|
77
77
|
if len(choices) == 0:
|
78
|
-
raise AssertionError(
|
79
|
-
"The `choices` parameter should not contain an empty list!"
|
80
|
-
)
|
78
|
+
raise AssertionError("The `choices` parameter should not contain an empty list!")
|
81
79
|
if default is not None:
|
82
80
|
if not isinstance(default, str):
|
83
81
|
raise AssertionError("Parameter `default` - Not а `str` type!")
|
84
82
|
if len(default) == 0:
|
85
|
-
raise AssertionError(
|
86
|
-
"The `default` parameter should not contain an empty string!"
|
87
|
-
)
|
83
|
+
raise AssertionError("The `default` parameter should not contain an empty string!")
|
88
84
|
if choices is not None and not self.has_value():
|
89
85
|
raise AssertionError(
|
90
|
-
"Parameter `default` does not coincide with "
|
91
|
-
+ "list of permissive values in `choicees`."
|
86
|
+
"Parameter `default` does not coincide with " + "list of permissive values in `choicees`.",
|
92
87
|
)
|
93
88
|
if not isinstance(label, str):
|
94
89
|
raise AssertionError("Parameter `default` - Not а `str` type!")
|
@@ -76,20 +76,15 @@ class ChoiceTextMultField(Field, ChoiceGroup, JsonMixin):
|
|
76
76
|
if not isinstance(choices, list):
|
77
77
|
raise AssertionError("Parameter `choices` - Not а `list` type!")
|
78
78
|
if len(choices) == 0:
|
79
|
-
raise AssertionError(
|
80
|
-
"The `choices` parameter should not contain an empty list!"
|
81
|
-
)
|
79
|
+
raise AssertionError("The `choices` parameter should not contain an empty list!")
|
82
80
|
if default is not None:
|
83
81
|
if not isinstance(default, list):
|
84
82
|
raise AssertionError("Parameter `default` - Not а `list` type!")
|
85
83
|
if len(default) == 0:
|
86
|
-
raise AssertionError(
|
87
|
-
"The `default` parameter should not contain an empty list!"
|
88
|
-
)
|
84
|
+
raise AssertionError("The `default` parameter should not contain an empty list!")
|
89
85
|
if choices is not None and not self.has_value():
|
90
86
|
raise AssertionError(
|
91
|
-
"Parameter `default` does not coincide with "
|
92
|
-
+ "list of permissive values in `choicees`."
|
87
|
+
"Parameter `default` does not coincide with " + "list of permissive values in `choicees`.",
|
93
88
|
)
|
94
89
|
if not isinstance(label, str):
|
95
90
|
raise AssertionError("Parameter `default` - Not а `str` type!")
|
ramifice/fields/color_field.py
CHANGED
@@ -56,9 +56,7 @@ class ColorField(Field, TextGroup, JsonMixin):
|
|
56
56
|
if not isinstance(default, str):
|
57
57
|
raise AssertionError("Parameter `default` - Not а `str` type!")
|
58
58
|
if len(default) == 0:
|
59
|
-
raise AssertionError(
|
60
|
-
"The `default` parameter should not contain an empty string!"
|
61
|
-
)
|
59
|
+
raise AssertionError("The `default` parameter should not contain an empty string!")
|
62
60
|
if constants.REGEX["color_code"].match(default) is None:
|
63
61
|
raise AssertionError("Parameter `default` - Not а color code!")
|
64
62
|
if not isinstance(label, str):
|
ramifice/fields/date_field.py
CHANGED
@@ -59,9 +59,7 @@ class DateField(Field, DateGroup):
|
|
59
59
|
if not isinstance(min_date, datetime):
|
60
60
|
raise AssertionError("Parameter `min_date` - Not а `str` type!")
|
61
61
|
if max_date is not None and min_date is not None and max_date <= min_date:
|
62
|
-
raise AssertionError(
|
63
|
-
"The `max_date` parameter should be more than the `min_date`!"
|
64
|
-
)
|
62
|
+
raise AssertionError("The `max_date` parameter should be more than the `min_date`!")
|
65
63
|
if default is not None:
|
66
64
|
if not isinstance(default, datetime):
|
67
65
|
raise AssertionError("Parameter `default` - Not а `str` type!")
|
@@ -59,9 +59,7 @@ class DateTimeField(Field, DateGroup):
|
|
59
59
|
if not isinstance(min_date, datetime):
|
60
60
|
raise AssertionError("Parameter `min_date` - Not а `str` type!")
|
61
61
|
if max_date is not None and min_date is not None and max_date <= min_date:
|
62
|
-
raise AssertionError(
|
63
|
-
"The `max_date` parameter should be more than the `min_date`!"
|
64
|
-
)
|
62
|
+
raise AssertionError("The `max_date` parameter should be more than the `min_date`!")
|
65
63
|
if default is not None:
|
66
64
|
if not isinstance(default, datetime):
|
67
65
|
raise AssertionError("Parameter `default` - Not а `str` type!")
|
ramifice/fields/email_field.py
CHANGED
@@ -51,9 +51,7 @@ class EmailField(Field, TextGroup, JsonMixin):
|
|
51
51
|
if not isinstance(default, str):
|
52
52
|
raise AssertionError("Parameter `default` - Not а `str` type!")
|
53
53
|
if len(default) == 0:
|
54
|
-
raise AssertionError(
|
55
|
-
"The `default` parameter should not contain an empty string!"
|
56
|
-
)
|
54
|
+
raise AssertionError("The `default` parameter should not contain an empty string!")
|
57
55
|
try:
|
58
56
|
validate_email(default, check_deliverability=True)
|
59
57
|
except EmailNotValidError:
|
ramifice/fields/float_field.py
CHANGED
@@ -57,7 +57,7 @@ class FloatField(Field, NumberGroup, JsonMixin):
|
|
57
57
|
if input_type not in ["number", "range"]:
|
58
58
|
raise AssertionError(
|
59
59
|
"Parameter `input_type` - Invalid input type! "
|
60
|
-
+ "The permissible value of `number` or `range`."
|
60
|
+
+ "The permissible value of `number` or `range`.",
|
61
61
|
)
|
62
62
|
if max_number is not None and not isinstance(max_number, float):
|
63
63
|
raise AssertionError("Parameter `max_number` - Not а number `float` type!")
|
@@ -66,15 +66,13 @@ class FloatField(Field, NumberGroup, JsonMixin):
|
|
66
66
|
if not isinstance(step, float):
|
67
67
|
raise AssertionError("Parameter `step` - Not а number `float` type!")
|
68
68
|
if max_number is not None and min_number is not None and max_number <= min_number:
|
69
|
-
raise AssertionError(
|
70
|
-
"The `max_number` parameter should be more than the `min_number`!"
|
71
|
-
)
|
69
|
+
raise AssertionError("The `max_number` parameter should be more than the `min_number`!")
|
72
70
|
if default is not None:
|
73
71
|
if not isinstance(default, float):
|
74
72
|
raise AssertionError("Parameter `default` - Not а number `float` type!")
|
75
73
|
if max_number is not None and default > max_number:
|
76
74
|
raise AssertionError("Parameter `default` is more `max_number`!")
|
77
|
-
if max_number is not None and default < min_number:
|
75
|
+
if max_number is not None and default < min_number:
|
78
76
|
raise AssertionError("Parameter `default` is less `min_number`!")
|
79
77
|
if not isinstance(label, str):
|
80
78
|
raise AssertionError("Parameter `default` - Not а `str` type!")
|
ramifice/fields/image_field.py
CHANGED
@@ -86,7 +86,7 @@ class ImageField(Field, FileGroup, JsonMixin):
|
|
86
86
|
raise AssertionError(
|
87
87
|
"The `thumbnails` parameter -> "
|
88
88
|
+ f"The `{size_name}` key should be less than a previous size!"
|
89
|
-
+ 'Example: {"lg": 1200, "md": 600, "sm": 300, "xs": 150 }'
|
89
|
+
+ 'Example: {"lg": 1200, "md": 600, "sm": 300, "xs": 150 }',
|
90
90
|
)
|
91
91
|
curr_size_thumb = max_size_thumb
|
92
92
|
if not isinstance(label, str):
|
ramifice/fields/integer_field.py
CHANGED
@@ -57,7 +57,7 @@ class IntegerField(Field, NumberGroup, JsonMixin):
|
|
57
57
|
if input_type not in ["number", "range"]:
|
58
58
|
raise AssertionError(
|
59
59
|
"Parameter `input_type` - Invalid input type! "
|
60
|
-
+ "The permissible value of `number` or `range`."
|
60
|
+
+ "The permissible value of `number` or `range`.",
|
61
61
|
)
|
62
62
|
if max_number is not None and not isinstance(max_number, int):
|
63
63
|
raise AssertionError("Parameter `max_number` - Not а number `int` type!")
|
@@ -66,15 +66,13 @@ class IntegerField(Field, NumberGroup, JsonMixin):
|
|
66
66
|
if not isinstance(step, int):
|
67
67
|
raise AssertionError("Parameter `step` - Not а number `int` type!")
|
68
68
|
if max_number is not None and min_number is not None and max_number <= min_number:
|
69
|
-
raise AssertionError(
|
70
|
-
"The `max_number` parameter should be more than the `min_number`!"
|
71
|
-
)
|
69
|
+
raise AssertionError("The `max_number` parameter should be more than the `min_number`!")
|
72
70
|
if default is not None:
|
73
71
|
if not isinstance(default, int):
|
74
72
|
raise AssertionError("Parameter `default` - Not а number `int` type!")
|
75
73
|
if max_number is not None and default > max_number:
|
76
74
|
raise AssertionError("Parameter `default` is more `max_number`!")
|
77
|
-
if max_number is not None and default < min_number:
|
75
|
+
if max_number is not None and default < min_number:
|
78
76
|
raise AssertionError("Parameter `default` is less `min_number`!")
|
79
77
|
if not isinstance(label, str):
|
80
78
|
raise AssertionError("Parameter `default` - Not а `str` type!")
|
ramifice/fields/ip_field.py
CHANGED
@@ -50,9 +50,7 @@ class IPField(Field, TextGroup, JsonMixin):
|
|
50
50
|
if not isinstance(default, str):
|
51
51
|
raise AssertionError("Parameter `default` - Not а `str` type!")
|
52
52
|
if len(default) == 0:
|
53
|
-
raise AssertionError(
|
54
|
-
"The `default` parameter should not contain an empty string!"
|
55
|
-
)
|
53
|
+
raise AssertionError("The `default` parameter should not contain an empty string!")
|
56
54
|
try:
|
57
55
|
ipaddress.ip_address(default)
|
58
56
|
except ValueError:
|
ramifice/fields/phone_field.py
CHANGED
@@ -54,9 +54,7 @@ class PhoneField(Field, TextGroup, JsonMixin):
|
|
54
54
|
if not isinstance(default, str):
|
55
55
|
raise AssertionError("Parameter `default` - Not а `str` type!")
|
56
56
|
if len(default) == 0:
|
57
|
-
raise AssertionError(
|
58
|
-
"The `default` parameter should not contain an empty string!"
|
59
|
-
)
|
57
|
+
raise AssertionError("The `default` parameter should not contain an empty string!")
|
60
58
|
try:
|
61
59
|
phone_default = phonenumbers.parse(default)
|
62
60
|
if not phonenumbers.is_valid_number(phone_default):
|
ramifice/fields/url_field.py
CHANGED
@@ -50,9 +50,7 @@ class URLField(Field, TextGroup, JsonMixin):
|
|
50
50
|
if not isinstance(default, str):
|
51
51
|
raise AssertionError("Parameter `default` - Not а `str` type!")
|
52
52
|
if len(default) == 0:
|
53
|
-
raise AssertionError(
|
54
|
-
"The `default` parameter should not contain an empty string!"
|
55
|
-
)
|
53
|
+
raise AssertionError("The `default` parameter should not contain an empty string!")
|
56
54
|
result = urlparse(default)
|
57
55
|
if not result.scheme or not result.netloc:
|
58
56
|
raise AssertionError("Parameter `default` - Invalid URL address!")
|
ramifice/models/decorator.py
CHANGED
@@ -158,8 +158,6 @@ def caching(cls: Any, service_name: str) -> dict[str, Any]:
|
|
158
158
|
metadata["data_dynamic_fields"] = data_dynamic_fields
|
159
159
|
metadata["count_all_fields"] = count_all_fields
|
160
160
|
metadata["count_fields_no_ignored"] = count_fields_no_ignored
|
161
|
-
metadata["regex_mongo_filter"] = re.compile(
|
162
|
-
rf'(?P<field>"(?:{"|".join(supported_lang_fields)})":)'
|
163
|
-
)
|
161
|
+
metadata["regex_mongo_filter"] = re.compile(rf'(?P<field>"(?:{"|".join(supported_lang_fields)})":)')
|
164
162
|
|
165
163
|
return metadata
|
ramifice/paladins/check.py
CHANGED
@@ -80,9 +80,7 @@ class CheckMixin(
|
|
80
80
|
"field_data": None,
|
81
81
|
"full_model_name": cls_model.META["full_model_name"],
|
82
82
|
"is_migration_process": is_migration_process,
|
83
|
-
"curr_doc": (
|
84
|
-
await collection.find_one({"_id": doc_id}) if is_save and is_update else None
|
85
|
-
),
|
83
|
+
"curr_doc": (await collection.find_one({"_id": doc_id}) if is_save and is_update else None),
|
86
84
|
}
|
87
85
|
|
88
86
|
# Run checking fields.
|
@@ -105,9 +105,7 @@ class DateGroupMixin:
|
|
105
105
|
locale=translations.CURRENT_LOCALE,
|
106
106
|
)
|
107
107
|
)
|
108
|
-
err_msg = translations._(
|
109
|
-
"The date %s must not be less than min=%s !" % value_str, min_date_str
|
110
|
-
)
|
108
|
+
err_msg = translations._("The date %s must not be less than min=%s !" % value_str, min_date_str)
|
111
109
|
accumulate_error(err_msg, params)
|
112
110
|
# Insert result.
|
113
111
|
if params["is_save"]:
|
@@ -66,9 +66,7 @@ class FileGroupMixin:
|
|
66
66
|
return
|
67
67
|
# Accumulate an error if the file size exceeds the maximum value.
|
68
68
|
if value["size"] > field.max_size:
|
69
|
-
err_msg = translations._(
|
70
|
-
"File size exceeds the maximum value %s !" % to_human_size(field.max_size)
|
71
|
-
)
|
69
|
+
err_msg = translations._("File size exceeds the maximum value %s !" % to_human_size(field.max_size))
|
72
70
|
accumulate_error(err_msg, params)
|
73
71
|
return
|
74
72
|
# Insert result.
|
@@ -66,9 +66,7 @@ class ImgGroupMixin:
|
|
66
66
|
return
|
67
67
|
# Accumulate an error if the file size exceeds the maximum value.
|
68
68
|
if value["size"] > field.max_size:
|
69
|
-
err_msg = translations._(
|
70
|
-
"Image size exceeds the maximum value %s !" % to_human_size(field.max_size)
|
71
|
-
)
|
69
|
+
err_msg = translations._("Image size exceeds the maximum value %s !" % to_human_size(field.max_size))
|
72
70
|
accumulate_error(err_msg, params)
|
73
71
|
return
|
74
72
|
# Create thumbnails.
|
@@ -49,16 +49,12 @@ class NumGroupMixin:
|
|
49
49
|
# Validation the `max_number` field attribute.
|
50
50
|
max_number = field.max_number
|
51
51
|
if max_number is not None and value > max_number:
|
52
|
-
err_msg = translations._(
|
53
|
-
"The value %d must not be greater than max=%d !" % value, max_number
|
54
|
-
)
|
52
|
+
err_msg = translations._("The value %d must not be greater than max=%d !" % value, max_number)
|
55
53
|
accumulate_error(err_msg, params)
|
56
54
|
# Validation the `min_number` field attribute.
|
57
55
|
min_number = field.min_number
|
58
56
|
if min_number is not None and value < min_number:
|
59
|
-
err_msg = translations._(
|
60
|
-
"The value %d must not be less than min=%d !" % value, min_number
|
61
|
-
)
|
57
|
+
err_msg = translations._("The value %d must not be less than min=%d !" % value, min_number)
|
62
58
|
accumulate_error(err_msg, params)
|
63
59
|
# Validation the `unique` field attribute.
|
64
60
|
if field.unique and not await check_uniqueness(value, params, field_name):
|
ramifice/paladins/save.py
CHANGED
@@ -54,9 +54,7 @@ class SaveMixin:
|
|
54
54
|
# Run hook.
|
55
55
|
await self.post_update()
|
56
56
|
# Refresh Model.
|
57
|
-
mongo_doc: dict[str, Any] | None = await collection.find_one(
|
58
|
-
{"_id": checked_data["_id"]}
|
59
|
-
)
|
57
|
+
mongo_doc: dict[str, Any] | None = await collection.find_one({"_id": checked_data["_id"]})
|
60
58
|
if mongo_doc is None:
|
61
59
|
msg = (
|
62
60
|
f"Model: `{self.full_model_name()}` > "
|
@@ -80,11 +78,7 @@ class SaveMixin:
|
|
80
78
|
# Refresh Model.
|
81
79
|
mongo_doc = await collection.find_one({"_id": checked_data["_id"]})
|
82
80
|
if mongo_doc is None:
|
83
|
-
msg = (
|
84
|
-
f"Model: `{self.full_model_name()}` > "
|
85
|
-
+ "Method: `save` => "
|
86
|
-
+ "The document was not created."
|
87
|
-
)
|
81
|
+
msg = f"Model: `{self.full_model_name()}` > " + "Method: `save` => " + "The document was not created."
|
88
82
|
logger.critical(msg)
|
89
83
|
raise PanicError(msg)
|
90
84
|
refresh_from_mongo_doc(self, mongo_doc)
|
ramifice/utils/fixtures.py
CHANGED
@@ -31,7 +31,7 @@ async def apply_fixture(
|
|
31
31
|
fixture_path: str = f"config/fixtures/{fixture_name}.yml"
|
32
32
|
data_yaml: dict[str, Any] | list[dict[str, Any]] | None = None
|
33
33
|
|
34
|
-
with open(fixture_path
|
34
|
+
with open(fixture_path) as file:
|
35
35
|
data_yaml = yaml.safe_load(file)
|
36
36
|
|
37
37
|
if not bool(data_yaml):
|
ramifice/utils/migration.py
CHANGED
@@ -52,9 +52,7 @@ class Migration:
|
|
52
52
|
"""
|
53
53
|
# Get access to super collection.
|
54
54
|
# (Contains Model state and dynamic field data.)
|
55
|
-
super_collection: AsyncCollection = constants.MONGO_DATABASE[
|
56
|
-
constants.SUPER_COLLECTION_NAME
|
57
|
-
]
|
55
|
+
super_collection: AsyncCollection = constants.MONGO_DATABASE[constants.SUPER_COLLECTION_NAME]
|
58
56
|
# Switch the `is_model_exist` parameter in `False`.
|
59
57
|
async for model_state in super_collection.find():
|
60
58
|
q_filter = {"collection_name": model_state["collection_name"]}
|
@@ -65,12 +63,10 @@ class Migration:
|
|
65
63
|
"""Get the state of the current model from a super collection."""
|
66
64
|
# Get access to super collection.
|
67
65
|
# (Contains Model state and dynamic field data.)
|
68
|
-
super_collection: AsyncCollection = constants.MONGO_DATABASE[
|
69
|
-
constants.SUPER_COLLECTION_NAME
|
70
|
-
]
|
66
|
+
super_collection: AsyncCollection = constants.MONGO_DATABASE[constants.SUPER_COLLECTION_NAME]
|
71
67
|
# Get state of current Model.
|
72
68
|
model_state: dict[str, Any] | None = await super_collection.find_one(
|
73
|
-
{"collection_name": metadata["collection_name"]}
|
69
|
+
{"collection_name": metadata["collection_name"]},
|
74
70
|
)
|
75
71
|
if model_state is not None:
|
76
72
|
model_state["is_model_exist"] = True
|
@@ -102,9 +98,7 @@ class Migration:
|
|
102
98
|
database = constants.MONGO_DATABASE
|
103
99
|
# Get access to super collection.
|
104
100
|
# (Contains Model state and dynamic field data.)
|
105
|
-
super_collection: AsyncCollection = constants.MONGO_DATABASE[
|
106
|
-
constants.SUPER_COLLECTION_NAME
|
107
|
-
]
|
101
|
+
super_collection: AsyncCollection = constants.MONGO_DATABASE[constants.SUPER_COLLECTION_NAME]
|
108
102
|
# Delete data for non-existent Models.
|
109
103
|
async for model_state in super_collection.find():
|
110
104
|
if model_state["is_model_exist"] is False:
|
@@ -183,8 +177,7 @@ class Migration:
|
|
183
177
|
for field_name, field_type in metadata["field_name_and_type"].items():
|
184
178
|
if (
|
185
179
|
field_type == "PasswordField"
|
186
|
-
and model_state["field_name_and_type"].get(field_name)
|
187
|
-
== "PasswordField"
|
180
|
+
and model_state["field_name_and_type"].get(field_name) == "PasswordField"
|
188
181
|
):
|
189
182
|
checked_data[field_name] = mongo_doc[field_name]
|
190
183
|
# Update date and time.
|
@@ -200,9 +193,7 @@ class Migration:
|
|
200
193
|
if model_state["data_dynamic_fields"].get(field_name, False) == False: # noqa: E712
|
201
194
|
model_state["data_dynamic_fields"][field_name] = field_data
|
202
195
|
else:
|
203
|
-
metadata["data_dynamic_fields"][field_name] = model_state[
|
204
|
-
"data_dynamic_fields"
|
205
|
-
][field_name]
|
196
|
+
metadata["data_dynamic_fields"][field_name] = model_state["data_dynamic_fields"][field_name]
|
206
197
|
# Refresh state of current Model.
|
207
198
|
model_state["data_dynamic_fields"] = metadata["data_dynamic_fields"]
|
208
199
|
model_state["field_name_and_type"] = metadata["field_name_and_type"]
|
@@ -224,9 +215,7 @@ class Migration:
|
|
224
215
|
# Apply fixture to current Model.
|
225
216
|
fixture_name: str | None = cls_model.META["fixture_name"]
|
226
217
|
if fixture_name is not None:
|
227
|
-
collection: AsyncCollection = constants.MONGO_DATABASE[
|
228
|
-
cls_model.META["collection_name"]
|
229
|
-
]
|
218
|
+
collection: AsyncCollection = constants.MONGO_DATABASE[cls_model.META["collection_name"]]
|
230
219
|
if await collection.estimated_document_count() == 0:
|
231
220
|
await apply_fixture(
|
232
221
|
fixture_name=fixture_name,
|
ramifice/utils/unit.py
CHANGED
@@ -32,10 +32,7 @@ class Unit(JsonMixin):
|
|
32
32
|
msg = "Class: `Unit` > Field: `field` => Not а `str` type!"
|
33
33
|
raise PanicError(msg)
|
34
34
|
if not isinstance(title, dict):
|
35
|
-
msg =
|
36
|
-
"Class: `Unit` > Field: `title` => Not а `str` type! "
|
37
|
-
+ 'Example: {"en": "Title", "ru": "Заголовок"}'
|
38
|
-
)
|
35
|
+
msg = "Class: `Unit` > Field: `title` => Not а `str` type! " + 'Example: {"en": "Title", "ru": "Заголовок"}'
|
39
36
|
raise PanicError(msg)
|
40
37
|
if not isinstance(value, (float, int, str)):
|
41
38
|
msg = "Class: `Unit` > Field: `value` => Not a `float | int | str` type!"
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: ramifice
|
3
|
-
Version: 0.8.
|
3
|
+
Version: 0.8.28
|
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/
|
@@ -60,6 +60,7 @@ Description-Content-Type: text/markdown
|
|
60
60
|
<a href="https://github.com/kebasyaty/ramifice/issues"><img src="https://img.shields.io/github/issues/kebasyaty/ramifice.svg" alt="GitHub issues"></a>
|
61
61
|
<a href="https://pepy.tech/projects/ramifice"><img src="https://static.pepy.tech/badge/ramifice" alt="PyPI Downloads"></a>
|
62
62
|
<a href="https://github.com/kebasyaty/ramifice/blob/main/LICENSE" alt="GitHub license"><img src="https://img.shields.io/github/license/kebasyaty/ramifice" alt="GitHub license"></a>
|
63
|
+
<a href="https://mypy-lang.org/" alt="Types: Mypy"><img src="https://img.shields.io/badge/types-Mypy-202235.svg?color=0c7ebf" alt="Types: Mypy"></a>
|
63
64
|
<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>
|
64
65
|
<a href="https://github.com/kebasyaty/ramifice" alt="PyPI implementation"><img src="https://img.shields.io/pypi/implementation/ramifice" alt="PyPI implementation"></a>
|
65
66
|
<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>
|
@@ -3,39 +3,39 @@ ramifice/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3
3
|
ramifice/commons/__init__.py,sha256=HwOckqlNkt4OzFbYqnLw9x0VXLbwO_mJaJ9MLYgSvtI,545
|
4
4
|
ramifice/commons/general.py,sha256=ZryiRH-qf_cH9HCul7EP11UU-k4YO_rp_kku2FWAwj4,5433
|
5
5
|
ramifice/commons/indexes.py,sha256=dBPVYeJGbEyENLEzGjQmQ2XYOr3qqzjonj6zyH4rl54,3696
|
6
|
-
ramifice/commons/many.py,sha256=
|
7
|
-
ramifice/commons/one.py,sha256=
|
6
|
+
ramifice/commons/many.py,sha256=sirqV6oEPMaBlYc8UvReLUQtwvbhr5d2V1kYQ-xpK8o,9378
|
7
|
+
ramifice/commons/one.py,sha256=Ppq7vZpmvcfnpurgH3rXSix1KUUwDHYeJQqKkqedE14,6955
|
8
8
|
ramifice/commons/tools.py,sha256=o0o-0W7VDAMPiEOWF9Du7W7py94fCLFx8KJc7LM6HP4,2423
|
9
|
-
ramifice/commons/unit_manager.py,sha256=
|
9
|
+
ramifice/commons/unit_manager.py,sha256=OCDh8Ms-zCYgHEwwyXp83qYDmRBSgkkAnZiJHSuEGm8,4945
|
10
10
|
ramifice/fields/__init__.py,sha256=hjqCZG_kKsHdHtSd05vHn9SiFpk-YSvKEsVFaXim5Sw,2360
|
11
11
|
ramifice/fields/bool_field.py,sha256=d3sKQWMAfEycgtBIhIIov2XVoqLbN8th8i3H7YLrNdg,2769
|
12
12
|
ramifice/fields/choice_float_dyn_field.py,sha256=e-i7CtmDVqWzRJJ5Pq4PmI69riHDPx9NX51h2qFsjEE,3912
|
13
|
-
ramifice/fields/choice_float_field.py,sha256=
|
13
|
+
ramifice/fields/choice_float_field.py,sha256=2XyMkRa6uxc9q5cxB89upoCqaUaUqZ39BLLYcE9Hmc8,4811
|
14
14
|
ramifice/fields/choice_float_mult_dyn_field.py,sha256=45nr0FoY9roO2pJ0FfzBIMu6ih5cl7_3NyKVwtUAHrA,3979
|
15
|
-
ramifice/fields/choice_float_mult_field.py,sha256=
|
15
|
+
ramifice/fields/choice_float_mult_field.py,sha256=lvcSWEwYFOuxpPect3kRh6QnDGfzB2Y0JkODmhfurQo,5121
|
16
16
|
ramifice/fields/choice_int_dyn_field.py,sha256=qUAZivbZSmGYhoPo-vu9P0psEjj-ZtUWjmjYv9GY6yc,3904
|
17
|
-
ramifice/fields/choice_int_field.py,sha256=
|
17
|
+
ramifice/fields/choice_int_field.py,sha256=e0E2P1s21918KeYaKQrMsYb64QXztdcBiHzH7J6cLEw,4797
|
18
18
|
ramifice/fields/choice_int_mult_dyn_field.py,sha256=QajFttWuw5Z_S_ik48zev83tVIiPOgHjzPFnxmkO_e4,3973
|
19
|
-
ramifice/fields/choice_int_mult_field.py,sha256=
|
19
|
+
ramifice/fields/choice_int_mult_field.py,sha256=Aet8kmD8tmHk0IF13P4LTTpAQwKX8f7YwhkJSMVf3TI,5113
|
20
20
|
ramifice/fields/choice_text_dyn_field.py,sha256=H_BGtTuNNGJdXDZmGGPpi-7c0GtDGJwkyNFbKScLs28,3895
|
21
|
-
ramifice/fields/choice_text_field.py,sha256=
|
21
|
+
ramifice/fields/choice_text_field.py,sha256=Kkm_CZCNXlMH9_brp0bR93ByPUU0R8MKsleVvdrc6nc,4957
|
22
22
|
ramifice/fields/choice_text_mult_dyn_field.py,sha256=OrPZ-y2ihcJeLkTWJrcPgMijedq_5czbPEmISg1HdWU,3964
|
23
|
-
ramifice/fields/choice_text_mult_field.py,sha256=
|
24
|
-
ramifice/fields/color_field.py,sha256
|
25
|
-
ramifice/fields/date_field.py,sha256=
|
26
|
-
ramifice/fields/date_time_field.py,sha256=
|
27
|
-
ramifice/fields/email_field.py,sha256=
|
23
|
+
ramifice/fields/choice_text_mult_field.py,sha256=H3qp6B4Rw81FEycmBJ9wiwhTQc_hlE5TmRZJNj_Z-yc,5104
|
24
|
+
ramifice/fields/color_field.py,sha256=Q1ZezPW6Jl-9olKCx47pMdHTCauBY_lwoudxIhZpAgw,4449
|
25
|
+
ramifice/fields/date_field.py,sha256=svJjb6KgsmpW4RO8y3Opkh2uFwwSVfzyeb7nd5tNXLs,6267
|
26
|
+
ramifice/fields/date_time_field.py,sha256=jINGK1VrRt1boXmjJb6_WU7G7h_qnbUSolKNFOtVXFg,6324
|
27
|
+
ramifice/fields/email_field.py,sha256=joReU6YV-ViewMiRVvHozVjIhXuPMwxA-cmqwR5kkHY,4389
|
28
28
|
ramifice/fields/file_field.py,sha256=dAsOYXPjMNwC_t8jCyoNEwlRAsGEd9V_tiuix0qTukU,9476
|
29
|
-
ramifice/fields/float_field.py,sha256=
|
29
|
+
ramifice/fields/float_field.py,sha256=0OjoR9nwDs-Isv_lJoAT_jtdKmnd7-MqltCUiCViups,5796
|
30
30
|
ramifice/fields/id_field.py,sha256=36VroZIgCH6uKuYjjWTXIycZ06ZGy4reLX6FhMUphCI,4757
|
31
|
-
ramifice/fields/image_field.py,sha256=
|
32
|
-
ramifice/fields/integer_field.py,sha256=
|
33
|
-
ramifice/fields/ip_field.py,sha256=
|
31
|
+
ramifice/fields/image_field.py,sha256=dZOB8ctt-7KeB-ePDwgeIgpNP6tLfnxWBU_E5_6dApc,12855
|
32
|
+
ramifice/fields/integer_field.py,sha256=WKzmy-v2uLmIYlrTwcmuoUGfjWQhGD9wHukfQ0fUipk,5770
|
33
|
+
ramifice/fields/ip_field.py,sha256=GjDo1g5PEolqb8_AcDqgE_BnTITqew2rZcqmEn3S5WA,4293
|
34
34
|
ramifice/fields/password_field.py,sha256=lKELnyIjlAIJWeCR_3BCa0ZL5R0L73cf9zimigIgN3g,3902
|
35
|
-
ramifice/fields/phone_field.py,sha256=
|
35
|
+
ramifice/fields/phone_field.py,sha256=neaa9sCLtQR5zr0eiF6CkoSHIif2h2j01DY_VDgpNzk,4580
|
36
36
|
ramifice/fields/slug_field.py,sha256=wJtyf5LWP5pxw6G91_sYSs02QY7kvLYyB1_99_6gz5o,3552
|
37
37
|
ramifice/fields/text_field.py,sha256=fBVxBzHwj7R0TiSXnidqA5XHJdEz16WShT6TGjC-B6g,5299
|
38
|
-
ramifice/fields/url_field.py,sha256=
|
38
|
+
ramifice/fields/url_field.py,sha256=MbaXUVbmYIaYHN4sldaSIsojqxUjT0zHDpuzGC1pHrY,4292
|
39
39
|
ramifice/fields/general/__init__.py,sha256=JzgIDseNQLB_IDwY9-JSiT_bONxvhJmbKl5PhQzTnpE,40
|
40
40
|
ramifice/fields/general/choice_group.py,sha256=fdxfUEKavnW3SahtmyXNDsIJ1O67wCqZb0g-qnNc9cc,896
|
41
41
|
ramifice/fields/general/date_group.py,sha256=0Y4njV6AboQKCpSpjNRWiO8iJF4EdnVWOvmRz_M_7MY,1185
|
@@ -44,40 +44,40 @@ ramifice/fields/general/file_group.py,sha256=HjCww3B6eS9gUmr6AGZTXhHVhS_VBvn0Xpb
|
|
44
44
|
ramifice/fields/general/number_group.py,sha256=QvJnnpvWvU5J-99mWk7h-00hW7busClv1eSR_DPll4A,753
|
45
45
|
ramifice/fields/general/text_group.py,sha256=y5j_7I-TzOpr6vJpbEFHN1JRc6s0wa6BVSqnHMMmX-4,1077
|
46
46
|
ramifice/models/__init__.py,sha256=I4p5Y_oHG9ZLZ3vR44PpCGGvB-C2W7fSQPb5qJsm-VQ,178
|
47
|
-
ramifice/models/decorator.py,sha256=
|
47
|
+
ramifice/models/decorator.py,sha256=bFUN62UXLKSVteyd8GRZGEK-u-IgJQq1U_HrCrws5ZU,6350
|
48
48
|
ramifice/models/model.py,sha256=kexnWtfmQaiGZU2qKeAhuHLxmuIFFe-xHwCULzLs9bc,7639
|
49
49
|
ramifice/paladins/__init__.py,sha256=bFr12UzadCCpuIkGSd6reeIeQ5td8W7LfckduP84WXc,1517
|
50
50
|
ramifice/paladins/add_valid.py,sha256=c-vIkbbIBC94T4czxkQC40uwNEe6w8wQgNVgu4cjeoY,439
|
51
|
-
ramifice/paladins/check.py,sha256=
|
51
|
+
ramifice/paladins/check.py,sha256=7zRYKzaa2tXJq8OVNe52SEFt9YFkrElsf4-mvhVD_B0,6908
|
52
52
|
ramifice/paladins/delete.py,sha256=k3N2qlaHZLWtFUTqWvtkYaqW9h3uK7ecpLjKr5gfoGE,3690
|
53
53
|
ramifice/paladins/hooks.py,sha256=jTOcz5eb3WUpIy21h-CcnsISDDsTgDCWjitszcFxZFE,1057
|
54
54
|
ramifice/paladins/indexing.py,sha256=ep6iSUhnH70eaNASr0Kx3yeuRE_i9BEdVUUiJBo4hZE,363
|
55
55
|
ramifice/paladins/password.py,sha256=7lZmsl-bBely5zlVz0aCYlC5yf8nHp1YswoFF4CZWBI,3297
|
56
56
|
ramifice/paladins/refrash.py,sha256=oS-N1QVwQGwt5lSxS01bpM6ETGuMLV_RFt1u5v2uEds,1221
|
57
|
-
ramifice/paladins/save.py,sha256=
|
57
|
+
ramifice/paladins/save.py,sha256=ahuPKo6qh9MHPXs_QNo9RbeBvN74uWtuI27k84gx5f4,3631
|
58
58
|
ramifice/paladins/tools.py,sha256=8rkWPGrVMJiYN97EZuX52nVFVfB6qa08avYT4v8ohLA,2918
|
59
59
|
ramifice/paladins/validation.py,sha256=vJ55g4al-V_aGxFSrnXDwAxjJXWv00Z8ZGexFipRD1c,1890
|
60
60
|
ramifice/paladins/groups/__init__.py,sha256=GdIBJaMKz7L8pBKMAA__a4m-p0g0_RlzCcvDLDMMiec,958
|
61
61
|
ramifice/paladins/groups/bool_group.py,sha256=X8P4YDh02gNzxTo9rgeCnmnV88jApUPqPLYIkpf5vGg,841
|
62
62
|
ramifice/paladins/groups/choice_group.py,sha256=NkD2sKqBkdUMHY36pFdvL4uQ-81LXByRHF_lhCEAI6Y,1848
|
63
|
-
ramifice/paladins/groups/date_group.py,sha256=
|
64
|
-
ramifice/paladins/groups/file_group.py,sha256=
|
63
|
+
ramifice/paladins/groups/date_group.py,sha256=3i6U2mwFMxW8s5rRi7RtSr7my6a5Cdy5MRWe601hjGA,3780
|
64
|
+
ramifice/paladins/groups/file_group.py,sha256=vDeW5JCqKHWa43LILcVWJSU1TG-CrwKXQZhchWsZgM8,2975
|
65
65
|
ramifice/paladins/groups/id_group.py,sha256=9iurBTOuhG1_8Wmxc5piTMcUNxAW3H0ZavA1sW7uopY,1321
|
66
|
-
ramifice/paladins/groups/img_group.py,sha256=
|
67
|
-
ramifice/paladins/groups/num_group.py,sha256=
|
66
|
+
ramifice/paladins/groups/img_group.py,sha256=xSrDYqviuMt7mxOZiO0jKll1WnVlWRaSynk7ZvdEJ4c,6131
|
67
|
+
ramifice/paladins/groups/num_group.py,sha256=oiBqm9lFsyHBKZgxfWvcQUpePPIT_0TBGPVrt0ae57s,2285
|
68
68
|
ramifice/paladins/groups/pass_group.py,sha256=54kvAyoUCEjujTw0Dh6oUrtv3RU80sWEem_b-3Ytv0k,1920
|
69
69
|
ramifice/paladins/groups/slug_group.py,sha256=sf-9CebDLoCDsaxyPVJKMhi6D_tWFeg3ET8Qk5E8pU8,2505
|
70
70
|
ramifice/paladins/groups/text_group.py,sha256=TWvUxFctwDtXSJQL_E4TvHX1Yh-cDx5MJLGLAJyC6Xc,4478
|
71
71
|
ramifice/utils/__init__.py,sha256=lAD90nw2VfGSuf0SLjOkeFScBPmc48XFvecueAfq73w,468
|
72
72
|
ramifice/utils/constants.py,sha256=zDVG2D8u0UMNl1Ik90PhZCdxjmK81uwqxosorersbXE,2630
|
73
73
|
ramifice/utils/errors.py,sha256=eEV7-aVR0U19vKqTd9JRHFJXcOv6N1HtXSzqeQpdciE,2796
|
74
|
-
ramifice/utils/fixtures.py,sha256=
|
75
|
-
ramifice/utils/migration.py,sha256=
|
74
|
+
ramifice/utils/fixtures.py,sha256=0hdJGu895zDvVg5HUmRVUqDLZbvM-7BlhwTF6vhRqJI,3374
|
75
|
+
ramifice/utils/migration.py,sha256=rA6RMIB7xrLNGUJHPuvxA5O0B3NkmG155et82kOtu7g,11316
|
76
76
|
ramifice/utils/mixins.py,sha256=XSkxJllqsMxN7xcP_9kn3-GRS4a1l_QQpFOlD3e-tIM,1123
|
77
77
|
ramifice/utils/tools.py,sha256=EKNJAV9Ch17IrmghLcu7-I69gDNkDSqPepG9GKU7WkA,3163
|
78
78
|
ramifice/utils/translations.py,sha256=EWITTDd4uXukRubOchqGwNjmZWt5HxoxRgq_kKeGsR8,4646
|
79
|
-
ramifice/utils/unit.py,sha256=
|
80
|
-
ramifice-0.8.
|
81
|
-
ramifice-0.8.
|
82
|
-
ramifice-0.8.
|
83
|
-
ramifice-0.8.
|
79
|
+
ramifice/utils/unit.py,sha256=fxeWGWh5GkI8E9lxsf80HOh-NihSrqEmIQAQlUKMIaE,2497
|
80
|
+
ramifice-0.8.28.dist-info/METADATA,sha256=X_XGDUwRgnmu1K2qcI9zlEzKoKQSWbbquGD1DMsT28Q,21236
|
81
|
+
ramifice-0.8.28.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
82
|
+
ramifice-0.8.28.dist-info/licenses/LICENSE,sha256=LrEL0aTZx90HDwFUQCJutORiDjJL9AnuVvCtspXIqt4,1095
|
83
|
+
ramifice-0.8.28.dist-info/RECORD,,
|
File without changes
|
File without changes
|