New Upstream Snapshot - python-marshmallow
Ready changes
Summary
Merged new upstream version: 3.19.0+git20230118.1.b80adb0 (was: 3.18.0+git20221026.1.82f5020).
Resulting package
Built on 2023-01-19T12:41 (took 5m4s)
The resulting binary packages can be installed (if you have the apt repository enabled) by running one of:
apt install -t fresh-snapshots python3-marshmallow-docapt install -t fresh-snapshots python3-marshmallow
Lintian Result
- python-marshmallow_3.19.0+git20230118.1.b80adb0-1~jan+nus1.dsc
- python-marshmallow_3.19.0+git20230118.1.b80adb0-1~jan+nus1_amd64.buildinfo
- python3-marshmallow-doc_3.19.0+git20230118.1.b80adb0-1~jan+nus1_all.deb
- python3-marshmallow_3.19.0+git20230118.1.b80adb0-1~jan+nus1_all.deb
- python-marshmallow_3.19.0+git20230118.1.b80adb0-1~jan+nus1_amd64.changes
Diff
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
deleted file mode 100644
index 96d1cfd..0000000
--- a/.github/FUNDING.yml
+++ /dev/null
@@ -1,2 +0,0 @@
-open_collective: "marshmallow"
-tidelift: "pypi/marshmallow"
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
deleted file mode 100644
index 3f590c7..0000000
--- a/.github/dependabot.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-version: 2
-updates:
-- package-ecosystem: pip
- directory: "/"
- schedule:
- interval: daily
- open-pull-requests-limit: 10
- ignore:
- - dependency-name: sphinx
- versions:
- - 3.5.0
- - 3.5.1
- - 3.5.2
- - 3.5.3
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
deleted file mode 100644
index 239f9a0..0000000
--- a/.pre-commit-config.yaml
+++ /dev/null
@@ -1,28 +0,0 @@
-repos:
-- repo: https://github.com/asottile/pyupgrade
- rev: v2.31.1
- hooks:
- - id: pyupgrade
- args: [--py37-plus]
-- repo: https://github.com/python/black
- rev: 22.3.0
- hooks:
- - id: black
- language_version: python3
-- repo: https://github.com/pycqa/flake8
- rev: 4.0.1
- hooks:
- - id: flake8
- additional_dependencies: [flake8-bugbear==22.1.11]
-- repo: https://github.com/pre-commit/mirrors-mypy
- rev: v0.960
- hooks:
- - id: mypy
- additional_dependencies: [types-simplejson, types-pytz, packaging]
- # these files are checked under `tox -e mypy-test`
- exclude: ^tests/mypy_test_cases/.*$
-- repo: https://github.com/asottile/blacken-docs
- rev: v1.12.1
- hooks:
- - id: blacken-docs
- additional_dependencies: [black==22.1.0]
diff --git a/.readthedocs.yml b/.readthedocs.yml
deleted file mode 100644
index d61a1ac..0000000
--- a/.readthedocs.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-version: 2
-sphinx:
- configuration: docs/conf.py
-formats: []
-python:
- version: 3.8
- install:
- - method: pip
- path: .
- extra_requirements:
- - docs
diff --git a/AUTHORS.rst b/AUTHORS.rst
index f4aec16..a0a928a 100644
--- a/AUTHORS.rst
+++ b/AUTHORS.rst
@@ -170,3 +170,4 @@ Contributors (chronological)
- Isira Seneviratne `@Isira-Seneviratne <https://github.com/Isira-Seneviratne>`_
- Karthikeyan Singaravelan `@tirkarthi <https://github.com/tirkarthi>`_
- Marco Satti `@marcosatti <https://github.com/marcosatti>`_
+- Ivo Reumkens `@vanHoi <https://github.com/vanHoi>`_
diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index ec2a084..51cb1d4 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -1,6 +1,23 @@
Changelog
---------
+3.20.0 (unreleased)
+*******************
+
+Other changes:
+
+- Officially support Python 3.11 (:pr:`2067`).
+
+3.19.0 (2022-11-11)
+*******************
+
+Features:
+
+- Add ``timestamp`` and ``timestamp_ms`` formats to `fields.DateTime`
+ (:issue:`612`).
+ Thanks :user:`vgavro` for the suggestion and thanks :user:`vanHoi` for
+ the PR.
+
3.18.0 (2022-09-15)
*******************
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
deleted file mode 100644
index c4fb805..0000000
--- a/CODE_OF_CONDUCT.md
+++ /dev/null
@@ -1 +0,0 @@
-For the marshmallow code of conduct, see https://marshmallow.readthedocs.io/en/dev/code_of_conduct.html
diff --git a/PKG-INFO b/PKG-INFO
new file mode 100644
index 0000000..1d214dd
--- /dev/null
+++ b/PKG-INFO
@@ -0,0 +1,191 @@
+Metadata-Version: 2.1
+Name: marshmallow
+Version: 3.19.0
+Summary: A lightweight library for converting complex datatypes to and from native Python datatypes.
+Home-page: https://github.com/marshmallow-code/marshmallow
+Author: Steven Loria
+Author-email: sloria1@gmail.com
+License: MIT
+Project-URL: Changelog, https://marshmallow.readthedocs.io/en/latest/changelog.html
+Project-URL: Issues, https://github.com/marshmallow-code/marshmallow/issues
+Project-URL: Funding, https://opencollective.com/marshmallow
+Project-URL: Tidelift, https://tidelift.com/subscription/pkg/pypi-marshmallow?utm_source=pypi-marshmallow&utm_medium=pypi
+Keywords: serialization,rest,json,api,marshal,marshalling,deserialization,validation,schema
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
+Classifier: Programming Language :: Python :: 3.11
+Requires-Python: >=3.7
+Provides-Extra: dev
+Provides-Extra: docs
+Provides-Extra: lint
+Provides-Extra: tests
+License-File: LICENSE
+
+********************************************
+marshmallow: simplified object serialization
+********************************************
+
+.. image:: https://badgen.net/pypi/v/marshmallow
+ :target: https://pypi.org/project/marshmallow/
+ :alt: Latest version
+
+.. image:: https://dev.azure.com/sloria/sloria/_apis/build/status/marshmallow-code.marshmallow?branchName=dev
+ :target: https://dev.azure.com/sloria/sloria/_build/latest?definitionId=5&branchName=dev
+ :alt: Build status
+
+.. image:: https://readthedocs.org/projects/marshmallow/badge/
+ :target: https://marshmallow.readthedocs.io/
+ :alt: Documentation
+
+.. image:: https://badgen.net/badge/code%20style/black/000
+ :target: https://github.com/ambv/black
+ :alt: code style: black
+
+
+**marshmallow** is an ORM/ODM/framework-agnostic library for converting complex datatypes, such as objects, to and from native Python datatypes.
+
+.. code-block:: python
+
+ from datetime import date
+ from pprint import pprint
+
+ from marshmallow import Schema, fields
+
+
+ class ArtistSchema(Schema):
+ name = fields.Str()
+
+
+ class AlbumSchema(Schema):
+ title = fields.Str()
+ release_date = fields.Date()
+ artist = fields.Nested(ArtistSchema())
+
+
+ bowie = dict(name="David Bowie")
+ album = dict(artist=bowie, title="Hunky Dory", release_date=date(1971, 12, 17))
+
+ schema = AlbumSchema()
+ result = schema.dump(album)
+ pprint(result, indent=2)
+ # { 'artist': {'name': 'David Bowie'},
+ # 'release_date': '1971-12-17',
+ # 'title': 'Hunky Dory'}
+
+
+In short, marshmallow schemas can be used to:
+
+- **Validate** input data.
+- **Deserialize** input data to app-level objects.
+- **Serialize** app-level objects to primitive Python types. The serialized objects can then be rendered to standard formats such as JSON for use in an HTTP API.
+
+Get It Now
+==========
+
+::
+
+ $ pip install -U marshmallow
+
+
+Documentation
+=============
+
+Full documentation is available at https://marshmallow.readthedocs.io/ .
+
+Requirements
+============
+
+- Python >= 3.7
+
+Ecosystem
+=========
+
+A list of marshmallow-related libraries can be found at the GitHub wiki here:
+
+https://github.com/marshmallow-code/marshmallow/wiki/Ecosystem
+
+Credits
+=======
+
+Contributors
+------------
+
+This project exists thanks to all the people who contribute.
+
+**You're highly encouraged to participate in marshmallow's development.**
+Check out the `Contributing Guidelines <https://marshmallow.readthedocs.io/en/latest/contributing.html>`_ to see how you can help.
+
+Thank you to all who have already contributed to marshmallow!
+
+.. image:: https://opencollective.com/marshmallow/contributors.svg?width=890&button=false
+ :target: https://marshmallow.readthedocs.io/en/latest/authors.html
+ :alt: Contributors
+
+Backers
+-------
+
+If you find marshmallow useful, please consider supporting the team with
+a donation. Your donation helps move marshmallow forward.
+
+Thank you to all our backers! [`Become a backer`_]
+
+.. _`Become a backer`: https://opencollective.com/marshmallow#backer
+
+.. image:: https://opencollective.com/marshmallow/backers.svg?width=890
+ :target: https://opencollective.com/marshmallow#backers
+ :alt: Backers
+
+Sponsors
+--------
+
+Support this project by becoming a sponsor (or ask your company to support this project by becoming a sponsor).
+Your logo will show up here with a link to your website. [`Become a sponsor`_]
+
+.. _`Become a sponsor`: https://opencollective.com/marshmallow#sponsor
+
+.. image:: https://opencollective.com/marshmallow/sponsor/0/avatar.svg
+ :target: https://opencollective.com/marshmallow/sponsor/0/website
+ :alt: Sponsors
+
+.. image:: https://opencollective.com/static/images/become_sponsor.svg
+ :target: https://opencollective.com/marshmallow#sponsor
+ :alt: Become a sponsor
+
+
+Professional Support
+====================
+
+Professionally-supported marshmallow is now available through the
+`Tidelift Subscription <https://tidelift.com/subscription/pkg/pypi-marshmallow?utm_source=pypi-marshmallow&utm_medium=readme>`_.
+
+Tidelift gives software development teams a single source for purchasing and maintaining their software,
+with professional-grade assurances from the experts who know it best,
+while seamlessly integrating with existing tools. [`Get professional support`_]
+
+.. _`Get professional support`: https://tidelift.com/subscription/pkg/pypi-marshmallow?utm_source=marshmallow&utm_medium=referral&utm_campaign=github
+
+.. image:: https://user-images.githubusercontent.com/2379650/45126032-50b69880-b13f-11e8-9c2c-abd16c433495.png
+ :target: https://tidelift.com/subscription/pkg/pypi-marshmallow?utm_source=pypi-marshmallow&utm_medium=readme
+ :alt: Get supported marshmallow with Tidelift
+
+
+Project Links
+=============
+
+- Docs: https://marshmallow.readthedocs.io/
+- Changelog: https://marshmallow.readthedocs.io/en/latest/changelog.html
+- Contributing Guidelines: https://marshmallow.readthedocs.io/en/latest/contributing.html
+- PyPI: https://pypi.python.org/pypi/marshmallow
+- Issues: https://github.com/marshmallow-code/marshmallow/issues
+- Donate: https://opencollective.com/marshmallow
+
+License
+=======
+
+MIT licensed. See the bundled `LICENSE <https://github.com/marshmallow-code/marshmallow/blob/dev/LICENSE>`_ file for more details.
diff --git a/RELEASING.md b/RELEASING.md
deleted file mode 100644
index 7659fc0..0000000
--- a/RELEASING.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# Releasing
-
-1. Bump version in `src/marshmallow/__init__.py` and update the changelog
- with today's date.
-2. Commit: `git commit -m "Bump version and update changelog"`
-3. Tag the commit: `git tag x.y.z`
-4. Push: `git push --tags origin dev`. CI will take care of the
- PyPI release.
-5. Add release notes on Tidelift.
diff --git a/SECURITY.md b/SECURITY.md
deleted file mode 100644
index 92ec2bb..0000000
--- a/SECURITY.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# Security Contact Information
-
-To report a security vulnerability, please use the
-[Tidelift security contact](https://tidelift.com/security).
-Tidelift will coordinate the fix and disclosure.
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
deleted file mode 100644
index fd895e4..0000000
--- a/azure-pipelines.yml
+++ /dev/null
@@ -1,23 +0,0 @@
-trigger:
- branches:
- include: [dev, 2.x-line, test-me-*]
- tags:
- include: ['*']
-
-resources:
- repositories:
- - repository: sloria
- type: github
- endpoint: github
- name: sloria/azure-pipeline-templates
- ref: refs/heads/sloria
-
-jobs:
-- template: job--python-tox.yml@sloria
- parameters:
- toxenvs: [lint, mypy-test, py37, py310]
- os: linux
-- template: job--pypi-release.yml@sloria
- parameters:
- dependsOn:
- - tox_linux
diff --git a/debian/changelog b/debian/changelog
index ecdafe2..834d05f 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+python-marshmallow (3.19.0+git20230118.1.b80adb0-1) UNRELEASED; urgency=low
+
+ * New upstream snapshot.
+ * New upstream snapshot.
+
+ -- Debian Janitor <janitor@jelmer.uk> Thu, 19 Jan 2023 12:37:58 -0000
+
python-marshmallow (3.18.0-1) unstable; urgency=medium
* New upstream release
diff --git a/debian/patches/0001-remove-privacy-breaches b/debian/patches/0001-remove-privacy-breaches
index fb53228..e419ea4 100644
--- a/debian/patches/0001-remove-privacy-breaches
+++ b/debian/patches/0001-remove-privacy-breaches
@@ -1,9 +1,11 @@
From: Federico Ceratto <federico@debian.org>
Subject: Remove privacy breaches
---- a/docs/conf.py
-+++ b/docs/conf.py
-@@ -13,9 +13,6 @@
+Index: python-marshmallow.git/docs/conf.py
+===================================================================
+--- python-marshmallow.git.orig/docs/conf.py
++++ python-marshmallow.git/docs/conf.py
+@@ -13,9 +13,6 @@ extensions = [
"sphinx.ext.intersphinx",
"sphinx.ext.viewcode",
"alabaster",
@@ -13,7 +15,7 @@ Subject: Remove privacy breaches
]
primary_domain = "py"
-@@ -59,10 +56,6 @@
+@@ -59,10 +56,6 @@ html_theme_options = {
"logo": "marshmallow-logo.png",
"description": "Object serialization and deserialization, lightweight and fluffy.",
"description_font_style": "italic",
@@ -24,9 +26,11 @@ Subject: Remove privacy breaches
"opencollective": "marshmallow",
"tidelift_url": (
"https://tidelift.com/subscription/pkg/pypi-marshmallow"
---- a/docs/_templates/donate.html
-+++ b/docs/_templates/donate.html
-@@ -17,7 +17,6 @@
+Index: python-marshmallow.git/docs/_templates/donate.html
+===================================================================
+--- python-marshmallow.git.orig/docs/_templates/donate.html
++++ python-marshmallow.git/docs/_templates/donate.html
+@@ -17,7 +17,6 @@ If you find marshmallow useful, please c
{% if theme_opencollective %}
<p>
<a class="badge" href="https://opencollective.com/{{ theme_opencollective }}" target="_blank">
diff --git a/docs/.gitignore b/docs/.gitignore
new file mode 100644
index 0000000..50441ab
--- /dev/null
+++ b/docs/.gitignore
@@ -0,0 +1,2 @@
+marshmallow.docset
+marshmallow.tgz
diff --git a/docs/conf.py b/docs/conf.py
index 0066953..8831881 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -81,14 +81,14 @@ html_theme_options = {
}
html_sidebars = {
- "index": ["about.html", "donate.html", "useful-links.html", "searchbox.html"],
+ "index": ["about.html", "searchbox.html", "donate.html", "useful-links.html"],
"**": [
"about.html",
+ "searchbox.html",
"donate.html",
"useful-links.html",
"localtoc.html",
"relations.html",
- "searchbox.html",
],
}
diff --git a/performance/benchmark.py b/performance/benchmark.py
deleted file mode 100644
index 9a30a1e..0000000
--- a/performance/benchmark.py
+++ /dev/null
@@ -1,155 +0,0 @@
-"""Simple benchmark for Marshmallow serialization of a moderately complex object.
-
-Uses the `timeit` module to benchmark serializing an object through Marshmallow.
-"""
-import argparse
-import cProfile
-import gc
-import timeit
-import datetime
-
-from marshmallow import Schema, fields, ValidationError, post_dump
-
-
-# Custom validator
-def must_not_be_blank(data):
- if not data:
- raise ValidationError("Data not provided.")
-
-
-class AuthorSchema(Schema):
- id = fields.Int(dump_only=True)
- first = fields.Str()
- last = fields.Str()
- book_count = fields.Float()
- age = fields.Float()
- address = fields.Str()
- full_name = fields.Method("get_full_name")
-
- def get_full_name(self, author):
- return f"{author.last}, {author.first}"
-
-
-class QuoteSchema(Schema):
- id = fields.Int(dump_only=True)
- author = fields.Nested(AuthorSchema, validate=must_not_be_blank)
- content = fields.Str(required=True, validate=must_not_be_blank)
- posted_at = fields.DateTime(dump_only=True)
- book_name = fields.Str()
- page_number = fields.Float()
- line_number = fields.Float()
- col_number = fields.Float()
-
- @post_dump
- def add_full_name(self, data, **kwargs):
- data["author_full"] = "{}, {}".format(
- data["author"]["last"], data["author"]["first"]
- )
- return data
-
-
-class Author:
- def __init__(self, id, first, last, book_count, age, address):
- self.id = id
- self.first = first
- self.last = last
- self.book_count = book_count
- self.age = age
- self.address = address
-
-
-class Quote:
- def __init__(
- self,
- id,
- author,
- content,
- posted_at,
- book_name,
- page_number,
- line_number,
- col_number,
- ):
- self.id = id
- self.author = author
- self.content = content
- self.posted_at = posted_at
- self.book_name = book_name
- self.page_number = page_number
- self.line_number = line_number
- self.col_number = col_number
-
-
-def run_timeit(quotes, iterations, repeat, profile=False):
- quotes_schema = QuoteSchema(many=True)
- if profile:
- profile = cProfile.Profile()
- profile.enable()
-
- gc.collect()
- best = min(
- timeit.repeat(
- lambda: quotes_schema.dump(quotes),
- "gc.enable()",
- number=iterations,
- repeat=repeat,
- )
- )
- if profile:
- profile.disable()
- profile.dump_stats("marshmallow.pprof")
-
- usec = best * 1e6 / iterations
- return usec
-
-
-def main():
- parser = argparse.ArgumentParser(description="Runs a benchmark of Marshmallow.")
- parser.add_argument(
- "--iterations",
- type=int,
- default=1000,
- help="Number of iterations to run per test.",
- )
- parser.add_argument(
- "--repeat",
- type=int,
- default=5,
- help="Number of times to repeat the performance test. The minimum will "
- "be used.",
- )
- parser.add_argument(
- "--object-count", type=int, default=20, help="Number of objects to dump."
- )
- parser.add_argument(
- "--profile",
- action="store_true",
- help="Whether or not to profile Marshmallow while running the benchmark.",
- )
- args = parser.parse_args()
-
- quotes = []
-
- for i in range(args.object_count):
- quotes.append(
- Quote(
- i,
- Author(i, "Foo", "Bar", 42, 66, "123 Fake St"),
- "Hello World",
- datetime.datetime(2019, 7, 4, tzinfo=datetime.timezone.utc),
- "The World",
- 34,
- 3,
- 70,
- )
- )
-
- print(
- "Benchmark Result: {:.2f} usec/dump".format(
- run_timeit(quotes, args.iterations, args.repeat, profile=args.profile)
- )
- )
-
-
-if __name__ == "__main__":
- main()
diff --git a/setup.cfg b/setup.cfg
index 330163a..99e8c91 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -2,10 +2,9 @@
license_files = LICENSE
[flake8]
-extend-ignore = E203, E266, E501, E731, B903
max-line-length = 90
max-complexity = 18
-select = B,C,E,F,W,T4,B9
+extend-ignore = E203, E266, E501, E731, B903
[tool:pytest]
norecursedirs = .git .ropeproject .tox docs env venv tests/mypy_test_cases
@@ -17,3 +16,8 @@ warn_unreachable = true
warn_unused_ignores = true
warn_redundant_casts = true
no_implicit_optional = true
+
+[egg_info]
+tag_build =
+tag_date = 0
+
diff --git a/setup.py b/setup.py
index 286ec75..1911661 100644
--- a/setup.py
+++ b/setup.py
@@ -4,17 +4,17 @@ from setuptools import setup, find_packages
EXTRAS_REQUIRE = {
"tests": ["pytest", "pytz", "simplejson"],
"lint": [
- "mypy==0.971",
- "flake8==5.0.4",
- "flake8-bugbear==22.9.11",
+ "mypy==0.991",
+ "flake8==6.0.0",
+ "flake8-bugbear==23.1.17",
"pre-commit~=2.4",
],
"docs": [
- "sphinx==5.1.1",
+ "sphinx==6.1.3",
"sphinx-issues==3.0.1",
- "alabaster==0.7.12",
+ "alabaster==0.7.13",
"sphinx-version-warning==1.1.2",
- "autodocsumm==0.2.9",
+ "autodocsumm==0.2.10",
],
}
EXTRAS_REQUIRE["dev"] = EXTRAS_REQUIRE["tests"] + EXTRAS_REQUIRE["lint"] + ["tox"]
@@ -83,6 +83,7 @@ setup(
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
+ "Programming Language :: Python :: 3.11",
],
test_suite="tests",
project_urls={
diff --git a/src/marshmallow.egg-info/PKG-INFO b/src/marshmallow.egg-info/PKG-INFO
new file mode 100644
index 0000000..1d214dd
--- /dev/null
+++ b/src/marshmallow.egg-info/PKG-INFO
@@ -0,0 +1,191 @@
+Metadata-Version: 2.1
+Name: marshmallow
+Version: 3.19.0
+Summary: A lightweight library for converting complex datatypes to and from native Python datatypes.
+Home-page: https://github.com/marshmallow-code/marshmallow
+Author: Steven Loria
+Author-email: sloria1@gmail.com
+License: MIT
+Project-URL: Changelog, https://marshmallow.readthedocs.io/en/latest/changelog.html
+Project-URL: Issues, https://github.com/marshmallow-code/marshmallow/issues
+Project-URL: Funding, https://opencollective.com/marshmallow
+Project-URL: Tidelift, https://tidelift.com/subscription/pkg/pypi-marshmallow?utm_source=pypi-marshmallow&utm_medium=pypi
+Keywords: serialization,rest,json,api,marshal,marshalling,deserialization,validation,schema
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
+Classifier: Programming Language :: Python :: 3.11
+Requires-Python: >=3.7
+Provides-Extra: dev
+Provides-Extra: docs
+Provides-Extra: lint
+Provides-Extra: tests
+License-File: LICENSE
+
+********************************************
+marshmallow: simplified object serialization
+********************************************
+
+.. image:: https://badgen.net/pypi/v/marshmallow
+ :target: https://pypi.org/project/marshmallow/
+ :alt: Latest version
+
+.. image:: https://dev.azure.com/sloria/sloria/_apis/build/status/marshmallow-code.marshmallow?branchName=dev
+ :target: https://dev.azure.com/sloria/sloria/_build/latest?definitionId=5&branchName=dev
+ :alt: Build status
+
+.. image:: https://readthedocs.org/projects/marshmallow/badge/
+ :target: https://marshmallow.readthedocs.io/
+ :alt: Documentation
+
+.. image:: https://badgen.net/badge/code%20style/black/000
+ :target: https://github.com/ambv/black
+ :alt: code style: black
+
+
+**marshmallow** is an ORM/ODM/framework-agnostic library for converting complex datatypes, such as objects, to and from native Python datatypes.
+
+.. code-block:: python
+
+ from datetime import date
+ from pprint import pprint
+
+ from marshmallow import Schema, fields
+
+
+ class ArtistSchema(Schema):
+ name = fields.Str()
+
+
+ class AlbumSchema(Schema):
+ title = fields.Str()
+ release_date = fields.Date()
+ artist = fields.Nested(ArtistSchema())
+
+
+ bowie = dict(name="David Bowie")
+ album = dict(artist=bowie, title="Hunky Dory", release_date=date(1971, 12, 17))
+
+ schema = AlbumSchema()
+ result = schema.dump(album)
+ pprint(result, indent=2)
+ # { 'artist': {'name': 'David Bowie'},
+ # 'release_date': '1971-12-17',
+ # 'title': 'Hunky Dory'}
+
+
+In short, marshmallow schemas can be used to:
+
+- **Validate** input data.
+- **Deserialize** input data to app-level objects.
+- **Serialize** app-level objects to primitive Python types. The serialized objects can then be rendered to standard formats such as JSON for use in an HTTP API.
+
+Get It Now
+==========
+
+::
+
+ $ pip install -U marshmallow
+
+
+Documentation
+=============
+
+Full documentation is available at https://marshmallow.readthedocs.io/ .
+
+Requirements
+============
+
+- Python >= 3.7
+
+Ecosystem
+=========
+
+A list of marshmallow-related libraries can be found at the GitHub wiki here:
+
+https://github.com/marshmallow-code/marshmallow/wiki/Ecosystem
+
+Credits
+=======
+
+Contributors
+------------
+
+This project exists thanks to all the people who contribute.
+
+**You're highly encouraged to participate in marshmallow's development.**
+Check out the `Contributing Guidelines <https://marshmallow.readthedocs.io/en/latest/contributing.html>`_ to see how you can help.
+
+Thank you to all who have already contributed to marshmallow!
+
+.. image:: https://opencollective.com/marshmallow/contributors.svg?width=890&button=false
+ :target: https://marshmallow.readthedocs.io/en/latest/authors.html
+ :alt: Contributors
+
+Backers
+-------
+
+If you find marshmallow useful, please consider supporting the team with
+a donation. Your donation helps move marshmallow forward.
+
+Thank you to all our backers! [`Become a backer`_]
+
+.. _`Become a backer`: https://opencollective.com/marshmallow#backer
+
+.. image:: https://opencollective.com/marshmallow/backers.svg?width=890
+ :target: https://opencollective.com/marshmallow#backers
+ :alt: Backers
+
+Sponsors
+--------
+
+Support this project by becoming a sponsor (or ask your company to support this project by becoming a sponsor).
+Your logo will show up here with a link to your website. [`Become a sponsor`_]
+
+.. _`Become a sponsor`: https://opencollective.com/marshmallow#sponsor
+
+.. image:: https://opencollective.com/marshmallow/sponsor/0/avatar.svg
+ :target: https://opencollective.com/marshmallow/sponsor/0/website
+ :alt: Sponsors
+
+.. image:: https://opencollective.com/static/images/become_sponsor.svg
+ :target: https://opencollective.com/marshmallow#sponsor
+ :alt: Become a sponsor
+
+
+Professional Support
+====================
+
+Professionally-supported marshmallow is now available through the
+`Tidelift Subscription <https://tidelift.com/subscription/pkg/pypi-marshmallow?utm_source=pypi-marshmallow&utm_medium=readme>`_.
+
+Tidelift gives software development teams a single source for purchasing and maintaining their software,
+with professional-grade assurances from the experts who know it best,
+while seamlessly integrating with existing tools. [`Get professional support`_]
+
+.. _`Get professional support`: https://tidelift.com/subscription/pkg/pypi-marshmallow?utm_source=marshmallow&utm_medium=referral&utm_campaign=github
+
+.. image:: https://user-images.githubusercontent.com/2379650/45126032-50b69880-b13f-11e8-9c2c-abd16c433495.png
+ :target: https://tidelift.com/subscription/pkg/pypi-marshmallow?utm_source=pypi-marshmallow&utm_medium=readme
+ :alt: Get supported marshmallow with Tidelift
+
+
+Project Links
+=============
+
+- Docs: https://marshmallow.readthedocs.io/
+- Changelog: https://marshmallow.readthedocs.io/en/latest/changelog.html
+- Contributing Guidelines: https://marshmallow.readthedocs.io/en/latest/contributing.html
+- PyPI: https://pypi.python.org/pypi/marshmallow
+- Issues: https://github.com/marshmallow-code/marshmallow/issues
+- Donate: https://opencollective.com/marshmallow
+
+License
+=======
+
+MIT licensed. See the bundled `LICENSE <https://github.com/marshmallow-code/marshmallow/blob/dev/LICENSE>`_ file for more details.
diff --git a/src/marshmallow.egg-info/SOURCES.txt b/src/marshmallow.egg-info/SOURCES.txt
new file mode 100644
index 0000000..42c6108
--- /dev/null
+++ b/src/marshmallow.egg-info/SOURCES.txt
@@ -0,0 +1,85 @@
+AUTHORS.rst
+CHANGELOG.rst
+CONTRIBUTING.rst
+LICENSE
+MANIFEST.in
+NOTICE
+README.rst
+pyproject.toml
+setup.cfg
+setup.py
+docs/.gitignore
+docs/about.rst.inc
+docs/api_reference.rst
+docs/authors.rst
+docs/changelog.rst
+docs/code_of_conduct.rst
+docs/conf.py
+docs/contributing.rst
+docs/custom_fields.rst
+docs/dashing.json
+docs/ecosystem.rst
+docs/examples.rst
+docs/extending.rst
+docs/index.rst
+docs/install.rst
+docs/kudos.rst
+docs/license.rst
+docs/marshmallow.class_registry.rst
+docs/marshmallow.decorators.rst
+docs/marshmallow.error_store.rst
+docs/marshmallow.exceptions.rst
+docs/marshmallow.fields.rst
+docs/marshmallow.schema.rst
+docs/marshmallow.utils.rst
+docs/marshmallow.validate.rst
+docs/nesting.rst
+docs/quickstart.rst
+docs/upgrading.rst
+docs/whos_using.rst
+docs/why.rst
+docs/_static/marshmallow-logo.png
+docs/_static/css/versionwarning.css
+docs/_templates/donate.html
+docs/_templates/useful-links.html
+examples/flask_example.py
+examples/inflection_example.py
+examples/package_json_example.py
+examples/peewee_example.py
+examples/textblob_example.py
+src/marshmallow/__init__.py
+src/marshmallow/base.py
+src/marshmallow/class_registry.py
+src/marshmallow/decorators.py
+src/marshmallow/error_store.py
+src/marshmallow/exceptions.py
+src/marshmallow/fields.py
+src/marshmallow/orderedset.py
+src/marshmallow/py.typed
+src/marshmallow/schema.py
+src/marshmallow/types.py
+src/marshmallow/utils.py
+src/marshmallow/validate.py
+src/marshmallow/warnings.py
+src/marshmallow.egg-info/PKG-INFO
+src/marshmallow.egg-info/SOURCES.txt
+src/marshmallow.egg-info/dependency_links.txt
+src/marshmallow.egg-info/not-zip-safe
+src/marshmallow.egg-info/requires.txt
+src/marshmallow.egg-info/top_level.txt
+tests/__init__.py
+tests/base.py
+tests/conftest.py
+tests/foo_serializer.py
+tests/test_decorators.py
+tests/test_deserialization.py
+tests/test_error_store.py
+tests/test_exceptions.py
+tests/test_fields.py
+tests/test_options.py
+tests/test_registry.py
+tests/test_schema.py
+tests/test_serialization.py
+tests/test_utils.py
+tests/test_validate.py
+tests/mypy_test_cases/test_validation_error.py
\ No newline at end of file
diff --git a/src/marshmallow.egg-info/dependency_links.txt b/src/marshmallow.egg-info/dependency_links.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/src/marshmallow.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/src/marshmallow.egg-info/not-zip-safe b/src/marshmallow.egg-info/not-zip-safe
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/src/marshmallow.egg-info/not-zip-safe
@@ -0,0 +1 @@
+
diff --git a/src/marshmallow.egg-info/requires.txt b/src/marshmallow.egg-info/requires.txt
new file mode 100644
index 0000000..ca0e318
--- /dev/null
+++ b/src/marshmallow.egg-info/requires.txt
@@ -0,0 +1,29 @@
+packaging>=17.0
+
+[dev]
+flake8-bugbear==23.1.17
+flake8==6.0.0
+mypy==0.991
+pre-commit~=2.4
+pytest
+pytz
+simplejson
+tox
+
+[docs]
+alabaster==0.7.13
+autodocsumm==0.2.10
+sphinx-issues==3.0.1
+sphinx-version-warning==1.1.2
+sphinx==6.1.3
+
+[lint]
+flake8-bugbear==23.1.17
+flake8==6.0.0
+mypy==0.991
+pre-commit~=2.4
+
+[tests]
+pytest
+pytz
+simplejson
diff --git a/src/marshmallow.egg-info/top_level.txt b/src/marshmallow.egg-info/top_level.txt
new file mode 100644
index 0000000..85efe39
--- /dev/null
+++ b/src/marshmallow.egg-info/top_level.txt
@@ -0,0 +1 @@
+marshmallow
diff --git a/src/marshmallow/__init__.py b/src/marshmallow/__init__.py
index 6ff7589..3ec24fe 100644
--- a/src/marshmallow/__init__.py
+++ b/src/marshmallow/__init__.py
@@ -16,7 +16,7 @@ from marshmallow.utils import EXCLUDE, INCLUDE, RAISE, missing, pprint
from . import fields
-__version__ = "3.18.0"
+__version__ = "3.19.0"
__parsed_version__ = Version(__version__)
__version_info__: tuple[int, int, int] | tuple[
int, int, int, str, int
diff --git a/src/marshmallow/decorators.py b/src/marshmallow/decorators.py
index c71038d..bb96b87 100644
--- a/src/marshmallow/decorators.py
+++ b/src/marshmallow/decorators.py
@@ -61,7 +61,7 @@ Example: ::
from __future__ import annotations
import functools
-from typing import Any, Callable, Dict, Optional, Tuple, Union, cast
+from typing import Any, Callable, cast
PRE_DUMP = "pre_dump"
POST_DUMP = "post_dump"
@@ -72,9 +72,7 @@ VALIDATES_SCHEMA = "validates_schema"
class MarshmallowHook:
- __marshmallow_hook__ = (
- None
- ) # type: Optional[Dict[Union[Tuple[str, bool], str], Any]]
+ __marshmallow_hook__: dict[tuple[str, bool] | str, Any] | None = None
def validates(field_name: str) -> Callable[..., Any]:
diff --git a/src/marshmallow/fields.py b/src/marshmallow/fields.py
index f153b5f..386aa7c 100644
--- a/src/marshmallow/fields.py
+++ b/src/marshmallow/fields.py
@@ -157,9 +157,9 @@ class Field(FieldABC):
default: typing.Any = missing_,
data_key: str | None = None,
attribute: str | None = None,
- validate: None
- | (
- typing.Callable[[typing.Any], typing.Any]
+ validate: (
+ None
+ | typing.Callable[[typing.Any], typing.Any]
| typing.Iterable[typing.Callable[[typing.Any], typing.Any]]
) = None,
required: bool = False,
@@ -1218,11 +1218,14 @@ class DateTime(Field):
Example: ``'2014-12-22T03:12:58.019077+00:00'``
:param format: Either ``"rfc"`` (for RFC822), ``"iso"`` (for ISO8601),
- or a date format string. If `None`, defaults to "iso".
+ ``"timestamp"``, ``"timestamp_ms"`` (for a POSIX timestamp) or a date format string.
+ If `None`, defaults to "iso".
:param kwargs: The same keyword arguments that :class:`Field` receives.
.. versionchanged:: 3.0.0rc9
Does not modify timezone information on (de)serialization.
+ .. versionchanged:: 3.19
+ Add timestamp as a format.
"""
SERIALIZATION_FUNCS = {
@@ -1230,13 +1233,17 @@ class DateTime(Field):
"iso8601": utils.isoformat,
"rfc": utils.rfcformat,
"rfc822": utils.rfcformat,
- } # type: typing.Dict[str, typing.Callable[[typing.Any], str]]
+ "timestamp": utils.timestamp,
+ "timestamp_ms": utils.timestamp_ms,
+ } # type: typing.Dict[str, typing.Callable[[typing.Any], str | float]]
DESERIALIZATION_FUNCS = {
"iso": utils.from_iso_datetime,
"iso8601": utils.from_iso_datetime,
"rfc": utils.from_rfc,
"rfc822": utils.from_rfc,
+ "timestamp": utils.from_timestamp,
+ "timestamp_ms": utils.from_timestamp_ms,
} # type: typing.Dict[str, typing.Callable[[str], typing.Any]]
DEFAULT_FORMAT = "iso"
@@ -1252,7 +1259,7 @@ class DateTime(Field):
"format": '"{input}" cannot be formatted as a {obj_type}.',
}
- def __init__(self, format: str | None = None, **kwargs):
+ def __init__(self, format: str | None = None, **kwargs) -> None:
super().__init__(**kwargs)
# Allow this to be None. It may be set later in the ``_serialize``
# or ``_deserialize`` methods. This allows a Schema to dynamically set the
@@ -1267,7 +1274,7 @@ class DateTime(Field):
or self.DEFAULT_FORMAT
)
- def _serialize(self, value, attr, obj, **kwargs):
+ def _serialize(self, value, attr, obj, **kwargs) -> str | float | None:
if value is None:
return None
data_format = self.format or self.DEFAULT_FORMAT
@@ -1277,7 +1284,7 @@ class DateTime(Field):
else:
return value.strftime(data_format)
- def _deserialize(self, value, attr, data, **kwargs):
+ def _deserialize(self, value, attr, data, **kwargs) -> dt.datetime:
if not value: # Falsy values, e.g. '', None, [] are not valid
raise self.make_error("invalid", input=value, obj_type=self.OBJ_TYPE)
data_format = self.format or self.DEFAULT_FORMAT
@@ -1298,7 +1305,7 @@ class DateTime(Field):
) from error
@staticmethod
- def _make_object_from_format(value, data_format):
+ def _make_object_from_format(value, data_format) -> dt.datetime:
return dt.datetime.strptime(value, data_format)
@@ -1323,11 +1330,11 @@ class NaiveDateTime(DateTime):
*,
timezone: dt.timezone | None = None,
**kwargs,
- ):
+ ) -> None:
super().__init__(format=format, **kwargs)
self.timezone = timezone
- def _deserialize(self, value, attr, data, **kwargs):
+ def _deserialize(self, value, attr, data, **kwargs) -> dt.datetime:
ret = super()._deserialize(value, attr, data, **kwargs)
if is_aware(ret):
if self.timezone is None:
@@ -1360,11 +1367,11 @@ class AwareDateTime(DateTime):
*,
default_timezone: dt.tzinfo | None = None,
**kwargs,
- ):
+ ) -> None:
super().__init__(format=format, **kwargs)
self.default_timezone = default_timezone
- def _deserialize(self, value, attr, data, **kwargs):
+ def _deserialize(self, value, attr, data, **kwargs) -> dt.datetime:
ret = super()._deserialize(value, attr, data, **kwargs)
if not is_aware(ret):
if self.default_timezone is None:
@@ -2017,14 +2024,14 @@ class Function(Field):
def __init__(
self,
- serialize: None
- | (
- typing.Callable[[typing.Any], typing.Any]
+ serialize: (
+ None
+ | typing.Callable[[typing.Any], typing.Any]
| typing.Callable[[typing.Any, dict], typing.Any]
) = None,
- deserialize: None
- | (
- typing.Callable[[typing.Any], typing.Any]
+ deserialize: (
+ None
+ | typing.Callable[[typing.Any], typing.Any]
| typing.Callable[[typing.Any, dict], typing.Any]
) = None,
**kwargs,
diff --git a/src/marshmallow/schema.py b/src/marshmallow/schema.py
index 9215269..b9109a9 100644
--- a/src/marshmallow/schema.py
+++ b/src/marshmallow/schema.py
@@ -658,9 +658,17 @@ class Schema(base.SchemaABC, metaclass=SchemaMeta):
d_kwargs["partial"] = sub_partial
else:
d_kwargs["partial"] = partial
- getter = lambda val: field_obj.deserialize(
- val, field_name, data, **d_kwargs
- )
+
+ def getter(
+ val, field_obj=field_obj, field_name=field_name, d_kwargs=d_kwargs
+ ):
+ return field_obj.deserialize(
+ val,
+ field_name,
+ data,
+ **d_kwargs,
+ )
+
value = self._call_and_store(
getter_func=getter,
data=raw_value,
@@ -1047,15 +1055,15 @@ class Schema(base.SchemaABC, metaclass=SchemaMeta):
# the type checker's perspective.
if isinstance(field_obj, type) and issubclass(field_obj, base.FieldABC):
msg = (
- 'Field for "{}" must be declared as a '
+ 'Field for "{field_name}" must be declared as a '
"Field instance, not a class. "
- 'Did you mean "fields.{}()"?'.format(field_name, field_obj.__name__)
+ 'Did you mean "fields.{field_obj.__name__}()"?'
)
raise TypeError(msg) from error
raise error
self.on_bind_field(field_name, field_obj)
- @lru_cache(maxsize=8)
+ @lru_cache(maxsize=8) # noqa (https://github.com/PyCQA/flake8-bugbear/issues/310)
def _has_processors(self, tag) -> bool:
return bool(self._hooks[(tag, True)] or self._hooks[(tag, False)])
diff --git a/src/marshmallow/utils.py b/src/marshmallow/utils.py
index fd65133..7a16ff6 100644
--- a/src/marshmallow/utils.py
+++ b/src/marshmallow/utils.py
@@ -190,6 +190,34 @@ def from_iso_date(value):
return dt.date(**kw)
+def from_timestamp(value: typing.Any) -> dt.datetime:
+ value = float(value)
+ if value < 0:
+ raise ValueError("Not a valid POSIX timestamp")
+
+ # Load a timestamp with utc as timezone to prevent using system timezone.
+ # Then set timezone to None, to let the Field handle adding timezone info.
+ return dt.datetime.fromtimestamp(value, tz=dt.timezone.utc).replace(tzinfo=None)
+
+
+def from_timestamp_ms(value: typing.Any) -> dt.datetime:
+ value = float(value)
+ return from_timestamp(value / 1000)
+
+
+def timestamp(
+ value: dt.datetime,
+) -> float:
+ if not is_aware(value):
+ # When a date is naive, use UTC as zone info to prevent using system timezone.
+ value = value.replace(tzinfo=dt.timezone.utc)
+ return value.timestamp()
+
+
+def timestamp_ms(value: dt.datetime) -> float:
+ return timestamp(value) * 1000
+
+
def isoformat(datetime: dt.datetime) -> str:
"""Return the ISO8601-formatted representation of a datetime object.
diff --git a/tests/test_deserialization.py b/tests/test_deserialization.py
index c80a258..32aa099 100644
--- a/tests/test_deserialization.py
+++ b/tests/test_deserialization.py
@@ -526,6 +526,50 @@ class TestFieldDeserialization:
else:
assert field.deserialize(value) == expected
+ @pytest.mark.parametrize(
+ ("fmt", "value", "expected"),
+ [
+ ("timestamp", 1384043025, dt.datetime(2013, 11, 10, 0, 23, 45)),
+ ("timestamp", "1384043025", dt.datetime(2013, 11, 10, 0, 23, 45)),
+ ("timestamp", 1384043025, dt.datetime(2013, 11, 10, 0, 23, 45)),
+ ("timestamp", 1384043025.12, dt.datetime(2013, 11, 10, 0, 23, 45, 120000)),
+ (
+ "timestamp",
+ 1384043025.123456,
+ dt.datetime(2013, 11, 10, 0, 23, 45, 123456),
+ ),
+ ("timestamp", 1, dt.datetime(1970, 1, 1, 0, 0, 1)),
+ ("timestamp_ms", 1384043025000, dt.datetime(2013, 11, 10, 0, 23, 45)),
+ ("timestamp_ms", 1000, dt.datetime(1970, 1, 1, 0, 0, 1)),
+ ],
+ )
+ def test_timestamp_field_deserialization(self, fmt, value, expected):
+ field = fields.DateTime(format=fmt)
+ assert field.deserialize(value) == expected
+
+ # By default, a datetime from a timestamp is never aware.
+ field = fields.NaiveDateTime(format=fmt)
+ assert field.deserialize(value) == expected
+
+ field = fields.AwareDateTime(format=fmt)
+ with pytest.raises(ValidationError, match="Not a valid aware datetime."):
+ field.deserialize(value)
+
+ # But it can be added by providing a default.
+ field = fields.AwareDateTime(format=fmt, default_timezone=central)
+ expected_aware = expected.replace(tzinfo=central)
+ assert field.deserialize(value) == expected_aware
+
+ @pytest.mark.parametrize("fmt", ["timestamp", "timestamp_ms"])
+ @pytest.mark.parametrize(
+ "in_value",
+ ["", "!@#", 0, -1, dt.datetime(2013, 11, 10, 1, 23, 45)],
+ )
+ def test_invalid_timestamp_field_deserialization(self, fmt, in_value):
+ field = fields.DateTime(format="timestamp")
+ with pytest.raises(ValidationError, match="Not a valid datetime."):
+ field.deserialize(in_value)
+
@pytest.mark.parametrize(
("fmt", "timezone", "value", "expected"),
[
diff --git a/tests/test_serialization.py b/tests/test_serialization.py
index 51671dd..56f0773 100644
--- a/tests/test_serialization.py
+++ b/tests/test_serialization.py
@@ -579,6 +579,38 @@ class TestFieldSerialization:
field = fields.DateTime(format=fmt)
assert field.serialize("d", {"d": value}) == expected
+ @pytest.mark.parametrize(
+ ("fmt", "value", "expected"),
+ [
+ ("timestamp", dt.datetime(1970, 1, 1), 0),
+ ("timestamp", dt.datetime(2013, 11, 10, 0, 23, 45), 1384043025),
+ (
+ "timestamp",
+ dt.datetime(2013, 11, 10, 0, 23, 45, tzinfo=dt.timezone.utc),
+ 1384043025,
+ ),
+ (
+ "timestamp",
+ central.localize(dt.datetime(2013, 11, 10, 0, 23, 45), is_dst=False),
+ 1384064625,
+ ),
+ ("timestamp_ms", dt.datetime(2013, 11, 10, 0, 23, 45), 1384043025000),
+ (
+ "timestamp_ms",
+ dt.datetime(2013, 11, 10, 0, 23, 45, tzinfo=dt.timezone.utc),
+ 1384043025000,
+ ),
+ (
+ "timestamp_ms",
+ central.localize(dt.datetime(2013, 11, 10, 0, 23, 45), is_dst=False),
+ 1384064625000,
+ ),
+ ],
+ )
+ def test_datetime_field_timestamp(self, fmt, value, expected):
+ field = fields.DateTime(format=fmt)
+ assert field.serialize("d", {"d": value}) == expected
+
@pytest.mark.parametrize("fmt", ["iso", "iso8601", None])
@pytest.mark.parametrize(
("value", "expected"),
diff --git a/tox.ini b/tox.ini
deleted file mode 100644
index af884d9..0000000
--- a/tox.ini
+++ /dev/null
@@ -1,35 +0,0 @@
-[tox]
-envlist = lint,mypy-test,py37,py38,py39,py310,docs
-
-[testenv]
-extras = tests
-commands = pytest {posargs}
-
-[testenv:lint]
-deps = pre-commit~=2.4
-skip_install = true
-commands = pre-commit run --all-files --show-diff-on-failure
-
-[testenv:mypy-test]
-deps = mypy
-commands = mypy --show-error-codes --warn-unused-ignores tests/mypy_test_cases/
-
-[testenv:docs]
-extras = docs
-commands = sphinx-build docs/ docs/_build {posargs}
-
-; Below tasks are for development only (not run in CI)
-
-[testenv:watch-docs]
-deps = sphinx-autobuild
-extras = docs
-commands = sphinx-autobuild --open-browser docs/ docs/_build {posargs} --watch src/marshmallow --delay 2
-
-[testenv:watch-readme]
-deps = restview
-skip_install = true
-commands = restview README.rst
-
-[testenv:benchmark]
-usedevelop = true
-commands = python performance/benchmark.py --iterations=100 --repeat=3
Debdiff
[The following lists of changes regard files as different if they have different names, permissions or owners.]
Files in second set of .debs but not in first
-rw-r--r-- root/root /usr/lib/python3/dist-packages/marshmallow-3.19.0.egg-info/PKG-INFO -rw-r--r-- root/root /usr/lib/python3/dist-packages/marshmallow-3.19.0.egg-info/dependency_links.txt -rw-r--r-- root/root /usr/lib/python3/dist-packages/marshmallow-3.19.0.egg-info/not-zip-safe -rw-r--r-- root/root /usr/lib/python3/dist-packages/marshmallow-3.19.0.egg-info/requires.txt -rw-r--r-- root/root /usr/lib/python3/dist-packages/marshmallow-3.19.0.egg-info/top_level.txt lrwxrwxrwx root/root /usr/share/doc/python3-marshmallow/html/_static/_sphinx_javascript_frameworks_compat.js -> ../../../../javascript/sphinxdoc/1.0/_sphinx_javascript_frameworks_compat.js lrwxrwxrwx root/root /usr/share/doc/python3-marshmallow/html/_static/sphinx_highlight.js -> ../../../../javascript/sphinxdoc/1.0/sphinx_highlight.js
Files in first set of .debs but not in second
-rw-r--r-- root/root /usr/lib/python3/dist-packages/marshmallow-3.18.0.egg-info/PKG-INFO -rw-r--r-- root/root /usr/lib/python3/dist-packages/marshmallow-3.18.0.egg-info/dependency_links.txt -rw-r--r-- root/root /usr/lib/python3/dist-packages/marshmallow-3.18.0.egg-info/not-zip-safe -rw-r--r-- root/root /usr/lib/python3/dist-packages/marshmallow-3.18.0.egg-info/requires.txt -rw-r--r-- root/root /usr/lib/python3/dist-packages/marshmallow-3.18.0.egg-info/top_level.txt
No differences were encountered between the control files of package python3-marshmallow
Control files of package python3-marshmallow-doc: lines which differ (wdiff format)
Depends: libjs-sphinxdoc (>= 4.3), 5.2), libjs-jquery, libjs-underscore