--- /dev/null
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+import json
+from operator import itemgetter, attrgetter, methodcaller, concat, iconcat
+try:
+ from bunch import *
+ from lessly import *
+ from lessly.data.yaml_omap import yaml, OrderedDict
+ from lessly.misc import keystringer
+ from lessly.strings import split_camel
+except ImportError:
+ print "You'll need to install some stuff. Try:"
+ print " pip install bunch"
+ print " pip install git://github.com/dsc/py-lessly.git"
+ print
+ raise
+
+
+class Options(Bunch):
+
+ def __init__(self, data):
+ self.ordered_data = bunchify(data)
+ for o in self.ordered_data:
+ self[o.name] = o
+
+
+ def pluck(self, key, default=None):
+ return pluck(self.ordered_data, key, default)
+
+ def pluckattr(self, attr, default=None):
+ return pluckattr(self.ordered_data, key, default)
+
+ def invoke(self, attr, *args, **kwargs):
+ return invoke(self.ordered_data, attr, *args, **kwargs)
+
+ @property
+ def all_tags(self):
+ return set(reduce(concat, self.pluck('tags', []), []))
+
+ def update_tags(self):
+ TAG_ADD_BY_NAME = {
+ # match... add tag...
+ 'label' : ['labels'],
+ 'color' : ['color'],
+ 'axis' : ['axes'],
+ 'grid' : ['grid'],
+ 'pan' : ['pan'],
+ 'zoom' : ['zoom'],
+ 'range' : ['range'],
+ }
+ TAG_REPLACEMENTS = {
+ 'csv parsing' : ['csv'],
+
+ 'overall display' : ['display'],
+ 'chart labels' : ['labels', 'display'],
+ 'legend' : ['legend', 'labels', 'display'],
+ 'value display/formatting' : ['formatting', 'display'],
+ 'data series colors' : ['data', 'color', 'display'],
+ 'data line display' : ['data', 'lines', 'display'],
+
+ 'interactive elements' : ['interactivity'],
+ 'zooming' : ['zoom'],
+ }
+ TAG_PREPEND = {
+ 'csv' : 'source',
+ # 'label' : 'display',
+ # 'color' : 'display',
+ # 'formatting' : 'display',
+ 'zoom' : 'interactivity',
+ 'pan' : 'interactivity',
+ 'range' : 'interactivity',
+ }
+
+ for o in self.ordered_data:
+ name = o.name.lower()
+ otags = o.tags
+ for tag, tests in TAG_ADD_BY_NAME.iteritems():
+ if any(test in name for test in tests):
+ otags.append(tag)
+
+ for tag, repls in TAG_REPLACEMENTS.iteritems():
+ otags = reduce(lambda acc, t: acc+(repls if t == tag else [t]), otags, [])
+ # i = 0
+ # while i < len(otags):
+ # if otags[i] == tag:
+ # otags[i:i+1] = repls
+ # i += len(repls) - 1
+ # i += 1
+
+ for tag, ptag in TAG_PREPEND.iteritems():
+ otags = reduce(lambda acc, t: acc+([ptag, t] if t == tag else [t]), otags, [])
+
+ o.tags = list(set(otags))
+
+
+
+
+
+ def save(self, outpath='data.yaml'):
+ with open(outpath, 'w') as f:
+ yaml.safe_dump(self.ordered_data, f, indent=4, default_flow_style=False, width=80)
+
+ @classmethod
+ def fromFile(Cls, optspath='data.yaml'):
+ with open(optspath, 'rU') as f:
+ return Cls(yaml.load(f))
+
+
+
+
+