ramifice 0.5.11__py3-none-any.whl → 0.6.0__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 (76) hide show
  1. ramifice/__init__.py +3 -3
  2. ramifice/commons/__init__.py +5 -5
  3. ramifice/commons/general.py +2 -2
  4. ramifice/commons/indexes.py +1 -1
  5. ramifice/commons/many.py +7 -3
  6. ramifice/commons/one.py +7 -3
  7. ramifice/commons/tools.py +1 -1
  8. ramifice/commons/unit_manager.py +3 -3
  9. ramifice/fields/__init__.py +28 -28
  10. ramifice/fields/bool_field.py +3 -3
  11. ramifice/fields/choice_float_dyn_field.py +4 -4
  12. ramifice/fields/choice_float_field.py +4 -4
  13. ramifice/fields/choice_float_mult_dyn_field.py +4 -4
  14. ramifice/fields/choice_float_mult_field.py +4 -4
  15. ramifice/fields/choice_int_dyn_field.py +4 -4
  16. ramifice/fields/choice_int_field.py +4 -4
  17. ramifice/fields/choice_int_mult_dyn_field.py +4 -4
  18. ramifice/fields/choice_int_mult_field.py +4 -4
  19. ramifice/fields/choice_text_dyn_field.py +4 -4
  20. ramifice/fields/choice_text_field.py +4 -4
  21. ramifice/fields/choice_text_mult_dyn_field.py +4 -4
  22. ramifice/fields/choice_text_mult_field.py +4 -4
  23. ramifice/fields/color_field.py +4 -4
  24. ramifice/fields/date_field.py +3 -3
  25. ramifice/fields/date_time_field.py +3 -3
  26. ramifice/fields/email_field.py +4 -4
  27. ramifice/fields/file_field.py +19 -18
  28. ramifice/fields/float_field.py +4 -4
  29. ramifice/fields/general/__init__.py +1 -1
  30. ramifice/fields/general/choice_group.py +3 -1
  31. ramifice/fields/general/date_group.py +2 -1
  32. ramifice/fields/general/field.py +3 -1
  33. ramifice/fields/general/file_group.py +3 -1
  34. ramifice/fields/general/number_group.py +3 -1
  35. ramifice/fields/general/text_group.py +3 -1
  36. ramifice/fields/id_field.py +2 -2
  37. ramifice/fields/image_field.py +18 -37
  38. ramifice/fields/integer_field.py +4 -4
  39. ramifice/fields/ip_field.py +4 -4
  40. ramifice/fields/password_field.py +2 -2
  41. ramifice/fields/phone_field.py +4 -4
  42. ramifice/fields/slug_field.py +4 -4
  43. ramifice/fields/text_field.py +3 -3
  44. ramifice/fields/url_field.py +4 -4
  45. ramifice/models/decorator.py +33 -61
  46. ramifice/models/model.py +2 -2
  47. ramifice/paladins/__init__.py +6 -6
  48. ramifice/paladins/check.py +17 -30
  49. ramifice/paladins/delete.py +6 -6
  50. ramifice/paladins/groups/__init__.py +10 -10
  51. ramifice/paladins/groups/bool_group.py +1 -1
  52. ramifice/paladins/groups/choice_group.py +2 -2
  53. ramifice/paladins/groups/date_group.py +5 -2
  54. ramifice/paladins/groups/file_group.py +7 -4
  55. ramifice/paladins/groups/id_group.py +2 -2
  56. ramifice/paladins/groups/img_group.py +27 -15
  57. ramifice/paladins/groups/num_group.py +6 -2
  58. ramifice/paladins/groups/pass_group.py +3 -3
  59. ramifice/paladins/groups/slug_group.py +2 -2
  60. ramifice/paladins/groups/text_group.py +16 -5
  61. ramifice/paladins/password.py +2 -2
  62. ramifice/paladins/refrash.py +3 -3
  63. ramifice/paladins/save.py +3 -3
  64. ramifice/paladins/tools.py +1 -3
  65. ramifice/utils/fixtures.py +1 -1
  66. ramifice/utils/migration.py +5 -7
  67. ramifice/utils/mixins/__init__.py +4 -4
  68. ramifice/utils/tools.py +2 -2
  69. ramifice/utils/translations.py +1 -1
  70. ramifice/utils/unit.py +2 -2
  71. {ramifice-0.5.11.dist-info → ramifice-0.6.0.dist-info}/METADATA +4 -17
  72. ramifice-0.6.0.dist-info/RECORD +84 -0
  73. ramifice/models/pseudo.py +0 -181
  74. ramifice-0.5.11.dist-info/RECORD +0 -85
  75. {ramifice-0.5.11.dist-info → ramifice-0.6.0.dist-info}/WHEEL +0 -0
  76. {ramifice-0.5.11.dist-info → ramifice-0.6.0.dist-info}/licenses/LICENSE +0 -0
