Changeset - cc94b5fc9205
[Not reviewed]
default
0 3 0
Drew Perttula - 10 years ago 2015-06-13 04:34:43
drewp@bigasterisk.com
effects can mention sub uris, and this becomes currentSubValue(uri)
Ignore-this: 13a8162d01d4bd686c0955132ce290ef
3 files changed with 27 insertions and 5 deletions:
0 comments (0 inline, 0 general)
light9/effecteval/effect.py
Show inline comments
 
@@ -32,23 +32,26 @@ class CodeLine(object):
 
          {'_u1': URIRef('uri1'), '_u2': URIRef('uri2')}
 
        """
 
        lname, expr = [s.strip() for s in self.code.split('=', 1)]
 
        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
 

	
 
    def findVars(self, expr):
 
        """may return some more strings than just the vars"""
 
@@ -57,12 +60,15 @@ class CodeLine(object):
 
        tokens.discard('None')
 
        return tokens
 
        
 
    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):
 
        """
 
        mapping of the local names for uris in the code to high-level
 
        objects (Submaster, Curve)
light9/effecteval/effectloop.py
Show inline comments
 
@@ -49,12 +49,18 @@ class EffectLoop(object):
 
        log.info('setEffects currentSong=%s', self.currentSong)
 
        if self.currentSong is None:
 
            return
 
        
 
        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
 
    def getSongTime(self):
 
        now = time.time()
 
        old = now - self.requestTime
light9/effecteval/test_effect.py
Show inline comments
 
@@ -5,14 +5,17 @@ sys.path.insert(0, 'bin') # for run_loca
 

	
 
from effect import CodeLine
 
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):
 
    def test_gets_lname(self):
 
        ec = CodeLine(graph=None, code='x = y+1')
 
        self.assertEqual('x', ec.outName)
 
@@ -50,12 +53,19 @@ class TestAsPython(unittest.TestCase):
 
    def test_curve_doesnt_double_wrap(self):
 
        ec = CodeLine(graph=None, code='x = curve(<http://example/curve1>, t+.01)')
 
        _, inExpr, expr, uris = ec._asPython()
 
        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)
 
class TestPossibleVars(unittest.TestCase):
 
    def test1(self):
 
        self.assertEqual(set([]), CodeLine(None, 'a1 = 1').possibleVars)
0 comments (0 inline, 0 general)