diff --git a/.flake8 b/.flake8
new file mode 100644
index 000000000..6a6b5cfe7
--- /dev/null
+++ b/.flake8
@@ -0,0 +1,10 @@
+[flake8]
+ban-relative-imports = true
+inline-quotes = "
+exclude =
+ jsonschema/__init__.py
+ jsonschema/_reflect.py
+ignore =
+ B008, # Barring function calls in default args. Ha, no.
+ B306, # See https://github.com/PyCQA/flake8-bugbear/issues/131
+ W503, # (flake8 default) old PEP8 boolean operator line breaks
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index a1b7ee37e..ad885a437 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -13,9 +13,9 @@ jobs:
pre-commit:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v2
- - uses: actions/setup-python@v2
- - uses: pre-commit/action@v2.0.0
+ - uses: actions/checkout@v3
+ - uses: actions/setup-python@v3
+ - uses: pre-commit/action@v2.0.3
ci:
runs-on: ${{ matrix.os }}
@@ -84,19 +84,18 @@ jobs:
toxenv: py310-format_nongpl-build
- name: "3.10"
toxenv: py310-format_nongpl-tests
- # Temporarily disabled due to pypa/setuptools#3274
- # - name: "3.11.0-alpha - 3.11.0"
- # toxenv: py311-noextra-build
- # - name: "3.11.0-alpha - 3.11.0"
- # toxenv: py311-noextra-tests
- # - name: "3.11.0-alpha - 3.11.0"
- # toxenv: py311-format-build
- # - name: "3.11.0-alpha - 3.11.0"
- # toxenv: py311-format-tests
- # - name: "3.11.0-alpha - 3.11.0"
- # toxenv: py311-format_nongpl-build
- # - name: "3.11.0-alpha - 3.11.0"
- # toxenv: py311-format_nongpl-tests
+ - name: "3.11.0-beta - 3.11.0"
+ toxenv: py311-noextra-build
+ - name: "3.11.0-beta - 3.11.0"
+ toxenv: py311-noextra-tests
+ - name: "3.11.0-beta - 3.11.0"
+ toxenv: py311-format-build
+ - name: "3.11.0-beta - 3.11.0"
+ toxenv: py311-format-tests
+ - name: "3.11.0-beta - 3.11.0"
+ toxenv: py311-format_nongpl-build
+ - name: "3.11.0-beta - 3.11.0"
+ toxenv: py311-format_nongpl-tests
- name: "3.10"
toxenv: docs-dirhtml
- name: "3.10"
@@ -180,13 +179,11 @@ jobs:
toxenv: docs-style
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
- name: Set up Python ${{ matrix.python-version.name }}
- uses: actions/setup-python@v2
+ uses: actions/setup-python@v3
with:
python-version: ${{ matrix.python-version.name }}
- - name: Ensure we have new enough versions to respect python_version
- run: python -m pip install -U pip setuptools
- name: Install dependencies
run: >
sudo apt-get update &&
@@ -199,3 +196,39 @@ jobs:
run: python -m pip install tox
- name: Run tox
run: python -m tox -e "${{ matrix.python-version.toxenv }}"
+
+ packaging:
+ needs: ci
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ fetch-depth: 0
+ - uses: actions/setup-python@v3
+ with:
+ python-version: "3.10"
+ - name: Install dependencies
+ run: python -m pip install build
+ - name: Create packages
+ run: python -m build .
+ - uses: actions/upload-artifact@v3
+ with:
+ name: dist
+ path: dist
+ - name: Publish package
+ if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags')
+ uses: pypa/gh-action-pypi-publish@master
+ with:
+ user: __token__
+ password: ${{ secrets.pypi_password }}
+ - name: Create Release Notes
+ if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags')
+ uses: actions/github-script@v6
+ with:
+ github-token: ${{ secrets.GITHUB_TOKEN }}
+ script: |
+ await github.request(`POST /repos/${{ github.repository }}/releases`, {
+ tag_name: "${{ github.ref }}",
+ generate_release_notes: true
+ });
diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml
index 7a14bcedb..3edc62750 100644
--- a/.github/workflows/coverage.yml
+++ b/.github/workflows/coverage.yml
@@ -10,13 +10,11 @@ jobs:
coverage:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
- name: Set up Python
- uses: actions/setup-python@v2
+ uses: actions/setup-python@v3
with:
- python-version: 3.9
- - name: Ensure we have new enough versions to respect python_version
- run: python -m pip install -U pip setuptools
+ python-version: "3.10"
- name: Install tox
run: python -m pip install tox
- name: Collect & Upload Coverage
diff --git a/.github/workflows/fuzz.yml b/.github/workflows/fuzz.yml
index 927c0806d..dcc49a383 100644
--- a/.github/workflows/fuzz.yml
+++ b/.github/workflows/fuzz.yml
@@ -23,7 +23,7 @@ jobs:
oss-fuzz-project-name: 'jsonschema'
fuzz-seconds: 30
- name: Upload Crash
- uses: actions/upload-artifact@v2
+ uses: actions/upload-artifact@v3
if: failure() && steps.build.outcome == 'success'
with:
name: artifacts
diff --git a/.github/workflows/packaging.yml b/.github/workflows/packaging.yml
deleted file mode 100644
index 47723ec87..000000000
--- a/.github/workflows/packaging.yml
+++ /dev/null
@@ -1,43 +0,0 @@
-name: Packaging
-
-on:
- push:
- release:
- types: [published]
-
-jobs:
- build:
- runs-on: ubuntu-latest
-
- steps:
- - uses: actions/checkout@v2
- with:
- fetch-depth: 0
- - name: Set up Python ${{ matrix.python-version }}
- uses: actions/setup-python@v2
- with:
- python-version: 3.9
- - name: Install dependencies
- run: python -m pip install build
- - name: Create packages
- run: python -m build .
- - uses: actions/upload-artifact@v2
- with:
- name: dist
- path: dist
- - name: Publish package
- if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags')
- uses: pypa/gh-action-pypi-publish@master
- with:
- user: __token__
- password: ${{ secrets.pypi_password }}
- - name: Create Release Notes
- if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags')
- uses: actions/github-script@v4.0.2
- with:
- github-token: ${{ secrets.GITHUB_TOKEN }}
- script: |
- await github.request(`POST /repos/${{ github.repository }}/releases`, {
- tag_name: "${{ github.ref }}",
- generate_release_notes: true
- });
diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index d05032d08..18bd54fee 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -1,3 +1,12 @@
+v4.6.0
+------
+
+* Fix ``unevaluatedProperties`` and ``unevaluatedItems`` for types they should
+ ignore (#949)
+* ``jsonschema`` now uses `hatch `_ for its build
+ process. This should be completely transparent to end-users (and only matters
+ to contributors).
+
v4.5.1
------
diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst
new file mode 100644
index 000000000..c051d5697
--- /dev/null
+++ b/CONTRIBUTING.rst
@@ -0,0 +1,60 @@
+============================
+Contributing to `jsonschema`
+============================
+
+Found a bug?
+------------
+
+If you suspect you may have found a security-related vulnerability, please follow the instructions in `the security policy `_.
+
+Otherwise, it is extremely helpful if you first search to see whether your bug has been `previously reported on the Issues tab `_.
+
+If it doesn't appear to be a known issue, please `file a new one `_, and include a **title and clear description**, along with as much relevant information as possible.
+Including a *minimal*, *self-sufficient* bit of code (often an instance and schema) is the fastest way to get attention, along with a description of the behavior you expect, and if you're able, a link to where in the specification contains the behavior you're noticing is incorrect.
+
+Pull requests to fix your issue are of course very welcome.
+
+
+Fixing a Bug?
+-------------
+
+Please open a new GitHub pull request with the change, along with new tests.
+
+Ensure the PR description clearly describes the problem and solution. Include the relevant issue number if applicable.
+
+Continuous integration via GitHub actions should run to indicate whether your change passes both the test suite as well as linters.
+Please ensure it passes, or indicate in a comment if you believe it fails spuriously.
+
+
+Adding New Functionality?
+-------------------------
+
+Please discuss any larger changes ahead of time for the sake of your own time!
+
+Improvements are very welcome, but large pull requests, disruptive ones, or backwards incompatible ones, can lead to long back and forth discussions.
+
+You're welcome to suggest a change in an issue and thereby get some initial feedback before embarking on an effort that may not get merged.
+
+
+Improving the Documentation?
+----------------------------
+
+Writing good documentation is challenging both to prioritize and to do well.
+
+Any help you may have would be great, especially if you're a beginner who's struggled to understand a part of the library.
+
+Documentation is written in `Sphinx-flavored reStructuredText `_, so you'll want to familiarize yourself a bit with Sphinx.
+
+Feel free to file issues or pull requests.
+
+
+Have a Question?
+----------------
+
+Please do not use the issue tracker for questions, it's reserved for things believed to be bugs, or new functionality.
+
+There is a `discussions tab `_ where general questions can be asked.
+
+Answers on it are best-effort.
+
+Any help you can offer to answer others' questions is of course very welcome as well.
diff --git a/MANIFEST.in b/MANIFEST.in
deleted file mode 100644
index 2eef0b793..000000000
--- a/MANIFEST.in
+++ /dev/null
@@ -1,5 +0,0 @@
-graft json
-include *.rst
-include COPYING
-include pyproject.toml
-include tox.ini
diff --git a/README.rst b/README.rst
index 8b43ad9c8..0003c5020 100644
--- a/README.rst
+++ b/README.rst
@@ -125,8 +125,9 @@ schemas can be found there.
Otherwise, asking questions on Stack Overflow is another means of
getting help if you're stuck.
-Contributing
-------------
+
+About
+-----
I'm Julian Berman.
diff --git a/docs/conf.py b/docs/conf.py
index 2e3cf5d03..f595f16d7 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -240,6 +240,7 @@ def entire_domain(host):
linkcheck_ignore = [
+ entire_domain("img.shields.io"),
"https://github.com/python-jsonschema/jsonschema/actions",
"https://github.com/python-jsonschema/jsonschema/workflows/CI/badge.svg",
]
diff --git a/docs/validate.rst b/docs/validate.rst
index cda8f355f..abb52cb97 100644
--- a/docs/validate.rst
+++ b/docs/validate.rst
@@ -205,7 +205,7 @@ to validate. Their names can be viewed by inspecting the
`FormatChecker.checkers` attribute. Certain checkers will only be
available if an appropriate package is available for use. The easiest way to
ensure you have what is needed is to install ``jsonschema`` using the
-``format`` or ``format_nongpl`` setuptools extra -- i.e.
+``format`` or ``format_nongpl`` collection of optional dependencies -- e.g.
.. code-block:: sh
diff --git a/jsonschema/py.typed b/jsonschema/py.typed
deleted file mode 100644
index e69de29bb..000000000
diff --git a/pyproject.toml b/pyproject.toml
index 477d5e673..115e20154 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,16 +1,97 @@
[build-system]
-requires = [
- # The minimum setuptools version is specific to the PEP 517 backend,
- # and may be stricter than the version required in `setup.py`
- "setuptools>=40.6.0",
- "setuptools_scm[toml]>=3.4",
- "wheel",
+requires = ["hatchling", "hatch-vcs"]
+build-backend = "hatchling.build"
+
+[tool.hatch.version]
+source = "vcs"
+
+[project]
+name = "jsonschema"
+description = "An implementation of JSON Schema validation for Python"
+readme = "README.rst"
+requires-python = ">=3.7"
+license = {text = "MIT"}
+keywords = ["validation", "data validation", "jsonschema", "json"]
+authors = [
+ {email = "Julian+jsonschema@GrayVines.com"},
+ {name = "Julian Berman"},
+]
+classifiers = [
+ "Development Status :: 5 - Production/Stable",
+ "Intended Audience :: Developers",
+ "License :: OSI Approved :: MIT License",
+ "Operating System :: OS Independent",
+ "Programming Language :: Python",
+ "Programming Language :: Python :: 3.7",
+ "Programming Language :: Python :: 3.8",
+ "Programming Language :: Python :: 3.9",
+ "Programming Language :: Python :: 3.10",
+ "Programming Language :: Python :: 3.11",
+ "Programming Language :: Python :: Implementation :: CPython",
+ "Programming Language :: Python :: Implementation :: PyPy",
+]
+dynamic = ["version"]
+
+dependencies = [
+ "attrs>=17.4.0",
+ "pyrsistent>=0.14.0,!=0.17.0,!=0.17.1,!=0.17.2",
+
+ "importlib_metadata;python_version<'3.8'",
+ "typing_extensions;python_version<'3.8'",
+ "importlib_resources>=1.4.0;python_version<'3.9'",
+]
+
+[project.optional-dependencies]
+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",
]
-build-backend = "setuptools.build_meta"
+
+[project.scripts]
+jsonschema = "jsonschema.cli:main"
+
+[project.urls]
+homepage = "https://github.com/python-jsonschema/jsonschema"
+documentation = "https://python-jsonschema.readthedocs.io/"
+issues = "https://github.com/python-jsonschema/jsonschema/issues/"
+funding = "https://github.com/sponsors/Julian"
+tidelift = "https://tidelift.com/subscription/pkg/pypi-jsonschema?utm_source=pypi-jsonschema&utm_medium=referral&utm_campaign=pypi-link"
+changelog = "https://github.com/python-jsonschema/jsonschema/blob/main/CHANGELOG.rst"
+source = "https://github.com/python-jsonschema/jsonschema"
[tool.isort]
from_first = true
include_trailing_comma = true
multi_line_output = 3
-[tool.setuptools_scm]
+[tool.mypy]
+ignore_missing_imports = true
+
+[tool.pydocstyle]
+match = "(?!(test_|_|compat|cli)).*\\.py" # see PyCQA/pydocstyle#323
+add-select = [
+ "D410", # Trailing whitespace plz
+]
+add-ignore = [
+ "D107", # Hah, no
+ "D200", # 1-line docstrings don't need to be on one line
+ "D202", # One line is fine.
+ "D412", # Trailing whitespace plz
+ "D413", # No trailing whitespace plz
+]
diff --git a/setup.cfg b/setup.cfg
deleted file mode 100644
index 18623eb0b..000000000
--- a/setup.cfg
+++ /dev/null
@@ -1,91 +0,0 @@
-[metadata]
-name = jsonschema
-url = https://github.com/python-jsonschema/jsonschema
-project_urls =
- Funding = https://github.com/sponsors/Julian
- Tidelift = https://tidelift.com/subscription/pkg/pypi-jsonschema?utm_source=pypi-jsonschema&utm_medium=referral&utm_campaign=pypi-link
- Changelog = https://github.com/python-jsonschema/jsonschema/blob/main/CHANGELOG.rst
- Documentation = https://python-jsonschema.readthedocs.io/en/latest/
- Source = https://github.com/python-jsonschema/jsonschema
- Issues = https://github.com/python-jsonschema/jsonschema/issues/
-description = An implementation of JSON Schema validation for Python
-long_description = file: README.rst
-long_description_content_type = text/x-rst
-author = Julian Berman
-author_email = Julian@GrayVines.com
-license = MIT
-classifiers =
- Development Status :: 5 - Production/Stable
- Intended Audience :: Developers
- License :: OSI Approved :: MIT License
- Operating System :: OS Independent
- Programming Language :: Python
- Programming Language :: Python :: 3.7
- Programming Language :: Python :: 3.8
- Programming Language :: Python :: 3.9
- Programming Language :: Python :: 3.10
- Programming Language :: Python :: 3.11
- Programming Language :: Python :: Implementation :: CPython
- Programming Language :: Python :: Implementation :: PyPy
-
-[options]
-packages = find:
-python_requires = >=3.7
-install_requires =
- attrs>=17.4.0
- importlib_metadata;python_version<'3.8'
- importlib_resources>=1.4.0;python_version<'3.9'
- pyrsistent>=0.14.0,!=0.17.0,!=0.17.1,!=0.17.2
- typing_extensions;python_version<'3.8'
-
-[options.extras_require]
-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
-
-[options.entry_points]
-console_scripts =
- jsonschema = jsonschema.cli:main
-
-[options.package_data]
-jsonschema = py.typed, schemas/*.json, schemas/*/*.json
-
-[flake8]
-ban-relative-imports = true
-inline-quotes = "
-exclude =
- jsonschema/__init__.py
- jsonschema/_reflect.py
-ignore =
- B008, # Barring function calls in default args. Ha, no.
- B306, # See https://github.com/PyCQA/flake8-bugbear/issues/131
- W503, # (flake8 default) old PEP8 boolean operator line breaks
-
-[mypy]
-ignore_missing_imports = true
-
-[pydocstyle]
-match = (?!(test_|_|compat|cli)).*\.py # see PyCQA/pydocstyle#323
-add-select =
- D410, # Trailing whitespace plz
-add-ignore =
- D107, # Hah, no
- D200, # 1-line docstrings don't need to be on one line
- D202, # One line is fine.
- D412, # Trailing whitespace plz
- D413, # No trailing whitespace plz
diff --git a/tox.ini b/tox.ini
index 93365b71a..eb2201342 100644
--- a/tox.ini
+++ b/tox.ini
@@ -22,13 +22,12 @@ setenv =
whitelist_externals =
mkdir
commands =
- {envpython} -m pip install 'pip>=21.1.1' # Evade CVE-2021-28363
+ noextra: {envpython} -m pip install --disable-pip-version-check {toxinidir}
+ format,perf: {envpython} -m pip install --disable-pip-version-check '{toxinidir}[format]'
+ format_nongpl: {envpython} -m pip install --disable-pip-version-check '{toxinidir}[format_nongpl]'
- noextra: {envpython} -m pip install {toxinidir}
- format,perf: {envpython} -m pip install '{toxinidir}[format]'
- format_nongpl: {envpython} -m pip install '{toxinidir}[format_nongpl]'
-
- tests,coverage,codecov: {envpython} -W 'error' -m {env:MAYBE_COVERAGE:} twisted.trial {posargs:jsonschema}
+ # Ignore the deprecation warning until pypa/setuptools#3276 is released
+ tests,coverage,codecov: {envpython} -Werror -W"ignore:module 'sre_constants' is deprecated:DeprecationWarning" -m {env:MAYBE_COVERAGE:} twisted.trial {posargs:jsonschema}
tests: {envpython} -m doctest {toxinidir}/README.rst
coverage: {envpython} -m coverage report --show-missing
@@ -68,11 +67,7 @@ commands =
[testenv:safety]
deps = safety
commands =
- {envpython} -m pip install 'pip>=21.1.1' # Evade CVE-2021-28363
-
- # Remove once pypa/pip#7555 is closed.
- {envpython} -m pip install --use-feature=in-tree-build '{toxinidir}[format]'
-
+ {envpython} -m pip install --disable-pip-version-check '{toxinidir}[format]'
{envpython} -m safety check
[testenv:secrets]
@@ -97,7 +92,7 @@ deps =
pyrsistent
types-attrs
types-requests
-commands = {envpython} -m mypy --config {toxinidir}/setup.cfg {posargs} {toxinidir}/jsonschema
+commands = {envpython} -m mypy --config {toxinidir}/pyproject.toml {posargs} {toxinidir}/jsonschema
[testenv:docs-dirhtml]
commands = {envpython} -m sphinx -b dirhtml {toxinidir}/docs/ {envtmpdir}/build {posargs:-a -n -q -T -W}