Skip to content

Commit

Permalink
io: add insertion mechanism to RecursiveDict
Browse files Browse the repository at this point in the history
  • Loading branch information
tschaume committed Jul 14, 2015
1 parent 5108c63 commit 349dbbb
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 4 deletions.
4 changes: 3 additions & 1 deletion mpcontribs/io/mpfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,9 @@ def make_general_section(self):
for idx, mp_cat_id in enumerate(self.document.keys()):
general_section = self.document[mp_cat_id].pop(mp_level01_titles[0])
if not idx:
self.document[mp_level01_titles[0]] = general_section
self.document.insert_before(
mp_cat_id, (mp_level01_titles[0], general_section)
)

def get_string(self, with_comments=False):
"""Returns a string to be written as a file"""
Expand Down
24 changes: 21 additions & 3 deletions mpcontribs/io/utils.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
from collections import OrderedDict, Mapping
from collections import OrderedDict as _OrderedDict
from collections import Mapping as _Mapping
from ..config import indent_symbol, min_separator_length, mp_level01_titles
import pandas as pd
import numpy as np

class RecursiveDict(OrderedDict):
class RecursiveDict(_OrderedDict):
"""extension of dict for internal representation of MPFile"""

def rec_update(self, other):
Expand All @@ -23,7 +24,7 @@ def iterate(self, nested_dict=None):
if nested_dict is None: self.level = 0
self.items = []
for key,value in d.iteritems():
if isinstance(value, Mapping):
if isinstance(value, _Mapping):
# FIXME: currently skipping all plots sections in output
if self.level == 1 and key == mp_level01_titles[2]: continue
yield get_indentor(n=self.level), key
Expand All @@ -43,6 +44,23 @@ def iterate(self, nested_dict=None):
else:
yield key, value

# insertion mechanism from https://gist.github.com/jaredks/6276032
def __insertion(self, link_prev, key_value):
key, value = key_value
if link_prev[2] != key:
if key in self:
del self[key]
link_next = link_prev[1]
self._OrderedDict__map[key] = link_prev[1] = link_next[0] = [link_prev, link_next, key]
dict.__setitem__(self, key, value)

def insert_after(self, existing_key, key_value):
self.__insertion(self._OrderedDict__map[existing_key], key_value)

def insert_before(self, existing_key, key_value):
self.__insertion(self._OrderedDict__map[existing_key][0], key_value)


def nest_dict(dct, keys):
"""nest dict under list of keys"""
nested_dict = dct
Expand Down

0 comments on commit 349dbbb

Please sign in to comment.