Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-warlock for openSUSE:Factory 
checked in at 2022-10-15 16:38:22
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-warlock (Old)
 and      /work/SRC/openSUSE:Factory/.python-warlock.new.2275 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-warlock"

Sat Oct 15 16:38:22 2022 rev:19 rq:1011101 version:2.0.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-warlock/python-warlock.changes    
2022-05-25 20:35:52.112337015 +0200
+++ /work/SRC/openSUSE:Factory/.python-warlock.new.2275/python-warlock.changes  
2022-10-15 16:40:58.934661639 +0200
@@ -1,0 +2,23 @@
+Fri Oct 14 18:58:16 UTC 2022 - pgaj...@suse.com
+
+- version update to 2.0.1
+  Added
+  * Meta: Locked dependencies via poetry.lock file in version control. #44
+  * Meta: Add pre-commit config to enforce code styling and file formatting. 
#43
+  * Meta: Add tox config for test automation across Python versions. #47
+  * Tests for DeprecationWarnings issued for Model.changes. #46
+  * Cache the validator instance to speedup schema validation process. #55
+  * Support for jsonschema 4.x. #65
+  * Support for Python 3.9, 3.10. #65
+  Fixed
+  * Fixed DeprecationWarnings for using assertEquals in tests. #45
+  Changed
+  * Meta: Replace setuptools with poetry for packaging and dependency 
management. #35
+  * Changed behavior of model_factory back to pre-1.3 call signature. #39
+  * Meta: Switched build backend from poetry to poetry-core. #66
+  Removed
+  * Support for Python 3.4 (EOL). #44
+  * Support for Python 3.5, 3.6 (EOL). #65
+  * Support for Python 2.7 (EOL by 2019-01-01). #48
+
+-------------------------------------------------------------------

Old:
----
  warlock-1.3.3.tar.gz

New:
----
  warlock-2.0.1.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-warlock.spec ++++++
--- /var/tmp/diff_new_pack.Ht0GwF/_old  2022-10-15 16:40:59.434662840 +0200
+++ /var/tmp/diff_new_pack.Ht0GwF/_new  2022-10-15 16:40:59.434662840 +0200
@@ -18,7 +18,7 @@
 
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
 Name:           python-warlock
-Version:        1.3.3
+Version:        2.0.1
 Release:        0
 Summary:        Python object model built on top of JSON schema
 License:        Apache-2.0
@@ -27,14 +27,14 @@
 Source:         
https://github.com/bcwaldon/warlock/archive/%{version}.tar.gz#/warlock-%{version}.tar.gz
 BuildRequires:  %{python_module jsonpatch >= 0.7}
 BuildRequires:  %{python_module jsonschema >= 0.10}
+BuildRequires:  %{python_module pip}
+BuildRequires:  %{python_module poetry}
 BuildRequires:  %{python_module pytest}
 BuildRequires:  %{python_module setuptools}
-BuildRequires:  %{python_module six}
 BuildRequires:  fdupes
 BuildRequires:  python-rpm-macros
 Requires:       python-jsonpatch >= 0.7
 Requires:       python-jsonschema >= 0.10
-Requires:       python-six
 BuildArch:      noarch
 %python_subpackages
 
@@ -46,15 +46,14 @@
 rm pytest.ini
 
 %build
-%python_build
+%pyproject_wheel
 
 %install
-%python_install
+%pyproject_install
 %python_expand %fdupes %{buildroot}%{$python_sitelib}
 
 %check
-# Skipped because of gh#bcwaldon/warlock#64 (the package is incompatible with 
jsonschema < 4)
-%pytest -k 'not test_recursive_models'
+%pytest
 
 %files %{python_files}
 %doc README.md

++++++ warlock-1.3.3.tar.gz -> warlock-2.0.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/warlock-1.3.3/.coveragerc 
new/warlock-2.0.1/.coveragerc
--- old/warlock-1.3.3/.coveragerc       2019-05-20 12:07:50.000000000 +0200
+++ new/warlock-2.0.1/.coveragerc       2022-06-17 14:53:49.000000000 +0200
@@ -16,4 +16,4 @@
     raise NotImplementedError
 
     # Don't complain if non-runnable code isn't run:
-    if __name__ == .__main__.:
\ No newline at end of file
+    if __name__ == .__main__.:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/warlock-1.3.3/.flake8 new/warlock-2.0.1/.flake8
--- old/warlock-1.3.3/.flake8   2019-05-20 12:07:50.000000000 +0200
+++ new/warlock-2.0.1/.flake8   2022-06-17 14:53:49.000000000 +0200
@@ -6,4 +6,4 @@
     __pycache__
     locale/
     htmlcov/
-max-complexity = 10
\ No newline at end of file
+max-complexity = 10
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/warlock-1.3.3/.github/workflows/ci.yaml 
new/warlock-2.0.1/.github/workflows/ci.yaml
--- old/warlock-1.3.3/.github/workflows/ci.yaml 1970-01-01 01:00:00.000000000 
+0100
+++ new/warlock-2.0.1/.github/workflows/ci.yaml 2022-06-17 14:53:49.000000000 
+0200
@@ -0,0 +1,47 @@
+---
+name: CI
+on:
+  - push
+  - pull_request
+jobs:
+  test:
+    name: Run unit tests
+    runs-on: ubuntu-latest
+    strategy:
+      matrix:
+        python: ['3.7', '3.8', '3.9', '3.10']
+    steps:
+      - name: Checkout source code
+        uses: actions/checkout@v2
+      - name: Set up Python ${{ matrix.python }}
+        uses: actions/setup-python@v2
+        with:
+          python-version: ${{ matrix.python }}
+      - name: Install dependencies
+        run: python -m pip install tox
+      - name: Run unit tests (via tox)
+        # Run tox using the version of Python in `PATH`
+        run: tox -e py
+  release:
+    name: Upload release artifacts
+    runs-on: ubuntu-latest
+    needs: test
+    if: github.event_name == 'push'
+    steps:
+      - name: Checkout source code
+        uses: actions/checkout@v2
+        with:
+          fetch-depth: 0
+      - name: Set up Python
+        uses: actions/setup-python@v2
+        with:
+          python-version: '3.10'
+      - name: Install dependencies
+        run: python -m pip install build
+      - name: Build a binary wheel and a source tarball
+        run: python -m build --sdist --wheel --outdir dist/ .
+      - name: Publish distribution to PyPI
+        if: startsWith(github.ref, 'refs/tags')
+        uses: pypa/gh-action-pypi-publish@master
+        with:
+          password: ${{ secrets.PYPI_API_TOKEN }}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/warlock-1.3.3/.gitignore new/warlock-2.0.1/.gitignore
--- old/warlock-1.3.3/.gitignore        2019-05-20 12:07:50.000000000 +0200
+++ new/warlock-2.0.1/.gitignore        2022-06-17 14:53:49.000000000 +0200
@@ -9,4 +9,4 @@
 .pytest_cache/
 .python-version
 htmlcov/
