Script I used to manipulate tags in data.yaml
authordsc <dsc@less.ly>
Mon, 27 Feb 2012 00:05:08 +0000 (16:05 -0800)
committerdsc <dsc@less.ly>
Mon, 27 Feb 2012 00:05:08 +0000 (16:05 -0800)
msc/dygraph-options/dygraph_options.py [new file with mode: 0644]

diff --git a/msc/dygraph-options/dygraph_options.py b/msc/dygraph-options/dygraph_options.py
new file mode 100644 (file)
index 0000000..886457d
--- /dev/null
@@ -0,0 +1,112 @@
+#!/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))
+    
+
+
+
+