Skip to content

Commit f2e86eb

Browse files
committed
Variant Typing
1 parent ceeafe8 commit f2e86eb

9 files changed

Lines changed: 224 additions & 174 deletions

File tree

cppython/test/data/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
"""Data for testing plugins"""

cppython/test/data/mocks.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
"""Mocked types and data for testing plugins"""
2+
3+
from collections.abc import Sequence
4+
5+
from cppython.core.plugin_schema.generator import Generator
6+
from cppython.core.plugin_schema.provider import Provider
7+
from cppython.core.plugin_schema.scm import SCM
8+
from cppython.test.mock.generator import MockGenerator
9+
from cppython.test.mock.provider import MockProvider
10+
from cppython.test.mock.scm import MockSCM
11+
12+
13+
def _mock_provider_list() -> Sequence[type[Provider]]:
14+
"""Mocked list of providers
15+
16+
Returns:
17+
A list of mock providers
18+
"""
19+
variants = []
20+
21+
# Default
22+
variants.append(MockProvider)
23+
24+
return variants
25+
26+
27+
def _mock_generator_list() -> Sequence[type[Generator]]:
28+
"""Mocked list of generators
29+
30+
Returns:
31+
List of mock generators
32+
"""
33+
variants = []
34+
35+
# Default
36+
variants.append(MockGenerator)
37+
38+
return variants
39+
40+
41+
def _mock_scm_list() -> Sequence[type[SCM]]:
42+
"""Mocked list of SCMs
43+
44+
Returns:
45+
List of mock SCMs
46+
"""
47+
variants = []
48+
49+
# Default
50+
variants.append(MockSCM)
51+
52+
return variants
53+
54+
55+
provider_variants = _mock_provider_list()
56+
generator_variants = _mock_generator_list()
57+
scm_variants = _mock_scm_list()

cppython/test/data/variants.py

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
"""Data definitions"""
2+
3+
from pathlib import Path
4+
5+
from cppython.core.schema import (
6+
CPPythonGlobalConfiguration,
7+
CPPythonLocalConfiguration,
8+
PEP621Configuration,
9+
ProjectConfiguration,
10+
)
11+
from cppython.test.schema import Variant, Variants
12+
13+
14+
def _pep621_configuration_list() -> Variants[PEP621Configuration]:
15+
"""Creates a list of mocked configuration types
16+
17+
Returns:
18+
A list of variants to test
19+
"""
20+
data = Variants[PEP621Configuration]()
21+
22+
# Default
23+
default = PEP621Configuration(name='default-test', version='1.0.0')
24+
default_variant = Variant[PEP621Configuration](configuration=default)
25+
26+
data.variants.append(default_variant)
27+
28+
return data
29+
30+
31+
def _cppython_local_configuration_list() -> Variants[CPPythonLocalConfiguration]:
32+
"""Mocked list of local configuration data
33+
34+
Returns:
35+
A list of variants to test
36+
"""
37+
data = Variants[CPPythonLocalConfiguration]()
38+
39+
# Default
40+
default = CPPythonLocalConfiguration()
41+
default_variant = Variant[CPPythonLocalConfiguration](configuration=default)
42+
43+
data.variants.append(default_variant)
44+
45+
return data
46+
47+
48+
def _cppython_global_configuration_list() -> Variants[CPPythonGlobalConfiguration]:
49+
"""Mocked list of global configuration data
50+
51+
Returns:
52+
A list of variants to test
53+
"""
54+
data = Variants[CPPythonGlobalConfiguration]()
55+
56+
# Default
57+
default = CPPythonGlobalConfiguration()
58+
default_variant = Variant[CPPythonGlobalConfiguration](configuration=default)
59+
60+
# Check off
61+
check_off_data = {'current-check': False}
62+
check_off = CPPythonGlobalConfiguration(**check_off_data)
63+
check_off_variant = Variant[CPPythonGlobalConfiguration](configuration=check_off)
64+
65+
data.variants.append(default_variant)
66+
data.variants.append(check_off_variant)
67+
68+
return data
69+
70+
71+
def _project_configuration_list() -> Variants[ProjectConfiguration]:
72+
"""Mocked list of project configuration data
73+
74+
Returns:
75+
A list of variants to test
76+
"""
77+
data = Variants[ProjectConfiguration]()
78+
79+
# NOTE: pyproject_file will be overridden by fixture
80+
81+
# Default
82+
default = ProjectConfiguration(pyproject_file=Path('pyproject.toml'), version='0.1.0')
83+
default_variant = Variant[ProjectConfiguration](configuration=default)
84+
85+
data.variants.append(default_variant)
86+
87+
return data
88+
89+
90+
pep621_variants = _pep621_configuration_list()
91+
cppython_local_variants = _cppython_local_configuration_list()
92+
cppython_global_variants = _cppython_global_configuration_list()
93+
project_variants = _project_configuration_list()

cppython/test/pytest/shared.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,12 @@
2727
ProjectConfiguration,
2828
ProjectData,
2929
)
30-
from cppython.test.pytest.variants import (
30+
from cppython.test.data.mocks import (
3131
generator_variants,
3232
provider_variants,
3333
scm_variants,
3434
)
35+
from cppython.test.schema import Variant
3536

3637

3738
class BaseTests[T: Plugin](metaclass=ABCMeta):
@@ -130,7 +131,7 @@ class BaseUnitTests[T: Plugin](BaseTests[T], metaclass=ABCMeta):
130131
"""Unit testing information for all plugin test classes"""
131132

132133
@staticmethod
133-
def test_feature_extraction(plugin_type: type[T], project_configuration: ProjectConfiguration) -> None:
134+
def test_feature_extraction(plugin_type: type[T], project_configuration: Variant[ProjectConfiguration]) -> None:
134135
"""Test the feature extraction of a plugin.
135136
136137
This method tests the feature extraction functionality of a plugin by asserting that the features
@@ -140,7 +141,7 @@ def test_feature_extraction(plugin_type: type[T], project_configuration: Project
140141
plugin_type: The type of plugin to test.
141142
project_configuration: The project configuration to use for testing.
142143
"""
143-
assert plugin_type.features(project_configuration.pyproject_file.parent)
144+
assert plugin_type.features(project_configuration.configuration.pyproject_file.parent)
144145

145146
@staticmethod
146147
def test_information(plugin_type: type[T]) -> None:

cppython/test/pytest/variants.py

Lines changed: 0 additions & 131 deletions
This file was deleted.

cppython/test/schema.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
"""Data schemas for plugin testing"""
2+
3+
from typing import Annotated
4+
5+
from pydantic import Field
6+
7+
from cppython.core.schema import CPPythonModel
8+
9+
10+
class Variant[T: CPPythonModel](CPPythonModel):
11+
"""A configuration variant for a schema type"""
12+
13+
configuration: Annotated[T, Field(description='The configuration data')]
14+
15+
16+
class Variants[T: CPPythonModel](CPPythonModel):
17+
"""A group of variants"""
18+
19+
variants: Annotated[list[Variant[T]], Field(description='Data variants')] = []

0 commit comments

Comments
 (0)