From bd1ab4cd3e8fe16ca7a8df129011c32b42b4552a Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Sat, 13 Jun 2026 20:10:06 +0200 Subject: [PATCH] Enforce color format in JSON schema tests via FormatChecker Register a "color" format checker backed by pydantic_extra_types.Color so that format: "color" is actually validated in Draft202012Validator. This removes the _json_schema_skip workaround from gx_color and adds 'foobar' to request_invalid and 'red' to request_valid to reflect the full range accepted by the color validator. --- test/unit/tool_util/parameter_specification.yml | 5 ++--- .../test_parameter_specification_json_schema.py | 17 ++++++++++++++++- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/test/unit/tool_util/parameter_specification.yml b/test/unit/tool_util/parameter_specification.yml index ca475a8c3e7..0aabb1056d6 100644 --- a/test/unit/tool_util/parameter_specification.yml +++ b/test/unit/tool_util/parameter_specification.yml @@ -1234,9 +1234,11 @@ gx_color: - parameter: '#aabbcc' - parameter: '#000000' - parameter: '#abcd' + - parameter: 'red' request_invalid: - parameter: null - parameter: {} + - parameter: 'foobar' workflow_step_valid: - parameter: '#aabbcc' - parameter: '#000000' @@ -1253,9 +1255,6 @@ gx_color: - parameter: 'foobar' - parameter: 5 - parameter: {__class__: 'ConnectedValue2'} - _json_schema_skip: - workflow_step_invalid: "color validator uses AfterValidator" - workflow_step_linked_invalid: "color validator uses AfterValidator" gx_data: request_valid: diff --git a/test/unit/tool_util/test_parameter_specification_json_schema.py b/test/unit/tool_util/test_parameter_specification_json_schema.py index 2a4c30590a0..7cc1aab90a4 100644 --- a/test/unit/tool_util/test_parameter_specification_json_schema.py +++ b/test/unit/tool_util/test_parameter_specification_json_schema.py @@ -22,8 +22,10 @@ from typing import ( ) import jsonschema +import jsonschema.exceptions import pytest import yaml +from pydantic_extra_types.color import Color as _Color pytestmark = pytest.mark.skipif( sys.version_info < (3, 9), reason="jsonschema<4.24 on Python 3.8 mishandles additionalProperties in anyOf" @@ -72,8 +74,21 @@ def _json_schema_for(bundle: ToolParameterBundleModel, state_representation: Sta return to_json_schema(model) +_FORMAT_CHECKER = jsonschema.FormatChecker() + + +@_FORMAT_CHECKER.checks("color", raises=jsonschema.exceptions.FormatError) +def _check_color_format(value: object) -> bool: + if isinstance(value, str): + try: + _Color(value) + except Exception as e: + raise jsonschema.exceptions.FormatError(f"{value!r} is not a valid color", cause=e) + return True + + def _json_schema_validates(schema: Dict[str, Any], state_dict: RawStateDict) -> bool: - validator = jsonschema.Draft202012Validator(schema) + validator = jsonschema.Draft202012Validator(schema, format_checker=_FORMAT_CHECKER) errors = list(validator.iter_errors(state_dict)) return len(errors) == 0