@@ -3,13 +3,14 @@
3
3
  Supported fields: ImageField
4
4
  """
5
5
 
6
+ import asyncio
6
7
  from typing import Any
7
8
 
8
9
  from PIL import Image
9
10
 
10
- from ...utils import translations
11
- from ...utils.tools import to_human_size
12
- from ..tools import accumulate_error, panic_type_error
11
+ from ramifice.paladins.tools import accumulate_error, panic_type_error
12
+ from ramifice.utils import translations
13
+ from ramifice.utils.tools import to_human_size
13
14
 
14
15
 
15
16
  class ImgGroupMixin:
@@ -18,7 +19,7 @@ class ImgGroupMixin:
18
19
  Supported fields: ImageField
19
20
  """
20
21
 
21
- def img_group(self, params: dict[str, Any]) -> None:
22
+ async def img_group(self, params: dict[str, Any]) -> None:
22
23
  """Checking image fields."""
23
24
  field = params["field_data"]
24
25
  value = field.value or None
@@ -79,37 +80,48 @@ class ImgGroupMixin:
79
80
  # Extension to the upper register and delete the point.
80
81
  ext_upper = value["ext_upper"]
81
82
  # Get image file.
82
- with Image.open(path) as img:
83
+ with await asyncio.to_thread(Image.open, path) as img:
83
84
  width, height = img.size
84
85
  value["width"] = width
85
86
  value["height"] = height
86
- resample = (
87
- Image.Resampling.LANCZOS # High quality and low performance.
88
- if params["field_data"].high_quality
89
- else Image.Resampling.BICUBIC
90
- )
91
87
  for size_name in ["lg", "md", "sm", "xs"]:
92
88
  max_size = thumbnails.get(size_name)
93
89
  if max_size is None:
94
90
  continue
95
91
  size = max_size, max_size
96
- img.thumbnail(size=size, resample=resample)
92
+ img.thumbnail(size=size, resample=Image.Resampling.LANCZOS)
97
93
  if size_name == "lg":
98
94
  value["path_lg"] = f"{imgs_dir_path}/lg{extension}"
99
95
  value["url_lg"] = f"{imgs_dir_url}/lg{extension}"
100
- img.save(fp=value["path_lg"], format=ext_upper)
96
+ await asyncio.to_thread(
97
+ img.save,
98
+ fp=value["path_lg"],
99
+ format=ext_upper,
100
+ )
101
101
  elif size_name == "md":
102
102
  value["path_md"] = f"{imgs_dir_path}/md{extension}"
103
103
  value["url_md"] = f"{imgs_dir_url}/md{extension}"
104
- img.save(fp=value["path_md"], format=ext_upper)
104
+ await asyncio.to_thread(
105
+ img.save,
106
+ fp=value["path_md"],
107
+ format=ext_upper,
108
+ )
105
109
  elif size_name == "sm":
106
110
  value["path_sm"] = f"{imgs_dir_path}/sm{extension}"
107
111
  value["url_sm"] = f"{imgs_dir_url}/sm{extension}"
108
- img.save(fp=value["path_sm"], format=ext_upper)
112
+ await asyncio.to_thread(
113
+ img.save,
114
+ fp=value["path_sm"],
115
+ format=ext_upper,
116
+ )
109
117
  elif size_name == "xs":
110
118
  value["path_xs"] = f"{imgs_dir_path}/xs{extension}"
111
119
  value["url_xs"] = f"{imgs_dir_url}/xs{extension}"
112
- img.save(fp=value["path_xs"], format=ext_upper)
120
+ await asyncio.to_thread(
121
+ img.save,
122
+ fp=value["path_xs"],
123
+ format=ext_upper,
124
+ )
113
125
  # Insert result.
114
126
  if params["is_save"] and (value["is_new_img"] or value["save_as_is"]):
115
127
  value["is_delete"] = False
@@ -6,8 +6,12 @@ Supported fields:
6
6
 
7
7
  from typing import Any
8
8
 
