| Viewing file:  extra_validations.py (2.79 KB)      -rw-r--r-- Select action/file-type:
 
  (+) |  (+) |  (+) | Code (+) | Session (+) |  (+) | SDB (+) |  (+) |  (+) |  (+) |  (+) |  (+) | 
 
"""The purpose of this module is implement PEP 621 validations that aredifficult to express as a JSON Schema (or that are not supported by the current
 JSON Schema library).
 """
 
 from inspect import cleandoc
 from typing import Mapping, TypeVar
 
 from .error_reporting import ValidationError
 
 T = TypeVar("T", bound=Mapping)
 
 
 class RedefiningStaticFieldAsDynamic(ValidationError):
 _DESC = """According to PEP 621:
 
 Build back-ends MUST raise an error if the metadata specifies a field
 statically as well as being listed in dynamic.
 """
 __doc__ = _DESC
 _URL = (
 "https://packaging.python.org/en/latest/specifications/"
 "pyproject-toml/#dynamic"
 )
 
 
 class IncludedDependencyGroupMustExist(ValidationError):
 _DESC = """An included dependency group must exist and must not be cyclic.
 """
 __doc__ = _DESC
 _URL = "https://peps.python.org/pep-0735/"
 
 
 def validate_project_dynamic(pyproject: T) -> T:
 project_table = pyproject.get("project", {})
 dynamic = project_table.get("dynamic", [])
 
 for field in dynamic:
 if field in project_table:
 raise RedefiningStaticFieldAsDynamic(
 message=f"You cannot provide a value for `project.{field}` and "
 "list it under `project.dynamic` at the same time",
 value={
 field: project_table[field],
 "...": " # ...",
 "dynamic": dynamic,
 },
 name=f"data.project.{field}",
 definition={
 "description": cleandoc(RedefiningStaticFieldAsDynamic._DESC),
 "see": RedefiningStaticFieldAsDynamic._URL,
 },
 rule="PEP 621",
 )
 
 return pyproject
 
 
 def validate_include_depenency(pyproject: T) -> T:
 dependency_groups = pyproject.get("dependency-groups", {})
 for key, value in dependency_groups.items():
 for each in value:
 if (
 isinstance(each, dict)
 and (include_group := each.get("include-group"))
 and include_group not in dependency_groups
 ):
 raise IncludedDependencyGroupMustExist(
 message=f"The included dependency group {include_group} doesn't exist",
 value=each,
 name=f"data.dependency_groups.{key}",
 definition={
 "description": cleandoc(IncludedDependencyGroupMustExist._DESC),
 "see": IncludedDependencyGroupMustExist._URL,
 },
 rule="PEP 735",
 )
 # TODO: check for `include-group` cycles (can be conditional to graphlib)
 return pyproject
 
 
 EXTRA_VALIDATIONS = (validate_project_dynamic, validate_include_depenency)
 
 |