Skip to content
Merged
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
4 changes: 4 additions & 0 deletions src/snakemake_interface_common/plugin_registry/plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -335,6 +335,10 @@ def _get_prefixed_name(self, field_name: str) -> str:
def _parse_type(self, thefield: Field, value: Any, thetype: Any) -> Any:
def apply_type(value: Any, thetype: Any) -> Any:
try:
if typing.get_origin(thetype) is list:
thetype = typing.get_args(thetype)[0]
if isinstance(value, list) and thetype is not list:
return [thetype(item) for item in value]
return thetype(value)
except Exception as e:
raise WorkflowError(
Expand Down
33 changes: 31 additions & 2 deletions tests/tests.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from dataclasses import dataclass
from typing import Optional
from dataclasses import dataclass, field
from typing import List, Optional
import pytest

from snakemake_interface_common import at_least_snakemake_version
Expand Down Expand Up @@ -140,6 +140,35 @@ def __init__(self):
assert settings.optional_int is None


@dataclass
class ListSettings(SettingsBase):
mounts: Optional[List[str]] = field(
default=None, metadata={"help": "mounts", "nargs": "+"}
)
ints: List[int] = field(
default_factory=list, metadata={"help": "ints", "nargs": "+"}
)


class ListPlugin(TestPlugin):
@property
def settings_cls(self):
return ListSettings


@pytest.mark.parametrize(
"mounts, ints", [(["/a:/a", "/b:/b"], [1, 2]), (["/a:/a"], ["1", "2"])]
)
def test_settings_list_nargs(mounts, ints):
class MockArgs:
test_mounts = mounts
test_ints = ints

settings = ListPlugin().get_settings(MockArgs())
assert settings.mounts == mounts
assert settings.ints == [1, 2]


def test_access_pattern_str():
from snakemake_interface_common.io import AccessPattern

Expand Down
Loading