Skip to content

Commit

Permalink
translators.yaml: Fix keys rendering in nested lists and lists/dicts
Browse files Browse the repository at this point in the history
  • Loading branch information
glorpen committed Mar 6, 2020
1 parent 3dff393 commit 27e2687
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 9 deletions.
Empty file.
17 changes: 17 additions & 0 deletions src/glorpen/config/tests/translators/yaml.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import unittest
import yaml

from glorpen.config.fields.simple import Dict, List, Any
from glorpen.config.translators.yaml import YamlRenderer

class YamlRendererTest(unittest.TestCase):
def test_dict_nested_in_list(self):
f = Dict({
"a-dict": List(
Dict({'a':Any().help(value=1), 'i':Any().help(value=1)}),
)
})

out_str = YamlRenderer().render(f.help_config)
out = yaml.safe_load(out_str)
self.assertEqual(out, {'a-dict':[{'a': 1, 'i': 1}]})
39 changes: 30 additions & 9 deletions src/glorpen/config/translators/yaml.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
from glorpen.config.translators.base import Renderer, Reader
from io import StringIO

# TODO: comment all but first variants, key alternatives
# TODO: comment char at line start?

class YamlRenderer(Renderer):
def reset(self):
self._data = StringIO()
Expand All @@ -26,28 +29,41 @@ def render_value(self, value):
ret_v = ret_v[:-4].strip()
return ret_v

def render_current_parent_key(self):
k = self._key[-1]
def render_key(self, k):
if k is None:
return '- '
else:
return f'{k}: '

def render_current_parent_key(self):
return self.render_key(self._key[-1])

def get_current_nested_lists_count(self):
return len(list(itertools.takewhile(lambda x: x is None, reversed(self._key))))
def get_current_keys_until_main_list_start(self):
ret = list(reversed(list(itertools.takewhile(lambda x: x is None, reversed(self._key[0:-1])))))
if ret:
ret.append(self._key[-1])
else:
if len(self._key) == 1 and self._key[0] is None:
ret.append(None)

return ret

def get_current_container(self):
return self._parent_containers[-1] if self._parent_containers else None

def render_value_as_variant(self, value, comment=''):
z = -1
# when in nested list item, parent key list is on same line
key_repeat_count = 1
if self._first_list_item:
key_repeat_count = self.get_current_nested_lists_count()
z = z - key_repeat_count + 1
# it could be nested list or hash in a list
# so handle laying multiple keys in one line
keys = self.get_current_keys_until_main_list_start()
keys_prefix = "".join(self.render_key(i) for i in keys)
z = z - len(keys) + 1
else:
keys_prefix = self.render_current_parent_key()

return self.padding(z) + (self.render_current_parent_key() * key_repeat_count) + self.render_value(value) + comment + '\n'
return self.padding(z) + keys_prefix + self.render_value(value) + comment + '\n'


def visit_node(self, node):
Expand Down Expand Up @@ -107,8 +123,13 @@ def visit_container_list(self, node):
self._data.write(self.padding(-1) + self.render_current_parent_key() + "\n")

def visit_container_hash(self, node):
if self._key:
if self._key and self._key[-1] is not None:
self._data.write(self.padding(-1) + self.render_current_parent_key() + "\n")

# def visit_any(self, tag, node, *args):
# self._data.write(f"<{tag}>\n")
# def leave_any(self, tag, node, *args):
# self._data.write(f"</{tag}>\n")

class YamlReader(Reader):
def __init__(self, path):
Expand Down

0 comments on commit 27e2687

Please sign in to comment.