-.vscode/
\ No newline at end of file
+.vscode/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/warlock-1.3.3/.pre-commit-config.yaml 
new/warlock-2.0.1/.pre-commit-config.yaml
--- old/warlock-1.3.3/.pre-commit-config.yaml   1970-01-01 01:00:00.000000000 
+0100
+++ new/warlock-2.0.1/.pre-commit-config.yaml   2022-06-17 14:53:49.000000000 
+0200
@@ -0,0 +1,45 @@
+default_language_version:
+  python: python3.7
+
+repos:
+  - repo: https://github.com/pre-commit/pre-commit-hooks
+    rev: "v2.4.0"
+    hooks:
+      # General file-formatting
+      - id: trailing-whitespace
+        args: [--markdown-linebreak-ext=md]
+      - id: end-of-file-fixer
+      - id: check-json
+      - id: check-toml
+
+      # Python-related
+      - id: debug-statements
+      - id: name-tests-test
+        args: ["--django"] # Required to match on test*.py
+
+      # Git-related
+      - id: check-merge-conflict
+
+  - repo: https://gitlab.com/pycqa/flake8
+    rev: "3.7.9"
+    hooks:
+      - id: flake8
+        additional_dependencies:
+          - flake8-bugbear # Finds common application design anti-patterns
+
+  - repo: https://github.com/pre-commit/pygrep-hooks
+    rev: "v1.4.2"
+    hooks:
+      - id: python-check-blanket-noqa
+
+  - repo: https://github.com/pre-commit/mirrors-isort
+    rev: "v4.3.21"
+    hooks:
+      - id: isort
+        additional_dependencies:
+          - toml # Required for loading config from pyproject.toml
+
+  - repo: https://github.com/ambv/black
+    rev: "19.10b0"
+    hooks:
+      - id: black
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/warlock-1.3.3/.travis.yml 
new/warlock-2.0.1/.travis.yml
--- old/warlock-1.3.3/.travis.yml       2019-05-20 12:07:50.000000000 +0200
+++ new/warlock-2.0.1/.travis.yml       1970-01-01 01:00:00.000000000 +0100
@@ -1,41 +0,0 @@
-dist: xenial
-language: python
-python: 3.7
-cache: pip
-
-env:
-- TEST_CMD="pytest"
-
-install:
-  - pip install pytest pytest-cov
-  - if [[ $TRAVIS_PYTHON_VERSION == 3.7 ]] && [[ "$TEST_CMD" == pytest* ]]; 
then
-      pip install pytest pytest-cov coveralls; fi
-  - if [[ $TEST_CMD == black* ]]; then pip install black; fi
-  - if [[ $TEST_CMD == flake8* ]]; then pip install flake8 flake8-bugbear 
flake8-todo; fi
-
-script:
-- python setup.py develop
-- $TEST_CMD
-
-after_success:
- - if [[ $TRAVIS_PYTHON_VERSION == 3.7 ]] && [[ "$TEST_CMD" == pytest* ]];
-     then coveralls; fi
-
-matrix:
-  include:
-    - name: "black"
-      env:
-        - TEST_CMD="black --check --verbose ."
-    - name: "flake8"
-      env:
-        - TEST_CMD="flake8 warlock"
-    - name: "pytest-py2.7"
-      python: 2.7
-    - name: "pytest-py3.4"
-      python: 3.4
-    - name: "pytest-py3.5"
-      python: 3.5
-    - name: "pytest-py3.6"
-      python: 3.6
-    - name: "pytest-py3.7"
-      python: 3.7
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/warlock-1.3.3/CHANGELOG.md 
new/warlock-2.0.1/CHANGELOG.md
--- old/warlock-1.3.3/CHANGELOG.md      2019-05-20 12:07:50.000000000 +0200
+++ new/warlock-2.0.1/CHANGELOG.md      2022-06-17 14:53:49.000000000 +0200
@@ -6,6 +6,32 @@
 
 ## [Unreleased]
 
