From a718a75b1387fb49125889a5be2e8a150ec30fe2 Mon Sep 17 00:00:00 2001 From: Jan Kowalleck Date: Thu, 16 Jul 2026 11:34:14 +0200 Subject: [PATCH 1/2] typing Signed-off-by: Jan Kowalleck --- tests/__init__.py | 23 ++++++++++++++++++++++- tests/test_syntax.py | 23 ++++++++--------------- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/tests/__init__.py b/tests/__init__.py index f282358..0e41d7c 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -1,4 +1,7 @@ +import json from pathlib import Path +from typing import TypedDict, Required, NotRequired + TESTS_ROOT_DIR = Path(__file__).parent TESTS_DATA_DIR = TESTS_ROOT_DIR / '_data' @@ -6,4 +9,22 @@ TESTS_DATA_FILES = { 'invalid_syntax': TESTS_DATA_DIR / 'invalid_syntax.json', 'valid_syntax': TESTS_DATA_DIR / 'valid_syntax.json', -} \ No newline at end of file +} + +class SyntaxCase(TypedDict): + value: Required[str] + reason: Required[str] + expect_lark: NotRequired[bool] + expect_regex: NotRequired[bool] + conforms_with_rfc3987_semantics: NotRequired[bool] + semantics_notes: NotRequired[str] + +T_syntax_file = dict[str, list[SyntaxCase]] + +def valid_syntax_data() -> T_syntax_file: + with open(TESTS_DATA_FILES['valid_syntax'], "r", encoding="utf-8") as f: + return json.load(f) + +def invalid_syntax_data() -> T_syntax_file: + with open(TESTS_DATA_FILES['invalid_syntax'], "r", encoding="utf-8") as f: + return json.load(f) \ No newline at end of file diff --git a/tests/test_syntax.py b/tests/test_syntax.py index df59181..e50a767 100644 --- a/tests/test_syntax.py +++ b/tests/test_syntax.py @@ -1,29 +1,21 @@ -from pathlib import Path -import json +from typing import TYPE_CHECKING + import pytest +from typing import Callable import rfc3987_syntax2 as sut -from . import TESTS_DATA_FILES - -def valid_syntax_data(): - with open(TESTS_DATA_FILES['valid_syntax'], "r", encoding="utf-8") as f: - return json.load(f) - +from . import valid_syntax_data, invalid_syntax_data, SyntaxCase, T_syntax_file -def invalid_syntax_data(): - with open(TESTS_DATA_FILES['invalid_syntax'], "r", encoding="utf-8") as f: - return json.load(f) - -def syntax_data_as_params(src_cb): +def syntax_data_as_params(src_cb: Callable[[], T_syntax_file]): for term, examples in src_cb().items(): for example in examples: yield pytest.param(term, example, id=f"{term}-{example['value']}") @pytest.mark.parametrize("term,valid_example", syntax_data_as_params(valid_syntax_data)) -def test_is_valid_syntax(term, valid_example): +def test_is_valid_syntax(term: str, valid_example: SyntaxCase) -> None: actual = sut.is_valid_syntax(term=term, value=valid_example["value"]) print("") print( @@ -33,8 +25,9 @@ def test_is_valid_syntax(term, valid_example): actual is True ), f"Failed term: {term} for '{valid_example['value']}' : {valid_example['reason']}" + @pytest.mark.parametrize("term,invalid_example", syntax_data_as_params(invalid_syntax_data)) -def test_not_is_valid_syntax(term, invalid_example): +def test_not_is_valid_syntax(term: str, invalid_example: SyntaxCase) -> None: actual = sut.is_valid_syntax(term=term, value=invalid_example["value"]) print("") print( From 0228e17fa1e4b02ccdf5da90fc6d57093d79a959 Mon Sep 17 00:00:00 2001 From: Jan Kowalleck Date: Thu, 16 Jul 2026 11:39:33 +0200 Subject: [PATCH 2/2] typing Signed-off-by: Jan Kowalleck --- pyproject.toml | 1 + tests/__init__.py | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index d810a91..43251d8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,6 +41,7 @@ Source = "https://github.com/jkowalleck/rfc3987-syntax2" [project.optional-dependencies] testing = [ + "typing_extensions>=4.16.0", "pytest>=8.3.5", ] diff --git a/tests/__init__.py b/tests/__init__.py index 0e41d7c..d6eb5d2 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -1,7 +1,7 @@ import json from pathlib import Path -from typing import TypedDict, Required, NotRequired - +from typing import TypedDict +from typing_extensions import Required, NotRequired TESTS_ROOT_DIR = Path(__file__).parent TESTS_DATA_DIR = TESTS_ROOT_DIR / '_data'