[build-system] requires = ["hatchling", "hatch-vcs", "hatch-fancy-pypi-readme"] build-backend = "hatchling.build" [tool.hatch.version] source = "vcs" [project] name = "jsonschema" description = "An implementation of JSON Schema validation for Python" requires-python = ">=3.10" license = "MIT" license-files = ["COPYING"] keywords = [ "validation", "data validation", "jsonschema", "json", "json schema", ] authors = [ { name = "Julian Berman", email = "Julian+jsonschema@GrayVines.com" }, ] classifiers = [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: File Formats :: JSON", "Topic :: File Formats :: JSON :: JSON Schema", ] dynamic = ["version", "readme"] dependencies = [ "attrs>=22.2.0", "jsonschema-specifications>=2023.03.6", "referencing>=0.28.4", "rpds-py>=0.25.0", ] [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", "rfc3987-syntax>=1.1.0", "uri_template", "webcolors>=24.6.0", ] [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" [dependency-groups] test = ["virtue", "jsonpath-ng"] [tool.hatch.metadata.hooks.fancy-pypi-readme] content-type = "text/x-rst" [[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]] path = "README.rst" end-before = ".. start cut from PyPI" [[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]] path = "README.rst" start-after = ".. end cut from PyPI\n\n\n" [[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]] text = """ Release Information ------------------- """ [[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]] path = "CHANGELOG.rst" pattern = "(^v.+?)\nv" [tool.coverage.html] show_contexts = true skip_covered = false [tool.coverage.run] branch = true source = ["jsonschema"] dynamic_context = "test_function" [tool.coverage.report] exclude_also = [ "if TYPE_CHECKING:", "\\s*\\.\\.\\.\\s*", ] omit = [ "*/jsonschema/__main__.py", "*/jsonschema/benchmarks/*", "*/jsonschema/tests/fuzz_validate.py", ] show_missing = true skip_covered = true [tool.doc8] ignore = [ "D000", # see PyCQA/doc8#125 "D001", # one sentence per line, so max length doesn't make sense ] [tool.mypy] ignore_missing_imports = true show_error_codes = true exclude = ["jsonschema/benchmarks/*"] [tool.ruff] line-length = 79 extend-exclude = ["json"] [tool.ruff.lint] select = ["ALL"] ignore = [ "A001", # It's fine to shadow builtins "A002", "A003", "A005", "ARG", # This is all wrong whenever an interface is involved "ANN", # Just let the type checker do this "B006", # Mutable arguments require care but are OK if you don't abuse them "B008", # It's totally OK to call functions for default arguments. "B904", # raise SomeException(...) is fine. "B905", # No need for explicit strict, this is simply zip's default behavior "C408", # Calling dict is fine when it saves quoting the keys "C901", # Not really something to focus on "D105", # It's fine to not have docstrings for magic methods. "D107", # __init__ especially doesn't need a docstring "D200", # This rule makes diffs uglier when expanding docstrings "D203", # No blank lines before docstrings. "D212", # Start docstrings on the second line. "D400", # This rule misses sassy docstrings ending with ! or ? "D401", # This rule is too flaky. "D406", # Section headers should end with a colon not a newline "D407", # Underlines aren't needed "D412", # Plz spaces after section headers "EM101", # These don't bother me, it's fine there's some duplication. "EM102", "FBT", # It's worth avoiding boolean args but I don't care to enforce it "FIX", # Yes thanks, if I could it wouldn't be there "N", # These naming rules are silly "PERF203", # try/excepts in loops are sometimes needed "PLC0415", # too noisy, there are too many cases this is fine "PLR0911", # These metrics are fine to be aware of but not to enforce "PLR0912", "PLR0913", "PLR0915", "PLR1714", # This makes for uglier comparisons sometimes "PLW0642", # Shadowing self also isn't a big deal. "PLW2901", # Shadowing for loop variables is occasionally fine. "PT", # We use unittest "PYI025", # wat, I'm not confused, thanks. "RET502", # Returning None implicitly is fine "RET503", "RET505", # These push you to use `if` instead of `elif`, but for no reason "RET506", "RSE102", # Ha, what, who even knew you could leave the parens off. But no. "SIM300", # Not sure what heuristic this uses, but it's easily incorrect "SLF001", # Private usage within this package itself is fine "TD", # These TODO style rules are also silly "TRY003", # Some exception classes are essentially intended for free-form ] [tool.ruff.lint.flake8-pytest-style] mark-parentheses = false [tool.ruff.lint.flake8-quotes] docstring-quotes = "double" [tool.ruff.lint.isort] combine-as-imports = true from-first = true [tool.ruff.lint.per-file-ignores] "noxfile.py" = ["ANN", "D100", "S101", "T201"] "docs/*" = ["ANN", "D", "INP001"] "jsonschema/tests/*" = [ "ANN", "D", "RUF012", "S", "PLR", "PLW1641", "PYI024", "TRY", ] "jsonschema/tests/test_format.py" = ["ERA001"] "jsonschema/benchmarks/*" = ["ANN", "D", "INP001", "S101"]