ramifice 0.3.32__py3-none-any.whl → 0.4.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.
- ramifice/commons/tools.py +14 -5
- ramifice/fields/general/text_group.py +7 -0
- ramifice/fields/text_field.py +21 -21
- ramifice/paladins/check.py +1 -0
- ramifice/paladins/groups/text_group.py +25 -10
- ramifice/paladins/tools.py +11 -4
- {ramifice-0.3.32.dist-info → ramifice-0.4.0.dist-info}/METADATA +20 -9
- {ramifice-0.3.32.dist-info → ramifice-0.4.0.dist-info}/RECORD +10 -10
- {ramifice-0.3.32.dist-info → ramifice-0.4.0.dist-info}/WHEEL +0 -0
- {ramifice-0.3.32.dist-info → ramifice-0.4.0.dist-info}/licenses/LICENSE +0 -0
ramifice/commons/tools.py
CHANGED
@@ -13,7 +13,7 @@ def password_to_none(
|
|
13
13
|
) -> dict[str, Any]:
|
14
14
|
"""Create object instance from Mongo document."""
|
15
15
|
for f_name, t_name in field_name_and_type.items():
|
16
|
-
if "
|
16
|
+
if "PasswordField" == t_name:
|
17
17
|
mongo_doc[f_name] = None
|
18
18
|
return mongo_doc
|
19
19
|
|
@@ -26,7 +26,14 @@ def from_mongo_doc(
|
|
26
26
|
obj = cls_model()
|
27
27
|
for name, data in mongo_doc.items():
|
28
28
|
field = obj.__dict__[name]
|
29
|
-
|
29
|
+
if "TextField" == field.field_type:
|
30
|
+
field.value = (
|
31
|
+
data[translations.CURRENT_LOCALE] if isinstance(field.value, dict) else None
|
32
|
+
)
|
33
|
+
elif field.group == "pass":
|
34
|
+
field.value = None
|
35
|
+
else:
|
36
|
+
field.value = data
|
30
37
|
return obj
|
31
38
|
|
32
39
|
|
@@ -47,7 +54,9 @@ def mongo_doc_to_raw_doc(
|
|
47
54
|
for f_name, t_name in field_name_and_type.items():
|
48
55
|
value = mongo_doc[f_name]
|
49
56
|
if value is not None:
|
50
|
-
if "
|
57
|
+
if "TextField" == t_name:
|
58
|
+
value = value[current_locale] if isinstance(value, dict) else None
|
59
|
+
elif "Date" in t_name:
|
51
60
|
if "Time" in t_name:
|
52
61
|
value = format_datetime(
|
53
62
|
datetime=value,
|
@@ -60,9 +69,9 @@ def mongo_doc_to_raw_doc(
|
|
60
69
|
format="short",
|
61
70
|
locale=current_locale,
|
62
71
|
)
|
63
|
-
elif "
|
72
|
+
elif "IDField" == t_name:
|
64
73
|
value = str(value)
|
65
|
-
elif "
|
74
|
+
elif "PasswordField" == t_name:
|
66
75
|
value = None
|
67
76
|
doc[f_name] = value
|
68
77
|
return doc
|
ramifice/fields/text_field.py
CHANGED
@@ -3,10 +3,9 @@
|
|
3
3
|
from ..utils import globals
|
4
4
|
from ..utils.mixins.json_converter import JsonMixin
|
5
5
|
from .general.field import Field
|
6
|
-
from .general.text_group import TextGroup
|
7
6
|
|
8
7
|
|
9
|
-
class TextField(Field,
|
8
|
+
class TextField(Field, JsonMixin):
|
10
9
|
"""Field of Model for enter text."""
|
11
10
|
|
12
11
|
def __init__( # noqa: D107
|
@@ -19,7 +18,6 @@ class TextField(Field, TextGroup, JsonMixin):
|
|
19
18
|
warning: list[str] | None = None,
|
20
19
|
textarea: bool = False,
|
21
20
|
use_editor: bool = False,
|
22
|
-
default: str | None = None,
|
23
21
|
placeholder: str = "",
|
24
22
|
required: bool = False,
|
25
23
|
readonly: bool = False,
|
@@ -29,15 +27,6 @@ class TextField(Field, TextGroup, JsonMixin):
|
|
29
27
|
if globals.DEBUG:
|
30
28
|
if not isinstance(maxlength, int):
|
31
29
|
raise AssertionError("Parameter `maxlength` - Not а `int` type!")
|
32
|
-
if default is not None:
|
33
|
-
if not isinstance(default, str):
|
34
|
-
raise AssertionError("Parameter `default` - Not а `str` type!")
|
35
|
-
if len(default) == 0:
|
36
|
-
raise AssertionError(
|
37
|
-
"The `default` parameter should not contain an empty string!"
|
38
|
-
)
|
39
|
-
if len(default) > maxlength:
|
40
|
-
raise AssertionError("Parameter `default` exceeds the size of `maxlength`!")
|
41
30
|
if not isinstance(label, str):
|
42
31
|
raise AssertionError("Parameter `default` - Not а `str` type!")
|
43
32
|
if not isinstance(disabled, bool):
|
@@ -78,17 +67,28 @@ class TextField(Field, TextGroup, JsonMixin):
|
|
78
67
|
field_type="TextField",
|
79
68
|
group="text",
|
80
69
|
)
|
81
|
-
TextGroup.__init__(
|
82
|
-
self,
|
83
|
-
input_type="text",
|
84
|
-
placeholder=placeholder,
|
85
|
-
required=required,
|
86
|
-
readonly=readonly,
|
87
|
-
unique=unique,
|
88
|
-
)
|
89
70
|
JsonMixin.__init__(self)
|
90
71
|
|
91
|
-
self.
|
72
|
+
self.value: str | dict[str, str] | None = None
|
73
|
+
self.input_type = "text"
|
74
|
+
self.placeholder = placeholder
|
75
|
+
self.required = required
|
76
|
+
self.readonly = readonly
|
77
|
+
self.unique = unique
|
92
78
|
self.textarea = textarea
|
93
79
|
self.use_editor = use_editor
|
94
80
|
self.maxlength = maxlength
|
81
|
+
|
82
|
+
def __len__(self) -> int:
|
83
|
+
"""Return length of field `value`."""
|
84
|
+
value = self.value
|
85
|
+
if isinstance(value, str):
|
86
|
+
return len(value)
|
87
|
+
elif isinstance(value, dict):
|
88
|
+
count = 0
|
89
|
+
for text in value.values():
|
90
|
+
tmp = len(text)
|
91
|
+
if tmp > count:
|
92
|
+
count = tmp
|
93
|
+
return count
|
94
|
+
return 0
|
ramifice/paladins/check.py
CHANGED
@@ -25,11 +25,17 @@ class TextGroupMixin:
|
|
25
25
|
async def text_group(self, params: dict[str, Any]) -> None:
|
26
26
|
"""Checking text fields."""
|
27
27
|
field = params["field_data"]
|
28
|
+
field_type: str = field.field_type
|
29
|
+
is_text_field: bool = "TextField" == field_type
|
28
30
|
# Get current value.
|
29
|
-
value = field.value or field.default
|
31
|
+
value = field.value or field.__dict__.get("default")
|
30
32
|
|
31
|
-
if
|
32
|
-
|
33
|
+
if is_text_field:
|
34
|
+
if not isinstance(value, (str, dict, type(None))):
|
35
|
+
panic_type_error("str | None", params)
|
36
|
+
else:
|
37
|
+
if not isinstance(value, (str, type(None))):
|
38
|
+
panic_type_error("str | None", params)
|
33
39
|
|
34
40
|
if value is None:
|
35
41
|
if field.required:
|
@@ -40,7 +46,7 @@ class TextGroupMixin:
|
|
40
46
|
return
|
41
47
|
# Validation the `maxlength` field attribute.
|
42
48
|
maxlength: int | None = field.__dict__.get("maxlength")
|
43
|
-
if maxlength is not None and len(
|
49
|
+
if maxlength is not None and len(field) > maxlength:
|
44
50
|
err_msg = translations._("The length of the string exceeds maxlength=%d !" % maxlength)
|
45
51
|
accumulate_error(err_msg, params)
|
46
52
|
# Validation the `unique` field attribute.
|
@@ -48,8 +54,7 @@ class TextGroupMixin:
|
|
48
54
|
err_msg = translations._("Is not unique !")
|
49
55
|
accumulate_error(err_msg, params)
|
50
56
|
# Validation Email, Url, IP, Color, Phone.
|
51
|
-
|
52
|
-
if "Email" in field_type:
|
57
|
+
if "EmailField" == field_type:
|
53
58
|
try:
|
54
59
|
emailinfo = validate_email(
|
55
60
|
str(value),
|
@@ -60,18 +65,28 @@ class TextGroupMixin:
|
|
60
65
|
except EmailNotValidError:
|
61
66
|
err_msg = translations._("Invalid Email address !")
|
62
67
|
accumulate_error(err_msg, params)
|
63
|
-
elif "
|
68
|
+
elif "URLField" == field_type and not is_url(value):
|
64
69
|
err_msg = translations._("Invalid URL address !")
|
65
70
|
accumulate_error(err_msg, params)
|
66
|
-
elif "
|
71
|
+
elif "IPField" == field_type and not is_ip(value):
|
67
72
|
err_msg = translations._("Invalid IP address !")
|
68
73
|
accumulate_error(err_msg, params)
|
69
|
-
elif "
|
74
|
+
elif "ColorField" == field_type and not is_color(value):
|
70
75
|
err_msg = translations._("Invalid Color code !")
|
71
76
|
accumulate_error(err_msg, params)
|
72
|
-
elif "
|
77
|
+
elif "PhoneField" == field_type and not is_phone(value):
|
73
78
|
err_msg = translations._("Invalid Phone number !")
|
74
79
|
accumulate_error(err_msg, params)
|
75
80
|
# Insert result.
|
76
81
|
if params["is_save"]:
|
82
|
+
if is_text_field:
|
83
|
+
mult_lang_text: dict[str, str] = {}
|
84
|
+
if params["mongo_doc"] is not None:
|
85
|
+
mult_lang_text = params["mongo_doc"][field.name]
|
86
|
+
if isinstance(value, dict):
|
87
|
+
for lang, text in value.items():
|
88
|
+
mult_lang_text[lang] = text
|
89
|
+
else:
|
90
|
+
mult_lang_text[translations.CURRENT_LOCALE] = value
|
91
|
+
value = mult_lang_text
|
77
92
|
params["result_map"][field.name] = value
|
ramifice/paladins/tools.py
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
from typing import Any
|
4
4
|
|
5
|
-
from ..utils
|
5
|
+
from ..utils import errors, translations
|
6
6
|
|
7
7
|
|
8
8
|
def ignored_fields_to_none(inst_model: Any) -> None:
|
@@ -16,7 +16,14 @@ def refresh_from_mongo_doc(inst_model: Any, mongo_doc: dict[str, Any]) -> None:
|
|
16
16
|
"""Update object instance from Mongo document."""
|
17
17
|
for name, data in mongo_doc.items():
|
18
18
|
field = inst_model.__dict__[name]
|
19
|
-
|
19
|
+
if "TextField" == field.field_type:
|
20
|
+
field.value = (
|
21
|
+
data[translations.CURRENT_LOCALE] if isinstance(field.value, dict) else None
|
22
|
+
)
|
23
|
+
elif field.group == "pass":
|
24
|
+
field.value = None
|
25
|
+
else:
|
26
|
+
field.value = data
|
20
27
|
|
21
28
|
|
22
29
|
def panic_type_error(value_type: str, params: dict[str, Any]) -> None:
|
@@ -26,7 +33,7 @@ def panic_type_error(value_type: str, params: dict[str, Any]) -> None:
|
|
26
33
|
+ f"Field: `{params['field_data'].name}` > "
|
27
34
|
+ f"Parameter: `value` => Must be `{value_type}` type!"
|
28
35
|
)
|
29
|
-
raise PanicError(msg)
|
36
|
+
raise errors.PanicError(msg)
|
30
37
|
|
31
38
|
|
32
39
|
def accumulate_error(err_msg: str, params: dict[str, Any]) -> None:
|
@@ -41,7 +48,7 @@ def accumulate_error(err_msg: str, params: dict[str, Any]) -> None:
|
|
41
48
|
+ f"Field: `{params['field_data'].name}`"
|
42
49
|
+ f" => {err_msg}"
|
43
50
|
)
|
44
|
-
raise PanicError(msg)
|
51
|
+
raise errors.PanicError(msg)
|
45
52
|
|
46
53
|
|
47
54
|
async def check_uniqueness(
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: ramifice
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.4.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/
|
@@ -135,7 +135,7 @@ from datetime import datetime
|
|
135
135
|
|
136
136
|
from pymongo import AsyncMongoClient
|
137
137
|
from ramifice import model, translations, migration
|
138
|
-
from ramifice.fields import DateField, EmailField, ImageField, PasswordField, TextField
|
138
|
+
from ramifice.fields import DateField, EmailField, ImageField, PasswordField, TextField, FileField
|
139
139
|
|
140
140
|
|
141
141
|
@model(service_name="Accounts")
|
@@ -157,6 +157,10 @@ class User:
|
|
157
157
|
# Hint: By default = 2 MB
|
158
158
|
max_size=524288 # 0.5 MB = 524288 Bytes (in binary)
|
159
159
|
)
|
160
|
+
self.resume = FileField(
|
161
|
+
label=gettext("Resume"),
|
162
|
+
default="public/media/default/no_doc.odt",
|
163
|
+
)
|
160
164
|
self.username = TextField(
|
161
165
|
label=gettext("Username"),
|
162
166
|
required=True,
|
@@ -180,11 +184,13 @@ class User:
|
|
180
184
|
ignored=True,
|
181
185
|
)
|
182
186
|
|
187
|
+
# Optional method.
|
183
188
|
async def add_validation(self) -> dict[str, str]:
|
184
189
|
"""Additional validation of fields."""
|
190
|
+
gettext = translations.gettext
|
185
191
|
error_map: dict[str, str] = {}
|
186
192
|
if self.password != self.сonfirm_password:
|
187
|
-
error_map["password"] = "Passwords do not match!"
|
193
|
+
error_map["password"] = gettext("Passwords do not match!")
|
188
194
|
return error_map
|
189
195
|
|
190
196
|
|
@@ -197,11 +203,13 @@ async def main():
|
|
197
203
|
).migrat()
|
198
204
|
|
199
205
|
# If you need to change the language of translation.
|
200
|
-
#
|
206
|
+
# Hint: For Ramifice by default = "en"
|
207
|
+
translations.change_locale("en")
|
201
208
|
|
202
209
|
user = User()
|
203
210
|
user.username.value = "pythondev"
|
204
211
|
user.avatar.from_path("public/media/default/no-photo.png")
|
212
|
+
user.resume.from_path("public/media/default/no_doc.odt")
|
205
213
|
user.first_name.value = "John"
|
206
214
|
user.last_name.value = "Smith"
|
207
215
|
user.email.value = "John_Smith@gmail.com"
|
@@ -209,19 +217,22 @@ async def main():
|
|
209
217
|
user.password.value = "12345678"
|
210
218
|
user.сonfirm_password.value = "12345678"
|
211
219
|
|
220
|
+
# Create User.
|
212
221
|
if not await user.save():
|
213
|
-
|
222
|
+
# Convenient to use during development.
|
223
|
+
user.print_err()
|
214
224
|
|
215
|
-
|
216
|
-
|
225
|
+
# Update User.
|
226
|
+
user.username.value = "pythondev-123"
|
227
|
+
if not await user.save():
|
228
|
+
user.print_err()
|
217
229
|
|
218
230
|
print("User details:")
|
219
231
|
user_details = await User.find_one_to_raw_doc({"_id": user._id.value})
|
220
232
|
pprint.pprint(user_details)
|
221
233
|
|
234
|
+
# Remove User.
|
222
235
|
await user.delete(remove_files=False)
|
223
|
-
doc_count = await User.estimated_document_count()
|
224
|
-
print(f"Document count: {doc_count}") # => 0
|
225
236
|
|
226
237
|
await client.close()
|
227
238
|
|
@@ -5,7 +5,7 @@ ramifice/commons/general.py,sha256=dy2GTpekLyshrNG68XV2dxNgwsS4QODtIcG-c6Xvalw,4
|
|
5
5
|
ramifice/commons/indexes.py,sha256=hAcWKZ9MMgLbRtoQ6Af0b8r-PY0dbEYmMBl8z_d1DRo,3646
|
6
6
|
ramifice/commons/many.py,sha256=KGt7licVJmLADvyPtH7-GbXHig-EnGFbnk7QKu3mfvQ,8214
|
7
7
|
ramifice/commons/one.py,sha256=h9R-Ev-7h-xln4lp4SMJIIU9Cf9acqwjj4YYaML6uFg,5832
|
8
|
-
ramifice/commons/tools.py,sha256=
|
8
|
+
ramifice/commons/tools.py,sha256=ND1s-wt2wf8KhriUrLdCAQ56e7GlxrFZ69GWSwgoocA,2386
|
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
|
@@ -34,7 +34,7 @@ ramifice/fields/ip_field.py,sha256=tsxdwKd-MhkhnE1F2FmFg67jwh9Q-RvXECv1aG8PitE,3
|
|
34
34
|
ramifice/fields/password_field.py,sha256=m3n_qJRRHCtgyBC7nDB0dYBO_82Lp1Ws48d1_jxHA8o,3216
|
35
35
|
ramifice/fields/phone_field.py,sha256=5qZ_rR82M9cuW7Dv-D5d9jDaw7DJp9y60lRB4GEmi4w,3615
|
36
36
|
ramifice/fields/slug_field.py,sha256=9rH1VdxYPoK60QCKHRB91bA3ZmIeIuFmf6WttzB1yTI,2685
|
37
|
-
ramifice/fields/text_field.py,sha256=
|
37
|
+
ramifice/fields/text_field.py,sha256=OrZJ337C9YUT7LOzIZR5xRBxL7dSb7ERddiJWQaT3zI,3797
|
38
38
|
ramifice/fields/url_field.py,sha256=DTy4B22juav9dzIrqKy3NzM2vuICHvDzIDbzkkyF1C0,3993
|
39
39
|
ramifice/fields/general/__init__.py,sha256=5OE0TwPQjvpB3lBPuEwKrhjR_1ehOWxB98OJP_n32MA,20
|
40
40
|
ramifice/fields/general/choice_group.py,sha256=TBJblwH8mB71wd1z2jcSs28H-zx3JZVBfkk4YCE1-pI,916
|
@@ -42,18 +42,18 @@ ramifice/fields/general/date_group.py,sha256=RKockc_X1bYAbpzxTzXdc0kxgx51MK0bjko
|
|
42
42
|
ramifice/fields/general/field.py,sha256=Iwjx0idIUIFwcQw4TQEqejKct1EGaaJv1zZ1poSW8lo,1338
|
43
43
|
ramifice/fields/general/file_group.py,sha256=n45KfPzFI_l5hXoKkPDG0Q-0mdC2obExV-3PJ-MN5tA,1071
|
44
44
|
ramifice/fields/general/number_group.py,sha256=AqlCY-t6JHZ2QVBe7mk5nPt6z8M4VJ_RARRlSBoIxms,715
|
45
|
-
ramifice/fields/general/text_group.py,sha256=
|
45
|
+
ramifice/fields/general/text_group.py,sha256=6GD2Fe6Toz6zZjAAlcy5rPVCAGh6Yn1ltdIrFg9RF18,1057
|
46
46
|
ramifice/models/__init__.py,sha256=h_QQ5rSJNZ-7kmx7wIFd8E8RmUS94b_x4jdwMbq8zm4,15
|
47
47
|
ramifice/models/decorator.py,sha256=jOEn-0v0m_tM7mow45-tM-8LADUmwlG2DWZsEuC9S_w,6834
|
48
48
|
ramifice/models/model.py,sha256=6iD4c6Rk9Y5SFXnKNULWk7PlgVfzU_i4arF6SX6nysg,6495
|
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=
|
51
|
+
ramifice/paladins/check.py,sha256=hz9uQtAarZG9P2I5bwVYgKn2Nk_BD2wB3yqEdD3w494,6838
|
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
|
55
55
|
ramifice/paladins/save.py,sha256=EG0_v-imCQPax2pJIAXPoQcSL99g8abY2EeGJMvXBW4,3864
|
56
|
-
ramifice/paladins/tools.py,sha256=
|
56
|
+
ramifice/paladins/tools.py,sha256=d3sKH6GzPlt7SxR9JyTEY3YgmqhwNvwPOg3hg80-zoU,2297
|
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
|
@@ -65,7 +65,7 @@ ramifice/paladins/groups/img_group.py,sha256=RoD_QnW0F0DAzrGQmRi8jMZnWy2IomlFn6A
|
|
65
65
|
ramifice/paladins/groups/num_group.py,sha256=FHT9D2S3TsxdMypqoBgZsIzlaLY0KjXdPYqB95vvTRI,2229
|
66
66
|
ramifice/paladins/groups/pass_group.py,sha256=YU5a-NwohEutoEx2N5JmGfg8uPiYiW0XJ8XYsOih6eA,1859
|
67
67
|
ramifice/paladins/groups/slug_group.py,sha256=o-lr1ssfhTcBovlS6pWA2TQdg1qI6tlDjZ2iKkz-584,2191
|
68
|
-
ramifice/paladins/groups/text_group.py,sha256=
|
68
|
+
ramifice/paladins/groups/text_group.py,sha256=TVMo19IU-bLEb-xOeNNfSejTr0lDYahrQhWMHvle-Ws,3896
|
69
69
|
ramifice/utils/__init__.py,sha256=xixHoOX4ja5jIUZemem1qn4k4aonv3G3Q76azQK_pkU,43
|
70
70
|
ramifice/utils/errors.py,sha256=iuhq7fzpUmsOyeXeg2fJjta8yAuqlXLKsZVMpfUhtHE,1901
|
71
71
|
ramifice/utils/fixtures.py,sha256=NtxOnZslYJb4yvRpZbs3ckugmTwHQFS_9iCt2zddOC0,3102
|
@@ -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.
|
83
|
-
ramifice-0.
|
84
|
-
ramifice-0.
|
85
|
-
ramifice-0.
|
82
|
+
ramifice-0.4.0.dist-info/METADATA,sha256=hzKA83Yk4QFj5gAQWnu7X9y-ove9os6gEIiRYj3w3DE,20962
|
83
|
+
ramifice-0.4.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
84
|
+
ramifice-0.4.0.dist-info/licenses/LICENSE,sha256=LrEL0aTZx90HDwFUQCJutORiDjJL9AnuVvCtspXIqt4,1095
|
85
|
+
ramifice-0.4.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|