9
- from ...utils import translations
10
- from ..tools import accumulate_error, check_uniqueness, panic_type_error
9
+ from ramifice.paladins.tools import (
10
+ accumulate_error,
11
+ check_uniqueness,
12
+ panic_type_error,
13
+ )
14
+ from ramifice.utils import translations
11
15
 
12
16
 
13
17
  class NumGroupMixin:
@@ -7,9 +7,9 @@ from typing import Any
7
7
 
8
8
  from argon2 import PasswordHasher
9
9
 
10
- from ...utils import translations
11
- from ...utils.tools import is_password
12
- from ..tools import accumulate_error, panic_type_error
10
+ from ramifice.paladins.tools import accumulate_error, panic_type_error
11
+ from ramifice.utils import translations
12
+ from ramifice.utils.tools import is_password
13
13
 
14
14
 
15
15
  class PassGroupMixin:
@@ -8,8 +8,8 @@ from typing import Any
8
8
 
9
9
  from slugify import slugify
10
10
 
11
- from ...utils.errors import PanicError
12
- from ..tools import check_uniqueness
11
+ from ramifice.paladins.tools import check_uniqueness
12
+ from ramifice.utils.errors import PanicError
13
13
 
14
14
 
15
15
  class SlugGroupMixin:
@@ -5,13 +5,23 @@ Supported fields:
5
5
  IPField | EmailField | ColorField
