def test_parse_one_level(self):
        data = """\
... one
    # Comment on two
... two
*** line with some data
... three
"""
        parser = TreeParser(data)
        assert parser._text_generated() == """\
... one
    # Comment on two
... two
*** line with some data
... three
... ~end-marker~
"""
        assert parser.as_nested_list == ['one', '# Comment on two', 'two',
                                         'line with some data', 'three']
        ##pprint(parser.as_json)
        assert parser.as_json == {
            '_leaves': ['one', 'three', 'two', 'z-2cf54f23'],
            '_root': {'members': ['one', 'two', 'z-2cf54f23', 'three']},
            '_tree': [u'... one',
                      '    # Comment on two',
                      '... two',
                      '*** line with some data',
                      '... three'],
            'one': {'groups': ['_root']},
            'three': {'groups': ['_root']},
            'two': {'comments': ['# Comment on two'], 'groups': ['_root']},
            'z-2cf54f23': {'data': 'line with some data', 'groups': ['_root']}
        }
        assert parser.as_tree == data
    def test_parse_one_level_initial_indent(self):
        # Blank line is ignored
        data = """\
    ... one
    ... two

    ... three
"""
        parser = TreeParser(data)
        assert parser._text_generated() == """\
    ... one
    ... two
    ... three
    ... ~end-marker~
"""
        assert parser.as_nested_list == ['one', 'two', 'three']
        # No need to keep the initial indent in the data
        assert parser.as_tree == """\
... one
... two
... three
"""
        print("+++++++++++++++++++++++++++++++++++++++++++++++++")
        pprint(parser.as_json)
        assert parser.as_json == {
            u'_leaves': [u'one', u'three', u'two'],
            u'_root': {u'members': [u'one', u'two', u'three']},
            u'_tree': [u'... one', u'... two', u'... three'],
            u'one': {u'groups': [u'_root']},
            u'three': {u'groups': [u'_root']},
            u'two': {u'groups': [u'_root']}
        }
    def test_parse_to_nested_list(self):
        data = """\
... one
    ... alpha
... two
    ... beta
        ... beta_01
    ... gamma
... three
    ... delta
... four
"""
        parser = TreeParser(data)
        assert parser._text_generated() == """\
... one
    ... alpha
... two
    ... beta
        ... beta_01
    ... gamma
... three
    ... delta
... four
... ~end-marker~
"""
        assert parser.as_nested_list == [
            'one', ['alpha'],
            'two', ['beta', ['beta_01'], 'gamma'],
            'three', ['delta'],
            'four'
        ]
        ##print("+=" * 35)
        ##pprint(parser.as_json)
        assert parser.as_json == {
            '_leaves': ['alpha', 'beta_01', 'delta', 'four', 'gamma'],
            '_root': {'members': ['one', 'two', 'three', 'four']},
            '_tree': ['... one',
                      '    ... alpha',
                      '... two',
                      '    ... beta',
                      '        ... beta_01',
                      '    ... gamma',
                      '... three',
                      '    ... delta',
                      '... four'],
            'alpha': {'groups': ['one']},
            'beta': {'groups': ['two'], 'members': ['beta_01']},
            'beta_01': {'groups': ['beta']},
            'delta': {'groups': ['three']},
            'four': {'groups': ['_root']},
            'gamma': {'groups': ['two']},
            'one': {'groups': ['_root'], 'members': ['alpha']},
            'three': {'groups': ['_root'], 'members': ['delta']},
            'two': {'groups': ['_root'], 'members': ['beta', 'gamma']},
        }
        assert parser.as_tree == data
    def load(cls, data, data_format='tree'):
        """Load riders, ponies and latches from text file in the chosen
        format. Acceptable formats:
            json
            tree
            # bson
            # xml
        """
        cls.validate_format(data_format)

        if data_format == 'tree':
            parser = TreeParser(data)
            json_dict = parser.to_json()
            meta_data_list = json_dict['doc']['members']
            meta_data_dict = {} # TO-DO Dictionary comprehension
            for meta_data in meta_data_list:
                key, value = meta_data.split(':', 1)
                meta_data_dict[key.strip()] = value.strip()
        elif data_format == 'json':
            pass
            #try:
                #data2 = json.loads(data + '')  # OK if data is a string
            #except TypeError:
                #data2 = data.copy()  # data is already a dictionary;
                                     ## copy for safety
            # data is now a Python dict of simple data types

        # TO-DO Organisation missing should be an error -- remove default
        ##competition = cls(org_id=data.get('org_id', 'default_org_id2'),
                          ##name=data['name'], created=data.get('created'))
        competition = cls(**meta_data_dict)

        # Add competitors and latches


        # ==================================


        for creator_class in [Rider, Pony, Action]:
            ##for name, adict in data[creator_class.collection_name].iteritems():
                ##competition.add(creator_class(name, **adict))
            for adict in data[creator_class.collection_name]:
                competition.add(creator_class(**adict))
        for latch_key in data[Latch.collection_name]:
            if latch_key != LATCH_DENY_ALL:
                competition.add(Latch(latch_key))
        # Calculate members and validate integrity of graph
        competition.validate()
        return competition
    def test_parse_one_level_tree_from_json(self):
        json_str = """\
{
  "_leaves": ["one", "three", "two"],
  "_root": {"members": ["one", "two", "three"]},
  "_tree": ["... one",
            "... two",
            "... three"],
  "one": {"groups": ["_root"]},
  "three": {"groups": ["_root"]},
  "two": {"groups": ["_root"]}
}
"""
        parser = TreeParser(json_str)

        assert parser.to_json() == json.loads(json_str)
        return  # <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    def test_parse_one_level_with_comments(self):
        # Check nested list, and that tree formed is identical
        data = """\
    # Comment on one
... one
... two # Inline comment on two
    # Comment on three
... three
"""
        parser = TreeParser(data)
        assert parser._text_generated() == """\
    # Comment on one
... one
    # Inline comment on two
... two
    # Comment on three
... three
... ~end-marker~
"""
        assert parser.as_nested_list == ['# Comment on one', 'one',
                                         '# Inline comment on two', 'two',
                                         '# Comment on three', 'three']

        ##pprint(parser.as_json)
        assert parser.as_json == {
            '_leaves': ['one', 'three', 'two'],
            '_root': {'members': ['one', 'two', 'three']},
            '_tree': ['    # Comment on one',
                      '... one',
                      '    # Inline comment on two',
                      '... two',
                      '    # Comment on three',
                      '... three'],
            'one': {'comments': ['# Comment on one'], 'groups': ['_root']},
            'three': {'comments': ['# Comment on three'], 'groups': ['_root']},
            'two': {'comments': ['# Inline comment on two'],
                    'groups': ['_root']}}
        assert parser.as_tree == """\