Skip to content

Commit

Permalink
func placeholder should delegate its arguments to function
Browse files Browse the repository at this point in the history
  • Loading branch information
petrnymsa committed Jan 8, 2020
1 parent 5680d45 commit e72f89a
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 20 deletions.
16 changes: 8 additions & 8 deletions jdog/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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
"""
Expand Down
21 changes: 10 additions & 11 deletions jdog/placeholder/placeholder.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -17,35 +17,34 @@ 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):
"""
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)}"'
2 changes: 1 addition & 1 deletion tests/test_node.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"'

Expand Down
1 change: 1 addition & 0 deletions tests/test_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,4 @@ def test_option_nested(monkeypatch):

assert res == '{"value":"foo"}' or res == '{"value":1}'

# todo test other default placeholders

0 comments on commit e72f89a

Please sign in to comment.