Skip to content

Commit 1252a87

Browse files
authored
Merge branch 'main' into pre-commit-ci-update-config
2 parents da67220 + c3c8090 commit 1252a87

File tree

10 files changed

+198
-146
lines changed

10 files changed

+198
-146
lines changed

.github/dependabot.yml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
version: 2
2+
updates:
3+
- package-ecosystem: "github-actions"
4+
directory: "/"
5+
schedule:
6+
interval: "weekly"
7+
- package-ecosystem: "pip"
8+
directory: "/"
9+
schedule:
10+
interval: "weekly"
11+
group:
12+
docs:
13+
applies-to: version-updates

.github/workflows/build.yml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@ jobs:
1010
fail-fast: false
1111
matrix:
1212
python:
13-
- { VERSION: "3.8", TOXENV: "py38", ALLOW_FAILURE: false }
1413
- { VERSION: "3.9", TOXENV: "py39",ALLOW_FAILURE: false }
1514
- { VERSION: "3.10", TOXENV: "py310",ALLOW_FAILURE: false }
1615
- { VERSION: "3.11", TOXENV: "py311,pep8,pre-commit", ALLOW_FAILURE: false }
1716
- { VERSION: "3.12", TOXENV: "py312",ALLOW_FAILURE: false }
17+
- { VERSION: "3.13", TOXENV: "py313",ALLOW_FAILURE: false }
1818
- { VERSION: "pypy3.10", TOXENV: "pypy", ALLOW_FAILURE: false }
1919

2020
steps:
@@ -37,5 +37,3 @@ jobs:
3737
run: tox
3838
env:
3939
TOXENV: ${{ matrix.PYTHON.TOXENV }}
40-
GH_RECORD_MODE: "none"
41-
continue-on-error: ${{ matrix.PYTHON.ALLOW_FAILURE }}

.pre-commit-config.yaml

Lines changed: 34 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,36 @@
11
exclude: ^tests/fixtures/
22
repos:
3-
- repo: https://github.com/pre-commit/pre-commit-hooks
4-
rev: v5.0.0
5-
hooks:
6-
- id: check-yaml
7-
- id: debug-statements
8-
- id: end-of-file-fixer
9-
- id: trailing-whitespace
10-
- repo: https://github.com/asottile/reorder-python-imports
11-
rev: v3.15.0
12-
hooks:
13-
- id: reorder-python-imports
14-
args: [--application-directories, '.:src', --py38-plus]
15-
- repo: https://github.com/psf/black
16-
rev: 25.1.0
17-
hooks:
18-
- id: black
19-
- repo: https://github.com/asottile/pyupgrade
20-
rev: v3.20.0
21-
hooks:
22-
- id: pyupgrade
23-
args: [--py38-plus]
24-
- repo: https://github.com/pre-commit/mirrors-mypy
25-
rev: v1.15.0
26-
hooks:
27-
- id: mypy
28-
exclude: ^(docs/|tests/)
29-
- repo: https://github.com/jorisroovers/gitlint
30-
rev: v0.19.1
31-
hooks:
32-
- id: gitlint
33-
- repo: https://github.com/asottile/setup-cfg-fmt
34-
rev: v2.8.0
35-
hooks:
36-
- id: setup-cfg-fmt
37-
args: [--min-py3-version, '3.8']
3+
- repo: https://github.com/pre-commit/pre-commit-hooks
4+
rev: v5.0.0
5+
hooks:
6+
- id: check-yaml
7+
- id: debug-statements
8+
- id: end-of-file-fixer
9+
- id: trailing-whitespace
10+
- repo: https://github.com/PyCQA/isort
11+
rev: 6.0.1
12+
hooks:
13+
- id: isort
14+
- repo: https://github.com/psf/black
15+
rev: 25.1.0
16+
hooks:
17+
- id: black
18+
- repo: https://github.com/asottile/pyupgrade
19+
rev: v3.20.0
20+
hooks:
21+
- id: pyupgrade
22+
args: [--py39-plus]
23+
- repo: https://github.com/pre-commit/mirrors-mypy
24+
rev: v1.15.0
25+
hooks:
26+
- id: mypy
27+
exclude: ^(docs/|tests/)
28+
- repo: https://github.com/jorisroovers/gitlint
29+
rev: v0.19.1
30+
hooks:
31+
- id: gitlint
32+
- repo: https://github.com/asottile/setup-cfg-fmt
33+
rev: v2.8.0
34+
hooks:
35+
- id: setup-cfg-fmt
36+
args: [--min-py-version, '3.9']

