Skip to content

Commit 3bee5e1

Browse files
committed
adds support for getitems in argstring formatting
1 parent b6db19b commit 3bee5e1

File tree

2 files changed

+22
-6
lines changed

2 files changed

+22
-6
lines changed

pydra/engine/helpers.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -649,12 +649,9 @@ def argstr_formatting(argstr, inputs, value_updates=None):
649649
if value_updates:
650650
inputs_dict.update(value_updates)
651651
# getting all fields that should be formatted, i.e. {field_name}, ...
652-
inp_fields = re.findall(r"{\w+}", argstr)
653-
inp_fields_float = re.findall(r"{\w+:[0-9.]+f}", argstr)
654-
inp_fields += [re.sub(":[0-9.]+f", "", el) for el in inp_fields_float]
652+
inp_fields = re.findall(r"{(\w+)(?::[0-9.]+f|\[[\w]+\])?}", argstr)
655653
val_dict = {}
656-
for fld in inp_fields:
657-
fld_name = fld[1:-1] # extracting the name form {field_name}
654+
for fld_name in inp_fields:
658655
fld_value = inputs_dict[fld_name]
659656
fld_attr = getattr(attrs.fields(type(inputs)), fld_name)
660657
if fld_value is attr.NOTHING or (

pydra/engine/tests/test_helpers.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import random
55
import platform
66
import pytest
7+
import attrs
78
import cloudpickle as cp
89
from unittest.mock import Mock
910
from fileformats.generic import Directory, File
@@ -15,9 +16,9 @@
1516
load_and_run,
1617
position_sort,
1718
parse_copyfile,
19+
argstr_formatting,
1820
)
1921
from ...utils.hash import hash_function
20-
from .. import helpers_file
2122
from ..core import Workflow
2223

2324

@@ -311,3 +312,21 @@ def mock_field(copyfile):
311312
parse_copyfile(mock_field((1, 2)))
312313
with pytest.raises(TypeError, match="Unrecognised type for collation copyfile"):
313314
parse_copyfile(mock_field((Mode.copy, 2)))
315+
316+
317+
def test_argstr_formatting():
318+
@attrs.define
319+
class Inputs:
320+
a1_field: str
321+
b2_field: float
322+
c3_field: dict[str, str]
323+
d4_field: list[str]
324+
325+
inputs = Inputs("1", 2.0, {"c": "3"}, ["4"])
326+
assert (
327+
argstr_formatting(
328+
"{a1_field} {b2_field:02f} -test {c3_field[c]} -me {d4_field[0]}",
329+
inputs,
330+
)
331+
== "1 2.000000 -test 3 -me 4"
332+
)

0 commit comments

Comments
 (0)