aboutsummaryrefslogtreecommitdiff
path: root/setuptools/_vendor/_validate_pyproject/extra_validations.py
diff options
context:
space:
mode:
Diffstat (limited to 'setuptools/_vendor/_validate_pyproject/extra_validations.py')
-rw-r--r--setuptools/_vendor/_validate_pyproject/extra_validations.py36
1 files changed, 36 insertions, 0 deletions
diff --git a/setuptools/_vendor/_validate_pyproject/extra_validations.py b/setuptools/_vendor/_validate_pyproject/extra_validations.py
new file mode 100644
index 0000000..48c4e25
--- /dev/null
+++ b/setuptools/_vendor/_validate_pyproject/extra_validations.py
@@ -0,0 +1,36 @@
+"""The purpose of this module is implement PEP 621 validations that are
+difficult to express as a JSON Schema (or that are not supported by the current
+JSON Schema library).
+"""
+
+from typing import Mapping, TypeVar
+
+from .fastjsonschema_exceptions import JsonSchemaValueException
+
+T = TypeVar("T", bound=Mapping)
+
+
+class RedefiningStaticFieldAsDynamic(JsonSchemaValueException):
+ """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.
+ """
+
+
+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:
+ msg = f"You cannot provide a value for `project.{field}` and "
+ msg += "list it under `project.dynamic` at the same time"
+ name = f"data.project.{field}"
+ value = {field: project_table[field], "...": " # ...", "dynamic": dynamic}
+ raise RedefiningStaticFieldAsDynamic(msg, value, name, rule="PEP 621")
+
+ return pyproject
+
+
+EXTRA_VALIDATIONS = (validate_project_dynamic,)