Changeset 129:423266f0b9e4


Ignore:
Timestamp:
Sep 2, 2013, 2:57:59 PM (7 years ago)
Author:
Stefano Rivera <stefano@…>
Branch:
default
rebase_source:
490af2bc764ca05541f20594a4240c77e9f021aa
Message:

Support inline lists, dicts, etc. And alternative top level objects

Location:
nagslang
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • nagslang/tests/test_yamlish.py

    r120 r129  
    4949        self.roundtrip({'foo': 'bar'})
    5050
     51    def test_simple_list(self):
     52        self.roundtrip(['foo', 'bar'])
     53
    5154    def test_dict_of_dicts(self):
    5255        self.roundtrip({'foo': {'bar': 'baz'}})
     
    6265        })
    6366
     67    def test_list_of_lists(self):
     68        self.roundtrip(['foo', ['bar', 'baz'], 'qux'])
     69
    6470    def test_dict_list(self):
    6571        self.roundtrip({
    6672            'foo': ['bar', 'baz'],
    6773        })
     74
     75    def test_list_dict(self):
     76        self.roundtrip([
     77            {'foo': 'bar'},
     78            {'baz': 'qux', 'quux': 'corge'},
     79        ])
    6880
    6981    def test_nested_lists(self):
     
    98110
    99111
     112class TestFromPyYAMLInlineLists(TestRoundTrip):
     113    def dump_s(self, data):
     114        if yaml is None:
     115            raise SkipTest('yaml module unavailable')
     116        return yaml.dump(data)
     117
     118
    100119class TestToPyYAML(TestRoundTrip):
    101120    def load_s(self, text):
  • nagslang/yamlish.py

    r121 r129  
    11'''
    22Serializer and dumper for a simple, YAMLish format (actually a YAML subset).
    3 The top level object is a dict.
     3The top level object is a dict or list.
    44lists and dicts can contain:
    55 * lists, dicts,
     
    8787    _spaces_re = re.compile(r'^(\s*)(.*)')
    8888    _list_re = re.compile(r'^(-\s+)(.*)')
    89     _dict_re = re.compile(r'^([^-:]+):\s?(.*)')
     89    _dict_re = re.compile(r'^((?![{[])[^-:]+):\s?(.*)')
     90    _inline_list_re = re.compile(r"^([^',]+|''|'.+?[^'](?:'')*')(?:, (.*))?$")
    9091
    9192    def __init__(self):
    9293        # Stack of (indent level, container object)
    93         self._stack = [(0, {})]
     94        self._stack = []
    9495        # When a dict's value is a nested block, remember the key
    9596        self._parent_key = None
     
    125126
    126127    def parse(self, yaml):
     128        if yaml.startswith(('[', '{')):
     129            return self._parse_value(yaml)
     130
     131        if yaml.startswith('-'):
     132            self._stack.append((0, []))
     133        else:
     134            self._stack.append((0, {}))
     135
    127136        for line in yaml.splitlines():
    128137            spaces, line = self._spaces_re.match(line).groups()
     
    181190        if value.startswith("'") and value.endswith("'"):
    182191            return value[1:-1]
     192        if value.startswith('[') and value.endswith(']'):
     193            value = value[1:-1]
     194            output = []
     195            while value:
     196                m = self._inline_list_re.match(value)
     197                assert m
     198                output.append(self._parse_value(m.group(1)))
     199                value = m.group(2)
     200            return output
     201        if value.startswith('{') and value.endswith('}'):
     202            value = value[1:-1]
     203            output = {}
     204            while value:
     205                key, value = value.split(': ', 1)
     206                m = self._inline_list_re.match(value)
     207                assert m
     208                output[key] = self._parse_value(m.group(1))
     209                value = m.group(2)
     210            return output
     211        if value.startswith('!!'):
     212            raise NotImplemented()
    183213        if value == 'true':
    184214            return True
Note: See TracChangeset for help on using the changeset viewer.