ramifice 0.8.27__py3-none-any.whl → 0.8.29__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/__init__.py CHANGED
@@ -26,6 +26,7 @@ __all__ = (
26
26
  "model",
27
27
  "translations",
28
28
  "Migration",
29
+ "to_human_size",
29
30
  "Unit",
30
31
  )
31
32
 
@@ -36,6 +37,7 @@ from xloft import NamedTuple
36
37
  from ramifice.models.decorator import model
37
38
  from ramifice.utils import translations
38
39
  from ramifice.utils.migration import Migration
40
+ from ramifice.utils.tools import to_human_size
39
41
  from ramifice.utils.unit import Unit
40
42
 
41
43
  logging.basicConfig(
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,
@@ -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!")
@@ -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):
@@ -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!")
@@ -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:
@@ -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: # type: ignore
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!")
@@ -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):
@@ -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: # type: ignore
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!")
@@ -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:
@@ -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):
@@ -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!")
@@ -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
@@ -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)
@@ -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, "r") as file:
34
+ with open(fixture_path) as file:
35
35
  data_yaml = yaml.safe_load(file)
36
36
 
37
37
  if not bool(data_yaml):
@@ -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.27
3
+ Version: 0.8.29
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,9 +60,9 @@ 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
- <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>
66
66
  <br>
67
67
  <a href="https://pypi.org/project/ramifice"><img src="https://img.shields.io/pypi/format/ramifice" alt="Format"></a>
68
68
  <a href="https://github.com/kebasyaty/ramifice"><img src="https://img.shields.io/github/languages/top/kebasyaty/ramifice" alt="Top"></a>
