Esempio n. 1
0
    def test_invalid_build(self):
        artifacts = {'a': 42, 'b': lambda A: A * 2}
        afx = Artifax(artifacts)
        with self.assertRaises(UnresolvedDependencyError):
            _ = afx.build(solver='bfs_parallel')

        result = afx.build(allow_partial_functions=True)
        self.assertIsInstance(result['b'], partial)
Esempio n. 2
0
 def test_initial(self):
     afx = Artifax({
         'earth': object(),
         'un': lambda earth: 'water @{}'.format(earth),
         'mars': object(),
         'mcrn': lambda mars: 'dust @{}'.format(mars),
         'belt': object(),
         'opa': lambda belt: 'ice @{}'.format(belt)
     })
     self.assertEqual(afx.initial(), set(['earth', 'mars', 'belt']))
     _ = afx.build()
Esempio n. 3
0
    def test_at_constructor(self):
        def subtract(p, q):
            return p - q

        afx = Artifax(
            ab=At('a', 'b', subtract),
            ba=At('b', 'a', subtract),
            a=-11,
            b=7.5,
        )

        ab, ba = afx.build(targets=('ab', 'ba'))
        self.assertEqual(ab, -18.5)
        self.assertEqual(ba, 18.5)
Esempio n. 4
0
    def test_multiprocessing(self):
        afx = Artifax({
            'p1': 'p1',
            'p2': 'p2',
            'c1': lambda p1: 'c1 after {}'.format(p1),
            'c2': lambda p1: None,
            'c3': lambda p2: None,
            'c4': lambda p2: None,
            'c5': lambda p1, p2, c2, c3: None,
            'c6': lambda c1: None,
            'F': lambda c1, c2, c3, c4, c5: None,
        })

        c1 = afx.build(targets=('c1', ))
        self.assertEqual(c1, 'c1 after p1')
Esempio n. 5
0
    def test_add(self):
        afx = Artifax()
        afx.set('a', 42)
        self.assertEqual(len(afx), 1)
        self.assertEqual(afx.number_of_nodes(), 1)
        self.assertEqual(afx.number_of_edges(), 0)
        self.assertTrue('a' in afx)

        afx.set('x', lambda a: a / 3.14)
        self.assertEqual(len(afx), 2)
        self.assertEqual(afx.number_of_nodes(), 2)
        self.assertEqual(afx.number_of_edges(), 1)
        self.assertTrue('x' in afx)

        self.assertFalse('y' in afx)
Esempio n. 6
0
 def test_build(self):
     obj = object()
     afx = Artifax({
         'int': 42,
         'float': 1.618,
         'string': 'Hello',
         'obj': obj,
         'list': [1, 2, 3],
         'dictionary': {
             'answer': 42
         },
         'set': set([1, 2, 3.14])
     })
     result = afx.build(solver='linear')
     self.assertEqual(result['int'], 42)
     self.assertEqual(result['float'], 1.618)
     self.assertEqual(result['string'], 'Hello')
     self.assertEqual(result['obj'], obj)
     self.assertEqual(result['list'], [1, 2, 3])
     self.assertEqual(result['dictionary'], {'answer': 42})
     self.assertEqual(result['set'], set([1, 2, 3.14]))
Esempio n. 7
0
    def test_stale(self):
        class C:
            counter = 0

            def __init__(self):
                C.counter += 1

        afx = Artifax({
            'a': 42,
            'b': lambda a: math.pow(a, 5),
            'counter': lambda: C(),
        })
        result = afx.build(targets='b')
        self.assertEqual(result, 130691232)

        # 'counter' node should not have been evaluated
        # and should still be stale
        self.assertEqual(C.counter, 0)

        # cannot use async solver here because C won't be
        # pickable from pyunit
        _ = afx.build()['counter']()
        self.assertEqual(C.counter, 1)
Esempio n. 8
0
    def test_in_operator(self):
        afx = Artifax(p=(3, 4))
        self.assertTrue('p' in afx)
        self.assertFalse('q' in afx)

        afx.pop('p')
        self.assertFalse('p' in afx)

        afx.set('q', (1, 2))
        self.assertTrue('q' in afx)
Esempio n. 9
0
    def test_targeted_build(self):
        afx = Artifax(
            {
                'greeting':
                lambda name, punctuation: 'Hello, {}{}'.format(
                    name, punctuation)
            },
            name='World',
            punctuation='')
        greeting = afx.build(targets='greeting')
        self.assertEqual(greeting, 'Hello, World')

        afx.set('punctuation', '!')
        greeting, punctuation = afx.build(targets=('greeting', 'punctuation'))
        self.assertEqual(greeting, 'Hello, World!')
        self.assertEqual(punctuation, '!')

        result = afx.build()
        self.assertEqual(result['greeting'], 'Hello, World!')
        self.assertEqual(result['name'], 'World')
        self.assertEqual(result['punctuation'], '!')
Esempio n. 10
0
    def test_incremental_build(self):
        class ExpensiveObject:
            def __init__(self):
                self.counter = 0

            def expensive_method(self, _):
                self.counter += 1
                return 'foobar'

        exo = ExpensiveObject()
        afx = Artifax(
            p=(3, 4),
            q=(12, 13),
            exo=lambda q: exo.expensive_method(q),
        )

        # pool_async silently fails to get trigger callback that resolves
        # the nodes, I guess because it can't pickle ExpensiveObject
        # from the unittest thread
        result = afx.build(solver='linear')
        self.assertEqual(exo.counter, 1)

        afx.set('p', (1, 1))
        result = afx.build(solver='linear')
        self.assertEqual(exo.counter, 1)

        afx.set('q', (0, 0))
        result = afx.build(solver='linear')
        self.assertEqual(exo.counter, 2)

        afx.set('new', 'hello')
        result = afx.build(solver='linear')
        self.assertEqual(result['new'], 'hello')
        self.assertEqual(exo.counter, 2)

        afx.pop('new')
        result = afx.build(solver='linear')
        self.assertEqual(exo.counter, 2)
Esempio n. 11
0
 def test_pop(self):
     afx = Artifax()
     afx.set('c', 'C')
     c = afx.pop('c')
     self.assertTrue(len(afx) == 0)
     self.assertEqual(c, 'C')