ramifice 0.8.13__py3-none-any.whl → 0.8.15__py3-none-any.whl

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