6
6
  """
7
7
 
8
+ import asyncio
8
9
  from typing import Any
9
10
 
10
11
  from email_validator import EmailNotValidError, validate_email
11
12
 
12
- from ...utils import translations
13
- from ...utils.tools import is_color, is_ip, is_phone, is_url
14
- from ..tools import accumulate_error, check_uniqueness, panic_type_error
13
+ from ramifice.paladins.tools import (
14
+ accumulate_error,
15
+ check_uniqueness,
16
+ panic_type_error,
17
+ )
18
+ from ramifice.utils import translations
19
+ from ramifice.utils.tools import (
20
+ is_color,
21
+ is_ip,
22
+ is_phone,
23
+ is_url,
24
+ )
15
25
 
16
26
 
17
27
  class TextGroupMixin:
@@ -62,9 +72,10 @@ class TextGroupMixin:
62
72
  # Validation Email, Url, IP, Color, Phone.
63
73
  if "EmailField" == field_type:
64
74
  try:
65
- emailinfo = validate_email(
75
+ emailinfo = await asyncio.to_thread(
76
+ validate_email,
66
77
  str(value),
67
- check_deliverability=self.__class__.META["is_migrate_model"],
78
+ check_deliverability=True,
68
79
  )
69
80
  value = emailinfo.normalized
70
81
  params["field_data"].value = value
@@ -5,8 +5,8 @@ from typing import Any
5
5
  from argon2 import PasswordHasher
6
6
  from pymongo.asynchronous.collection import AsyncCollection
7
7
 
8
- from ..utils import globals
9
- from ..utils.errors import OldPassNotMatchError, PanicError
8
+ from ramifice.utils import globals
9
+ from ramifice.utils.errors import OldPassNotMatchError, PanicError
10
10
 
11
11
 
12
12
  class PasswordMixin:
@@ -4,9 +4,9 @@ from typing import Any
4
4
 
5
5
  from pymongo.asynchronous.collection import AsyncCollection
6
6
 
7
- from ..utils import globals
8
- from ..utils.errors import PanicError
9
- from .tools import refresh_from_mongo_doc
7
+ from ramifice.paladins.tools import refresh_from_mongo_doc
8
+ from ramifice.utils import globals
9
+ from ramifice.utils.errors import PanicError
10
10
 
11
11
 
12
12
  class RefrashMixin:
ramifice/paladins/save.py CHANGED
@@ -5,9 +5,9 @@ from typing import Any
5
5
 
6
6
  from pymongo.asynchronous.collection import AsyncCollection
7
7
 
8
- from ..utils import globals
9
- from ..utils.errors import PanicError
10
- from .tools import ignored_fields_to_none, refresh_from_mongo_doc
8
+ from ramifice.paladins.tools import ignored_fields_to_none, refresh_from_mongo_doc
9
+ from ramifice.utils import globals
10
+ from ramifice.utils.errors import PanicError
11
11
 
12
12
 
13
13
  class SaveMixin:
@@ -2,7 +2,7 @@
2
2
 
3
3
  from typing import Any
4
4
 
5
- from ..utils import errors, translations
5
+ from ramifice.utils import errors, translations
6
6
 
7
7
 
8
8
  def ignored_fields_to_none(inst_model: Any) -> None:
@@ -58,8 +58,6 @@ async def check_uniqueness(
58
58
  is_multi_language: bool = False,
59
59
  ) -> bool:
60
60
  """Check the uniqueness of the value in the collection."""
61
- if not params["is_migrate_model"]:
62
- return True
63
61
  q_filter = None
64
62
  if is_multi_language:
65
63
  lang_filter = [{f"{field_name}.{lang}": value} for lang in translations.LANGUAGES]
@@ -11,7 +11,7 @@ from dateutil.parser import parse
11
11
  from pymongo.asynchronous.collection import AsyncCollection
12
12
  from termcolor import colored
13
13
 
14
- from .errors import PanicError
14
+ from ramifice.utils.errors import PanicError
15
15
 
16
16
 
17
17
  async def apply_fixture(
@@ -11,10 +11,10 @@ from pymongo import AsyncMongoClient
11
11
  from pymongo.asynchronous.collection import AsyncCollection
12
12
  from termcolor import colored
13
13
 
14
- from ..models.model import Model
15
- from . import globals
16
- from .errors import DoesNotMatchRegexError, NoModelsForMigrationError, PanicError
17
- from .fixtures import apply_fixture
14
+ from ramifice.models.model import Model
15
+ from ramifice.utils import globals
16
+ from ramifice.utils.errors import DoesNotMatchRegexError, NoModelsForMigrationError, PanicError
17
+ from ramifice.utils.fixtures import apply_fixture
18
18
 
19
19
 
20
20
  class Monitor:
@@ -31,9 +31,7 @@ class Monitor:
31
31
  globals.MONGO_CLIENT = mongo_client
32
32
  globals.MONGO_DATABASE = globals.MONGO_CLIENT[globals.DATABASE_NAME]
33
33
  # Get Model list.
34
- self.model_list: list[Any] = [
35
- cls_model for cls_model in Model.__subclasses__() if cls_model.META["is_migrate_model"]
36
- ]
34
+ self.model_list: list[Any] = Model.__subclasses__()
37
35
  # Raise the exception if there are no models for migration.
38
36
  if len(self.model_list) == 0:
39
37
  raise NoModelsForMigrationError() # type: ignore[no-untyped-call]
@@ -1,6 +1,6 @@
1
1
  """A set of mixins for Ramifice."""
2
2
 
3
- from .add_valid import AddValidMixin
4
- from .hooks import HooksMixin
5
- from .indexing import IndexMixin
6
- from .json_converter import JsonMixin
3
+ from ramifice.utils.mixins.add_valid import AddValidMixin
4
+ from ramifice.utils.mixins.hooks import HooksMixin
5
+ from ramifice.utils.mixins.indexing import IndexMixin
6
+ from ramifice.utils.mixins.json_converter import JsonMixin
ramifice/utils/tools.py CHANGED
@@ -10,7 +10,7 @@ import phonenumbers
10
10
  from bson.objectid import ObjectId
11
11
  from email_validator import EmailNotValidError, validate_email
12
12
 
13
- from .globals import REGEX
13
+ from ramifice.utils.globals import REGEX
14
14
 
15
15
 
16
16
  def is_password(password: str | None) -> bool:
@@ -36,7 +36,7 @@ def get_file_size(path: str) -> int:
36
36
 
37
37
  def normal_email(email: str | None) -> str | None:
38
38
  """Normalizing email address.
39
-
39
+
40
40
  Use this before requeste to a database.
41
41
  For example, on the login page.
