Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ test = [
"build>=1.2.0,<1.3",
"deepdiff>=8.0,<9.0",
"hypothesis>=6.0.0,<7",
"inline-snapshot>=0.29.4,<1",
"parameterized>=0.9.0,<0.10",
"pip>=24.0",
"pytest>=8.0.0,<9.0.0",
Expand Down
157 changes: 97 additions & 60 deletions tests/commands/test_plugins.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

from typing import TYPE_CHECKING

from inline_snapshot import snapshot
from variantlib.commands.main import main

if TYPE_CHECKING:
Expand All @@ -28,98 +29,134 @@ def test_plugins_get_all_configs(
mocked_entry_points: None,
) -> None:
main(["plugins", "get-configs", "--all"])
assert (
capsys.readouterr().out
== """\
test_namespace :: name1 :: val1a
test_namespace :: name1 :: val1b
test_namespace :: name1 :: val1c
test_namespace :: name1 :: val1d
test_namespace :: name2 :: val2a
test_namespace :: name2 :: val2b
test_namespace :: name2 :: val2c
second_namespace :: name3 :: val3a
second_namespace :: name3 :: val3b
second_namespace :: name3 :: val3c
incompatible_namespace :: flag1 :: on
incompatible_namespace :: flag2 :: on
incompatible_namespace :: flag3 :: on
incompatible_namespace :: flag4 :: on
"""
)
assert capsys.readouterr().out == snapshot("""\
test_namespace:
- name: name1
multi_value: false
values:
- val1a
- val1b
- val1c
- val1d
- name: name2
multi_value: true
values:
- val2a
- val2b
- val2c
second_namespace:
- name: name3
multi_value: false
values:
- val3a
- val3b
- val3c
incompatible_namespace:
- name: flag1
multi_value: false
values:
- on
- name: flag2
multi_value: false
values:
- on
- name: flag3
multi_value: false
values:
- on
- name: flag4
multi_value: false
values:
- on
""")


def test_plugins_get_all_configs_filter_namespace(
capsys: pytest.CaptureFixture[str],
mocked_entry_points: None,
) -> None:
main(["plugins", "get-configs", "--all", "-n", "second_namespace"])
assert (
capsys.readouterr().out
== """\
second_namespace :: name3 :: val3a
second_namespace :: name3 :: val3b
second_namespace :: name3 :: val3c
"""
)
assert capsys.readouterr().out == snapshot("""\
second_namespace:
- name: name3
multi_value: false
values:
- val3a
- val3b
- val3c
""")


def test_plugins_get_all_configs_filter_feature(
capsys: pytest.CaptureFixture[str],
mocked_entry_points: None,
) -> None:
main(["plugins", "get-configs", "--all", "-f", "name1"])
assert (
capsys.readouterr().out
== """\
test_namespace :: name1 :: val1a
test_namespace :: name1 :: val1b
test_namespace :: name1 :: val1c
test_namespace :: name1 :: val1d
"""
)
assert capsys.readouterr().out == snapshot("""\
test_namespace:
- name: name1
multi_value: false
values:
- val1a
- val1b
- val1c
- val1d
second_namespace: []
incompatible_namespace: []
""")


def test_plugins_get_supported_configs(
capsys: pytest.CaptureFixture[str],
mocked_entry_points: None,
) -> None:
main(["plugins", "get-configs", "--supported"])
assert (
capsys.readouterr().out
== """\
test_namespace :: name1 :: val1a
test_namespace :: name1 :: val1b
test_namespace :: name2 :: val2a
test_namespace :: name2 :: val2b
test_namespace :: name2 :: val2c
second_namespace :: name3 :: val3a
"""
)
assert capsys.readouterr().out == snapshot("""\
test_namespace:
- name: name1
multi_value: false
values:
- val1a
- val1b
- name: name2
multi_value: true
values:
- val2a
- val2b
- val2c
second_namespace:
- name: name3
multi_value: false
values:
- val3a
""")


def test_plugins_get_supported_configs_filter_namespace(
capsys: pytest.CaptureFixture[str],
mocked_entry_points: None,
) -> None:
main(["plugins", "get-configs", "--supported", "-n", "second_namespace"])
assert (
capsys.readouterr().out
== """\
second_namespace :: name3 :: val3a
"""
)
assert capsys.readouterr().out == snapshot("""\
second_namespace:
- name: name3
multi_value: false
values:
- val3a
""")


def test_plugins_get_supported_configs_filter_feature(
capsys: pytest.CaptureFixture[str],
mocked_entry_points: None,
) -> None:
main(["plugins", "get-configs", "--supported", "-f", "name1"])
assert (
capsys.readouterr().out
== """\
test_namespace :: name1 :: val1a
test_namespace :: name1 :: val1b
"""
)
assert capsys.readouterr().out == snapshot("""\
test_namespace:
- name: name1
multi_value: false
values:
- val1a
- val1b
second_namespace: []
""")
70 changes: 70 additions & 0 deletions uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

27 changes: 20 additions & 7 deletions variantlib/commands/plugins/get_configs.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
from typing import TYPE_CHECKING

from variantlib import __package_name__
from variantlib.models.variant import VariantProperty

if TYPE_CHECKING:
from variantlib.plugins.loader import BasePluginLoader
Expand Down Expand Up @@ -46,10 +45,24 @@ def get_configs(args: list[str], plugin_loader: BasePluginLoader) -> None:
if parsed_args.namespace not in (provider_cfg.namespace, None):
continue

for feature in provider_cfg.configs:
if parsed_args.feature not in (feature.name, None):
continue
matched_features = [
feature
for feature in provider_cfg.configs
if parsed_args.feature in (feature.name, None)
]

for value in feature.values:
vprop = VariantProperty(provider_cfg.namespace, feature.name, value)
sys.stdout.write(f"{vprop.to_str()}\n")
if matched_features:
sys.stdout.write(f"{provider_cfg.namespace}:\n")
for feature in provider_cfg.configs:
if parsed_args.feature not in (feature.name, None):
continue

sys.stdout.write(f" - name: {feature.name}\n")
sys.stdout.write(
f" multi_value: {str(feature.multi_value).lower()}\n"
)
sys.stdout.write(" values:\n")
for value in feature.values:
sys.stdout.write(f" - {value}\n")
else:
sys.stdout.write(f"{provider_cfg.namespace}: []\n")