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
ramifice/models/pseudo.py DELETED
@@ -1,181 +0,0 @@
1
- """For converting Python classes into Ramifice models."""
2
-
3
- import json
4
- import os
5
- import shutil
6
- from abc import ABCMeta, abstractmethod
7
- from typing import Any
8
-
9
- from babel.dates import format_date, format_datetime
10
- from bson.objectid import ObjectId
11
- from dateutil.parser import parse
12
-
13
- from ..utils import translations
14
- from ..utils.errors import PanicError
15
-
16
-
17
- class PseudoModel(metaclass=ABCMeta):
18
- """Convert the Python Class into a pseudo Model Ramifice.
19
-
20
- Used for a Model that do not migrate into the database.
21
- """
22
-
23
- META: dict[str, Any] = {}
24
-
25
- def __init__(self) -> None: # noqa: D107
26
- self.fields()
27
- self.inject()
28
-
29
- for _, f_type in self.__dict__.items():
30
- if not callable(f_type) and f_type.group == "img":
31
- f_type.__dict__["add_width_height"] = True
32
-
33
- def __del__(self) -> None: # noqa: D105
34
- # If the model is not migrated,
35
- # it must delete files and images in the destructor.
36
- for _, f_type in self.__dict__.items():
37
- if callable(f_type):
38
- continue
39
- value = f_type.value
40
- if value is not None:
41
- if f_type.group == "file":
42
- value = value.get("path")
43
- if value is not None:
44
- os.remove(value)
45
- elif f_type.group == "img":
46
- value = value.get("imgs_dir_path")
47
- if value is not None:
48
- shutil.rmtree(value)
49
-
50
- @abstractmethod
51
- def fields(self) -> None:
52
- """For adding fields."""
53
- pass
54
-
55
- def model_name(self) -> str:
56
- """Get Model name - Class name."""
57
- return self.__class__.__name__
58
-
59
- def full_model_name(self) -> str:
60
- """Get full Model name - module_name + . + ClassName."""
61
- cls = self.__class__
62
- return f"{cls.__module__}.{cls.__name__}"
63
-
64
- def inject(self) -> None:
65
- """Injecting metadata from Model.META in params of fields."""
66
- metadata = self.__class__.META
67
- if bool(metadata):
68
- field_attrs = metadata["field_attrs"]
69
- for f_name, f_type in self.__dict__.items():
70
- if callable(f_type):
71
- continue
72
- f_type.id = field_attrs[f_name]["id"]
73
- f_type.name = field_attrs[f_name]["name"]
74
- if "Dyn" in f_type.field_type:
75
- msg = (
76
- f"Model: `{metadata['full_model_name']}` > "
77
- + f"Field: `{f_name}` => "
78
- + "Dynamic field only for a migrated Model."
79
- )
80
- raise PanicError(msg)
81
-
82
- # Complect of methods for converting Model to JSON and back.
83
- # --------------------------------------------------------------------------
84
- def to_dict(self) -> dict[str, Any]:
85
- """Convert object instance to a dictionary."""
86
- json_dict: dict[str, Any] = {}
87
- for name, data in self.__dict__.items():
88
- if not callable(data):
89
- json_dict[name] = data.to_dict()
90
- return json_dict
91
-
92
- def to_json(self) -> str:
93
- """Convert object instance to a JSON string."""
94
- return json.dumps(self.to_dict())
95
-
96
- @classmethod
97
- def from_dict(cls, json_dict: dict[str, Any]) -> Any:
98
- """Convert JSON string to a object instance."""
99
- obj = cls()
100
- for name, data in json_dict.items():
101
- obj.__dict__[name] = obj.__dict__[name].__class__.from_dict(data)
102
- return obj
103
-
104
- @classmethod
105
- def from_json(cls, json_str: str) -> Any:
106
- """Convert JSON string to a object instance."""
107
- json_dict = json.loads(json_str)
108
- return cls.from_dict(json_dict)
109
-
110
- # --------------------------------------------------------------------------
111
- def to_dict_only_value(self) -> dict[str, Any]:
112
- """Convert model.field.value (only the `value` attribute) to a dictionary."""
113
- json_dict: dict[str, Any] = {}
114
- current_locale = translations.CURRENT_LOCALE
115
- for name, data in self.__dict__.items():
116
- if callable(data):
117
- continue
118
- value = data.value
119
- if value is not None:
120
- group = data.group
121
- if group == "date":
122
- value = (
123
- format_date(
124
- date=value,
125
- format="short",
126
- locale=current_locale,
127
- )
128
- if data.field_type == "DateField"
129
- else format_datetime(
130
- datetime=value,
131
- format="short",
132
- locale=current_locale,
133
- )
134
- )
135
- elif group == "id":
136
- value = str(value)
137
- elif group == "pass":
138
- value = None
139
- json_dict[name] = value
140
- return json_dict
141
-
142
- def to_json_only_value(self) -> str:
143
- """Convert model.field.value (only the `value` attribute) to a JSON string."""
144
- return json.dumps(self.to_dict_only_value())
145
-
146
- @classmethod
147
- def from_dict_only_value(cls, json_dict: dict[str, Any]) -> Any:
148
- """Convert JSON string to a object instance."""
149
- obj = cls()
150
- for name, data in obj.__dict__.items():
151
- if callable(data):
152
- continue
153
- value = json_dict.get(name)
154
- if value is not None:
155
- group = data.group
156
- if group == "date":
157
- value = parse(value)
158
- elif group == "id":
159
- value = ObjectId(value)
160
- obj.__dict__[name].value = value
161
- return obj
162
-
163
- @classmethod
164
- def from_json_only_value(cls, json_str: str) -> Any:
165
- """Convert JSON string to a object instance."""
166
- json_dict = json.loads(json_str)
167
- return cls.from_dict_only_value(json_dict)
168
-
169
- def refrash_fields_only_value(self, only_value_dict: dict[str, Any]) -> None:
170
- """Partial or complete update a `value` of fields."""
171
- for name, data in self.__dict__.items():
172
- if callable(data):
173
- continue
174
- value = only_value_dict.get(name)
175
- if value is not None:
176
- group = data.group
177
- if group == "date":
178
- value = parse(value)
179
- elif group == "id":
180
- value = ObjectId(value)
181
- self.__dict__[name].value = value
@@ -1,85 +0,0 @@
1
- ramifice/__init__.py,sha256=IuI20h84QWyFftykvte_HLft2iVxwpu0K592NypMwfo,759
2
- ramifice/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- ramifice/commons/__init__.py,sha256=FTG78sTU0ay0rvmrq5fUmVjL-I-S7wgQq3BLcyqnjrQ,433
4
- ramifice/commons/general.py,sha256=SmtJge18Yjz7cpc-KXo238rQl465WtTqzNnuRjHl8qs,5361
5
- ramifice/commons/indexes.py,sha256=hAcWKZ9MMgLbRtoQ6Af0b8r-PY0dbEYmMBl8z_d1DRo,3646
6
- ramifice/commons/many.py,sha256=jkah1kO1CXWPB0xW0dbMelCFBSirRYkX9a333EcPE_M,9202
7
- ramifice/commons/one.py,sha256=uZsgwg_GgA1VMZDPqhRFMmCdtvcv6xsL4DWbCOwGV3w,6730
8
- ramifice/commons/tools.py,sha256=ectaILVYCSwNbB0VAys6nIhdsJbwuxAupNvcQfweC88,2366
9
- ramifice/commons/unit_manager.py,sha256=4spjvTv29AYSWaIP2A4k9E1vawPmwFau9GFK_yaveb8,4488
10
- ramifice/fields/__init__.py,sha256=yRfX7Tvpuh27Ggcx5u9e1RRYK7Wu59EVJYxxetmuP1w,1290
11
- ramifice/fields/bool_field.py,sha256=WWubSwsFJZu8b3MviDd2zXnNYOQaYw8toklFNSTVFLA,2072
12
- ramifice/fields/choice_float_dyn_field.py,sha256=GMyKWLjNCP7TeQl1rnM3S7GBPd0N0so_CCCYcuGQLZM,3113
13
- ramifice/fields/choice_float_field.py,sha256=7YY85Y1Em11z60oXtNqpUE-Ro-doB-3wQl33eKwOR1o,3906
14
- ramifice/fields/choice_float_mult_dyn_field.py,sha256=Uq8eyjiOVVL_K__-C5UJCsUcgXdFYMluZBSJatGz528,3176
15
- ramifice/fields/choice_float_mult_field.py,sha256=GKGUKARGnEhjzDe2N29QjU7u1TQcsSmpFIbjTPy6nDo,4252
16
- ramifice/fields/choice_int_dyn_field.py,sha256=O4cTaFIZdxZgb3AZmDIHrYwavBaG-pf-s3fF8fSeu2I,3107
17
- ramifice/fields/choice_int_field.py,sha256=VJi_9Ilp9Vei4qDqii4OSV_xzpZJHmxeYb5Lfxkvf6Y,3894
18
- ramifice/fields/choice_int_mult_dyn_field.py,sha256=G4iLbgipjNIuwQjh0mXo04npp7wpDnvVOlb3LmJKUEg,3172
19
- ramifice/fields/choice_int_mult_field.py,sha256=J-oRNoPoF-cgAbHlxtVTU7E-OeLf-Z-E2gL2036qhRc,4246
20
- ramifice/fields/choice_text_dyn_field.py,sha256=xFAOzdTKzrJg73-7CvNjovj-Dnj0ONmZi-sUz2vvcEI,3103
21
- ramifice/fields/choice_text_field.py,sha256=L1j36BX6pKtS661ZSYtrD9tuAjxD2puRGOvrdEBqcS8,4099
22
- ramifice/fields/choice_text_mult_dyn_field.py,sha256=HtDd7X70VlIJ2SdCTVr_8dZvw_oPw79QC0YjGaOZQlA,3168
23
- ramifice/fields/choice_text_mult_field.py,sha256=UGKbAJQaX1pq0KFJnvgEYYKlrr_eGsaFY2eOA-43NRw,4242
24
- ramifice/fields/color_field.py,sha256=NdYey3Og8hh7oK7yDljrG6K8frgqj4C2OTXFnJVAYFQ,3526
25
- ramifice/fields/date_field.py,sha256=w875p6JwssKhEZJLBHmC8sE5wArn161rlQi0Zt-qEZo,5214
26
- ramifice/fields/date_time_field.py,sha256=OGi-ED-Gm_AWGzczHA1qch59IuWy3KkVIJHQl3OlatU,5249
27
- ramifice/fields/email_field.py,sha256=jEIcWi6glmpK3x3os-b-IFxlrwho4uS4uIamprtg2_M,3433
28
- ramifice/fields/file_field.py,sha256=nMaVqVD61dH2TYN3ewAcT7xkYCtHuBcl4aSeoCcIDmA,7941
29
- ramifice/fields/float_field.py,sha256=o6rkcoYJB0Lyq4GkDxP3v4mUS-nKUgYCxNQkmgbTjlY,4585
30
- ramifice/fields/id_field.py,sha256=1_K1pfjYO7mNDs5W2zUHOiB5Y5vw0g02TPoGiBC2IYY,4135
31
- ramifice/fields/image_field.py,sha256=yxJLHZKYACoJMp_TrjhCDj1NHTG5uoDC45nD63YI474,12318
32
- ramifice/fields/integer_field.py,sha256=O-nddXEn7rkkqB-SgJxLPRTRHmPstrO-IfYiGR_ADe8,4561
33
- ramifice/fields/ip_field.py,sha256=tsxdwKd-MhkhnE1F2FmFg67jwh9Q-RvXECv1aG8PitE,3342
34
- ramifice/fields/password_field.py,sha256=m3n_qJRRHCtgyBC7nDB0dYBO_82Lp1Ws48d1_jxHA8o,3216
35
- ramifice/fields/phone_field.py,sha256=5qZ_rR82M9cuW7Dv-D5d9jDaw7DJp9y60lRB4GEmi4w,3615
36
- ramifice/fields/slug_field.py,sha256=9rH1VdxYPoK60QCKHRB91bA3ZmIeIuFmf6WttzB1yTI,2685
37
- ramifice/fields/text_field.py,sha256=pa5J1nTBC56JDU3mDyjy1Qofv8FLFUgACkNcZB6cUGQ,4107
38
- ramifice/fields/url_field.py,sha256=DTy4B22juav9dzIrqKy3NzM2vuICHvDzIDbzkkyF1C0,3993
39
- ramifice/fields/general/__init__.py,sha256=5OE0TwPQjvpB3lBPuEwKrhjR_1ehOWxB98OJP_n32MA,20
40
- ramifice/fields/general/choice_group.py,sha256=TBJblwH8mB71wd1z2jcSs28H-zx3JZVBfkk4YCE1-pI,916
41
- ramifice/fields/general/date_group.py,sha256=RKockc_X1bYAbpzxTzXdc0kxgx51MK0bjko_j34ixWU,1169
42
- ramifice/fields/general/field.py,sha256=Iwjx0idIUIFwcQw4TQEqejKct1EGaaJv1zZ1poSW8lo,1338
43
- ramifice/fields/general/file_group.py,sha256=n45KfPzFI_l5hXoKkPDG0Q-0mdC2obExV-3PJ-MN5tA,1071
44
- ramifice/fields/general/number_group.py,sha256=AqlCY-t6JHZ2QVBe7mk5nPt6z8M4VJ_RARRlSBoIxms,715
45
- ramifice/fields/general/text_group.py,sha256=6GD2Fe6Toz6zZjAAlcy5rPVCAGh6Yn1ltdIrFg9RF18,1057
46
- ramifice/models/__init__.py,sha256=h_QQ5rSJNZ-7kmx7wIFd8E8RmUS94b_x4jdwMbq8zm4,15
47
- ramifice/models/decorator.py,sha256=U1ukWWq2voEwvKonQAzihqGYVsoyPrOQ2jDXJZ-UcMc,7251
48
- ramifice/models/model.py,sha256=Ydz4kpYiEjjhxkiwhJmSIZM--lKe0QE38yL6wh2eITM,7104
49
- ramifice/models/pseudo.py,sha256=0PBLHUmoT5eXzIaZtTQ20IaNUPRAuRGGfRWbUypPtfc,6765
50
- ramifice/paladins/__init__.py,sha256=PIP3AXI2KBRXNcLJUF0d7ygJ7VLOAxlhb4HRKQ9MGYY,516
51
- ramifice/paladins/check.py,sha256=ennDiVAoCZIS3aKBK0eA-Vt8VJQnbIv90be5IFYraFg,7026
52
- ramifice/paladins/delete.py,sha256=tw50E98D5eFZ7gHGnh_8ztUB1LeTeWWKZvIcQqlgbF8,3352
53
- ramifice/paladins/password.py,sha256=w1XWh3bsncH1VTVjCLxyKI2waxMvltwcsPWW3V9Ib84,3027
54
- ramifice/paladins/refrash.py,sha256=fw-9x_NKGzreipBt_F9KF6FTsYm9hSzfq4ubi1FHYrQ,1065
55
- ramifice/paladins/save.py,sha256=EG0_v-imCQPax2pJIAXPoQcSL99g8abY2EeGJMvXBW4,3864
56
- ramifice/paladins/tools.py,sha256=Xm1RhkV1GX5B6GbyGmJMBzFyDQcenBxcRjlUamIz5pA,2706
57
- ramifice/paladins/validation.py,sha256=gcEJXIEPu1g7Z54vl14YTs5rCmxOEYsgQH1usFfyy7k,1730
58
- ramifice/paladins/groups/__init__.py,sha256=hpqmWLsYAMvZHAbmMXluQSqLhkHOSTUAgLHyTM1LTYI,472
59
- ramifice/paladins/groups/bool_group.py,sha256=oJc9mw9KGrnK_Pj7uXixYYQAJphcXLr_xSQv3PMUlcU,792
60
- ramifice/paladins/groups/choice_group.py,sha256=NsOdPMHtnK-ITnSQxEteCeTFhk7MrJJ3wIcDEeOgodU,1791
61
- ramifice/paladins/groups/date_group.py,sha256=B9usKKrHX16F1ckik60Xkub1tawgNENSHTk5Rt-K96k,3741
62
- ramifice/paladins/groups/file_group.py,sha256=-xgtrLOTlKXc71Mnbu3I_LbYnTEd8OprnhtYcJbaDtg,2932
63
- ramifice/paladins/groups/id_group.py,sha256=q5BeoM1e7mZmX0zVgemva9K-9ihJKBrX8kxvMh-uhhQ,1268
64
- ramifice/paladins/groups/img_group.py,sha256=RoD_QnW0F0DAzrGQmRi8jMZnWy2IomlFn6A5jTM02iA,5542
65
- ramifice/paladins/groups/num_group.py,sha256=6jT7nfIiVoQTlI2UdkcQOlHIDYjllFqSH7Nb87uJgzg,2274
66
- ramifice/paladins/groups/pass_group.py,sha256=YU5a-NwohEutoEx2N5JmGfg8uPiYiW0XJ8XYsOih6eA,1859
67
- ramifice/paladins/groups/slug_group.py,sha256=joBB5litljbv2h5JKEMzF71s_DKMWH6nzgThLiLZx2E,2307
68
- ramifice/paladins/groups/text_group.py,sha256=EiHGuiJKm-A4UrsV4DHoI7whL-LdQCIEvW6jX4YjfCo,4354
69
- ramifice/utils/__init__.py,sha256=xixHoOX4ja5jIUZemem1qn4k4aonv3G3Q76azQK_pkU,43
70
- ramifice/utils/errors.py,sha256=iuhq7fzpUmsOyeXeg2fJjta8yAuqlXLKsZVMpfUhtHE,1901
71
- ramifice/utils/fixtures.py,sha256=qsv9cg06lc82XaRlhI1j5vftmOQTTwOcDXCg_lnpK04,3159
72
- ramifice/utils/globals.py,sha256=uR20um3Qg_1SG1t7WyWbpq8kQD-9Mslyr_c1yh5Hw9w,1751
73
- ramifice/utils/migration.py,sha256=kx1JX0xSgebtNtoTm_161_MqBw5kpsqCfIsc8wXYc34,11060
74
- ramifice/utils/tools.py,sha256=sOKzwnvf6vdTNf9r6PKAdw6aB4undat2Z8tzS3M1GnQ,2733
75
- ramifice/utils/translations.py,sha256=rnBoFC4sFuwX5DoWa1EL5MmkfXslbGrezdiwebJ5HUk,4233
76
- ramifice/utils/unit.py,sha256=R34gxriT67vI6PmjMIRftNsSP036jwbnsYjxt1Wma48,2454
77
- ramifice/utils/mixins/__init__.py,sha256=-UxYokZSlEaqoIs0aPVGtzK2CgN88mTzyhryHEtt0Yo,181
78
- ramifice/utils/mixins/add_valid.py,sha256=TLOObedzXNA9eCylfAVbVCqIKE5sV-P5AdIN7avj-GA,407
79
- ramifice/utils/mixins/hooks.py,sha256=33jvJRhfnJeL2Hd_YFXk3M_7wjqHaByU2wRjKyboL6s,914
80
- ramifice/utils/mixins/indexing.py,sha256=Z0427HoaVRyNmSNN8Fx0mSICgAKV-gDdu3iR5qYUEbs,329
81
- ramifice/utils/mixins/json_converter.py,sha256=WhigXyDAV-FfILaZuwvRFRIk0D90Rv3dG5t-mv5fVyc,1107
82
- ramifice-0.5.11.dist-info/METADATA,sha256=gTxPqTmy6_69QXkdYgR30QYXrOsgUC5w__zOxNnXukg,21454
83
- ramifice-0.5.11.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
84
- ramifice-0.5.11.dist-info/licenses/LICENSE,sha256=LrEL0aTZx90HDwFUQCJutORiDjJL9AnuVvCtspXIqt4,1095
85
- ramifice-0.5.11.dist-info/RECORD,,