@@ -96,7 +96,7 @@ Online browsable documentation is available at [https://kebasyaty.github.io/rami
96
96
 
97
97
  ## Requirements
98
98
 
99
- [View the list of requirements.](https://github.com/kebasyaty/ramifice/blob/v0/REQUIREMENTS.md "View the list of requirements.")
99
+ [View the list of requirements](https://github.com/kebasyaty/ramifice/blob/v0/REQUIREMENTS.md "Requirements").
100
100
 
101
101
  ## Installation
102
102
 
@@ -105,7 +105,7 @@ Online browsable documentation is available at [https://kebasyaty.github.io/rami
105
105
  [![Ubuntu](https://img.shields.io/badge/Ubuntu-E95420?style=for-the-badge&logo=ubuntu&logoColor=white)](https://github.com/kebasyaty/ramifice/blob/v0/assets/UBUNTU_INSTALL_MONGODB.md)
106
106
  [![Windows](https://img.shields.io/badge/Windows-0078D6?style=for-the-badge&logo=windows&logoColor=white)](https://www.mongodb.com/try/download/community)
107
107
 
108
- 1. Run:
108
+ 2. Run:
109
109
 
110
110
  ```shell
111
111
  # Fedora:
@@ -128,14 +128,14 @@ uv add ramifice
128
128
 
129
129
  ## Usage
130
130
 
131
- It is recommended to look at examples [here](https://github.com/kebasyaty/ramifice/tree/v0/examples "here").
131
+ [It is recommended to look at examples here](https://github.com/kebasyaty/ramifice/tree/v0/examples "It is recommended to look at examples here").
132
132
 
133
133
  ```python
134
134
  import re
135
135
  import asyncio
136
136
  from typing import Any
137
137
  from datetime import datetime
138
- import pprint
138
+ from pprint import pprint as pp
139
139
 
140
140
  from pymongo import AsyncMongoClient
141
141
  from ramifice import (
@@ -143,13 +143,13 @@ from ramifice import (
143
143
  model,
144
144
  translations,
145
145
  Migration,
146
+ to_human_size,
146
147
  )
147
148
  from ramifice.fields import (
148
149
  ImageField,
149
150
  PasswordField,
150
151
  TextField,
151
152
  )
152
- from ramifice.utils.tools import to_human_size
153
153
 
154
154
 
155
155
  @model(service_name="Accounts")
@@ -245,7 +245,7 @@ async def main():
245
245
  {f"username": user.username.value}
246
246
  )
247
247
  if user_details is not None:
248
- pprint.pprint(user_details)
248
+ pp(user_details)
249
249
  else:
250
250
  print("No User!")
251
251
 
@@ -323,9 +323,9 @@ uv run pybabel compile -d config/translations/ramifice
323
323
 
324
324
  ## Model Parameters
325
325
 
326
- See the documentation [here](https://kebasyaty.github.io/ramifice/ "here").
326
+ [See the documentation here.](https://kebasyaty.github.io/ramifice/ "See the documentation here.")
327
327
 
328
- ###### ( only `service_name` is a required parameter )
328
+ ( only `service_name` is a required parameter )
329
329
 
330
330
  <div>
331
331
  <table>
@@ -614,7 +614,7 @@ size: int = get_file_size(path) # => 9843
614
614
 
615
615
  ## Changelog
616
616
 
617
- [View the change history.](https://github.com/kebasyaty/ramifice/blob/v0/CHANGELOG.md "Changelog")
617
+ [View the change history](https://github.com/kebasyaty/ramifice/blob/v0/CHANGELOG.md "Changelog").
618
618
 
619
619
  ## License
620
620
 
@@ -1,41 +1,41 @@
1
- ramifice/__init__.py,sha256=rTkA9TUWsis-q056oslAcalr3rwNChMUcpQX5Q43Pzs,1520
1
+ ramifice/__init__.py,sha256=XdLGeKCFqIVRyaj4M_dpdVvQ8Kx8rL3FtyuR08Ehnc4,1590
2
2
  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=D4sRNe9zrG_BD43vcEbnv81YthnzctZznbih6lBCnqM,9424
7
- ramifice/commons/one.py,sha256=htcrIjwKTegwvLoA9KHVChCLzdwVJW0LZXUGLBMFE64,6979
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=hDHmn3u0NDeIXxh0iCvaxN_stxtCAJVie-cWAZ6TK88,4968
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=4oonFHhUdHCoEr5WTQ75kol0ugK73vrGgyp2sEc1NPI,4891
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=lCRFDlftuf8FnQxhw3pw543Aeo45dDJoHJOOlEUrnXc,5261
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=QwRt155knw0rK-VHwc6M2GlOyUmqgI2hGyJfjaicMQA,4877
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=bA3IzVNivQLJlQlKR9ot4TnaQVAFvGTNLvCYe55UMqE,5253
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=8oWCn0xX_mk6ZUICq1H-poTEAsTDgHPLQfCAZSNs-xI,5097
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=gw5vWxooWBp0-RbFNTs74_n7Ib_nS2hKjlYzDLgy9RU,5244
24
- ramifice/fields/color_field.py,sha256=-ju_cJBzKSmcXsFQweePqNmF8VeIyaRJLwvl_ypOuVk,4505
25
- ramifice/fields/date_field.py,sha256=pmn627RGLojnprr3KAEYWvaF8IZm3YsWFZHBR8CCuYQ,6315
26
- ramifice/fields/date_time_field.py,sha256=AVtxkvs6MP6GnSQ5chImWETnJ57LEHJinTj05Xg1xiE,6372
27
- ramifice/fields/email_field.py,sha256=Z1FNIVy6NFcgxYXxsioUfU_kipbMp6iXdxS97woBooU,4445
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=ePOO0GBjDFlWjieRItpVKkUbKeuAagBCeDNvvFCVEJs,5859
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=jeHzsQtPJObDkKWUfyGagXn3_vKBaG4YXuJyqRYD1Mc,12854
32
- ramifice/fields/integer_field.py,sha256=p6dkzuTDjuBdi4K43m9-qRQGOXz4zNIz0x2fD1tm-Mk,5833
33
- ramifice/fields/ip_field.py,sha256=7s-pWIXVol2wWP6q8bEJiK_VyIzGZO17ZROK_GGbOrY,4349
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=9KwTd4lUHYsP2-XzWDnC0ri5reU7imCf51Qqjv_TIqQ,4636
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=O0IG1NKljTCN8AXll0vAQgPE5dXHJPbxrkytI6zG3i0,4348
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=2asTgb2rG4lfTciJhrfOI11kk-2wiScLBIbMy9Er3B4,6366
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=Gdfqb6pvcRwbcJNPXlG15aIZfpWNZJlpA4Yomf8at1c,6940
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=f91g24hDaifTtZVDCaixWYTAdUj0MTGv10hqT8FNUaE,3747
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=i6beJVv4RpMsSnqZziCLnvKoC43r4lyjsUjyBu_ZBkk,3812
64
- ramifice/paladins/groups/file_group.py,sha256=vzTfkEKA4GDd3c4opeFbM_teGslYreoAyplvzvzpeCw,3015
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=yH1cNAZbRnc5l67HCsjLNf2cR0L4LGasuBMOhCOP4GA,6171
67
- ramifice/paladins/groups/num_group.py,sha256=UtpmYELsNyooiOEIAhSaRuTxYr_FrNpqq9KqAflX2aU,2349
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=8DqsTyX1yLIk04bYrKJHGojTc7974sEhQnsc6XVXe9M,3379
75
- ramifice/utils/migration.py,sha256=0XMdHl1K0Akt5RxsRB_aUzN4VvN2t2yu3O-jSpFh79A,11504
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=Z32YjftbhNiuZTAQaM9-2ILxkfYcNz4nQ-1MFr8Jjek,2548
80
- ramifice-0.8.27.dist-info/METADATA,sha256=ZVCIlIENRsAwjiVxjKUarX6apkD2gmTATwXy8h64A2c,21081
81
- ramifice-0.8.27.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
82
- ramifice-0.8.27.dist-info/licenses/LICENSE,sha256=LrEL0aTZx90HDwFUQCJutORiDjJL9AnuVvCtspXIqt4,1095
83
- ramifice-0.8.27.dist-info/RECORD,,
79
+ ramifice/utils/unit.py,sha256=fxeWGWh5GkI8E9lxsf80HOh-NihSrqEmIQAQlUKMIaE,2497
80
+ ramifice-0.8.29.dist-info/METADATA,sha256=hfYwYXqfRfVsffnIR8v6hpZ7xrqOL83KMSYJ0ZHyy_s,21066
81
+ ramifice-0.8.29.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
82
+ ramifice-0.8.29.dist-info/licenses/LICENSE,sha256=LrEL0aTZx90HDwFUQCJutORiDjJL9AnuVvCtspXIqt4,1095
83
+ ramifice-0.8.29.dist-info/RECORD,,