Skip to content
This repository has been archived by the owner on Nov 9, 2017. It is now read-only.

Commit

Permalink
Fix looping over string of space-separated words
Browse files Browse the repository at this point in the history
  • Loading branch information
bkabrda committed Oct 10, 2013
1 parent 19e2e43 commit a9292e5
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 11 deletions.
39 changes: 28 additions & 11 deletions devassistant/yaml_assistant.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import functools
import logging
import os
import sys

from devassistant import argument
from devassistant import assistant_base
Expand All @@ -27,6 +28,9 @@ def inner(self, *args, **kwargs):

return inner

if sys.version_info[0] > 2:
basestring = str

class YamlAssistant(assistant_base.AssistantBase, loaded_yaml.LoadedYaml):
def __init__(self, name, parsed_yaml, path, fully_loaded=True, role='crt'):
self.name = name
Expand Down Expand Up @@ -296,17 +300,7 @@ def _run_one_section(self, section, kwargs):
skip_else = False
elif comm_type.startswith('for'):
# syntax: "for $i in $x: <section> or "for $i in cl_command: <section>"
try:
control_var, expression = self._parse_for(comm_type)
except exceptions.YamlSyntaxError as e:
logger.error(e)
raise e
try:
eval_expression = self._evaluate(expression, **kwargs)[1]
except exceptions.YamlSyntaxError as e:
logger.log(e)
raise e

control_var, eval_expression = self._get_for_control_var_and_eval_expr(comm_type, **kwargs)
for i in eval_expression:
kwargs[control_var] = i
self._run_one_section(comm, kwargs)
Expand Down Expand Up @@ -352,6 +346,29 @@ def _parse_for(self, control_line, **kwargs):

return (control_var, for_parts[3])

def _get_for_control_var_and_eval_expr(self, comm_type, **kwargs):
"""Returns tuple that consists of control variable name and iterable that is result
of evaluated expression of given for loop.
For example:
- given 'for $i in $(echo "foo bar")' it returns ('i', ['foo', 'bar'])
"""
try:
control_var, expression = self._parse_for(comm_type)
except exceptions.YamlSyntaxError as e:
logger.error(e)
raise e
try:
eval_expression = self._evaluate(expression, **kwargs)[1]
except exceptions.YamlSyntaxError as e:
logger.log(e)
raise e

iterval = []
if isinstance(eval_expression, basestring):
iterval = eval_expression.split()
return control_var, iterval

def _get_section_from_condition(self, if_section, else_section=None, **kwargs):
"""Returns section that should be used from given if/else sections by evaluating given condition.
Expand Down
11 changes: 11 additions & 0 deletions test/test_yaml_assistant.py
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,17 @@ def test_default_icon_path(self):
self.ya.path = os.path.join(settings.DATA_DIRECTORIES[0], 'assistants/crt/bar/baz.yaml')
assert self.ya.default_icon_path == os.path.join(settings.DATA_DIRECTORIES[0], 'icons/crt/bar/baz.svg')

def test_loop_empty_string(self):
self.ya._run = [{'for $i in $(echo "")': [{'log_i': '$i'}]}]
self.ya.run()
assert 'INFO' not in map(lambda x: x[0], self.tlh.msgs)

def test_loop_words(self):
self.ya._run = [{'for $i in $(echo "foo bar")': [{'log_i': '$i'}]}]
self.ya.run()
assert ('INFO', 'foo') in self.tlh.msgs
assert ('INFO', 'bar') in self.tlh.msgs


class TestExpressions(TestYamlAssistant):
def test_assign_existing_nonempty_variable(self):
Expand Down

0 comments on commit a9292e5

Please sign in to comment.