~johnsca/charms/trusty/cloudfoundry/better-basic-reconciler-status

« back to all changes in this revision

Viewing changes to charmgen/mapper.py

  • Committer: Benjamin Saller
  • Date: 2014-06-19 01:16:33 UTC
  • Revision ID: benjamin.saller@canonical.com-20140619011633-l5ef5ompcighkxn1
initial version of generator lib + 'charm'

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
import re
 
2
 
 
3
 
 
4
class NestedDict(dict):
 
5
    def __setitem__(self, key, value):
 
6
        key = key.split('.')
 
7
        o = self
 
8
        for part in key[:-1]:
 
9
            o = o.setdefault(part, {})
 
10
        o[key[-1]] = value
 
11
 
 
12
 
 
13
def flatten(data):
 
14
    result = {}
 
15
 
 
16
    def _f(o, p):
 
17
        for k, v in o.items():
 
18
            if isinstance(v, dict):
 
19
                _f(v, p + [k])
 
20
            else:
 
21
                key = '.'.join(p + [k])
 
22
                result[key] = v
 
23
    _f(data, [])
 
24
    return result
 
25
 
 
26
 
 
27
def property_mapper(property_expressions, data):
 
28
    data = flatten(data)
 
29
    result = NestedDict()
 
30
    for input_re, dest_path in property_expressions:
 
31
        for k, v in data.items():
 
32
            if re.match(input_re, k):
 
33
                target = re.sub(input_re, dest_path, k)
 
34
                result[target] = v
 
35
                break
 
36
    return result