Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: support repo-review #105

Merged
merged 4 commits into from
Aug 15, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
5 changes: 5 additions & 0 deletions setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ testing =
pytest-cov
pytest-xdist
pytest-randomly
repo-review; python_version>="3.10"

typecheck =
mypy
Expand All @@ -85,6 +86,10 @@ console_scripts =
validate_pyproject.tool_schema =
setuptools = validate_pyproject.api:load_builtin_plugin
distutils = validate_pyproject.api:load_builtin_plugin
repo_review.checks =
validate_pyproject = validate_pyproject.repo_review:repo_review_checks
repo_review.families =
validate_pyproject = validate_pyproject.repo_review:repo_review_families

[tool:pytest]
# Specify command line options as you would do when invoking pytest directly.
Expand Down
36 changes: 36 additions & 0 deletions src/validate_pyproject/repo_review.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
from typing import Any, Dict

import fastjsonschema

from . import api, plugins

__all__ = ["VPP001", "repo_review_checks", "repo_review_families"]


class VPP001:
"""Validate pyproject.toml"""

family = "validate-pyproject"

@staticmethod
def check(pyproject: Dict[str, Any]) -> str:
validator = api.Validator()
try:
validator(pyproject)
return ""
except fastjsonschema.JsonSchemaValueException as e:
return f"Invalid pyproject.toml! Error: {e}"


def repo_review_checks() -> Dict[str, VPP001]:
return {"VPP001": VPP001()}


def repo_review_families(pyproject: Dict[str, Any]) -> Dict[str, Dict[str, str]]:
has_distutils = "distutils" in pyproject.get("tool", {})
plugin_names = (ep.name for ep in plugins.iterate_entry_points())
plugin_list = (
f"`[tool.{n}]`" for n in plugin_names if n != "distutils" or has_distutils
)
descr = f"Checks `[build-system]`, `[project]`, {', '.join(plugin_list)}"
return {"validate-pyproject": {"name": "Validate-PyProject", "description": descr}}
40 changes: 40 additions & 0 deletions tests/test_repo_review.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
from pathlib import Path

import pytest

repo_review_processor = pytest.importorskip("repo_review.processor")

DIR = Path(__file__).parent.resolve()
EXAMPLES = DIR / "examples"
INVALID_EXAMPLES = DIR / "invalid-examples"


@pytest.mark.parametrize("name", ["atoml", "flit", "pdm", "pep_text", "trampolim"])
def test_valid_example(name: str) -> None:
processed = repo_review_processor.process(EXAMPLES / name)
assert all(r.result for r in processed.results), f"{processed.results}"


@pytest.mark.parametrize("name", ["pdm/invalid-version", "pdm/redefining-as-dynamic"])
def test_invalid_example(name: str) -> None:
processed = repo_review_processor.process(INVALID_EXAMPLES / name)
assert any(
not r.result and r.result is not None for r in processed.results
), f"{processed.results}"


def test_no_distutils() -> None:
processed = repo_review_processor.process(EXAMPLES / "pep_text")
family = processed.families["validate-pyproject"]
assert "[tool.setuptools]" in family["description"]
assert "[tool.distutils]" not in family["description"]


def test_has_distutils(tmp_path: Path) -> None:
d = tmp_path / "no-distutils"
d.mkdir()
d.joinpath("pyproject.toml").write_text("[tool.distutils]")
processed = repo_review_processor.process(d)
family = processed.families["validate-pyproject"]
assert "[tool.setuptools]" in family["description"]
assert "[tool.distutils]" in family["description"]