marshmallow 3.21.3__py3-none-any.whl → 3.22.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.
- marshmallow/decorators.py +13 -11
- marshmallow/schema.py +24 -26
- marshmallow/types.py +0 -1
- {marshmallow-3.21.3.dist-info → marshmallow-3.22.0.dist-info}/METADATA +17 -14
- {marshmallow-3.21.3.dist-info → marshmallow-3.22.0.dist-info}/RECORD +7 -7
- {marshmallow-3.21.3.dist-info → marshmallow-3.22.0.dist-info}/LICENSE +0 -0
- {marshmallow-3.21.3.dist-info → marshmallow-3.22.0.dist-info}/WHEEL +0 -0
marshmallow/decorators.py
CHANGED
|
@@ -68,6 +68,7 @@ Example: ::
|
|
|
68
68
|
from __future__ import annotations
|
|
69
69
|
|
|
70
70
|
import functools
|
|
71
|
+
from collections import defaultdict
|
|
71
72
|
from typing import Any, Callable, cast
|
|
72
73
|
|
|
73
74
|
PRE_DUMP = "pre_dump"
|
|
@@ -79,7 +80,7 @@ VALIDATES_SCHEMA = "validates_schema"
|
|
|
79
80
|
|
|
80
81
|
|
|
81
82
|
class MarshmallowHook:
|
|
82
|
-
__marshmallow_hook__: dict[
|
|
83
|
+
__marshmallow_hook__: dict[str, list[tuple[bool, Any]]] | None = None
|
|
83
84
|
|
|
84
85
|
|
|
85
86
|
def validates(field_name: str) -> Callable[..., Any]:
|
|
@@ -117,7 +118,8 @@ def validates_schema(
|
|
|
117
118
|
"""
|
|
118
119
|
return set_hook(
|
|
119
120
|
fn,
|
|
120
|
-
|
|
121
|
+
VALIDATES_SCHEMA,
|
|
122
|
+
many=pass_many,
|
|
121
123
|
pass_original=pass_original,
|
|
122
124
|
skip_on_field_errors=skip_on_field_errors,
|
|
123
125
|
)
|
|
@@ -136,7 +138,7 @@ def pre_dump(
|
|
|
136
138
|
.. versionchanged:: 3.0.0
|
|
137
139
|
``many`` is always passed as a keyword arguments to the decorated method.
|
|
138
140
|
"""
|
|
139
|
-
return set_hook(fn,
|
|
141
|
+
return set_hook(fn, PRE_DUMP, many=pass_many)
|
|
140
142
|
|
|
141
143
|
|
|
142
144
|
def post_dump(
|
|
@@ -157,7 +159,7 @@ def post_dump(
|
|
|
157
159
|
.. versionchanged:: 3.0.0
|
|
158
160
|
``many`` is always passed as a keyword arguments to the decorated method.
|
|
159
161
|
"""
|
|
160
|
-
return set_hook(fn,
|
|
162
|
+
return set_hook(fn, POST_DUMP, many=pass_many, pass_original=pass_original)
|
|
161
163
|
|
|
162
164
|
|
|
163
165
|
def pre_load(
|
|
@@ -174,7 +176,7 @@ def pre_load(
|
|
|
174
176
|
``partial`` and ``many`` are always passed as keyword arguments to
|
|
175
177
|
the decorated method.
|
|
176
178
|
"""
|
|
177
|
-
return set_hook(fn,
|
|
179
|
+
return set_hook(fn, PRE_LOAD, many=pass_many)
|
|
178
180
|
|
|
179
181
|
|
|
180
182
|
def post_load(
|
|
@@ -196,11 +198,11 @@ def post_load(
|
|
|
196
198
|
``partial`` and ``many`` are always passed as keyword arguments to
|
|
197
199
|
the decorated method.
|
|
198
200
|
"""
|
|
199
|
-
return set_hook(fn,
|
|
201
|
+
return set_hook(fn, POST_LOAD, many=pass_many, pass_original=pass_original)
|
|
200
202
|
|
|
201
203
|
|
|
202
204
|
def set_hook(
|
|
203
|
-
fn: Callable[..., Any] | None,
|
|
205
|
+
fn: Callable[..., Any] | None, tag: str, many: bool = False, **kwargs: Any
|
|
204
206
|
) -> Callable[..., Any]:
|
|
205
207
|
"""Mark decorated function as a hook to be picked up later.
|
|
206
208
|
You should not need to use this method directly.
|
|
@@ -214,7 +216,7 @@ def set_hook(
|
|
|
214
216
|
"""
|
|
215
217
|
# Allow using this as either a decorator or a decorator factory.
|
|
216
218
|
if fn is None:
|
|
217
|
-
return functools.partial(set_hook,
|
|
219
|
+
return functools.partial(set_hook, tag=tag, many=many, **kwargs)
|
|
218
220
|
|
|
219
221
|
# Set a __marshmallow_hook__ attribute instead of wrapping in some class,
|
|
220
222
|
# because I still want this to end up as a normal (unbound) method.
|
|
@@ -222,10 +224,10 @@ def set_hook(
|
|
|
222
224
|
try:
|
|
223
225
|
hook_config = function.__marshmallow_hook__
|
|
224
226
|
except AttributeError:
|
|
225
|
-
function.__marshmallow_hook__ = hook_config =
|
|
227
|
+
function.__marshmallow_hook__ = hook_config = defaultdict(list)
|
|
226
228
|
# Also save the kwargs for the tagged function on
|
|
227
|
-
# __marshmallow_hook__, keyed by
|
|
229
|
+
# __marshmallow_hook__, keyed by <tag>
|
|
228
230
|
if hook_config is not None:
|
|
229
|
-
hook_config[
|
|
231
|
+
hook_config[tag].append((many, kwargs))
|
|
230
232
|
|
|
231
233
|
return fn
|
marshmallow/schema.py
CHANGED
|
@@ -148,7 +148,7 @@ class SchemaMeta(ABCMeta):
|
|
|
148
148
|
class_registry.register(name, cls)
|
|
149
149
|
cls._hooks = cls.resolve_hooks()
|
|
150
150
|
|
|
151
|
-
def resolve_hooks(cls) -> dict[
|
|
151
|
+
def resolve_hooks(cls) -> dict[str, list[tuple[str, bool, dict]]]:
|
|
152
152
|
"""Add in the decorated processors
|
|
153
153
|
|
|
154
154
|
By doing this after constructing the class, we let standard inheritance
|
|
@@ -156,7 +156,7 @@ class SchemaMeta(ABCMeta):
|
|
|
156
156
|
"""
|
|
157
157
|
mro = inspect.getmro(cls)
|
|
158
158
|
|
|
159
|
-
hooks = defaultdict(list) # type: typing.Dict[
|
|
159
|
+
hooks = defaultdict(list) # type: typing.Dict[str, typing.List[typing.Tuple[str, bool, dict]]]
|
|
160
160
|
|
|
161
161
|
for attr_name in dir(cls):
|
|
162
162
|
# Need to look up the actual descriptor, not whatever might be
|
|
@@ -176,14 +176,16 @@ class SchemaMeta(ABCMeta):
|
|
|
176
176
|
continue
|
|
177
177
|
|
|
178
178
|
try:
|
|
179
|
-
hook_config = attr.__marshmallow_hook__
|
|
179
|
+
hook_config = attr.__marshmallow_hook__ # type: typing.Dict[str, typing.List[typing.Tuple[bool, dict]]]
|
|
180
180
|
except AttributeError:
|
|
181
181
|
pass
|
|
182
182
|
else:
|
|
183
|
-
for
|
|
183
|
+
for tag, config in hook_config.items():
|
|
184
184
|
# Use name here so we can get the bound method later, in
|
|
185
185
|
# case the processor was a descriptor or something.
|
|
186
|
-
hooks[
|
|
186
|
+
hooks[tag].extend(
|
|
187
|
+
(attr_name, many, kwargs) for many, kwargs in config
|
|
188
|
+
)
|
|
187
189
|
|
|
188
190
|
return hooks
|
|
189
191
|
|
|
@@ -226,6 +228,7 @@ class SchemaOpts:
|
|
|
226
228
|
self.dump_only = getattr(meta, "dump_only", ())
|
|
227
229
|
self.unknown = validate_unknown_parameter_value(getattr(meta, "unknown", RAISE))
|
|
228
230
|
self.register = getattr(meta, "register", True)
|
|
231
|
+
self.many = getattr(meta, "many", False)
|
|
229
232
|
|
|
230
233
|
|
|
231
234
|
class Schema(base.SchemaABC, metaclass=SchemaMeta):
|
|
@@ -319,7 +322,7 @@ class Schema(base.SchemaABC, metaclass=SchemaMeta):
|
|
|
319
322
|
# These get set by SchemaMeta
|
|
320
323
|
opts = None # type: SchemaOpts
|
|
321
324
|
_declared_fields = {} # type: typing.Dict[str, ma_fields.Field]
|
|
322
|
-
_hooks = {} # type: typing.Dict[
|
|
325
|
+
_hooks = {} # type: typing.Dict[str, typing.List[typing.Tuple[str, bool, dict]]]
|
|
323
326
|
|
|
324
327
|
class Meta:
|
|
325
328
|
"""Options object for a Schema.
|
|
@@ -342,6 +345,7 @@ class Schema(base.SchemaABC, metaclass=SchemaMeta):
|
|
|
342
345
|
`OrderedDict`.
|
|
343
346
|
- ``exclude``: Tuple or list of fields to exclude in the serialized result.
|
|
344
347
|
Nested fields can be represented with dot delimiters.
|
|
348
|
+
- ``many``: Whether the data is a collection by default.
|
|
345
349
|
- ``dateformat``: Default format for `Date <fields.Date>` fields.
|
|
346
350
|
- ``datetimeformat``: Default format for `DateTime <fields.DateTime>` fields.
|
|
347
351
|
- ``timeformat``: Default format for `Time <fields.Time>` fields.
|
|
@@ -365,7 +369,7 @@ class Schema(base.SchemaABC, metaclass=SchemaMeta):
|
|
|
365
369
|
*,
|
|
366
370
|
only: types.StrSequenceOrSet | None = None,
|
|
367
371
|
exclude: types.StrSequenceOrSet = (),
|
|
368
|
-
many: bool =
|
|
372
|
+
many: bool | None = None,
|
|
369
373
|
context: dict | None = None,
|
|
370
374
|
load_only: types.StrSequenceOrSet = (),
|
|
371
375
|
dump_only: types.StrSequenceOrSet = (),
|
|
@@ -379,7 +383,7 @@ class Schema(base.SchemaABC, metaclass=SchemaMeta):
|
|
|
379
383
|
raise StringNotCollectionError('"exclude" should be a list of strings')
|
|
380
384
|
# copy declared fields from metaclass
|
|
381
385
|
self.declared_fields = copy.deepcopy(self._declared_fields)
|
|
382
|
-
self.many = many
|
|
386
|
+
self.many = self.opts.many if many is None else many
|
|
383
387
|
self.only = only
|
|
384
388
|
self.exclude: set[typing.Any] | typing.MutableSet[typing.Any] = set(
|
|
385
389
|
self.opts.exclude
|
|
@@ -539,7 +543,7 @@ class Schema(base.SchemaABC, metaclass=SchemaMeta):
|
|
|
539
543
|
Validation no longer occurs upon serialization.
|
|
540
544
|
"""
|
|
541
545
|
many = self.many if many is None else bool(many)
|
|
542
|
-
if self.
|
|
546
|
+
if self._hooks[PRE_DUMP]:
|
|
543
547
|
processed_obj = self._invoke_dump_processors(
|
|
544
548
|
PRE_DUMP, obj, many=many, original_data=obj
|
|
545
549
|
)
|
|
@@ -548,7 +552,7 @@ class Schema(base.SchemaABC, metaclass=SchemaMeta):
|
|
|
548
552
|
|
|
549
553
|
result = self._serialize(processed_obj, many=many)
|
|
550
554
|
|
|
551
|
-
if self.
|
|
555
|
+
if self._hooks[POST_DUMP]:
|
|
552
556
|
result = self._invoke_dump_processors(
|
|
553
557
|
POST_DUMP, result, many=many, original_data=obj
|
|
554
558
|
)
|
|
@@ -846,7 +850,7 @@ class Schema(base.SchemaABC, metaclass=SchemaMeta):
|
|
|
846
850
|
if partial is None:
|
|
847
851
|
partial = self.partial
|
|
848
852
|
# Run preprocessors
|
|
849
|
-
if self.
|
|
853
|
+
if self._hooks[PRE_LOAD]:
|
|
850
854
|
try:
|
|
851
855
|
processed_data = self._invoke_load_processors(
|
|
852
856
|
PRE_LOAD, data, many=many, original_data=data, partial=partial
|
|
@@ -870,7 +874,7 @@ class Schema(base.SchemaABC, metaclass=SchemaMeta):
|
|
|
870
874
|
error_store=error_store, data=result, many=many
|
|
871
875
|
)
|
|
872
876
|
# Run schema-level validation
|
|
873
|
-
if self.
|
|
877
|
+
if self._hooks[VALIDATES_SCHEMA]:
|
|
874
878
|
field_errors = bool(error_store.errors)
|
|
875
879
|
self._invoke_schema_validators(
|
|
876
880
|
error_store=error_store,
|
|
@@ -892,7 +896,7 @@ class Schema(base.SchemaABC, metaclass=SchemaMeta):
|
|
|
892
896
|
)
|
|
893
897
|
errors = error_store.errors
|
|
894
898
|
# Run post processors
|
|
895
|
-
if not errors and postprocess and self.
|
|
899
|
+
if not errors and postprocess and self._hooks[POST_LOAD]:
|
|
896
900
|
try:
|
|
897
901
|
result = self._invoke_load_processors(
|
|
898
902
|
POST_LOAD,
|
|
@@ -1055,9 +1059,6 @@ class Schema(base.SchemaABC, metaclass=SchemaMeta):
|
|
|
1055
1059
|
raise error
|
|
1056
1060
|
self.on_bind_field(field_name, field_obj)
|
|
1057
1061
|
|
|
1058
|
-
def _has_processors(self, tag) -> bool:
|
|
1059
|
-
return bool(self._hooks[(tag, True)] or self._hooks[(tag, False)])
|
|
1060
|
-
|
|
1061
1062
|
def _invoke_dump_processors(
|
|
1062
1063
|
self, tag: str, data, *, many: bool, original_data=None
|
|
1063
1064
|
):
|
|
@@ -1102,9 +1103,8 @@ class Schema(base.SchemaABC, metaclass=SchemaMeta):
|
|
|
1102
1103
|
return data
|
|
1103
1104
|
|
|
1104
1105
|
def _invoke_field_validators(self, *, error_store: ErrorStore, data, many: bool):
|
|
1105
|
-
for attr_name in self._hooks[VALIDATES]:
|
|
1106
|
+
for attr_name, _, validator_kwargs in self._hooks[VALIDATES]:
|
|
1106
1107
|
validator = getattr(self, attr_name)
|
|
1107
|
-
validator_kwargs = validator.__marshmallow_hook__[VALIDATES]
|
|
1108
1108
|
field_name = validator_kwargs["field_name"]
|
|
1109
1109
|
|
|
1110
1110
|
try:
|
|
@@ -1159,11 +1159,10 @@ class Schema(base.SchemaABC, metaclass=SchemaMeta):
|
|
|
1159
1159
|
partial: bool | types.StrSequenceOrSet | None,
|
|
1160
1160
|
field_errors: bool = False,
|
|
1161
1161
|
):
|
|
1162
|
-
for attr_name in self._hooks[
|
|
1162
|
+
for attr_name, hook_many, validator_kwargs in self._hooks[VALIDATES_SCHEMA]:
|
|
1163
|
+
if hook_many != pass_many:
|
|
1164
|
+
continue
|
|
1163
1165
|
validator = getattr(self, attr_name)
|
|
1164
|
-
validator_kwargs = validator.__marshmallow_hook__[
|
|
1165
|
-
(VALIDATES_SCHEMA, pass_many)
|
|
1166
|
-
]
|
|
1167
1166
|
if field_errors and validator_kwargs["skip_on_field_errors"]:
|
|
1168
1167
|
continue
|
|
1169
1168
|
pass_original = validator_kwargs.get("pass_original", False)
|
|
@@ -1201,12 +1200,11 @@ class Schema(base.SchemaABC, metaclass=SchemaMeta):
|
|
|
1201
1200
|
original_data=None,
|
|
1202
1201
|
**kwargs,
|
|
1203
1202
|
):
|
|
1204
|
-
|
|
1205
|
-
|
|
1203
|
+
for attr_name, hook_many, processor_kwargs in self._hooks[tag]:
|
|
1204
|
+
if hook_many != pass_many:
|
|
1205
|
+
continue
|
|
1206
1206
|
# This will be a bound method.
|
|
1207
1207
|
processor = getattr(self, attr_name)
|
|
1208
|
-
|
|
1209
|
-
processor_kwargs = processor.__marshmallow_hook__[key]
|
|
1210
1208
|
pass_original = processor_kwargs.get("pass_original", False)
|
|
1211
1209
|
|
|
1212
1210
|
if many and not pass_many:
|
marshmallow/types.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: marshmallow
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.22.0
|
|
4
4
|
Summary: A lightweight library for converting complex datatypes to and from native Python datatypes.
|
|
5
5
|
Author-email: Steven Loria <sloria1@gmail.com>
|
|
6
6
|
Maintainer-email: Steven Loria <sloria1@gmail.com>, Jérôme Lafréchoux <jerome@jolimont.fr>, Jared Deckard <jared@shademaps.com>
|
|
@@ -19,11 +19,11 @@ Requires-Dist: packaging>=17.0
|
|
|
19
19
|
Requires-Dist: marshmallow[tests] ; extra == "dev"
|
|
20
20
|
Requires-Dist: tox ; extra == "dev"
|
|
21
21
|
Requires-Dist: pre-commit~=3.5 ; extra == "dev"
|
|
22
|
-
Requires-Dist: sphinx==
|
|
22
|
+
Requires-Dist: sphinx==8.0.2 ; extra == "docs"
|
|
23
23
|
Requires-Dist: sphinx-issues==4.1.0 ; extra == "docs"
|
|
24
|
-
Requires-Dist: alabaster==0.
|
|
24
|
+
Requires-Dist: alabaster==1.0.0 ; extra == "docs"
|
|
25
25
|
Requires-Dist: sphinx-version-warning==1.1.2 ; extra == "docs"
|
|
26
|
-
Requires-Dist: autodocsumm==0.2.
|
|
26
|
+
Requires-Dist: autodocsumm==0.2.13 ; extra == "docs"
|
|
27
27
|
Requires-Dist: pytest ; extra == "tests"
|
|
28
28
|
Requires-Dist: pytz ; extra == "tests"
|
|
29
29
|
Requires-Dist: simplejson ; extra == "tests"
|
|
@@ -40,19 +40,21 @@ Provides-Extra: tests
|
|
|
40
40
|
marshmallow: simplified object serialization
|
|
41
41
|
********************************************
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
|pypi| |build-status| |pre-commit| |docs|
|
|
44
|
+
|
|
45
|
+
.. |pypi| image:: https://badgen.net/pypi/v/marshmallow
|
|
44
46
|
:target: https://pypi.org/project/marshmallow/
|
|
45
47
|
:alt: Latest version
|
|
46
48
|
|
|
47
|
-
.. image:: https://github.com/marshmallow-code/marshmallow/actions/workflows/build-release.yml/badge.svg
|
|
49
|
+
.. |build-status| image:: https://github.com/marshmallow-code/marshmallow/actions/workflows/build-release.yml/badge.svg
|
|
48
50
|
:target: https://github.com/marshmallow-code/marshmallow/actions/workflows/build-release.yml
|
|
49
51
|
:alt: Build status
|
|
50
52
|
|
|
51
|
-
.. image:: https://results.pre-commit.ci/badge/github/marshmallow-code/marshmallow/dev.svg
|
|
53
|
+
.. |pre-commit| image:: https://results.pre-commit.ci/badge/github/marshmallow-code/marshmallow/dev.svg
|
|
52
54
|
:target: https://results.pre-commit.ci/latest/github/marshmallow-code/marshmallow/dev
|
|
53
55
|
:alt: pre-commit.ci status
|
|
54
56
|
|
|
55
|
-
.. image:: https://readthedocs.org/projects/marshmallow/badge/
|
|
57
|
+
.. |docs| image:: https://readthedocs.org/projects/marshmallow/badge/
|
|
56
58
|
:target: https://marshmallow.readthedocs.io/
|
|
57
59
|
:alt: Documentation
|
|
58
60
|
|
|
@@ -152,15 +154,16 @@ Thank you to all our backers! [`Become a backer`_]
|
|
|
152
154
|
Sponsors
|
|
153
155
|
--------
|
|
154
156
|
|
|
155
|
-
|
|
156
|
-
Your logo will show up here with a link to your website. [`Become a sponsor`_]
|
|
157
|
+
marshmallow is sponsored by `Route4Me <https://route4me.com>`_.
|
|
157
158
|
|
|
158
|
-
..
|
|
159
|
+
.. image:: https://github.com/user-attachments/assets/018c2e23-032e-4a11-98da-8b6dc25b9054
|
|
160
|
+
:target: https://route4me.com
|
|
161
|
+
:alt: Routing Planner
|
|
159
162
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
:alt: Become a sponsor
|
|
163
|
+
Support this project by becoming a sponsor (or ask your company to support this project by becoming a sponsor).
|
|
164
|
+
Your logo will be displayed here with a link to your website. [`Become a sponsor`_]
|
|
163
165
|
|
|
166
|
+
.. _`Become a sponsor`: https://opencollective.com/marshmallow#sponsor
|
|
164
167
|
|
|
165
168
|
Professional Support
|
|
166
169
|
====================
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
marshmallow/__init__.py,sha256=C-zbaQJ9dlJLJxotIqTa5OOaD6ojGNRqW8moGrMsGr8,2387
|
|
2
2
|
marshmallow/base.py,sha256=jZ68DZxxSCvRg2GTcxQcf2JjTxqEn-xFNrBEMK3CinU,1346
|
|
3
3
|
marshmallow/class_registry.py,sha256=Uvg-Obos0MejwTrpOHNEH4VF_SfGXKgR-4F2LnCbt1A,2811
|
|
4
|
-
marshmallow/decorators.py,sha256=
|
|
4
|
+
marshmallow/decorators.py,sha256=vmQFgBgdV0s1Fw8ySyZyQKvjKBTNf5JB3SCldEIl29o,8385
|
|
5
5
|
marshmallow/error_store.py,sha256=A7AxgLMw9ffSmaxRH4x3wcBWibx-DuGH4LwSDpVn50I,2223
|
|
6
6
|
marshmallow/exceptions.py,sha256=DuARdOcirCdJxmlp16V97hQKAXOokvdW12jXtYOlGyk,2326
|
|
7
7
|
marshmallow/fields.py,sha256=3mWgT1TiLzKgdhgWTJYsGe6lVgUz02g8sb63FEEn5hc,72995
|
|
8
8
|
marshmallow/orderedset.py,sha256=C2aAG6w1faIL1phinbAltbe3AUAnF5MN6n7fzESNDhI,2922
|
|
9
9
|
marshmallow/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10
|
-
marshmallow/schema.py,sha256=
|
|
11
|
-
marshmallow/types.py,sha256=
|
|
10
|
+
marshmallow/schema.py,sha256=l71HiKwPPfwIMQxXkr4oUoKybdT_vImoLkuj6ZTnUyg,49044
|
|
11
|
+
marshmallow/types.py,sha256=RDS4IfasIehvH2rGWh9e4RTBtsMp-JFFtjApajV22zc,283
|
|
12
12
|
marshmallow/utils.py,sha256=sWciesZ6tS08uX9Z9fzu2lbuut5eh8TKABU-TwgqSms,11886
|
|
13
13
|
marshmallow/validate.py,sha256=hS7fYC6byDHK9A7A4is0McDMZEzu6GkKke-7unLt2hE,23857
|
|
14
14
|
marshmallow/warnings.py,sha256=vHQu7AluuWqLhvlw5noXtWWbya13zDXY6JMaVSUzmDs,65
|
|
15
|
-
marshmallow-3.
|
|
16
|
-
marshmallow-3.
|
|
17
|
-
marshmallow-3.
|
|
18
|
-
marshmallow-3.
|
|
15
|
+
marshmallow-3.22.0.dist-info/LICENSE,sha256=kGtdkFHkJhRMsXOtkRZnuOvQWpxYTCwmwTWzKj7RIAE,1064
|
|
16
|
+
marshmallow-3.22.0.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
|
|
17
|
+
marshmallow-3.22.0.dist-info/METADATA,sha256=7rCpX93_5nP-u7BEcVtaAa56-99xuwHcg-ALtEgm4-w,7225
|
|
18
|
+
marshmallow-3.22.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|