pyproject.toml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
[tool.black]
22
line-length = 78
3-
target-version = ['py38']
4-
safe = true
3+
target-version = ['py39']
54
exclude = '''
65
(
76
/(
@@ -17,3 +16,8 @@ exclude = '''
1716
)/
1817
)
1918
'''
19+
20+
[tool.isort]
21+
profile = "black"
22+
line_length = 78
23+
force_single_line = true

setup.cfg

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,12 @@ project_urls =
2222

2323
[options]
2424
packages = find:
25-
python_requires = >=3.8
25+
python_requires = >=3.9
2626
include_package_data = True
2727

2828
[options.package_data]
2929
. = LICENSE, LICENSE.APACHE, LICENSE.BSD, AUTHORS.rst, HISTORY.rst
3030
uritemplate = py.typed
3131

32-
[bdist_wheel]
33-
universal = 1
34-
3532
[mypy]
3633
strict = True

tests/test_from_fixtures.py

Lines changed: 48 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,116 +1,136 @@
11
import json
22
import os.path
3+
import typing as t
34

45
import uritemplate
56

67

7-
def fixture_file_path(filename):
8+
def fixture_file_path(filename: str) -> str:
89
absolute_dir = os.path.abspath(os.path.dirname(__file__))
910
filename = filename + ".json"
1011
return os.path.join(absolute_dir, "fixtures", filename)
1112

1213

13-
def load_examples(filename):
14+
ExampleVariables = uritemplate.variable.VariableValueDict
15+
ExampleTemplatesAndResults = t.List[t.Tuple[str, t.Union[str, t.List[str]]]]
16+
17+
18+
class ExampleWithVariables(t.TypedDict):
19+
variables: ExampleVariables
20+
testcases: ExampleTemplatesAndResults
21+
22+
23+
Examples = t.Dict[str, ExampleWithVariables]
24+
25+
26+
def load_examples(filename: str) -> Examples:
1427
path = fixture_file_path(filename)
1528
with open(path, encoding="utf-8") as examples_file:
16-
examples = json.load(examples_file)
29+
examples = t.cast(Examples, json.load(examples_file))
1730
return examples
1831

1932

20-
def expected_set(expected):
33+
def expected_set(expected: t.Union[t.List[str], str]) -> t.Set[str]:
2134
if isinstance(expected, list):
2235
return set(expected)
2336
return {expected}
2437

2538

2639
class FixtureMixin:
27-
def _get_test(self, section):
28-
test = self.examples.get(section, {})
29-
return test.get("variables", {}), test.get("testcases", [])
30-
31-
def _test(self, testname):
40+
examples: Examples
41+
42+
def _get_test(
43+
self, section: str
44+
) -> t.Tuple[ExampleVariables, ExampleTemplatesAndResults]:
45+
test = t.cast(ExampleWithVariables, self.examples.get(section, {}))
46+
return (
47+
t.cast(ExampleVariables, test.get("variables", {})),
48+
t.cast(ExampleTemplatesAndResults, test.get("testcases", [])),
49+
)
50+
51+
def _test(self, testname: str) -> None:
3252
variables, testcases = self._get_test(testname)
3353
for template, expected in testcases:
34-
expected = expected_set(expected)
54+
expected_templates = expected_set(expected)
3555
expanded = uritemplate.expand(template, variables)
36-
assert expanded in expected
56+
assert expanded in expected_templates
3757

3858

3959
class TestSpecExamples(FixtureMixin):
4060
examples = load_examples("spec-examples")
4161

42-
def test_level_1(self):
62+
def test_level_1(self) -> None:
4363
"""Check that uritemplate.expand matches Level 1 expectations."""
4464
self._test("Level 1 Examples")
4565

46-
def test_level_2(self):
66+
def test_level_2(self) -> None:
4767
"""Check that uritemplate.expand matches Level 2 expectations."""
4868
self._test("Level 2 Examples")
4969

50-
def test_level_3(self):
70+
def test_level_3(self) -> None:
5171
"""Check that uritemplate.expand matches Level 3 expectations."""
5272
self._test("Level 3 Examples")
5373

54-
def test_level_4(self):
74+
def test_level_4(self) -> None:
5575
"""Check that uritemplate.expand matches Level 4 expectations."""
5676
self._test("Level 4 Examples")
5777

5878

5979
class TestSpecExamplesByRFCSection(FixtureMixin):
6080
examples = load_examples("spec-examples-by-section")
6181

62-
def test_variable_expansion(self):
82+
def test_variable_expansion(self) -> None:
6383
"""Check variable expansion."""
6484
self._test("3.2.1 Variable Expansion")
6585

66-
def test_simple_string_expansion(self):
86+
def test_simple_string_expansion(self) -> None:
6787
"""Check simple string expansion."""
6888
self._test("3.2.2 Simple String Expansion")
6989

70-
def test_reserved_expansion(self):
90+
def test_reserved_expansion(self) -> None:
7191
"""Check reserved expansion."""
7292
self._test("3.2.3 Reserved Expansion")
7393

74-
def test_fragment_expansion(self):
94+
def test_fragment_expansion(self) -> None:
7595
"""Check fragment expansion."""
7696
self._test("3.2.4 Fragment Expansion")
7797

78-
def test_dot_prefixed_label_expansion(self):
98+
def test_dot_prefixed_label_expansion(self) -> None:
7999
"""Check label expansion with dot-prefix."""
80100
self._test("3.2.5 Label Expansion with Dot-Prefix")
81101

82-
def test_path_segment_expansion(self):
102+
def test_path_segment_expansion(self) -> None:
83103
"""Check path segment expansion."""
84104
self._test("3.2.6 Path Segment Expansion")
85105

86-
def test_path_style_parameter_expansion(self):
106+
def test_path_style_parameter_expansion(self) -> None:
87107
"""Check path-style param expansion."""
88108
self._test("3.2.7 Path-Style Parameter Expansion")
89109

90-
def test_form_style_query_expansion(self):
110+
def test_form_style_query_expansion(self) -> None:
91111
"""Check form-style query expansion."""
92112
self._test("3.2.8 Form-Style Query Expansion")
93113

94-
def test_form_style_query_cntinuation(self):
114+
def test_form_style_query_cntinuation(self) -> None:
95115
"""Check form-style query continuation."""
96116
self._test("3.2.9 Form-Style Query Continuation")
97117

98118

99119
class TestExtendedTests(FixtureMixin):
100120
examples = load_examples("extended-tests")
101121

102-
def test_additional_examples_1(self):
122+
def test_additional_examples_1(self) -> None:
103123
"""Check Additional Examples 1."""
104124
self._test("Additional Examples 1")
105125

106-
def test_additional_examples_2(self):
126+
def test_additional_examples_2(self) -> None:
107127
"""Check Additional Examples 2."""
108128
self._test("Additional Examples 2")
109129

110-
def test_additional_examples_3(self):
130+
def test_additional_examples_3(self) -> None:
111131
"""Check Additional Examples 3."""
112132
self._test("Additional Examples 3: Empty Variables")
113133

114-
def test_additional_examples_4(self):
134+
def test_additional_examples_4(self) -> None:
115135
"""Check Additional Examples 4."""
116136
self._test("Additional Examples 4: Numeric Keys")

0 commit comments

Comments
 (0)