+## [2.0.1] - 2022-06-17
+### Changed
+- Meta: Switched build backend from poetry to poetry-core. #66
+
+## [2.0.0] - 2022-06-16
+### Added
+- Meta: Locked dependencies via `poetry.lock` file in version control. #44
+- Meta: Add [pre-commit](https://pre-commit.com) config to enforce code 
styling and file formatting. #43
+- Meta: Add [tox](https://tox.readthedocs.io/en/latest/index.html) config for 
test automation across Python versions. #47
+- Tests for DeprecationWarnings issued for `Model.changes`. #46
+- Cache the validator instance to speedup schema validation process. #55
+- Support for jsonschema 4.x. #65
+- Support for Python 3.9, 3.10. #65
+
+### Fixed
+- Fixed DeprecationWarnings for using `assertEquals` in tests. #45
+
+### Changed
+- Meta: Replace setuptools with poetry for packaging and dependency 
management. #35
+- Changed behavior of `model_factory` back to pre-1.3 call signature. #39
+
+### Removed
+- Support for Python 3.4 (EOL). #44
+- Support for Python 3.5, 3.6 (EOL). #65
+- Support for Python 2.7 (EOL by 2019-01-01). #48
+
 ## [1.3.3] - 2019-05-20
 ### Fixed
 - setup.py failing for Python 2.7. #41
@@ -50,7 +76,9 @@
 ## [0.8.0] - 2013-01-21
 
 ## [0.7.0] - 2012-11-26
-[Unreleased]: https://github.com/bcwaldon/warlock/compare/v1.3.3...HEAD
+
+[Unreleased]: https://github.com/bcwaldon/warlock/compare/v2.0.0...HEAD
+[2.0.0]: https://github.com/bcwaldon/warlock/compare/v1.3.3...v2.0.0
 [1.3.3]: https://github.com/bcwaldon/warlock/compare/v1.3.2...v1.3.3
 [1.3.2]: https://github.com/bcwaldon/warlock/compare/v1.3.1...v1.3.2
 [1.3.1]: https://github.com/bcwaldon/warlock/compare/v1.3.0...v1.3.1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/warlock-1.3.3/CONTRIBUTING.md 
new/warlock-2.0.1/CONTRIBUTING.md
--- old/warlock-1.3.3/CONTRIBUTING.md   2019-05-20 12:07:50.000000000 +0200
+++ new/warlock-2.0.1/CONTRIBUTING.md   2022-06-17 14:53:49.000000000 +0200
@@ -3,5 +3,5 @@
 Pull Requests are greatly welcome from everyone! Please make sure to fulfill 
the following criteria when proposing changes to Warlock:
 
 - Write unit tests, and run them through pytest; test coverage must not 
decrease
-- Make sure to support Python 2.7 -- 3.7; Travis CI will check all non-EOL 
version of Python
+- Make sure to test against different Python versions; CI will check all 
non-EOL version of Python
 - Run flake8 without warnings; including flake8-bugbear plugin
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/warlock-1.3.3/MANIFEST.in 
new/warlock-2.0.1/MANIFEST.in
--- old/warlock-1.3.3/MANIFEST.in       2019-05-20 12:07:50.000000000 +0200
+++ new/warlock-2.0.1/MANIFEST.in       1970-01-01 01:00:00.000000000 +0100
@@ -1,4 +0,0 @@
-include LICENSE
-include README.md
-include requirements.txt
-include setup.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/warlock-1.3.3/README.md new/warlock-2.0.1/README.md
--- old/warlock-1.3.3/README.md 2019-05-20 12:07:50.000000000 +0200
+++ new/warlock-2.0.1/README.md 2022-06-17 14:53:49.000000000 +0200
@@ -1,11 +1,17 @@
-# Warlock ??? self-validating Python objects using JSON schema
+# Warlock ?????????????
+
+**Create self-validating Python objects using JSON schema.**
 
 [![PyPI](https://img.shields.io/pypi/v/warlock.svg)][warlock]
 [![PyPI - Python 
Version](https://img.shields.io/pypi/pyversions/warlock.svg)][warlock]
 [![PyPI - Downloads](https://img.shields.io/pypi/dw/warlock.svg)][pypistats]
 
-[![Build 
Status](https://travis-ci.org/bcwaldon/warlock.svg?branch=master)][ci-builds]
+[![Build 
Status](https://github.com/bcwaldon/warlock/actions/workflows/ci.yaml/badge.svg)][ci-builds]
 [![Coverage 
Status](https://coveralls.io/repos/github/bcwaldon/warlock/badge.svg?branch=master)][coveralls]
+![GitHub commits since latest release 
(branch)](https://img.shields.io/github/commits-since/bcwaldon/warlock/latest/master.svg)
+
+[![Package management: 
poetry](https://img.shields.io/badge/deps-poetry-blueviolet.svg)][poetry]
+[![Code Style 
Black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black/)
 
 ## Installation
 
@@ -72,6 +78,7 @@
 
 [warlock]: https://pypi.org/project/warlock/
 [pip]: https://pip.pypa.io/en/stable/
-[ci-builds]: https://travis-ci.org/bcwaldon/warlock
+[ci-builds]: https://github.com/bcwaldon/warlock/actions/workflows/ci.yaml
 [coveralls]: https://coveralls.io/github/bcwaldon/warlock?branch=master
+[poetry]: https://poetry.eustace.io/docs/
 [pypistats]: https://pypistats.org/packages/warlock
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/warlock-1.3.3/poetry.lock 
new/warlock-2.0.1/poetry.lock
--- old/warlock-1.3.3/poetry.lock       1970-01-01 01:00:00.000000000 +0100
+++ new/warlock-2.0.1/poetry.lock       2022-06-17 14:53:49.000000000 +0200
@@ -0,0 +1,396 @@
+[[package]]
+name = "atomicwrites"
+version = "1.4.0"
+description = "Atomic file writes."
+category = "dev"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+
+[[package]]
+name = "attrs"
+version = "21.4.0"
+description = "Classes Without Boilerplate"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[package.extras]
+dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest 
(>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", 
"sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"]
+docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"]
+tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest 
(>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", 
"cloudpickle"]
+tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest 
(>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"]
+
+[[package]]
+name = "colorama"
+version = "0.4.5"
+description = "Cross-platform colored terminal text."
+category = "dev"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[[package]]
+name = "coverage"
+version = "6.4.1"
+description = "Code coverage measurement for Python"
+category = "dev"
+optional = false
+python-versions = ">=3.7"
+
+[package.dependencies]
+tomli = {version = "*", optional = true, markers = "python_full_version <= 
\"3.11.0a6\" and extra == \"toml\""}
+
+[package.extras]
+toml = ["tomli"]
+
+[[package]]
+name = "importlib-metadata"
+version = "4.11.4"
+description = "Read metadata from Python packages"
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[package.dependencies]
+typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""}
+zipp = ">=0.5"
+
+[package.extras]
+docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"]
+perf = ["ipython"]
+testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", 
"pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pyfakefs", 
"flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy 
(>=0.9.1)", "importlib-resources (>=1.3)"]
+
+[[package]]
+name = "importlib-resources"
+version = "5.8.0"
+description = "Read resources from Python packages"
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[package.dependencies]
+zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""}
+
+[package.extras]
+docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"]
+testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", 
"pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-black (>=0.3.7)", 
"pytest-mypy (>=0.9.1)"]
+
+[[package]]
+name = "iniconfig"
+version = "1.1.1"
+description = "iniconfig: brain-dead simple config-ini parsing"
+category = "dev"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "jsonpatch"
+version = "1.32"
+description = "Apply JSON-Patches (RFC 6902)"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[package.dependencies]
+jsonpointer = ">=1.9"
+
+[[package]]
+name = "jsonpointer"
+version = "2.3"
+description = "Identify specific nodes in a JSON document (RFC 6901)"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+
+[[package]]
+name = "jsonschema"
+version = "4.6.0"
+description = "An implementation of JSON Schema validation for Python"
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[package.dependencies]
+attrs = ">=17.4.0"
+importlib-metadata = {version = "*", markers = "python_version < \"3.8\""}
+importlib-resources = {version = ">=1.4.0", markers = "python_version < 
\"3.9\""}
+pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || 
>0.17.2"
+typing-extensions = {version = "*", markers = "python_version < \"3.8\""}
+
+[package.extras]
+format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", 
"rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"]
+format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", 
"rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors 
(>=1.11)"]
+
+[[package]]
+name = "packaging"
+version = "21.3"
+description = "Core utilities for Python packages"
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+pyparsing = ">=2.0.2,<3.0.5 || >3.0.5"
+
+[[package]]
+name = "pluggy"
+version = "1.0.0"
+description = "plugin and hook calling mechanisms for python"
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
+
+[package.extras]
+dev = ["pre-commit", "tox"]
+testing = ["pytest", "pytest-benchmark"]
+
+[[package]]
+name = "py"
+version = "1.11.0"
+description = "library with cross-python path, ini-parsing, io, code, log 
facilities"
+category = "dev"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[[package]]
+name = "pyparsing"
+version = "3.0.9"
+description = "pyparsing module - Classes and methods to define and execute 
parsing grammars"
+category = "dev"
+optional = false
+python-versions = ">=3.6.8"
+
+[package.extras]
+diagrams = ["railroad-diagrams", "jinja2"]
+
+[[package]]
+name = "pyrsistent"
+version = "0.18.1"
+description = "Persistent/Functional/Immutable data structures"
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[[package]]
+name = "pytest"
+version = "6.2.5"
+description = "pytest: simple powerful testing with Python"
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""}
+attrs = ">=19.2.0"
+colorama = {version = "*", markers = "sys_platform == \"win32\""}
+importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
+iniconfig = "*"
+packaging = "*"
+pluggy = ">=0.12,<2.0"
+py = ">=1.8.2"
+toml = "*"
+
+[package.extras]
+testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", 
"xmlschema"]
+
+[[package]]
+name = "pytest-cov"
+version = "3.0.0"
+description = "Pytest plugin for measuring coverage."
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+coverage = {version = ">=5.2.1", extras = ["toml"]}
+pytest = ">=4.6"
+
+[package.extras]
+testing = ["fields", "hunter", "process-tests", "six", "pytest-xdist", 
"virtualenv"]
+
+[[package]]
+name = "toml"
+version = "0.10.2"
+description = "Python Library for Tom's Obvious, Minimal Language"
+category = "dev"
+optional = false
+python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
+
+[[package]]
+name = "tomli"
+version = "2.0.1"
+description = "A lil' TOML parser"
+category = "dev"
+optional = false
+python-versions = ">=3.7"
+
+[[package]]
+name = "typing-extensions"
+version = "4.2.0"
+description = "Backported and Experimental Type Hints for Python 3.7+"
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[[package]]
+name = "zipp"
+version = "3.8.0"
+description = "Backport of pathlib-compatible object wrapper for zip files"
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[package.extras]
+docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"]
+testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", 
"pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", 
"pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"]
+
+[metadata]
+lock-version = "1.1"
+python-versions = "^3.7"
+content-hash = 
"522d884f572779dc37518150b5451de574501979fdbf7f0f58ba6da21ac0f0e1"
+
+[metadata.files]
+atomicwrites = [
+    {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = 
"sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"},
+    {file = "atomicwrites-1.4.0.tar.gz", hash = 
"sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"},
+]
+attrs = [
+    {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = 
"sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"},
+    {file = "attrs-21.4.0.tar.gz", hash = 
"sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"},
+]
+colorama = [
+    {file = "colorama-0.4.5-py2.py3-none-any.whl", hash = 
"sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"},
+    {file = "colorama-0.4.5.tar.gz", hash = 
"sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"},
+]
+coverage = [
+    {file = "coverage-6.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = 
"sha256:f1d5aa2703e1dab4ae6cf416eb0095304f49d004c39e9db1d86f57924f43006b"},
+    {file = "coverage-6.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = 
"sha256:4ce1b258493cbf8aec43e9b50d89982346b98e9ffdfaae8ae5793bc112fb0068"},
+    {file = 
"coverage-6.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", 
hash = 
"sha256:83c4e737f60c6936460c5be330d296dd5b48b3963f48634c53b3f7deb0f34ec4"},
+    {file = 
"coverage-6.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
 hash = 
"sha256:84e65ef149028516c6d64461b95a8dbcfce95cfd5b9eb634320596173332ea84"},
+    {file = 
"coverage-6.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
 hash = 
"sha256:f69718750eaae75efe506406c490d6fc5a6161d047206cc63ce25527e8a3adad"},
+    {file = "coverage-6.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = 
"sha256:e57816f8ffe46b1df8f12e1b348f06d164fd5219beba7d9433ba79608ef011cc"},
+    {file = "coverage-6.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = 
"sha256:01c5615d13f3dd3aa8543afc069e5319cfa0c7d712f6e04b920431e5c564a749"},
+    {file = "coverage-6.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = 
"sha256:75ab269400706fab15981fd4bd5080c56bd5cc07c3bccb86aab5e1d5a88dc8f4"},
+    {file = "coverage-6.4.1-cp310-cp310-win32.whl", hash = 
"sha256:a7f3049243783df2e6cc6deafc49ea123522b59f464831476d3d1448e30d72df"},
+    {file = "coverage-6.4.1-cp310-cp310-win_amd64.whl", hash = 
"sha256:ee2ddcac99b2d2aec413e36d7a429ae9ebcadf912946b13ffa88e7d4c9b712d6"},
+    {file = "coverage-6.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = 
"sha256:fb73e0011b8793c053bfa85e53129ba5f0250fdc0392c1591fd35d915ec75c46"},
+    {file = 
"coverage-6.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", 
hash = 
"sha256:106c16dfe494de3193ec55cac9640dd039b66e196e4641fa8ac396181578b982"},
+    {file = 
"coverage-6.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
 hash = 
"sha256:87f4f3df85aa39da00fd3ec4b5abeb7407e82b68c7c5ad181308b0e2526da5d4"},
+    {file = 
"coverage-6.4.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
 hash = 
"sha256:961e2fb0680b4f5ad63234e0bf55dfb90d302740ae9c7ed0120677a94a1590cb"},
+    {file = "coverage-6.4.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = 
"sha256:cec3a0f75c8f1031825e19cd86ee787e87cf03e4fd2865c79c057092e69e3a3b"},
+    {file = "coverage-6.4.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = 
"sha256:129cd05ba6f0d08a766d942a9ed4b29283aff7b2cccf5b7ce279d50796860bb3"},
+    {file = "coverage-6.4.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = 
"sha256:bf5601c33213d3cb19d17a796f8a14a9eaa5e87629a53979a5981e3e3ae166f6"},
+    {file = "coverage-6.4.1-cp37-cp37m-win32.whl", hash = 
"sha256:269eaa2c20a13a5bf17558d4dc91a8d078c4fa1872f25303dddcbba3a813085e"},
+    {file = "coverage-6.4.1-cp37-cp37m-win_amd64.whl", hash = 
"sha256:f02cbbf8119db68455b9d763f2f8737bb7db7e43720afa07d8eb1604e5c5ae28"},
+    {file = "coverage-6.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = 
"sha256:ffa9297c3a453fba4717d06df579af42ab9a28022444cae7fa605af4df612d54"},
+    {file = "coverage-6.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = 
"sha256:145f296d00441ca703a659e8f3eb48ae39fb083baba2d7ce4482fb2723e050d9"},
+    {file = 
"coverage-6.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", 
hash = 
"sha256:d67d44996140af8b84284e5e7d398e589574b376fb4de8ccd28d82ad8e3bea13"},
+    {file = 
"coverage-6.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
 hash = 
"sha256:2bd9a6fc18aab8d2e18f89b7ff91c0f34ff4d5e0ba0b33e989b3cd4194c81fd9"},
+    {file = 
"coverage-6.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
 hash = 
"sha256:3384f2a3652cef289e38100f2d037956194a837221edd520a7ee5b42d00cc605"},
+    {file = "coverage-6.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = 
"sha256:9b3e07152b4563722be523e8cd0b209e0d1a373022cfbde395ebb6575bf6790d"},
+    {file = "coverage-6.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = 
"sha256:1480ff858b4113db2718848d7b2d1b75bc79895a9c22e76a221b9d8d62496428"},
+    {file = "coverage-6.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = 
"sha256:865d69ae811a392f4d06bde506d531f6a28a00af36f5c8649684a9e5e4a85c83"},
+    {file = "coverage-6.4.1-cp38-cp38-win32.whl", hash = 
"sha256:664a47ce62fe4bef9e2d2c430306e1428ecea207ffd68649e3b942fa8ea83b0b"},
+    {file = "coverage-6.4.1-cp38-cp38-win_amd64.whl", hash = 
"sha256:26dff09fb0d82693ba9e6231248641d60ba606150d02ed45110f9ec26404ed1c"},
+    {file = "coverage-6.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = 
"sha256:d9c80df769f5ec05ad21ea34be7458d1dc51ff1fb4b2219e77fe24edf462d6df"},
+    {file = "coverage-6.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = 
"sha256:39ee53946bf009788108b4dd2894bf1349b4e0ca18c2016ffa7d26ce46b8f10d"},
+    {file = 
"coverage-6.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", 
hash = 
"sha256:f5b66caa62922531059bc5ac04f836860412f7f88d38a476eda0a6f11d4724f4"},
+    {file = 
"coverage-6.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
 hash = 
"sha256:fd180ed867e289964404051a958f7cccabdeed423f91a899829264bb7974d3d3"},
+    {file = 
"coverage-6.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
 hash = 
"sha256:84631e81dd053e8a0d4967cedab6db94345f1c36107c71698f746cb2636c63e3"},
+    {file = "coverage-6.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = 
"sha256:8c08da0bd238f2970230c2a0d28ff0e99961598cb2e810245d7fc5afcf1254e8"},
+    {file = "coverage-6.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = 
"sha256:d42c549a8f41dc103a8004b9f0c433e2086add8a719da00e246e17cbe4056f72"},
+    {file = "coverage-6.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = 
"sha256:309ce4a522ed5fca432af4ebe0f32b21d6d7ccbb0f5fcc99290e71feba67c264"},
+    {file = "coverage-6.4.1-cp39-cp39-win32.whl", hash = 
"sha256:fdb6f7bd51c2d1714cea40718f6149ad9be6a2ee7d93b19e9f00934c0f2a74d9"},
+    {file = "coverage-6.4.1-cp39-cp39-win_amd64.whl", hash = 
"sha256:342d4aefd1c3e7f620a13f4fe563154d808b69cccef415415aece4c786665397"},
+    {file = "coverage-6.4.1-pp36.pp37.pp38-none-any.whl", hash = 
"sha256:4803e7ccf93230accb928f3a68f00ffa80a88213af98ed338a57ad021ef06815"},
+    {file = "coverage-6.4.1.tar.gz", hash = 
"sha256:4321f075095a096e70aff1d002030ee612b65a205a0a0f5b815280d5dc58100c"},
+]
+importlib-metadata = [
+    {file = "importlib_metadata-4.11.4-py3-none-any.whl", hash = 
"sha256:c58c8eb8a762858f49e18436ff552e83914778e50e9d2f1660535ffb364552ec"},
+    {file = "importlib_metadata-4.11.4.tar.gz", hash = 
"sha256:5d26852efe48c0a32b0509ffbc583fda1a2266545a78d104a6f4aff3db17d700"},
+]
+importlib-resources = [
+    {file = "importlib_resources-5.8.0-py3-none-any.whl", hash = 
"sha256:7952325ffd516c05a8ad0858c74dff2c3343f136fe66a6002b2623dd1d43f223"},
+    {file = "importlib_resources-5.8.0.tar.gz", hash = 
"sha256:568c9f16cb204f9decc8d6d24a572eeea27dacbb4cee9e6b03a8025736769751"},
+]
+iniconfig = [
+    {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = 
"sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"},
+    {file = "iniconfig-1.1.1.tar.gz", hash = 
"sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"},
+]
+jsonpatch = [
+    {file = "jsonpatch-1.32-py2.py3-none-any.whl", hash = 
"sha256:26ac385719ac9f54df8a2f0827bb8253aa3ea8ab7b3368457bcdb8c14595a397"},
+    {file = "jsonpatch-1.32.tar.gz", hash = 
"sha256:b6ddfe6c3db30d81a96aaeceb6baf916094ffa23d7dd5fa2c13e13f8b6e600c2"},
+]
+jsonpointer = [
+    {file = "jsonpointer-2.3-py2.py3-none-any.whl", hash = 
"sha256:51801e558539b4e9cd268638c078c6c5746c9ac96bc38152d443400e4f3793e9"},
+    {file = "jsonpointer-2.3.tar.gz", hash = 
"sha256:97cba51526c829282218feb99dab1b1e6bdf8efd1c43dc9d57be093c0d69c99a"},
+]
+jsonschema = [
+    {file = "jsonschema-4.6.0-py3-none-any.whl", hash = 
"sha256:1c92d2db1900b668201f1797887d66453ab1fbfea51df8e4b46236689c427baf"},
+    {file = "jsonschema-4.6.0.tar.gz", hash = 
"sha256:9d6397ba4a6c0bf0300736057f649e3e12ecbc07d3e81a0dacb72de4e9801957"},
+]
+packaging = [
+    {file = "packaging-21.3-py3-none-any.whl", hash = 
"sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"},
+    {file = "packaging-21.3.tar.gz", hash = 
"sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"},
+]
+pluggy = [
+    {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = 
"sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"},
+    {file = "pluggy-1.0.0.tar.gz", hash = 
"sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"},
+]
+py = [
+    {file = "py-1.11.0-py2.py3-none-any.whl", hash = 
"sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"},
+    {file = "py-1.11.0.tar.gz", hash = 
"sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"},
+]
+pyparsing = [
+    {file = "pyparsing-3.0.9-py3-none-any.whl", hash = 
"sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"},
+    {file = "pyparsing-3.0.9.tar.gz", hash = 
"sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"},
+]
+pyrsistent = [
+    {file = "pyrsistent-0.18.1-cp310-cp310-macosx_10_9_universal2.whl", hash = 
"sha256:df46c854f490f81210870e509818b729db4488e1f30f2a1ce1698b2295a878d1"},
+    {file = 
"pyrsistent-0.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", 
hash = 
"sha256:5d45866ececf4a5fff8742c25722da6d4c9e180daa7b405dc0a2a2790d668c26"},
+    {file = 
"pyrsistent-0.18.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
 hash = 
"sha256:4ed6784ceac462a7d6fcb7e9b663e93b9a6fb373b7f43594f9ff68875788e01e"},
+    {file = "pyrsistent-0.18.1-cp310-cp310-win32.whl", hash = 
"sha256:e4f3149fd5eb9b285d6bfb54d2e5173f6a116fe19172686797c056672689daf6"},
+    {file = "pyrsistent-0.18.1-cp310-cp310-win_amd64.whl", hash = 
"sha256:636ce2dc235046ccd3d8c56a7ad54e99d5c1cd0ef07d9ae847306c91d11b5fec"},
+    {file = "pyrsistent-0.18.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = 
"sha256:e92a52c166426efbe0d1ec1332ee9119b6d32fc1f0bbfd55d5c1088070e7fc1b"},
+    {file = 
"pyrsistent-0.18.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", 
hash = 
"sha256:d7a096646eab884bf8bed965bad63ea327e0d0c38989fc83c5ea7b8a87037bfc"},
+    {file = 
"pyrsistent-0.18.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
 hash = 
"sha256:cdfd2c361b8a8e5d9499b9082b501c452ade8bbf42aef97ea04854f4a3f43b22"},
+    {file = "pyrsistent-0.18.1-cp37-cp37m-win32.whl", hash = 
"sha256:7ec335fc998faa4febe75cc5268a9eac0478b3f681602c1f27befaf2a1abe1d8"},
+    {file = "pyrsistent-0.18.1-cp37-cp37m-win_amd64.whl", hash = 
"sha256:6455fc599df93d1f60e1c5c4fe471499f08d190d57eca040c0ea182301321286"},
+    {file = "pyrsistent-0.18.1-cp38-cp38-macosx_10_9_universal2.whl", hash = 
"sha256:fd8da6d0124efa2f67d86fa70c851022f87c98e205f0594e1fae044e7119a5a6"},
+    {file = 
"pyrsistent-0.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", 
hash = 
"sha256:7bfe2388663fd18bd8ce7db2c91c7400bf3e1a9e8bd7d63bf7e77d39051b85ec"},
+    {file = 
"pyrsistent-0.18.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
 hash = 
"sha256:0e3e1fcc45199df76053026a51cc59ab2ea3fc7c094c6627e93b7b44cdae2c8c"},
+    {file = "pyrsistent-0.18.1-cp38-cp38-win32.whl", hash = 
"sha256:b568f35ad53a7b07ed9b1b2bae09eb15cdd671a5ba5d2c66caee40dbf91c68ca"},
+    {file = "pyrsistent-0.18.1-cp38-cp38-win_amd64.whl", hash = 
"sha256:d1b96547410f76078eaf66d282ddca2e4baae8964364abb4f4dcdde855cd123a"},
+    {file = "pyrsistent-0.18.1-cp39-cp39-macosx_10_9_universal2.whl", hash = 
"sha256:f87cc2863ef33c709e237d4b5f4502a62a00fab450c9e020892e8e2ede5847f5"},
+    {file = 
"pyrsistent-0.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", 
hash = 
"sha256:6bc66318fb7ee012071b2792024564973ecc80e9522842eb4e17743604b5e045"},
+    {file = 
"pyrsistent-0.18.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
 hash = 
"sha256:914474c9f1d93080338ace89cb2acee74f4f666fb0424896fcfb8d86058bf17c"},
+    {file = "pyrsistent-0.18.1-cp39-cp39-win32.whl", hash = 
"sha256:1b34eedd6812bf4d33814fca1b66005805d3640ce53140ab8bbb1e2651b0d9bc"},
+    {file = "pyrsistent-0.18.1-cp39-cp39-win_amd64.whl", hash = 
"sha256:e24a828f57e0c337c8d8bb9f6b12f09dfdf0273da25fda9e314f0b684b415a07"},
+    {file = "pyrsistent-0.18.1.tar.gz", hash = 
"sha256:d4d61f8b993a7255ba714df3aca52700f8125289f84f704cf80916517c46eb96"},
+]
+pytest = [
+    {file = "pytest-6.2.5-py3-none-any.whl", hash = 
"sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"},
+    {file = "pytest-6.2.5.tar.gz", hash = 
"sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"},
+]
+pytest-cov = [
+    {file = "pytest-cov-3.0.0.tar.gz", hash = 
"sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"},
+    {file = "pytest_cov-3.0.0-py3-none-any.whl", hash = 
"sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6"},
+]
+toml = [
+    {file = "toml-0.10.2-py2.py3-none-any.whl", hash = 
"sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"},
+    {file = "toml-0.10.2.tar.gz", hash = 
"sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"},
+]
+tomli = [
+    {file = "tomli-2.0.1-py3-none-any.whl", hash = 
"sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"},
+    {file = "tomli-2.0.1.tar.gz", hash = 
"sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"},
+]
+typing-extensions = [
+    {file = "typing_extensions-4.2.0-py3-none-any.whl", hash = 
"sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708"},
+    {file = "typing_extensions-4.2.0.tar.gz", hash = 
"sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376"},
+]
+zipp = [
+    {file = "zipp-3.8.0-py3-none-any.whl", hash = 
"sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099"},
+    {file = "zipp-3.8.0.tar.gz", hash = 
"sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad"},
+]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/warlock-1.3.3/pyproject.toml 
new/warlock-2.0.1/pyproject.toml
--- old/warlock-1.3.3/pyproject.toml    2019-05-20 12:07:50.000000000 +0200
+++ new/warlock-2.0.1/pyproject.toml    2022-06-17 14:53:49.000000000 +0200
@@ -1,3 +1,41 @@
+[tool.poetry]
+name = "warlock"
+version = "2.0.1"
+description = "Python object model built on JSON schema and JSON patch."
+readme = "README.md"
+authors = ["Brian Waldon <bcwal...@gmail.com>"]
+maintainers = ["Jan Willhaus <m...@janwillhaus.de>"]
+homepage = "http://github.com/bcwaldon/warlock";
+repository = "http://github.com/bcwaldon/warlock";
+license = "Apache-2.0"
+keywords=["JSON schema", "JSON patch", "model validation"]
+classifiers = [
+    "Development Status :: 5 - Production/Stable",
+    "Intended Audience :: Developers",
+    "Operating System :: MacOS :: MacOS X",
+    "Operating System :: Microsoft :: Windows",
+    "Operating System :: POSIX",
+    "Programming Language :: Python",
+    "Programming Language :: Python :: 3",
+    "Programming Language :: Python :: 3.7",
+    "Programming Language :: Python :: 3.8",
+    "Programming Language :: Python :: 3.9",
+    "Programming Language :: Python :: 3.10",
+    "Topic :: Software Development :: Libraries :: Python Modules",
+]
+packages = [
+    { include = "warlock" },
+]
+
+[tool.poetry.dependencies]
+python = "^3.7"
+jsonschema = "^4"
+jsonpatch = "^1"
+
+[tool.poetry.dev-dependencies]
+pytest = "^6.0"
+pytest-cov = "^3.0"
+
 [tool.black]
 line-length = 88
 include = '\.pyi?$'
@@ -9,3 +47,11 @@
   | __pycache__
 )/
 '''
+
+[tool.isort]
+known_third_party = ["jsonpatch","jsonschema"]
+known_first_party=["warlock"]
+
+[build-system]
+requires = ["poetry-core"]
+build-backend = "poetry.core.masonry.api"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/warlock-1.3.3/pytest.ini new/warlock-2.0.1/pytest.ini
--- old/warlock-1.3.3/pytest.ini        2019-05-20 12:07:50.000000000 +0200
+++ new/warlock-2.0.1/pytest.ini        2022-06-17 14:53:49.000000000 +0200
@@ -6,4 +6,4 @@
     --cov-config=.coveragerc
     --cov-report html
     --cov-report term
-    --verbose
\ No newline at end of file
+    --verbose
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/warlock-1.3.3/requirements.txt 
new/warlock-2.0.1/requirements.txt
--- old/warlock-1.3.3/requirements.txt  2019-05-20 12:07:50.000000000 +0200
+++ new/warlock-2.0.1/requirements.txt  1970-01-01 01:00:00.000000000 +0100
@@ -1,3 +0,0 @@
-jsonschema>=0.7,<4
-jsonpatch>=0.10,<2
-six
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/warlock-1.3.3/setup.cfg new/warlock-2.0.1/setup.cfg
--- old/warlock-1.3.3/setup.cfg 2019-05-20 12:07:50.000000000 +0200
+++ new/warlock-2.0.1/setup.cfg 1970-01-01 01:00:00.000000000 +0100
@@ -1,2 +0,0 @@
-[bdist_wheel]
-universal = 1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/warlock-1.3.3/setup.py new/warlock-2.0.1/setup.py
--- old/warlock-1.3.3/setup.py  2019-05-20 12:07:50.000000000 +0200
+++ new/warlock-2.0.1/setup.py  1970-01-01 01:00:00.000000000 +0100
@@ -1,65 +0,0 @@
-# Copyright 2012 Brian Waldon
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-import setuptools
-import io
-import os
-
-
-def parse_requirements():
-    fap = io.open("requirements.txt", "r", encoding="utf-8")
-    raw_req = fap.read()
-    fap.close()
-    return raw_req.split("\n")
-
-
-def read(fname):
-    with io.open(
-        os.path.join(os.path.dirname(__file__), fname), "r", encoding="utf-8"
-    ) as fp:
-        return fp.read()
-
-
-setuptools.setup(
-    name="warlock",
-    version="1.3.3",
-    description="Python object model built on JSON schema and JSON patch.",
-    long_description=read("README.md"),
-    long_description_content_type="text/markdown",
-    keywords=["JSON schema", "JSON patch", "model validation"],
-    author="Brian Waldon",
-    author_email="bcwal...@gmail.com",
-    maintainer="Jan Willhaus",
-    maintainer_email="m...@janwillhaus.de",
-    url="http://github.com/bcwaldon/warlock";,
-    packages=["warlock"],
-    install_requires=parse_requirements(),
-    license="Apache-2.0",
-    classifiers=[
-        "Development Status :: 5 - Production/Stable",
-        "Intended Audience :: Developers",
-        "Operating System :: MacOS :: MacOS X",
-        "Operating System :: Microsoft :: Windows",
-        "Operating System :: POSIX",
-        "Programming Language :: Python",
-        "Programming Language :: Python :: 2",
-        "Programming Language :: Python :: 2.7",
-        "Programming Language :: Python :: 3",
-        "Programming Language :: Python :: 3.4",
-        "Programming Language :: Python :: 3.5",
-        "Programming Language :: Python :: 3.6",
-        "Programming Language :: Python :: 3.7",
-        "Topic :: Software Development :: Libraries :: Python Modules",
-    ],
-)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/warlock-1.3.3/tests/schemas/country.json 
new/warlock-2.0.1/tests/schemas/country.json
--- old/warlock-1.3.3/tests/schemas/country.json        2019-05-20 
12:07:50.000000000 +0200
+++ new/warlock-2.0.1/tests/schemas/country.json        2022-06-17 
14:53:49.000000000 +0200
@@ -7,4 +7,4 @@
         "overlord": { "$ref": "person.json#" }
     },
     "additionalProperties": false
-}
\ No newline at end of file
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/warlock-1.3.3/tests/schemas/person.json 
new/warlock-2.0.1/tests/schemas/person.json
--- old/warlock-1.3.3/tests/schemas/person.json 2019-05-20 12:07:50.000000000 
+0200
+++ new/warlock-2.0.1/tests/schemas/person.json 2022-06-17 14:53:49.000000000 
+0200
@@ -7,4 +7,4 @@
             "firstname": { "type": "string" },
             "lastname": { "type": "string" }
         }
-}
\ No newline at end of file
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/warlock-1.3.3/tests/test_core.py 
new/warlock-2.0.1/tests/test_core.py
--- old/warlock-1.3.3/tests/test_core.py        2019-05-20 12:07:50.000000000 
+0200
+++ new/warlock-2.0.1/tests/test_core.py        2022-06-17 14:53:49.000000000 
+0200
@@ -13,16 +13,13 @@
 # limitations under the License.
 
 import copy
-import unittest
-import os
-
 import json
-
-import six
+import os
+import unittest
+import warnings
 
 import warlock
 
-
 fixture = {
     "name": "Country",
     "properties": {"name": {"type": "string"}, "population": {"type": 
"integer"}},
@@ -41,7 +38,7 @@
     "name": "Parent",
     "properties": {
         "name": {"type": "string"},
-        "children": {"type": "array", "items": [{"type": "object"}]},
+        "children": {"type": "array", "items": {"type": "object"}},
     },
     "required": ["name", "children"],
 }
@@ -64,13 +61,6 @@
         Country = warlock.model_factory(fixture)
         self.assertRaises(ValueError, Country, name=1)
 
-    def test_class_name_from_unicode_schema_name(self):
-        fixture_copy = copy.deepcopy(fixture)
-        fixture_copy["name"] = six.text_type(fixture_copy["name"])
-        # Can't set class.__name__ to a unicode object, ensure warlock
-        # does some magic to make it possible
-        warlock.model_factory(fixture_copy)
-
     def test_invalid_operations(self):
         Country = warlock.model_factory(fixture)
         sweden = Country(name="Sweden", population=9379116)
@@ -104,7 +94,7 @@
         Country = warlock.model_factory(fixture)
         sweden = Country(name="Sweden", population=9379116)
         self.assertEqual(
-            set(list(six.iteritems(sweden))),
+            set(list(sweden.items())),
             set([("name", "Sweden"), ("population", 9379116)]),
         )
         self.assertEqual(
@@ -136,27 +126,19 @@
         Mixmaster = warlock.model_factory(complex_fixture)
         mike = Mixmaster(sub={"foo": "mike"})
 
-        self.assertEquals("mike", mike.sub["foo"])
+        self.assertEqual("mike", mike.sub["foo"])
 
         mike_1 = mike.copy()
         mike_1["sub"]["foo"] = "james"
-        self.assertEquals("mike", mike.sub["foo"])
-
-        mike_2 = dict(six.iteritems(mike))
-        mike_2["sub"]["foo"] = "james"
-        self.assertEquals("mike", mike.sub["foo"])
+        self.assertEqual("mike", mike.sub["foo"])
 
         mike_2 = dict(mike.items())
         mike_2["sub"]["foo"] = "james"
-        self.assertEquals("mike", mike.sub["foo"])
-
-        mike_3_sub = list(six.itervalues(mike))[0]
-        mike_3_sub["foo"] = "james"
-        self.assertEquals("mike", mike.sub["foo"])
+        self.assertEqual("mike", mike.sub["foo"])
 
         mike_3_sub = list(mike.values())[0]
         mike_3_sub["foo"] = "james"
-        self.assertEquals("mike", mike.sub["foo"])
+        self.assertEqual("mike", mike.sub["foo"])
 
     def test_forbidden_methods(self):
         Country = warlock.model_factory(fixture)
@@ -189,11 +171,20 @@
     def test_changes(self):
         Country = warlock.model_factory(fixture)
         sweden = Country(name="Sweden", population=9379116)
-        self.assertEqual(sweden.changes, {})
+        with warnings.catch_warnings(record=True) as w:
+            warnings.simplefilter("always")
+            self.assertEqual(sweden.changes, {})
+            assert w[0].category == DeprecationWarning
         sweden["name"] = "Finland"
-        self.assertEqual(sweden.changes, {"name": "Finland"})
+        with warnings.catch_warnings(record=True) as w:
+            warnings.simplefilter("always")
+            self.assertEqual(sweden.changes, {"name": "Finland"})
+            assert w[0].category == DeprecationWarning
         sweden["name"] = "Norway"
-        self.assertEqual(sweden.changes, {"name": "Norway"})
+        with warnings.catch_warnings(record=True) as w:
+            warnings.simplefilter("always")
+            self.assertEqual(sweden.changes, {"name": "Norway"})
+            assert w[0].category == DeprecationWarning
 
     def test_patch_no_changes(self):
         Country = warlock.model_factory(fixture)
@@ -262,8 +253,8 @@
 
         country_schema = json.load(country_schema_file)
         person_schema = json.load(person_schema_file)
-        Country = warlock.model_factory(country_schema, resolver)
-        Person = warlock.model_factory(person_schema, resolver)
+        Country = warlock.model_factory(country_schema, resolver=resolver)
+        Person = warlock.model_factory(person_schema, resolver=resolver)
 
         england = Country(
             name="England",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/warlock-1.3.3/tox.ini new/warlock-2.0.1/tox.ini
--- old/warlock-1.3.3/tox.ini   1970-01-01 01:00:00.000000000 +0100
+++ new/warlock-2.0.1/tox.ini   2022-06-17 14:53:49.000000000 +0200
@@ -0,0 +1,11 @@
+[tox]
+skipsdist = True
+envlist = py37,py38,py39,py310
+
+[testenv]
+skip_install = true
+deps =
+  poetry
+commands =
+  poetry install -v
+  poetry run pytest
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/warlock-1.3.3/warlock/__init__.py 
new/warlock-2.0.1/warlock/__init__.py
--- old/warlock-1.3.3/warlock/__init__.py       2019-05-20 12:07:50.000000000 
+0200
+++ new/warlock-2.0.1/warlock/__init__.py       2022-06-17 14:53:49.000000000 
+0200
@@ -14,5 +14,5 @@
 
 """Public-facing Warlock API"""
 
-from warlock.core import model_factory  # NOQA
-from warlock.exceptions import InvalidOperation  # NOQA
+from warlock.core import model_factory  # noqa: F401
+from warlock.exceptions import InvalidOperation  # noqa: F401
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/warlock-1.3.3/warlock/core.py 
new/warlock-2.0.1/warlock/core.py
--- old/warlock-1.3.3/warlock/core.py   2019-05-20 12:07:50.000000000 +0200
+++ new/warlock-2.0.1/warlock/core.py   2022-06-17 14:53:49.000000000 +0200
@@ -17,9 +17,10 @@
 import copy
 
 from . import model
+from jsonschema.validators import validator_for
 
 
-def model_factory(schema, resolver=None, base_class=model.Model, name=None):
+def model_factory(schema, base_class=model.Model, name=None, resolver=None):
     """Generate a model class based on the provided JSON Schema
 
     :param schema: dict representing valid JSON schema
@@ -32,6 +33,13 @@
         def __init__(self, *args, **kwargs):
             self.__dict__["schema"] = schema
             self.__dict__["resolver"] = resolver
+
+            cls = validator_for(self.schema)
+            if resolver is not None:
+                self.__dict__["validator_instance"] = cls(schema, 
resolver=resolver)
+            else:
+                self.__dict__["validator_instance"] = cls(schema)
+
             base_class.__init__(self, *args, **kwargs)
 
     if resolver is not None:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/warlock-1.3.3/warlock/model.py 
new/warlock-2.0.1/warlock/model.py
--- old/warlock-1.3.3/warlock/model.py  2019-05-20 12:07:50.000000000 +0200
+++ new/warlock-2.0.1/warlock/model.py  2022-06-17 14:53:49.000000000 +0200
@@ -19,7 +19,6 @@
 
 import jsonpatch
 import jsonschema
-import six
 
 from . import exceptions
 
@@ -104,15 +103,9 @@
             raise exceptions.InvalidOperation(str(exc))
         dict.update(self, other)
 
-    def iteritems(self):
-        return six.iteritems(copy.deepcopy(dict(self)))
-
     def items(self):
         return copy.deepcopy(dict(self)).items()
 
-    def itervalues(self):
-        return six.itervalues(copy.deepcopy(dict(self)))
-
     def values(self):
         return copy.deepcopy(dict(self)).values()
 
@@ -134,9 +127,7 @@
     def validate(self, obj):
         """Apply a JSON schema to an object"""
         try:
-            if self.resolver is not None:
-                jsonschema.validate(obj, self.schema, resolver=self.resolver)
-            else:
-                jsonschema.validate(obj, self.schema)
+            self.validator_instance.validate(obj)
+
         except jsonschema.ValidationError as exc:
             raise exceptions.ValidationError(str(exc))

Reply via email to