Ignore:
Timestamp:
09/02/13 14:57:59 (8 years ago)
Author:
Stefano Rivera <stefano@…>
Branch:
default
Phase:
public
Rebase:
34393061663262633736346361303535343166323035393461343234306337376539663032316161
Message:

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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.