diff --git a/light9/effecteval/effect.py b/light9/effecteval/effect.py --- a/light9/effecteval/effect.py +++ b/light9/effecteval/effect.py @@ -35,17 +35,20 @@ class CodeLine(object): 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 @@ class CodeLine(object): 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): diff --git a/light9/effecteval/effectloop.py b/light9/effecteval/effectloop.py --- a/light9/effecteval/effectloop.py +++ b/light9/effecteval/effectloop.py @@ -52,6 +52,12 @@ class EffectLoop(object): 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 diff --git a/light9/effecteval/test_effect.py b/light9/effecteval/test_effect.py --- a/light9/effecteval/test_effect.py +++ b/light9/effecteval/test_effect.py @@ -8,8 +8,11 @@ from rdflib import URIRef 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 @@ class TestAsPython(unittest.TestCase): 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 = ') + _, 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)