From e72f89afdf090b16aa1b58551616ab186ab6c194 Mon Sep 17 00:00:00 2001 From: Petr Nymsa Date: Wed, 8 Jan 2020 23:11:13 +0100 Subject: [PATCH] func placeholder should delegate its arguments to function --- jdog/parser.py | 16 ++++++++-------- jdog/placeholder/placeholder.py | 21 ++++++++++----------- tests/test_node.py | 2 +- tests/test_parser.py | 1 + 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/jdog/parser.py b/jdog/parser.py index 7857c5b..159b67c 100644 --- a/jdog/parser.py +++ b/jdog/parser.py @@ -80,23 +80,23 @@ def __init__(self, lang='en-US', strict=False): SchemeParser.LAST_NAME: lambda token, args: self._placeholder_last_name(token, args), SchemeParser.CITY: - lambda token, _: FuncStrPlaceholder(token, self.faker.city), + lambda token, _: FuncStrPlaceholder(token, _, lambda __: self.faker.city), SchemeParser.STREET_ADDRESS: - lambda token, _: FuncStrPlaceholder(token, self.faker.street_address), + lambda token, _: FuncStrPlaceholder(token, _, lambda __: self.faker.street_address), SchemeParser.AGE: - lambda token, _: FuncPlaceholder(token, lambda: random.randint(1, 99)), + lambda token, _: FuncPlaceholder(token, _, lambda __: random.randint(1, 99)), SchemeParser.NUMBER: - lambda token, args: FuncPlaceholder(token, lambda: random.randint(int(args[0]), int(args[1]) - 1)), + lambda token, args: FuncPlaceholder(token, args, lambda xargs: random.randint(int(xargs[0]), int(xargs[1]) - 1)), SchemeParser.LOREM: - lambda token, args: FuncStrPlaceholder(token, lambda: self.faker.sentence(nb_words=int(args[0]))), + lambda token, args: FuncStrPlaceholder(token, args, lambda xargs: self.faker.sentence(nb_words=int(xargs[0]))), SchemeParser.OPTION: lambda token, args: OptionPlaceholder(token, args), SchemeParser.EMPTY: - lambda token, _: FuncStrPlaceholder(token, lambda: ''), + lambda token, _: FuncStrPlaceholder(token, _, lambda __: ''), SchemeParser.RANGE: lambda token, args: RangePlaceholder(token, args), SchemeParser.BOOL: - lambda token, _: FuncStrPlaceholder(token, lambda: str(random.random() > 0.5).lower()) + lambda token, _: FuncStrPlaceholder(token, _, lambda __: str(random.random() > 0.5).lower()) } def _placeholder_name(self, token, args): @@ -214,7 +214,7 @@ def _sub_parse(self, sub): def parse(self, scheme): """ Parse given scheme and return node structure representation of the scheme. - + :param str scheme: Scheme to parse :return: Node structure representing current scheme """ diff --git a/jdog/placeholder/placeholder.py b/jdog/placeholder/placeholder.py index 919d9d3..228984d 100644 --- a/jdog/placeholder/placeholder.py +++ b/jdog/placeholder/placeholder.py @@ -3,7 +3,7 @@ class Placeholder: Base class for placeholders. :var str full_name: - :var list arguments: Argument for placeholder + :var list arguments: Arguments for placeholder """ def __init__(self, full_name, arguments): @@ -17,23 +17,22 @@ def exec(self): def __str__(self): return f"{self.full_name} {self.arguments}" -# todo FIX: func placeholder should take argument and then pass it to func(...) - class FuncPlaceholder(Placeholder): """ Represents placeholder which takes function to execute later. Returned value is fully determined by func itself. - :var func func: Function to execute. Takes no arguments.TODO + :var func func: Function to execute. Takes provided arguments from placeholder. + :var list args: Parsed arguments as list """ - def __init__(self, full_name, func): - super().__init__(full_name, []) + def __init__(self, full_name, args, func): + super().__init__(full_name, args) self.func = func def exec(self): """Executes func and return its returned value""" - return self.func() + return self.func(self.arguments) class FuncStrPlaceholder(FuncPlaceholder): @@ -41,11 +40,11 @@ class FuncStrPlaceholder(FuncPlaceholder): Represents placeholder which takes function to execute later. The returned value is enclosed with double quotes to denote JSON string value. - :var func func: Function to execute. Takes no arguments.TODO + :var func func: Function to execute. Takes provided arguments from placeholder. """ - def __init__(self, full_name, func): - super().__init__(full_name, func) + def __init__(self, full_name, args, func): + super().__init__(full_name, args, func) def exec(self): """Executes func and return its value enclosed as string""" - return f'"{self.func()}"' + return f'"{self.func(self.arguments)}"' diff --git a/tests/test_node.py b/tests/test_node.py index 9f25309..1062ce3 100644 --- a/tests/test_node.py +++ b/tests/test_node.py @@ -53,7 +53,7 @@ def test_array(): def test_placeholder(): - pl = jph.FuncStrPlaceholder('ff', lambda: 'test_value') + pl = jph.FuncStrPlaceholder('ff', [], lambda _: 'test_value') node = jn.PlaceholderNode(pl) assert node.exec() == '"test_value"' diff --git a/tests/test_parser.py b/tests/test_parser.py index f4cedcf..a92175a 100644 --- a/tests/test_parser.py +++ b/tests/test_parser.py @@ -35,3 +35,4 @@ def test_option_nested(monkeypatch): assert res == '{"value":"foo"}' or res == '{"value":1}' +# todo test other default placeholders