ramifice 0.4.8__py3-none-any.whl → 0.4.10__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.
@@ -6,12 +6,32 @@ from pymongo.asynchronous.collection import AsyncCollection
6
6
  from pymongo.asynchronous.command_cursor import AsyncCommandCursor
7
7
  from pymongo.asynchronous.database import AsyncDatabase
8
8
 
9
- from ..utils import globals
9
+ from ..utils import globals, translations
10
10
 
11
11
 
12
12
  class GeneralMixin:
13
13
  """General purpose query methods."""
14
14
 
15
+ @classmethod
16
+ def from_mongo_doc(
17
+ cls,
18
+ mongo_doc: dict[str, Any],
19
+ ) -> Any:
20
+ """Create object instance from Mongo document."""
21
+ obj: Any = cls()
22
+ lang: str = translations.CURRENT_LOCALE
23
+ for name, data in mongo_doc.items():
24
+ field = obj.__dict__.get(name)
25
+ if field is None:
26
+ continue
27
+ if field.field_type == "TextField":
28
+ field.value = data.get(lang, "") if data is not None else None
29
+ elif field.group == "pass":
30
+ field.value = None
31
+ else:
32
+ field.value = data
33
+ return obj
34
+
15
35
  @classmethod
16
36
  async def estimated_document_count( # type: ignore[no-untyped-def]
17
37
  cls,
ramifice/commons/one.py CHANGED
@@ -7,7 +7,7 @@ from pymongo.results import DeleteResult
7
7
 
8
8
  from ..utils import globals
9
9
  from ..utils.errors import PanicError
10
- from .tools import from_mongo_doc, mongo_doc_to_raw_doc, password_to_none
10
+ from .tools import mongo_doc_to_raw_doc, password_to_none
11
11
 
12
12
 
13
13
  class OneMixin:
@@ -67,7 +67,7 @@ class OneMixin:
67
67
  mongo_doc = await collection.find_one(filter, *args, **kwargs)
68
68
  if mongo_doc is not None:
69
69
  # Convert document to Model instance.
70
- inst_model = from_mongo_doc(cls, mongo_doc)
70
+ inst_model = cls.from_mongo_doc(mongo_doc)
71
71
  return inst_model
72
72
 
73
73
  @classmethod
@@ -85,7 +85,7 @@ class OneMixin:
85
85
  mongo_doc = await collection.find_one(filter, *args, **kwargs)
86
86
  if mongo_doc is not None:
87
87
  # Convert document to Model instance.
88
- inst_model = from_mongo_doc(cls, mongo_doc)
88
+ inst_model = cls.from_mongo_doc( mongo_doc)
89
89
  json_str = inst_model.to_json()
90
90
  return json_str
91
91
 
ramifice/commons/tools.py CHANGED
@@ -18,24 +18,6 @@ def password_to_none(
18
18
  return mongo_doc
19
19
 
20
20
 
21
- def from_mongo_doc(
22
- cls_model: Any,
23
- mongo_doc: dict[str, Any],
24
- ) -> Any:
25
- """Create object instance from Mongo document."""
26
- obj: Any = cls_model()
27
- lang: str = translations.CURRENT_LOCALE
28
- for name, data in mongo_doc.items():
29
- field = obj.__dict__[name]
30
- if field.field_type == "TextField":
31
- field.value = data.get(lang, "") if data is not None else None
32
- elif field.group == "pass":
33
- field.value = None
34
- else:
35
- field.value = data
36
- return obj
37
-
38
-
39
21
  def mongo_doc_to_raw_doc(
40
22
  field_name_and_type: dict[str, str],
41
23
  mongo_doc: dict[str, Any],
@@ -69,8 +69,10 @@ class ChoiceFloatDynField(Field, ChoiceGroup, JsonMixin):
69
69
  self.value: float | None = None
70
70
  self.choices: dict[str, float] | None = None
71
71
 
72
- def has_value(self) -> bool:
72
+ def has_value(self, is_migrat: bool = False) -> bool:
73
73
  """Does the field value match the possible options in choices."""
74
+ if is_migrat:
75
+ return True
74
76
  value = self.value
75
77
  if value is not None:
76
78
  choices = self.choices
@@ -80,7 +80,7 @@ class ChoiceFloatField(Field, ChoiceGroup, JsonMixin):
80
80
  if not isinstance(readonly, bool):
81
81
  raise AssertionError("Parameter `readonly` - Not а `bool` type!")
82
82
 
83
- def has_value(self) -> bool:
83
+ def has_value(self, is_migrat: bool = False) -> bool:
84
84
  """Does the field value match the possible options in choices."""
85
85
  value = self.value
86
86
  if value is None:
@@ -69,8 +69,10 @@ class ChoiceFloatMultDynField(Field, ChoiceGroup, JsonMixin):
69
69
  self.value: list[float] | None = None
70
70
  self.choices: dict[str, float] | None = None
71
71
 
72
- def has_value(self) -> bool:
72
+ def has_value(self, is_migrat: bool = False) -> bool:
73
73
  """Does the field value match the possible options in choices."""
74
+ if is_migrat:
75
+ return True
74
76
  value = self.value
75
77
  if value is not None:
76
78
  choices = self.choices
@@ -91,7 +91,7 @@ class ChoiceFloatMultField(Field, ChoiceGroup, JsonMixin):
91
91
  if not isinstance(readonly, bool):
92
92
  raise AssertionError("Parameter `readonly` - Not а `bool` type!")
93
93
 
94
- def has_value(self) -> bool:
94
+ def has_value(self, is_migrat: bool = False) -> bool:
95
95
  """Does the field value match the possible options in choices."""
96
96
  value = self.value
97
97
  if value is None:
@@ -69,8 +69,10 @@ class ChoiceIntDynField(Field, ChoiceGroup, JsonMixin):
69
69
  self.value: int | None = None
70
70
  self.choices: dict[str, int] | None = None
71
71
 
72
- def has_value(self) -> bool:
72
+ def has_value(self, is_migrat: bool = False) -> bool:
73
73
  """Does the field value match the possible options in choices."""
74
+ if is_migrat:
75
+ return True
74
76
  value = self.value
75
77
  if value is not None:
76
78
  choices = self.choices
@@ -80,7 +80,7 @@ class ChoiceIntField(Field, ChoiceGroup, JsonMixin):
80
80
  if not isinstance(readonly, bool):
81
81
  raise AssertionError("Parameter `readonly` - Not а `bool` type!")
82
82
 
83
- def has_value(self) -> bool:
83
+ def has_value(self, is_migrat: bool = False) -> bool:
84
84
  """Does the field value match the possible options in choices."""
85
85
  value = self.value
86
86
  if value is None:
@@ -69,8 +69,10 @@ class ChoiceIntMultDynField(Field, ChoiceGroup, JsonMixin):
69
69
  self.value: list[int] | None = None
70
70
  self.choices: dict[str, int] | None = None
71
71
 
72
- def has_value(self) -> bool:
72
+ def has_value(self, is_migrat: bool = False) -> bool:
73
73
  """Does the field value match the possible options in choices."""
74
+ if is_migrat:
75
+ return True
74
76
  value = self.value
75
77
  if value is not None:
76
78
  choices = self.choices
@@ -91,7 +91,7 @@ class ChoiceIntMultField(Field, ChoiceGroup, JsonMixin):
91
91
  if not isinstance(readonly, bool):
92
92
  raise AssertionError("Parameter `readonly` - Not а `bool` type!")
93
93
 
94
- def has_value(self) -> bool:
94
+ def has_value(self, is_migrat: bool = False) -> bool:
95
95
  """Does the field value match the possible options in choices."""
96
96
  value = self.value
97
97
  if value is None:
@@ -69,8 +69,10 @@ class ChoiceTextDynField(Field, ChoiceGroup, JsonMixin):
69
69
  self.value: str | None = None
70
70
  self.choices: dict[str, str] | None = None
71
71
 
72
- def has_value(self) -> bool:
72
+ def has_value(self, is_migrat: bool = False) -> bool:
73
73
  """Does the field value match the possible options in choices."""
74
+ if is_migrat:
75
+ return True
74
76
  value = self.value
75
77
  if value is not None:
76
78
  choices = self.choices
@@ -85,7 +85,7 @@ class ChoiceTextField(Field, ChoiceGroup, JsonMixin):
85
85
  if not isinstance(readonly, bool):
86
86
  raise AssertionError("Parameter `readonly` - Not а `bool` type!")
87
87
 
88
- def has_value(self) -> bool:
88
+ def has_value(self, is_migrat: bool = False) -> bool:
89
89
  """Does the field value match the possible options in choices."""
90
90
  value = self.value
91
91
  if value is None:
@@ -69,8 +69,10 @@ class ChoiceTextMultDynField(Field, ChoiceGroup, JsonMixin):
69
69
  self.value: list[str] | None = None
70
70
  self.choices: dict[str, str] | None = None
71
71
 
72
- def has_value(self) -> bool:
72
+ def has_value(self, is_migrat: bool = False) -> bool:
73
73
  """Does the field value match the possible options in choices."""
74
+ if is_migrat:
75
+ return True
74
76
  value = self.value
75
77
  if value is not None:
76
78
  choices = self.choices
@@ -91,7 +91,7 @@ class ChoiceTextMultField(Field, ChoiceGroup, JsonMixin):
91
91
  if not isinstance(readonly, bool):
92
92
  raise AssertionError("Parameter `readonly` - Not а `bool` type!")
93
93
 
94
- def has_value(self) -> bool:
94
+ def has_value(self, is_migrat: bool = False) -> bool:
95
95
  """Does the field value match the possible options in choices."""
96
96
  value = self.value
97
97
  if value is None:
@@ -38,7 +38,10 @@ class CheckMixin(
38
38
  """Validation of Model data before saving to the database."""
39
39
 
40
40
  async def check(
41
- self, is_save: bool = False, collection: AsyncCollection | None = None
41
+ self,
42
+ is_save: bool = False,
43
+ collection: AsyncCollection | None = None,
44
+ is_migration_process: bool = False,
42
45
  ) -> dict[str, Any]:
43
46
  """Validation of Model data before saving to the database.
44
47
 
@@ -84,6 +87,7 @@ class CheckMixin(
84
87
  "field_data": None,
85
88
  "full_model_name": cls_model.META["full_model_name"],
86
89
  "is_migrate_model": is_migrate_model,
90
+ "is_migration_process": is_migration_process,
87
91
  "curr_doc": (
88
92
  await collection.find_one({"_id": doc_id}) if is_save and is_update else None
89
93
  ),
@@ -37,7 +37,7 @@ class ChoiceGroupMixin:
37
37
  params["result_map"][field.name] = None
38
38
  return
39
39
  # Does the field value match the possible options in choices.
40
- if not field.has_value():
40
+ if not field.has_value(is_migrat=params["is_migration_process"]):
41
41
  err_msg = translations._("Your choice does not match the options offered !")
42
42
  accumulate_error(err_msg, params)
43
43
  # Insert result.
@@ -68,7 +68,8 @@ async def apply_fixture(
68
68
  print(colored("\nFIXTURE:", "red", attrs=["bold"]))
69
69
  print(colored(fixture_path, "blue", attrs=["bold"]))
70
70
  inst_model.print_err()
71
- raise PanicError("Error: Fixtures")
71
+ msg = f"Fixture `{fixture_name}` failed."
72
+ raise PanicError(msg)
72
73
  # Get data for document.
73
74
  checked_data: dict[str, Any] = result_check["data"]
74
75
  # Add date and time.
@@ -102,7 +102,7 @@ class Monitor:
102
102
  # Delete collection associated with non-existent Model.
103
103
  await database.drop_collection(collection_name) # type: ignore[union-attr]
104
104
 
105
- async def migrat(self) -> None:
105
+ async def migrate(self) -> None:
106
106
  """Run migration process.
107
107
 
108
108
  1) Update the state of Models in the super collection.
@@ -154,7 +154,9 @@ class Monitor:
154
154
  #
155
155
  inst_model = cls_model.from_mongo_doc(mongo_doc)
156
156
  result_check: dict[str, Any] = await inst_model.check(
157
- is_save=True, collection=model_collection
157
+ is_save=True,
158
+ collection=model_collection,
159
+ is_migration_process=True,
158
160
  )
159
161
  if not result_check["is_valid"]:
160
162
  print(colored("\n!!!>>MIGRATION<<!!!", "red", attrs=["bold"]))
@@ -174,20 +176,21 @@ class Monitor:
174
176
  checked_data["updated_at"] = datetime.now()
175
177
  # Update the document in the database.
176
178
  await model_collection.replace_one(
177
- filter={"_id": checked_data["_id"]}, replacement=checked_data
179
+ filter={"_id": checked_data["_id"]},
180
+ replacement=checked_data,
178
181
  )
179
182
  #
180
183
  # Refresh the dynamic fields data for the current model.
181
- meta_dyn_field_list: list[str] = metadata["data_dynamic_fields"].keys()
182
- for field_name, field_data in model_state["data_dynamic_fields"].items():
183
- field_type = metadata["field_name_and_type"].get(field_name)
184
- if field_type is not None and field_name in meta_dyn_field_list:
185
- model_state["field_name_and_type"][field_name] = field_type
186
- metadata["data_dynamic_fields"][field_name] = field_data
187
- #
184
+ for field_name, field_data in metadata["data_dynamic_fields"].items():
185
+ if model_state["data_dynamic_fields"].get(field_name, False) == False:
186
+ model_state["data_dynamic_fields"][field_name] = field_data
187
+ else:
188
+ metadata["data_dynamic_fields"][field_name] = model_state[
189
+ "data_dynamic_fields"
190
+ ][field_name]
191
+ # Refresh state of current Model.
188
192
  model_state["data_dynamic_field"] = metadata["data_dynamic_fields"]
189
193
  model_state["field_name_and_type"] = metadata["field_name_and_type"]
190
- # Refresh state of current Model.
191
194
  await super_collection.replace_one(
192
195
  filter={"collection_name": model_state["collection_name"]},
193
196
  replacement=model_state,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ramifice
3
- Version: 0.4.8
3
+ Version: 0.4.10
4
4
  Summary: ORM-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/
@@ -220,7 +220,7 @@ async def main():
220
220
  await migration.Monitor(
221
221
  database_name="test_db",
222
222
  mongo_client=client,
223
- ).migrat()
223
+ ).migrate()
224
224
 
225
225
  # If you need to change the language of translation.
226
226
  # Hint: For Ramifice by default = "en"
@@ -453,6 +453,11 @@ collection = await User.collection()
453
453
  q_filter = {"email": "John_Smith@gmail.com"}
454
454
  mongo_doc = await User.find_one(q_filter)
455
455
 
456
+ # Create object instance from Mongo document.
457
+ q_filter = {"email": "John_Smith@gmail.com"}
458
+ mongo_doc = await User.find_one(q_filter)
459
+ user = User.from_mongo_doc(mongo_doc)
460
+
456
461
  # Find a single document and converting to raw document.
457
462
  q_filter = {"email": "John_Smith@gmail.com"}
458
463
  raw_doc = await User.find_one_to_raw_doc(q_filter)
@@ -516,7 +521,7 @@ async for index in await User.list_indexes():
516
521
  # Units Management.
517
522
  # Management for `choices` parameter in dynamic field types.
518
523
  # Units are stored in a separate collection.
519
- from ramifice.utils.unit import Unit
524
+ from ramifice import Unit
520
525
  unit = Unit(
521
526
  field="field_name", # The name of the dynamic field.
522
527
  title="Title", # The name of the choice item.
@@ -1,26 +1,26 @@
1
1
  ramifice/__init__.py,sha256=IuI20h84QWyFftykvte_HLft2iVxwpu0K592NypMwfo,759
2
2
  ramifice/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  ramifice/commons/__init__.py,sha256=FTG78sTU0ay0rvmrq5fUmVjL-I-S7wgQq3BLcyqnjrQ,433
4
- ramifice/commons/general.py,sha256=dy2GTpekLyshrNG68XV2dxNgwsS4QODtIcG-c6Xvalw,4298
4
+ ramifice/commons/general.py,sha256=yi52I9t8R1XePZdyrPmhXJxLc_YkY72Ea7_dBvsKfXI,4984
5
5
  ramifice/commons/indexes.py,sha256=hAcWKZ9MMgLbRtoQ6Af0b8r-PY0dbEYmMBl8z_d1DRo,3646
6
6
  ramifice/commons/many.py,sha256=KGt7licVJmLADvyPtH7-GbXHig-EnGFbnk7QKu3mfvQ,8214
7
- ramifice/commons/one.py,sha256=h9R-Ev-7h-xln4lp4SMJIIU9Cf9acqwjj4YYaML6uFg,5832
8
- ramifice/commons/tools.py,sha256=zR-mmqqsfSWKF0lws1qMvCh-sauJa8pHX5GNJZdAjMI,2341
7
+ ramifice/commons/one.py,sha256=MwUlU9getNtwTOL6-lROdzViBsChWgMIMppCWoeAnFU,5815
8
+ ramifice/commons/tools.py,sha256=s4CdHb9h8aqR371py0KVsBnNBJSW8-7AVjbTmuFAeeg,1793
9
9
  ramifice/commons/unit_manager.py,sha256=IkWqXu1PHHal0aGfx6zme81iXPeygxPqEWO-u_8RXoI,4356
10
10
  ramifice/fields/__init__.py,sha256=yRfX7Tvpuh27Ggcx5u9e1RRYK7Wu59EVJYxxetmuP1w,1290
11
11
  ramifice/fields/bool_field.py,sha256=WWubSwsFJZu8b3MviDd2zXnNYOQaYw8toklFNSTVFLA,2072
12
- ramifice/fields/choice_float_dyn_field.py,sha256=_QqZHJ9UDaKPWUlvzwAmf0BepKaA3AOhJWVsmajcqbM,3018
13
- ramifice/fields/choice_float_field.py,sha256=xoeKVFyAB9Ns64DAEiRjXWBuY7tEECSr6sKApz1NOz4,3649
14
- ramifice/fields/choice_float_mult_dyn_field.py,sha256=ERjg-eyZObT-ifMBdk78Ez04YlRz7kY_jhcS5QpEp0s,3081
15
- ramifice/fields/choice_float_mult_field.py,sha256=5pUWsZ8Z7OBo85OlZxlyPGNfwjOAfbNpbjgjgodpXZ0,4206
16
- ramifice/fields/choice_int_dyn_field.py,sha256=3Wu1alewYrQRPIbnXRrjsAp2E50xGK466x6YQbVQG7I,3012
17
- ramifice/fields/choice_int_field.py,sha256=emmmygqEXwwHMc49cV8a4y8iX-jHbwxLxRGjg2e0hig,3637
18
- ramifice/fields/choice_int_mult_dyn_field.py,sha256=olcebbGXz8ru8xZ1I1RwLdzIzYMUYBEInOerG_ci2k8,3077
19
- ramifice/fields/choice_int_mult_field.py,sha256=r4KN12VD8XtftboCiYfN2M9bg3RmZe8mHj2_6agEo1g,4200
20
- ramifice/fields/choice_text_dyn_field.py,sha256=M-Rkb4YyLjSmOBT8WE-fiNapQgk4uZnQMktVW6fMix4,3008
21
- ramifice/fields/choice_text_field.py,sha256=jzWNow_nPPzLLdFYyhrMvNALp0fqWbccyB3pUwhrH7k,3842
22
- ramifice/fields/choice_text_mult_dyn_field.py,sha256=5jch2i8fLn9Unkanm-zNA_0yegtTVsjcuJDg2TpzLRA,3073
23
- ramifice/fields/choice_text_mult_field.py,sha256=wzYQlWQmwYtg4LhK8n-ycX3ijac5Q6vwRHqRgG7WQNs,4196
12
+ ramifice/fields/choice_float_dyn_field.py,sha256=FNOX8999vOz9S_0UK1Mn_K9s3Mmy7OeXioCM1bOwtD0,3091
13
+ ramifice/fields/choice_float_field.py,sha256=rf93rsDkl4AImIIimkpFdMf3DzDq4j3yCzv_alu-R5U,3674
14
+ ramifice/fields/choice_float_mult_dyn_field.py,sha256=RRSWEietLjR3e0R62oq7c8PIng0XmHoLLJj0k9veE60,3154
15
+ ramifice/fields/choice_float_mult_field.py,sha256=a3n1YnBN7VBu45nLIl3eu3FcuEj86LebvT_iPzgLFnc,4231
16
+ ramifice/fields/choice_int_dyn_field.py,sha256=QhP0mGHTj3V4KKPj6hsc05bOe4Hw2TnNHimQBixVYAs,3085
17
+ ramifice/fields/choice_int_field.py,sha256=PyyFCkz-2lwKLJaKdR0DwYctMSk7n0iqxFbYeXUhVJQ,3662
18
+ ramifice/fields/choice_int_mult_dyn_field.py,sha256=NMPDWcgR6doeCHPYIHFeD9w66FcE6uKIVEIW4Zmk3YA,3150
19
+ ramifice/fields/choice_int_mult_field.py,sha256=gzmtf9segqAH7IuaZjR6l9cyaCNIrBdWKRuNPAU0Klk,4225
20
+ ramifice/fields/choice_text_dyn_field.py,sha256=yfk9pa1_KEKFNL5PzvTkRuz_83q3Lf38sBdogBQpybI,3081
21
+ ramifice/fields/choice_text_field.py,sha256=W4X5HkMVBrxu_6hWRfOffU6GAhgJEh9fJAb6cLIESPk,3867
22
+ ramifice/fields/choice_text_mult_dyn_field.py,sha256=xU_8mGPHIsRFndziE5o2NhuxwSg_cJX1mSBYMQtB8Yw,3146
23
+ ramifice/fields/choice_text_mult_field.py,sha256=0pNE2WWoyk_rX7-IMq3KUx6Yxl8OzSf0-_WGTRnxX1g,4221
24
24
  ramifice/fields/color_field.py,sha256=NdYey3Og8hh7oK7yDljrG6K8frgqj4C2OTXFnJVAYFQ,3526
25
25
  ramifice/fields/date_field.py,sha256=w875p6JwssKhEZJLBHmC8sE5wArn161rlQi0Zt-qEZo,5214
26
26
  ramifice/fields/date_time_field.py,sha256=OGi-ED-Gm_AWGzczHA1qch59IuWy3KkVIJHQl3OlatU,5249
@@ -48,7 +48,7 @@ ramifice/models/decorator.py,sha256=jOEn-0v0m_tM7mow45-tM-8LADUmwlG2DWZsEuC9S_w,
48
48
  ramifice/models/model.py,sha256=ZvgIbcuSXuAkBl_FofOZXGwWMwlqKB-PwTMyXiqK-Fo,6610
49
49
  ramifice/models/pseudo.py,sha256=PhLQM4zXdaOtTSmNFzwN4twlUmdvA1D_-YOMJtaOIwM,6754
50
50
  ramifice/paladins/__init__.py,sha256=PIP3AXI2KBRXNcLJUF0d7ygJ7VLOAxlhb4HRKQ9MGYY,516
51
- ramifice/paladins/check.py,sha256=9VQmr3GXaGitMQl-3KOZP-2_xYC7JG_jDLM62iKx1b4,6903
51
+ ramifice/paladins/check.py,sha256=ennDiVAoCZIS3aKBK0eA-Vt8VJQnbIv90be5IFYraFg,7026
52
52
  ramifice/paladins/delete.py,sha256=tw50E98D5eFZ7gHGnh_8ztUB1LeTeWWKZvIcQqlgbF8,3352
53
53
  ramifice/paladins/password.py,sha256=w1XWh3bsncH1VTVjCLxyKI2waxMvltwcsPWW3V9Ib84,3027
54
54
  ramifice/paladins/refrash.py,sha256=fw-9x_NKGzreipBt_F9KF6FTsYm9hSzfq4ubi1FHYrQ,1065
@@ -57,7 +57,7 @@ ramifice/paladins/tools.py,sha256=QxxwZILyBLcAiDUN48KE99c_cHVjG-VYilEsIinRhEU,26
57
57
  ramifice/paladins/validation.py,sha256=gcEJXIEPu1g7Z54vl14YTs5rCmxOEYsgQH1usFfyy7k,1730
58
58
  ramifice/paladins/groups/__init__.py,sha256=hpqmWLsYAMvZHAbmMXluQSqLhkHOSTUAgLHyTM1LTYI,472
59
59
  ramifice/paladins/groups/bool_group.py,sha256=oJc9mw9KGrnK_Pj7uXixYYQAJphcXLr_xSQv3PMUlcU,792
60
- ramifice/paladins/groups/choice_group.py,sha256=VcoPrTHTu9rcY4k6-dWHqBDE2zOHEIoLIKjG6-9dSps,1728
60
+ ramifice/paladins/groups/choice_group.py,sha256=96MOiOn-dD_GgYOCBjkG_Gct-mEF35z1TSCzEkyXK5o,1768
61
61
  ramifice/paladins/groups/date_group.py,sha256=B9usKKrHX16F1ckik60Xkub1tawgNENSHTk5Rt-K96k,3741
62
62
  ramifice/paladins/groups/file_group.py,sha256=-xgtrLOTlKXc71Mnbu3I_LbYnTEd8OprnhtYcJbaDtg,2932
63
63
  ramifice/paladins/groups/id_group.py,sha256=q5BeoM1e7mZmX0zVgemva9K-9ihJKBrX8kxvMh-uhhQ,1268
@@ -68,9 +68,9 @@ ramifice/paladins/groups/slug_group.py,sha256=joBB5litljbv2h5JKEMzF71s_DKMWH6nzg
68
68
  ramifice/paladins/groups/text_group.py,sha256=rUWNaAPkTMMlRf6A-6nQAa4HCj6NBTjPKIYaEKSOUL4,4305
69
69
  ramifice/utils/__init__.py,sha256=xixHoOX4ja5jIUZemem1qn4k4aonv3G3Q76azQK_pkU,43
70
70
  ramifice/utils/errors.py,sha256=iuhq7fzpUmsOyeXeg2fJjta8yAuqlXLKsZVMpfUhtHE,1901
71
- ramifice/utils/fixtures.py,sha256=Krl31nNShEg6A15Q8WRDqIai0bPyaJuK8jEGt5ySzao,3114
71
+ ramifice/utils/fixtures.py,sha256=qsv9cg06lc82XaRlhI1j5vftmOQTTwOcDXCg_lnpK04,3159
72
72
  ramifice/utils/globals.py,sha256=uR20um3Qg_1SG1t7WyWbpq8kQD-9Mslyr_c1yh5Hw9w,1751
73
- ramifice/utils/migration.py,sha256=LON53a8oBpjc9ox-FzqBEGsAWnqW8t-CWBkRC7BbwxI,11022
73
+ ramifice/utils/migration.py,sha256=ol8ysNGBr0wuOwo00ZbbN0U8YKiiYVgyRYja0axdiHM,11059
74
74
  ramifice/utils/tools.py,sha256=sOKzwnvf6vdTNf9r6PKAdw6aB4undat2Z8tzS3M1GnQ,2733
75
75
  ramifice/utils/translations.py,sha256=GNGE0ULAA0aOY5pTxUd3MQW-nVaKvp6BeXWEcsR0s0o,4048
76
76
  ramifice/utils/unit.py,sha256=qJ2SpClsFcMRcwB_ZA-QlrB5T9OinCBiWx5KqQ9vH_A,2266
@@ -79,7 +79,7 @@ ramifice/utils/mixins/add_valid.py,sha256=TLOObedzXNA9eCylfAVbVCqIKE5sV-P5AdIN7a
79
79
  ramifice/utils/mixins/hooks.py,sha256=33jvJRhfnJeL2Hd_YFXk3M_7wjqHaByU2wRjKyboL6s,914
80
80
  ramifice/utils/mixins/indexing.py,sha256=Z0427HoaVRyNmSNN8Fx0mSICgAKV-gDdu3iR5qYUEbs,329
81
81
  ramifice/utils/mixins/json_converter.py,sha256=WhigXyDAV-FfILaZuwvRFRIk0D90Rv3dG5t-mv5fVyc,1107
82
- ramifice-0.4.8.dist-info/METADATA,sha256=8SwX-fdl1VAUuVPM0j1M7ga_sZeClHp2tiD1hr5cFSM,21624
83
- ramifice-0.4.8.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
84
- ramifice-0.4.8.dist-info/licenses/LICENSE,sha256=LrEL0aTZx90HDwFUQCJutORiDjJL9AnuVvCtspXIqt4,1095
85
- ramifice-0.4.8.dist-info/RECORD,,
82
+ ramifice-0.4.10.dist-info/METADATA,sha256=KO9Jhk80L6Y9NajuZQ37nBSWxJt1XRHcyTGO2VFbuWY,21787
83
+ ramifice-0.4.10.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
84
+ ramifice-0.4.10.dist-info/licenses/LICENSE,sha256=LrEL0aTZx90HDwFUQCJutORiDjJL9AnuVvCtspXIqt4,1095
85
+ ramifice-0.4.10.dist-info/RECORD,,