42
42
  """
@@ -28,7 +28,7 @@ import gettext as _gettext
28
28
  from gettext import NullTranslations
29
29
  from typing import Any
30
30
 
31
- from .errors import PanicError
31
+ from ramifice.utils.errors import PanicError
32
32
 
33
33
  # Language code by default.
34
34
  DEFAULT_LOCALE: str = "en"
ramifice/utils/unit.py CHANGED
@@ -2,8 +2,8 @@
2
2
 
3
3
  from typing import Any
4
4
 
5
- from .errors import PanicError
6
- from .mixins.json_converter import JsonMixin
5
+ from ramifice.utils.errors import PanicError
6
+ from ramifice.utils.mixins.json_converter import JsonMixin
7
7
 
8
8
 
9
9
  class Unit(JsonMixin):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ramifice
3
- Version: 0.5.11
3
+ Version: 0.6.0
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/
@@ -23,6 +23,8 @@ Classifier: Programming Language :: Python :: Implementation :: CPython
23
23
  Classifier: Topic :: Database
24
24
  Classifier: Typing :: Typed
25
25
  Requires-Python: <4.0,>=3.12
26
+ Requires-Dist: aiofiles>=24.1.0
27
+ Requires-Dist: aioshutil>=1.5
26
28
  Requires-Dist: argon2-cffi>=25.1.0
27
29
  Requires-Dist: babel>=2.17.0
28
30
  Requires-Dist: email-validator>=2.2.0
@@ -58,6 +60,7 @@ Description-Content-Type: text/markdown
58
60
  <a href="https://pepy.tech/projects/ramifice"><img src="https://static.pepy.tech/badge/ramifice" alt="PyPI Downloads"></a>
59
61
  <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>
60
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
+ <a href="https://github.com/kebasyaty/ramifice" alt="PyPI implementation"><img src="https://img.shields.io/pypi/implementation/ramifice" alt="PyPI implementation"></a>
61
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>
62
65
  </p>
63
66
  <p align="center">
@@ -148,16 +151,12 @@ class User:
148
151
  # ngettext = translations.ngettext
149
152
  self.avatar = ImageField(
150
153
  label=gettext("Avatar"),
151
- placeholder=gettext("Upload your photo"),
152
154
  default="public/media/default/no-photo.png",
153
155
  # Directory for images inside media directory.
154
156
  target_dir="users/avatars",
155
157
  # Available 4 sizes from lg to xs or None.
156
158
  # Hint: By default = None
157
159
  thumbnails={"lg": 512, "md": 256, "sm": 128, "xs": 64},
158
- # True - high quality and low performance for thumbnails.
159
- # Hint: By default = False
160
- high_quality=True,
161
160
  # The maximum size of the original image in bytes.
162
161
  # Hint: By default = 2 MB
163
162
  max_size=524288, # 0.5 MB = 512 KB = 524288 Bytes (in binary)
@@ -167,7 +166,6 @@ class User:
167
166
  )
168
167
  self.username = TextField(
169
168
  label=gettext("Username"),
170
- placeholder=gettext("Enter your username"),
171
169
  maxlength=150,
172
170
  required=True,
173
171
  unique=True,
@@ -177,11 +175,9 @@ class User:
177
175
  )
178
176
  self.password = PasswordField(
179
177
  label=gettext("Password"),
180
- placeholder=gettext("Enter your password"),
181
178
  )
182
179
  self.сonfirm_password = PasswordField(
183
180
  label=gettext("Confirm password"),
184
- placeholder=gettext("Repeat your password"),
185
181
  # If true, the value of this field is not saved in the database.
186
182
  ignored=True,
187
183
  )
@@ -342,14 +338,6 @@ See the documentation [here](https://kebasyaty.github.io/ramifice/ "here").
342
338
  <td align="left">1000</td>
343
339
  <td align="left">limiting query results.</td>
344
340
  </tr>
345
- <tr>
346
- <td align="left">is_migrate_model</td>
347
- <td align="left">True</td>
348
- <td align="left">
349
- Set to <b>False</b> if you do not need to migrate the Model to the database.<br>
350
- This can be use to validate a web forms - Search form, Contact form, etc.
351
- </td>
352
- </tr>
353
341
  <tr>
354
342
  <td align="left">is_create_doc</td>
355
343
  <td align="left">True</td>
@@ -380,7 +368,6 @@ See the documentation [here](https://kebasyaty.github.io/ramifice/ "here").
380
368
  service_name="ServiceName",
381
369
  fixture_name="FixtureName",
382
370
  db_query_docs_limit=1000,
383
- is_migrate_model=True,
384
371
  is_create_doc = True,
385
372
  is_update_doc = True,
386
373
  is_delete_doc = True,
@@ -0,0 +1,84 @@
1
+ ramifice/__init__.py,sha256=jLlfcFwSvw_X3dTRz3MbaLJ8SfqlNNrZ8jSwBrS3EMI,783
2
+ ramifice/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
+ ramifice/commons/__init__.py,sha256=NZeqK9PEX7q8bVfiUaysdk_GShpA-5EfdM61mhj3wHg,513
4
+ ramifice/commons/general.py,sha256=Jte8VWCGuMaQidCT19eFjh7tfaTEjBnkto_0mDJoxc4,5384
5
+ ramifice/commons/indexes.py,sha256=GlAUtYnGaqNjuupg-KLzDzak9eDcOWZiE9y-Iz2AKXQ,3653
6
+ ramifice/commons/many.py,sha256=5F3TsiUZuygILsNt5Er-mWHXot2qua_GEnHlT6AB-0M,9253
7
+ ramifice/commons/one.py,sha256=8B5IQHX68x8hsbrb90vu-WgCH9zge2jJ3RmlJ256xU0,6781
8
+ ramifice/commons/tools.py,sha256=xCalseb-sEDTqHyIv3r0o29n0VIWzmXZZoY3DTIVAIM,2373
9
+ ramifice/commons/unit_manager.py,sha256=RGKxNovICXiaCzqdzsuvO4fehcSnSa0BDw-ax0J3MuE,4509
10
+ ramifice/fields/__init__.py,sha256=u_XTUfcWTI96lvxinMPm_s9XNJ4jNDd8zhL9vwRvckc,1710
11
+ ramifice/fields/bool_field.py,sha256=aTOLSO4k6TRvfWpRupvAuOFSuPQfRBViCE4wI2AJYgo,2101
12
+ ramifice/fields/choice_float_dyn_field.py,sha256=5vfMjTr2jarr3sSaPfE-YejtTfK24CrTUPRCyn29QOE,3157
13
+ ramifice/fields/choice_float_field.py,sha256=jNjEfkLXAwaAHgubGOQrT9AttwbRgxHkqhtRqMgMtsk,3950
14
+ ramifice/fields/choice_float_mult_dyn_field.py,sha256=ReXje9VvEPUthqrP3fjr16VVi0GWvqiN7CQp4UeUDr4,3220
15
+ ramifice/fields/choice_float_mult_field.py,sha256=70L_mMKvvVowKS7E06BSsQ9IAX3s0q6k4_MhePcsYOU,4296
16
+ ramifice/fields/choice_int_dyn_field.py,sha256=yWYoESTjrk2_RxFwaVYuIXo6troyWHZK1Ey2kMJvRMs,3151
17
+ ramifice/fields/choice_int_field.py,sha256=2ejg7z-Ct-Ho56bZeB-SBuvNd0Aq7rQf7AFg41qxW-w,3938
18
+ ramifice/fields/choice_int_mult_dyn_field.py,sha256=TKwqvZOqUMnq7mdWrUofcnWq61FRAHBeMsIuiMXQXVw,3216
19
+ ramifice/fields/choice_int_mult_field.py,sha256=e39ue_sybVO9q5S1eKg6kTox6k8gIZSUEhmIlbpwF_c,4290
20
+ ramifice/fields/choice_text_dyn_field.py,sha256=6AR0vy_ZNv6XAgypzsgWrfNgHXS-7CX0OCA1gA9cy2Q,3147
21
+ ramifice/fields/choice_text_field.py,sha256=HTEfKUZKBDE3Rv9eKYenodURc4O_iClPQLK2y5LSfBU,4143
22
+ ramifice/fields/choice_text_mult_dyn_field.py,sha256=RxTDktctGVFKXbLWeISNrpEOIEysp7xjX0VoAn6a3NQ,3212
23
+ ramifice/fields/choice_text_mult_field.py,sha256=WCpOmrmPZpvIYV9WCo2xAHhAT_Iogd0tuuuR-raGm4c,4286
24
+ ramifice/fields/color_field.py,sha256=Syam8MtB--B0HzAT3w3QuWz3pPixSMbh8xGPmbGYLCs,3570
25
+ ramifice/fields/date_field.py,sha256=xhMRsEwk4CztDae5va2Tx0v9Oh55M4p0S4Y0qu-ZlIk,5251
26
+ ramifice/fields/date_time_field.py,sha256=RKxXVWTWGNxTri-MDlOAZNSwgtL46m-0grh3wKX-gi8,5286
27
+ ramifice/fields/email_field.py,sha256=qXG7zHkr5ox4CFrb6QYarBMl8gwcq8KlVFVCj-zfvs0,3477
28
+ ramifice/fields/file_field.py,sha256=YLdZvotj6ymEVRjYGU4xsiHkP_zI8krk3TuHaowvfDo,8126
29
+ ramifice/fields/float_field.py,sha256=wadjiYakzv4uzWD8wI2E0B9w78Or4hZiAmrNXlOy8EI,4629
30
+ ramifice/fields/id_field.py,sha256=NqdM0UJAi-iXJc7wa6CAJNG0-i4YNt08XGkHqV5ingc,4157
31
+ ramifice/fields/image_field.py,sha256=MfKILPPz2ye8x696eEu8loRRpIWgP4neVoZ7ucNkDIw,11545
32
+ ramifice/fields/integer_field.py,sha256=QpLqLItG4mVMYOhpGDVFNr-wDFqeUuERtfZy7C-EslE,4605
33
+ ramifice/fields/ip_field.py,sha256=q-2OgT4VBDo8yzrX7wwuSHwexwsM8wDwnHOyQRACItI,3386
34
+ ramifice/fields/password_field.py,sha256=EzIsegHdsVpnj9D-cTI1Q9RBbW07qUx7I7UFcMWW8Hk,3238
35
+ ramifice/fields/phone_field.py,sha256=-rjW8d00phqHi0YK_R8eZtwPHszyT9Aqxdb3M_KOxIY,3659
36
+ ramifice/fields/slug_field.py,sha256=V0kQ8bfqTv3Rxs17dmhGpe_LmgNS7LOGkvvK2fZJYfE,2729
37
+ ramifice/fields/text_field.py,sha256=JUMF8yx1eZ79k9mw28TxVCPcPqecXjqOpkDf25a5Tu4,4136
38
+ ramifice/fields/url_field.py,sha256=LsHNn38bDt_7kaggX53P-nE3C4pYIlp1NeOPcH06lTk,4037
39
+ ramifice/fields/general/__init__.py,sha256=JzgIDseNQLB_IDwY9-JSiT_bONxvhJmbKl5PhQzTnpE,40
40
+ ramifice/fields/general/choice_group.py,sha256=aNO8LnsafGOOQ7d2lAppI9YtzVHbWUZ6t1znEEIbAv8,962
41
+ ramifice/fields/general/date_group.py,sha256=C5VgR0CBEGgG7nIYEeI82hVXttngSJAGFvEdXC_OpGY,1213
42
+ ramifice/fields/general/field.py,sha256=qm7N-U5H1V6BK_6quJeGGpTmb9IqA-vxZlNHwoABye0,1384
43
+ ramifice/fields/general/file_group.py,sha256=T-IwFnlJAWaRcQKVn09IJCdFNGgnUfMkjLzWFFqn7gY,1117
44
+ ramifice/fields/general/number_group.py,sha256=LOPHbKAnIuqW4DEh2fH78w6qOQjp0OhkuP7MoikhlkA,761
45
+ ramifice/fields/general/text_group.py,sha256=m9EnlYGwqlck-JIYOCUd0hUYAVr8jH4YCnTmm9QlCkQ,1103
46
+ ramifice/models/__init__.py,sha256=h_QQ5rSJNZ-7kmx7wIFd8E8RmUS94b_x4jdwMbq8zm4,15
47
+ ramifice/models/decorator.py,sha256=vEblLbpQQ0BkdTI2ch-BtDvCqWSEXe2aaEjxND705_Q,5954
48
+ ramifice/models/model.py,sha256=JPEUYONRHVj7uE5vnuodc65dGHyBQCRmV8mdVUAgyXw,7118
49
+ ramifice/paladins/__init__.py,sha256=EJ6EEKXUcMG5P1bDmlEa4W3fsxSz5u6mzDG_oU1efMQ,618
50
+ ramifice/paladins/check.py,sha256=OeEDtL3lNR94bL1shrHloAHXHZtHnl6IWzEgukD9HSU,6580
51
+ ramifice/paladins/delete.py,sha256=hnLpyMoNbgegQ_GF-A7iEHj7cbk1oSc5xyTy1BNLxsE,3426
52
+ ramifice/paladins/password.py,sha256=pp0AVMf98w-2Ps3hHqwwIDSsXh93s-1TrBbeEI83Ly8,3041
53
+ ramifice/paladins/refrash.py,sha256=4xojazc5BqCkE8_st11gH5tj2LpflzWVn2ZD-uNoOsg,1096
54
+ ramifice/paladins/save.py,sha256=Z8vmqEksCK8XY27-BsgN2lyaNxLregOo5p0_XB9qUys,3895
55
+ ramifice/paladins/tools.py,sha256=zc2VXp1U_BCT4IQWopwhxJ5vqci9jX128U5_nMeHawY,2652
56
+ ramifice/paladins/validation.py,sha256=gcEJXIEPu1g7Z54vl14YTs5rCmxOEYsgQH1usFfyy7k,1730
57
+ ramifice/paladins/groups/__init__.py,sha256=GxJWM3IkYT3HW9pnJ1QTEjdOKJnjEoAaQ8SRukXnIW0,712
58
+ ramifice/paladins/groups/bool_group.py,sha256=rz1XIIdhOqbCOYZT1Yl84XaJg-0vwdcqCnt0BH-xHVA,808
59
+ ramifice/paladins/groups/choice_group.py,sha256=KmrjbuHLLl6yGbRkdoMflf1thh17GLWrcbfaqrHlDiE,1813
60
+ ramifice/paladins/groups/date_group.py,sha256=V3MCp8eA7txVLh6xmg76G9_y62TzWIQWqH59Ip26Xag,3779
61
+ ramifice/paladins/groups/file_group.py,sha256=ySS7L5zcm2XrZRQUUOU8kgzqrucZ95UYzXD6pALWqE4,2982
62
+ ramifice/paladins/groups/id_group.py,sha256=zN_Glu_cMGk8jMSDli3vYPvYrQXvQJNJFzb-t-qtZlQ,1290
63
+ ramifice/paladins/groups/img_group.py,sha256=YDJTvbRoqQ2nf7-2QbIQ72I4j_c98_d5LZNrD9kCy0Q,6040
64
+ ramifice/paladins/groups/num_group.py,sha256=sbxzTdl33TVySfaNfqMixyBkJ69v6AqEgraFUN3Kftk,2317
65
+ ramifice/paladins/groups/pass_group.py,sha256=uuIIqMBXsYG7vTHc_AhdgWuNCivxTgQMjkEu0-ElSmY,1887
66
+ ramifice/paladins/groups/slug_group.py,sha256=ztiA2v7e5lQYRZtlLw8WGOhSWaYQfOdZ6wkKbx3ZbTM,2329
67
+ ramifice/paladins/groups/text_group.py,sha256=FSrZbm3Fd0SU0IIFFBxs9XN2HPSFHshgwIRiLaUDwNY,4456
68
+ ramifice/utils/__init__.py,sha256=xixHoOX4ja5jIUZemem1qn4k4aonv3G3Q76azQK_pkU,43
69
+ ramifice/utils/errors.py,sha256=iuhq7fzpUmsOyeXeg2fJjta8yAuqlXLKsZVMpfUhtHE,1901
70
+ ramifice/utils/fixtures.py,sha256=IG55gdFUbrWRQ2cL3Df9mYBgjVlFrlRuWB7UeK1Nzd8,3173
71
+ ramifice/utils/globals.py,sha256=uR20um3Qg_1SG1t7WyWbpq8kQD-9Mslyr_c1yh5Hw9w,1751
72
+ ramifice/utils/migration.py,sha256=JUhYaJ61IS1W_Khof0sbqeHDQrI7-XcmTQ41PhCdjcQ,11017
73
+ ramifice/utils/tools.py,sha256=1yFIOrkWToM55OpMMId9T26hZqPQWnxLU3_jQ4Ejazg,2743
74
+ ramifice/utils/translations.py,sha256=aEkNKilD7RlJjBixqhh0cfIMw9lg13woaIwd3dyR8G4,4247
75
+ ramifice/utils/unit.py,sha256=PPNKWYFJ8cz0nwbBPaTdL58_Nr7N0fIHFJBpKG2ZLKI,2482
76
+ ramifice/utils/mixins/__init__.py,sha256=GrxJDsw73bEkitIh0-0BCxNnUK-N5uRXMCRlaPoaz1o,265
77
+ ramifice/utils/mixins/add_valid.py,sha256=TLOObedzXNA9eCylfAVbVCqIKE5sV-P5AdIN7avj-GA,407
78
+ ramifice/utils/mixins/hooks.py,sha256=33jvJRhfnJeL2Hd_YFXk3M_7wjqHaByU2wRjKyboL6s,914
79
+ ramifice/utils/mixins/indexing.py,sha256=Z0427HoaVRyNmSNN8Fx0mSICgAKV-gDdu3iR5qYUEbs,329
80
+ ramifice/utils/mixins/json_converter.py,sha256=WhigXyDAV-FfILaZuwvRFRIk0D90Rv3dG5t-mv5fVyc,1107
81
+ ramifice-0.6.0.dist-info/METADATA,sha256=mGAJxiS68kKIy6ZO94iagVCIAXPPVM2hoxSZnwHGKyk,20987
82
+ ramifice-0.6.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
83
+ ramifice-0.6.0.dist-info/licenses/LICENSE,sha256=LrEL0aTZx90HDwFUQCJutORiDjJL9AnuVvCtspXIqt4,1095
84
+ ramifice-0.6.0.dist-info/RECORD,,