changeset 1249:cc94b5fc9205

effects can mention sub uris, and this becomes currentSubValue(uri) Ignore-this: 13a8162d01d4bd686c0955132ce290ef
author Drew Perttula <drewp@bigasterisk.com>
date Sat, 13 Jun 2015 04:34:43 +0000
parents e1a407e928a7
children b5b841cee380
files light9/effecteval/effect.py light9/effecteval/effectloop.py light9/effecteval/test_effect.py
diffstat 3 files changed, 27 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/light9/effecteval/effect.py	Sat Jun 13 04:31:08 2015 +0000
+++ b/light9/effecteval/effect.py	Sat Jun 13 04:34:43 2015 +0000
@@ -35,17 +35,20 @@
         self.uriCounter = 0
         resources = {}
 
-        def alreadyInCurveFunc(s, i):
-            prefix = 'curve('
+        def alreadyInFunc(prefix, s, i):
             return i >= len(prefix) and s[i-len(prefix):i] == prefix
 
         def repl(m):
             v = '_res%s' % self.uriCounter
             self.uriCounter += 1
             r = resources[v] = URIRef(m.group(1))
-            if self._uriIsCurve(r):
-                if not alreadyInCurveFunc(m.string, m.start()):
-                    return 'curve(%s, t)' % v
+            for uriTypeMatches, wrapFuncName, addlArgs in [
+                    (self._uriIsCurve(r), 'curve', ', t'),
+                    (self._uriIsSub(r), 'currentSubLevel', ''),
+            ]:
+                if uriTypeMatches:
+                    if not alreadyInFunc(wrapFuncName + '(', m.string, m.start()):
+                        return '%s(%s%s)' % (wrapFuncName, v, addlArgs)
             return v
         outExpr = re.sub(r'<(http\S*?)>', repl, expr)
         return lname, expr, outExpr, resources
@@ -60,6 +63,9 @@
     def _uriIsCurve(self, uri):
         # this result could vary with graph changes (rare)
         return self.graph.contains((uri, RDF.type, L9['Curve']))
+
+    def _uriIsSub(self, uri):
+        return self.graph.contains((uri, RDF.type, L9['Submaster']))
         
     @prof.logTime
     def _resourcesAsPython(self, resources):
--- a/light9/effecteval/effectloop.py	Sat Jun 13 04:31:08 2015 +0000
+++ b/light9/effecteval/effectloop.py	Sat Jun 13 04:34:43 2015 +0000
@@ -52,6 +52,12 @@
         
         for effectUri in self.graph.objects(self.currentSong, L9['effect']):
             self.currentEffects.append(EffectNode(self.graph, effectUri))
+
+
+        for sub in self.graph.subjects(RDF.type, L9['Submaster']):
+            for effectUri in self.graph.objects(sub, L9['drivesEffect']):
+                self.currentEffects.append(EffectNode(self.graph, effectUri))
+                
         log.info('now we have %s effects', len(self.currentEffects))
         
     @inlineCallbacks
--- a/light9/effecteval/test_effect.py	Sat Jun 13 04:31:08 2015 +0000
+++ b/light9/effecteval/test_effect.py	Sat Jun 13 04:34:43 2015 +0000
@@ -8,8 +8,11 @@
 
 def isCurve(self, uri):
     return 'curve' in uri
+def isSub(self, uri):
+    return 'sub' in uri
 
 @mock.patch('light9.effecteval.effect.CodeLine._uriIsCurve', new=isCurve)
+@mock.patch('light9.effecteval.effect.CodeLine._uriIsSub', new=isSub)
 @mock.patch('light9.effecteval.effect.CodeLine._resourcesAsPython',
             new=lambda self, r: self.expr)
 class TestAsPython(unittest.TestCase):
@@ -53,6 +56,13 @@
         self.assertEqual('curve(_res0, t+.01)', expr)
         self.assertEqual({'_res0': URIRef('http://example/curve1')}, uris)
 
+    def test_sub_uri_expands_to_sub_lookup_func(self):
+        ec = CodeLine(graph=None, code='x = <http://example/sub1>')
+        _, inExpr, expr, uris = ec._asPython()
+        self.assertEqual('currentSubLevel(_res0)', expr)
+        self.assertEqual({'_res0': URIRef('http://example/sub1')}, uris)
+        
+        
 @mock.patch('light9.effecteval.effect.CodeLine._uriIsCurve', new=isCurve)
 @mock.patch('light9.effecteval.effect.CodeLine._resourcesAsPython',
             new=lambda self, r: self.expr)