예제 #1
0
    def test_script_equality(self):
        name = 'name'
        regions = [
            TextRegion(content='a'),
        ]
        script_a = Script(
            name=name,
            regions=regions,
        )
        script_b = Script(
            name=name,
            regions=regions,
        )
        script_c = Script(
            name=name + 'different',
            regions=regions,
        )
        script_d = Script(
            name=name,
            regions=regions + regions,
        )

        self.assertTrue(script_a == script_a)
        self.assertTrue(hash(script_a) == hash(script_a))
        self.assertIsNot(script_a, script_b)
        self.assertTrue(script_a == script_b)
        self.assertTrue(hash(script_a) == hash(script_b))
        self.assertFalse(script_a == script_c)
        self.assertFalse(hash(script_a) == hash(script_c))
        self.assertFalse(script_a == script_d)
        self.assertTrue(hash(script_a) == hash(script_d))
        self.assertFalse(script_a == 42)
예제 #2
0
    def test_script_call_in_pipeline(self, redis_script):
        name = 'foo'
        regions = [
            ReturnRegion(
                type_='string',
                content='%return string',
            ),
        ]
        script = Script(
            name=name,
            regions=regions,
        )
        client = MagicMock(spec=BasePipeline)
        redis_script.return_value = MagicMock(return_value=42)
        result = script.get_runner(client=client)()

        self.assertTrue(hasattr(result, '__call__'))
        self.assertEqual("42", result(42))
        redis_script.return_value.assert_called_once_with(
            keys=[],
            args=[],
        )

        # Make sure pipeline instances are not cached.
        self.assertNotIn(client, script._redis_scripts)
예제 #3
0
    def test_script_get_scripts_for_line(self):
        script_a = Script(
            name='a',
            regions=[
                TextRegion(content='>c\n>d'),
            ],
        )
        script_b = Script(
            name='b',
            regions=[
                TextRegion(content='>f\n>g'),
            ],
        )
        script = Script(
            name='foo',
            regions=[
                TextRegion(content='a'),
                TextRegion(content='b'),
                ScriptRegion(
                    script=script_a,
                    content='%include "a"',
                ),
                TextRegion(content='e'),
                ScriptRegion(
                    script=script_b,
                    content='%include "b"',
                ),
                # Next script inclusion will be ignored as the script was
                # already included.
                # It won't be possible to get an error from this inclusion line
                # so we expect a like skip.
                ScriptRegion(
                    script=script_a,
                    content='%include "a"',
                ),
                TextRegion(content='h\ni\nj'),
            ],
        )

        get_scripts_for_line = script.get_scripts_for_line

        with self.assertRaises(ValueError):
            get_scripts_for_line(0)

        self.assertEqual([(script, 1)], get_scripts_for_line(1))
        self.assertEqual([(script, 2)], get_scripts_for_line(2))
        self.assertEqual([(script, 3), (script_a, 1)], get_scripts_for_line(3))
        self.assertEqual([(script, 3), (script_a, 2)], get_scripts_for_line(4))
        self.assertEqual([(script, 4)], get_scripts_for_line(5))
        self.assertEqual([(script, 5), (script_b, 1)], get_scripts_for_line(6))
        self.assertEqual([(script, 5), (script_b, 2)], get_scripts_for_line(7))
        # Here goes the line skip.
        self.assertEqual([(script, 7)], get_scripts_for_line(8))
        self.assertEqual([(script, 8)], get_scripts_for_line(9))
        self.assertEqual([(script, 9)], get_scripts_for_line(10))

        with self.assertRaises(ValueError):
            get_scripts_for_line(11)
예제 #4
0
    def test_script_get_line_info_multiple_includes(self):
        name = 'a'
        c_regions = [
            TextRegion(content='4\n5\n6'),
        ]
        c_script = Script(
            name='c',
            regions=c_regions,
        )
        b_regions = [
            TextRegion(content='1\n2\n3'),
            ScriptRegion(
                script=c_script,
                content='%include "c"',
            ),
        ]
        b_script = Script(
            name='b',
            regions=b_regions,
        )
        a_regions = [
            ScriptRegion(
                script=b_script,
                content='%include "b"',
            ),
            ScriptRegion(
                script=c_script,
                content='%include "c"',
            ),
            ScriptRegion(
                script=c_script,
                content='%include "c"',
            ),
            TextRegion(content='7'),
        ]
        script = Script(
            name=name,
            regions=a_regions,
        )

        get_line_info = script.get_line_info

        with self.assertRaises(ValueError):
            get_line_info(0)

        self.assertEqual((1, 1, 1, 1, 1, 6, a_regions[0]), get_line_info(1))
        self.assertEqual((1, 1, 1, 1, 2, 6, a_regions[0]), get_line_info(2))
        self.assertEqual((1, 1, 1, 1, 3, 6, a_regions[0]), get_line_info(3))
        self.assertEqual((1, 1, 1, 1, 4, 6, a_regions[0]), get_line_info(4))
        self.assertEqual((1, 1, 1, 1, 5, 6, a_regions[0]), get_line_info(5))
        self.assertEqual((1, 1, 1, 1, 6, 6, a_regions[0]), get_line_info(6))
        self.assertEqual((4, 4, 1, 7, 7, 1, a_regions[3]), get_line_info(7))

        with self.assertRaises(ValueError):
            get_line_info(8)
예제 #5
0
    def test_script_render(self):
        name = 'foo'
        regions = [
            TextRegion(content='a'),
        ]
        script = Script(
            name=name,
            regions=regions,
        )
        context = MagicMock()
        result = script.render(context=context)

        self.assertEqual(context.render_script.return_value, result)
        context.render_script.assert_called_once_with(script)
예제 #6
0
    def test_script_render(self):
        name = 'foo'
        regions = [
            TextRegion(content='a'),
        ]
        script = Script(
            name=name,
            regions=regions,
        )
        context = MagicMock()
        result = script.render(context=context)

        self.assertEqual(context.render_script.return_value, result)
        context.render_script.assert_called_once_with(script)
예제 #7
0
    def test_script_instanciation_with_args(self):
        name = 'foo'
        subregions = [
            ArgumentRegion(
                name="arg2",
                index=1,
                type_='string',
                content='%arg arg2',
            ),
            TextRegion(content='local b = 0;'),
        ]
        regions = [
            ArgumentRegion(
                name="arg1",
                index=1,
                type_='string',
                content='%arg arg1',
            ),
            TextRegion(content='a'),
            ScriptRegion(
                script=Script(
                    name='bar',
                    regions=subregions,
                ),
                content='%include "bar"',
            ),
            ArgumentRegion(
                name="arg3",
                index=3,
                type_='integer',
                content='%arg arg3 integer',
            ),
        ]
        script = Script(
            name=name,
            regions=regions,
        )

        self.assertEqual(
            [
                ("arg1", str),
                ("arg2", str),
                ("arg3", int),
            ],
            script.args,
        )
예제 #8
0
    def test_script_render_default(self):
        name = 'foo'
        regions = [
            TextRegion(content='a'),
            TextRegion(content='b'),
            TextRegion(content='c'),
        ]
        script = Script(
            name=name,
            regions=regions,
        )

        self.assertEqual('a\nb\nc', script.render())

        # Make sure a second call (with the cached value) returns the same
        # script.
        self.assertEqual('a\nb\nc', script.render())
예제 #9
0
    def test_script_render_default(self):
        name = 'foo'
        regions = [
            TextRegion(content='a'),
            TextRegion(content='b'),
            TextRegion(content='c'),
        ]
        script = Script(
            name=name,
            regions=regions,
        )

        self.assertEqual('a\nb\nc', script.render())

        # Make sure a second call (with the cached value) returns the same
        # script.
        self.assertEqual('a\nb\nc', script.render())
예제 #10
0
    def test_script_instanciation_no_regions(self):
        name = 'foo'
        regions = []

        with self.assertRaises(ValueError):
            Script(
                name=name,
                regions=regions,
            )
예제 #11
0
    def test_script_instanciation_with_keys(self):
        name = 'foo'
        subregions = [
            KeyRegion(
                name="key2",
                index=1,
                content='%key key2',
            ),
            TextRegion(content='local b = 0;'),
        ]
        regions = [
            KeyRegion(
                name="key1",
                index=1,
                content='%key key1',
            ),
            TextRegion(content='a'),
            ScriptRegion(
                script=Script(
                    name='bar',
                    regions=subregions,
                ),
                content='%include "bar"',
            ),
            KeyRegion(
                name="key3",
                index=3,
                content='%key key3',
            ),
        ]
        script = Script(
            name=name,
            regions=regions,
        )

        self.assertEqual(
            [
                "key1",
                "key2",
                "key3",
            ],
            script.keys,
        )
예제 #12
0
    def test_extract_regions_text_last(self):
        contents = [
            '%arg arg1',
            '%include "foo"',
            '%key key2',
            'a',
            'b',
            'c',
        ]
        content = '\n'.join(contents)
        script = Script(
            name='foo',
            regions=[
                ArgumentRegion(
                    name='arg2',
                    index=1,
                    type_='string',
                    content='%arg arg2',
                ),
                KeyRegion(
                    name='key1',
                    index=1,
                    content='%key key1',
                ),
            ],
        )
        get_script_by_name = MagicMock(return_value=script)
        regions = self.parser.parse_regions(
            content=content,
            current_path=".",
            get_script_by_name=get_script_by_name,
        )

        self.maxDiff = None
        self.assertEqual(
            [
                ArgumentRegion(
                    name='arg1',
                    index=1,
                    type_='string',
                    content=contents[0],
                ),
                ScriptRegion(
                    script=script,
                    content='%include "foo"',
                ),
                KeyRegion(
                    name='key2',
                    index=2,
                    content=contents[2],
                ),
                TextRegion(content='\n'.join(contents[3:6])),
            ],
            regions,
        )
예제 #13
0
    def test_script_call_return_as_boolean(self, _):
        name = 'foo'
        regions = [
            ReturnRegion(
                type_='boolean',
                content='%return boolean',
            ),
        ]
        script = Script(
            name=name,
            regions=regions,
        )
        script._redis_scripts[None] = MagicMock(return_value=5)
        result = script.get_runner(client=None)()

        self.assertEqual(True, result)
        script._redis_scripts[None].assert_called_once_with(
            keys=[],
            args=[],
        )
예제 #14
0
    def test_script_as_string(self):
        name = 'foo'
        regions = [
            TextRegion(content='a'),
        ]
        script = Script(
            name=name,
            regions=regions,
        )

        self.assertEqual('foo.lua', str(script))
예제 #15
0
    def test_script_call_return_as_dict(self, _):
        name = 'foo'
        regions = [
            ReturnRegion(
                type_='list',
                content='%return list',
            ),
        ]
        script = Script(
            name=name,
            regions=regions,
        )
        value = {'a': 1, 'b': 3.5, 'c': None, 'd': ['a', 2], 'e': 's'}
        script._redis_scripts[None] = MagicMock(return_value=json.dumps(value))
        result = script.get_runner(client=None)()

        self.assertEqual(value, result)
        script._redis_scripts[None].assert_called_once_with(
            keys=[],
            args=[],
        )
예제 #16
0
    def test_script_call_return_as_boolean(self, _):
        name = 'foo'
        regions = [
            ReturnRegion(
                type_='boolean',
                content='%return boolean',
            ),
        ]
        script = Script(
            name=name,
            regions=regions,
        )
        script._redis_script = MagicMock(return_value=5)
        result = script.get_runner(client=None)()

        self.assertEqual(True, result)
        script._redis_script.assert_called_once_with(
            keys=[],
            args=[],
            client=None,
        )
예제 #17
0
    def test_script_call_missing_key(self):
        name = 'foo'
        regions = [
            KeyRegion(
                name='key1',
                index=1,
                content='%key key1',
            ),
            ArgumentRegion(
                name='arg1',
                index=1,
                type_='string',
                content='%arg arg1',
            ),
        ]
        script = Script(
            name=name,
            regions=regions,
        )

        with self.assertRaises(TypeError):
            script.get_runner(client=None)(arg1='ARG')
예제 #18
0
    def test_script_call_missing_key(self):
        name = 'foo'
        regions = [
            KeyRegion(
                name='key1',
                index=1,
                content='%key key1',
            ),
            ArgumentRegion(
                name='arg1',
                index=1,
                type_='string',
                content='%arg arg1',
            ),
        ]
        script = Script(
            name=name,
            regions=regions,
        )

        with self.assertRaises(TypeError):
            script.get_runner(client=None)(arg1='ARG')
예제 #19
0
    def test_script_render_with_duplicate_includes_pragma_once(self):
        subsubscript = Script(
            name='a',
            regions=[
                TextRegion(content='a'),
            ],
        )
        subsubscript.multiple_inclusion = False
        subscript = Script(
            name='b',
            regions=[
                TextRegion(content='b'),
                ScriptRegion(
                    script=subsubscript,
                    content='%include "a"',
                ),
            ],
        )
        subscript.multiple_inclusion = False
        script = Script(
            name='c',
            regions=[
                ScriptRegion(
                    script=subsubscript,
                    content='%include "a"',
                ),
                ScriptRegion(
                    script=subscript,
                    content='%include "b"',
                ),
                ScriptRegion(
                    script=subscript,
                    content='%include "b"',
                ),
            ],
        )
        script.multiple_inclusion = False

        self.assertEqual('a\nb', script.render())
예제 #20
0
    def test_script_get_line_info(self):
        name = 'foo'
        subregions = [
            TextRegion(content='e\nf\ng'),
        ]
        regions = [
            TextRegion(content='a'),
            TextRegion(content='b'),
            TextRegion(content='c\nd'),
            ScriptRegion(
                script=Script(
                    name='bar',
                    regions=subregions,
                ),
                content='%include "bar"',
            ),
            TextRegion(content='h'),
        ]
        script = Script(
            name=name,
            regions=regions,
        )

        get_line_info = script.get_line_info

        with self.assertRaises(ValueError):
            get_line_info(0)

        self.assertEqual((1, 1, 1, 1, 1, 1, regions[0]), get_line_info(1))
        self.assertEqual((2, 2, 1, 2, 2, 1, regions[1]), get_line_info(2))
        self.assertEqual((3, 3, 2, 3, 3, 2, regions[2]), get_line_info(3))
        self.assertEqual((3, 4, 2, 3, 4, 2, regions[2]), get_line_info(4))
        self.assertEqual((5, 5, 1, 5, 5, 3, regions[3]), get_line_info(5))
        self.assertEqual((5, 5, 1, 5, 6, 3, regions[3]), get_line_info(6))
        self.assertEqual((5, 5, 1, 5, 7, 3, regions[3]), get_line_info(7))
        self.assertEqual((6, 6, 1, 8, 8, 1, regions[4]), get_line_info(8))

        with self.assertRaises(ValueError):
            get_line_info(9)
예제 #21
0
    def test_script_call_return_as_dict(self, _):
        name = 'foo'
        regions = [
            ReturnRegion(
                type_='list',
                content='%return list',
            ),
        ]
        script = Script(
            name=name,
            regions=regions,
        )
        value = {'a': 1, 'b': 3.5, 'c': None, 'd': ['a', 2], 'e': 's'}
        script._redis_script = MagicMock(return_value=jdumps(value))
        result = script.get_runner(client=None)()

        self.assertEqual(value, result)
        script._redis_script.assert_called_once_with(
            keys=[],
            args=[],
            client=None,
        )
예제 #22
0
    def test_script_line_count(self):
        name = 'foo'
        regions = [
            TextRegion(content='a'),
            TextRegion(content='b'),
            TextRegion(content='c'),
        ]
        script = Script(
            name=name,
            regions=regions,
        )

        self.assertEqual(3, script.line_count)
        self.assertEqual(3, script.real_line_count)
예제 #23
0
    def test_script_call_in_pipeline(self, redis_script):
        name = 'foo'
        regions = [
            ReturnRegion(
                type_='string',
                content='%return string',
            ),
        ]
        script = Script(
            name=name,
            regions=regions,
        )
        client = MagicMock(spec=BasePipeline)
        redis_script.return_value = MagicMock(return_value=42)
        result = script.get_runner(client=client)()

        self.assertTrue(hasattr(result, '__call__'))
        self.assertEqual("42", result(42))
        redis_script.return_value.assert_called_once_with(
            keys=[],
            args=[],
            client=client,
        )
예제 #24
0
    def test_script_representation(self):
        name = 'foo'
        regions = [
            TextRegion(content='a'),
        ]
        script = Script(
            name=name,
            regions=regions,
        )

        self.assertEqual(
            "Script(name='foo')",
            repr(script),
        )
예제 #25
0
    def test_script_instanciation(self):
        name = 'foo'
        regions = [
            TextRegion(content='a'),
        ]
        script = Script(
            name=name,
            regions=regions,
        )

        self.assertEqual(name, script.name)
        self.assertEqual(regions, script.regions)
        self.assertIsNone(script.return_type)
        self.assertTrue(script.multiple_inclusion)
예제 #26
0
    def test_script_get_real_line_content(self):
        name = 'foo'
        subregions = [
            TextRegion(content='e\nf\ng'),
        ]
        regions = [
            TextRegion(content='a'),
            TextRegion(content='b'),
            TextRegion(content='c\nd'),
            ScriptRegion(
                script=Script(
                    name='bar',
                    regions=subregions,
                ),
                content='%include "bar"',
            ),
            TextRegion(content='h'),
        ]
        script = Script(
            name=name,
            regions=regions,
        )

        with self.assertRaises(ValueError):
            script.get_real_line_content(0)

        self.assertEqual('a', script.get_real_line_content(1))
        self.assertEqual('b', script.get_real_line_content(2))
        self.assertEqual('c', script.get_real_line_content(3))
        self.assertEqual('d', script.get_real_line_content(4))
        self.assertEqual('%include "bar"', script.get_real_line_content(5))
        self.assertEqual('%include "bar"', script.get_real_line_content(6))
        self.assertEqual('%include "bar"', script.get_real_line_content(7))
        self.assertEqual('h', script.get_real_line_content(8))

        with self.assertRaises(ValueError):
            script.get_real_line_content(9)
예제 #27
0
    def test_script_render_with_duplicate_includes(self):
        subsubscript = Script(
            name='a',
            regions=[
                TextRegion(content='a'),
            ],
        )
        subscript = Script(
            name='b',
            regions=[
                TextRegion(content='b'),
                ScriptRegion(
                    script=subsubscript,
                    content='%include "a"',
                ),
            ],
        )
        script = Script(
            name='c',
            regions=[
                ScriptRegion(
                    script=subsubscript,
                    content='%include "a"',
                ),
                ScriptRegion(
                    script=subscript,
                    content='%include "b"',
                ),
                ScriptRegion(
                    script=subscript,
                    content='%include "b"',
                ),
            ],
        )

        self.assertEqual('a\nb\na\nb\na', script.render())
예제 #28
0
    def test_script_render_with_duplicate_includes(self):
        subsubscript = Script(
            name='a',
            regions=[
                TextRegion(content='a'),
            ],
        )
        subscript = Script(
            name='b',
            regions=[
                TextRegion(content='b'),
                ScriptRegion(
                    script=subsubscript,
                    content='%include "a"',
                ),
            ],
        )
        script = Script(
            name='c',
            regions=[
                ScriptRegion(
                    script=subsubscript,
                    content='%include "a"',
                ),
                ScriptRegion(
                    script=subscript,
                    content='%include "b"',
                ),
                ScriptRegion(
                    script=subscript,
                    content='%include "b"',
                ),
            ],
        )

        self.assertEqual('a\nb\na\nb\na', script.render())
예제 #29
0
    def test_script_region_instanciation(self):
        name = 'foo'
        regions = [
            TextRegion(content='a'),
        ]
        script = Script(
            name=name,
            regions=regions,
        )
        script_region = ScriptRegion(
            script=script,
            content='%include "foo"',
        )

        self.assertEqual(script, script_region.script)
예제 #30
0
    def test_script_region_line_count(self):
        name = 'foo'
        regions = [
            TextRegion(content='a'),
            TextRegion(content='b'),
        ]
        script = Script(
            name=name,
            regions=regions,
        )
        script_region = ScriptRegion(
            script=script,
            content='%include "foo"',
        )

        self.assertEqual(script.line_count, script_region.line_count)
        self.assertEqual(1, script_region.real_line_count)
예제 #31
0
 def test_script_instanciation_with_too_many_return_statements(self):
     name = 'foo'
     regions = [
         ReturnRegion(
             type_='string',
             content='%return string',
         ),
         ReturnRegion(
             type_='integer',
             content='%return integer',
         ),
     ]
     with self.assertRaises(ValueError):
         Script(
             name=name,
             regions=regions,
         )
예제 #32
0
    def test_script_instanciation_with_pragma_once(self):
        name = 'foo'
        regions = [
            PragmaRegion(
                value='once',
                content='%pragma once',
            ),
            ReturnRegion(
                type_='integer',
                content='%return integer',
            ),
        ]
        script = Script(
            name=name,
            regions=regions,
        )

        self.assertFalse(script.multiple_inclusion)
예제 #33
0
    def test_extract_regions_keys(self):
        contents = [
            '%key key1',
            '%include "foo"',
            '%key key3',
        ]
        content = '\n'.join(contents)
        script = Script(
            name='foo',
            regions=[
                KeyRegion(
                    name='key2',
                    index=1,
                    content='%key key2',
                ),
            ],
        )
        get_script_by_name = MagicMock(return_value=script)
        regions = self.parser.parse_regions(
            content=content,
            current_path=".",
            get_script_by_name=get_script_by_name,
        )

        self.maxDiff = None
        self.assertEqual(
            [
                KeyRegion(
                    name='key1',
                    index=1,
                    content=contents[0],
                ),
                ScriptRegion(
                    script=script,
                    content='%include "foo"',
                ),
                KeyRegion(
                    name='key3',
                    index=3,
                    content=contents[2],
                ),
            ],
            regions,
        )
예제 #34
0
    def test_script_region_representation(self):
        name = 'foo'
        regions = [
            TextRegion(content='a'),
        ]
        script = Script(
            name=name,
            regions=regions,
        )
        script_region = ScriptRegion(
            script=script,
            content='%include "foo"',
        )

        self.assertEqual(
            ("ScriptRegion(real_line_count=1, line_count=1, "
             "script='foo.lua', content='%include \"foo\"')"),
            repr(script_region),
        )
예제 #35
0
 def test_script_instanciation_with_incorrect_keys(self):
     name = 'foo'
     regions = [
         KeyRegion(
             name="key1",
             index=1,
             content='%key key1',
         ),
         KeyRegion(
             name="key2",
             index=3,
             content='%key key2',
         ),
     ]
     with self.assertRaises(ValueError):
         Script(
             name=name,
             regions=regions,
         )
예제 #36
0
    def test_script_region_as_string(self):
        name = 'foo'
        regions = [
            TextRegion(content='a'),
            TextRegion(content='b'),
        ]
        script = Script(
            name=name,
            regions=regions,
        )
        script_region = ScriptRegion(
            script=script,
            content='%include "foo"',
        )
        render_context = MagicMock()
        result = script_region.render(context=render_context)

        render_context.render_script.assert_called_once_with(script=script)
        self.assertEqual(render_context.render_script.return_value, result)
예제 #37
0
    def test_script_instanciation_with_return_statement(self):
        name = 'foo'
        regions = [
            ArgumentRegion(
                name="arg1",
                type_='string',
                index=1,
                content='%arg arg1',
            ),
            ReturnRegion(
                type_='integer',
                content='%return integer',
            ),
        ]
        script = Script(
            name=name,
            regions=regions,
        )

        self.assertIs(int, script.return_type)
예제 #38
0
    def test_script_region_keys(self):
        name = 'foo'
        regions = [
            KeyRegion(
                name='key1',
                index=1,
                content='%key key1',
            ),
            TextRegion(content='b'),
        ]
        script = Script(
            name=name,
            regions=regions,
        )
        script_region = ScriptRegion(
            script=script,
            content='%include "foo"',
        )

        self.assertEqual(script.keys, script_region.keys)
예제 #39
0
    def test_script_render_with_duplicate_includes_pragma_once(self):
        subsubscript = Script(
            name='a',
            regions=[
                TextRegion(content='a'),
            ],
        )
        subsubscript.multiple_inclusion = False
        subscript = Script(
            name='b',
            regions=[
                TextRegion(content='b'),
                ScriptRegion(
                    script=subsubscript,
                    content='%include "a"',
                ),
            ],
        )
        subscript.multiple_inclusion = False
        script = Script(
            name='c',
            regions=[
                ScriptRegion(
                    script=subsubscript,
                    content='%include "a"',
                ),
                ScriptRegion(
                    script=subscript,
                    content='%include "b"',
                ),
                ScriptRegion(
                    script=subscript,
                    content='%include "b"',
                ),
            ],
        )
        script.multiple_inclusion = False

        self.assertEqual('a\nb', script.render())
예제 #40
0
    def test_script_run(self, _):
        name = 'foo'
        regions = [
            KeyRegion(
                name='key1',
                index=1,
                content='%key key1',
            ),
            ArgumentRegion(
                name='arg1',
                index=1,
                type_='string',
                content='%arg arg1',
            ),
            TextRegion(content='b'),
            KeyRegion(
                name='key2',
                index=2,
                content='%key key2',
            ),
            ArgumentRegion(
                name='arg2',
                index=2,
                type_='integer',
                content='%arg arg2',
            ),
            ArgumentRegion(
                name='arg3',
                index=3,
                type_='bool',
                content='%arg arg3',
            ),
            ArgumentRegion(
                name='arg4',
                index=4,
                type_='list',
                content='%arg arg4',
            ),
            ArgumentRegion(
                name='arg5',
                index=5,
                type_='dict',
                content='%arg arg5',
            ),
        ]
        script = Script(
            name=name,
            regions=regions,
        )
        script._redis_scripts[None] = MagicMock(return_value="result")
        result = script.get_runner(client=None)(
            arg1='ARG',
            arg2=2,
            arg3=False,
            arg4=(1, 2.5, None, 'a'),
            arg5={'b': None},
            key1='KEY',
            key2='KEY 2',
        )

        self.assertEqual("result", result)
        script._redis_scripts[None].assert_called_once_with(
            keys=['KEY', 'KEY 2'],
            args=[
                'ARG',
                2,
                0,
                json.dumps([1, 2.5, None, 'a']),
                json.dumps({'b': None}),
            ],
        )
예제 #41
0
    def test_script_render_with_duplicate_includes_nested_keys(self):
        script_a = Script(
            name='a',
            regions=[
                KeyRegion(
                    name='key1',
                    index=1,
                    content='%key key1',
                ),
            ],
        )
        script_b = Script(
            name='b',
            regions=[
                KeyRegion(
                    name='key2',
                    index=1,
                    content='%key key2',
                ),
            ],
        )
        script_c = Script(
            name='c',
            regions=[
                KeyRegion(
                    name='key3',
                    index=1,
                    content='%key key3',
                ),
            ],
        )
        script_d = Script(
            name='d',
            regions=[
                ScriptRegion(
                    script=script_c,
                    content='%include "c"',
                ),
                KeyRegion(
                    name='key4',
                    index=2,
                    content='%key key4',
                ),
            ],
        )
        script = Script(
            name='abcd',
            regions=[
                ScriptRegion(
                    script=script_a,
                    content='%include "a"',
                ),
                ScriptRegion(
                    script=script_b,
                    content='%include "b"',
                ),
                ScriptRegion(
                    script=script_d,
                    content='%include "d"',
                ),
            ],
        )

        self.assertEqual(
            [
                'local key1 = KEYS[1]',
                'local key2 = KEYS[2]',
                'local key3 = KEYS[3]',
                'local key4 = KEYS[4]',
            ],
            script.render().split('\n'),
        )
예제 #42
0
    def test_script_render_with_duplicate_includes_nested_args(self):
        script_a = Script(
            name='a',
            regions=[
                ArgumentRegion(
                    name='arg1',
                    type_='string',
                    index=1,
                    content='%arg arg1',
                ),
            ],
        )
        script_b = Script(
            name='b',
            regions=[
                ArgumentRegion(
                    name='arg2',
                    type_='string',
                    index=1,
                    content='%arg arg2',
                ),
            ],
        )
        script_c = Script(
            name='c',
            regions=[
                ArgumentRegion(
                    name='arg3',
                    type_='string',
                    index=1,
                    content='%arg arg3',
                ),
            ],
        )
        script_d = Script(
            name='d',
            regions=[
                ScriptRegion(
                    script=script_c,
                    content='%include "c"',
                ),
                ArgumentRegion(
                    name='arg4',
                    type_='string',
                    index=2,
                    content='%arg arg4',
                ),
            ],
        )
        script = Script(
            name='abcd',
            regions=[
                ScriptRegion(
                    script=script_a,
                    content='%include "a"',
                ),
                ScriptRegion(
                    script=script_b,
                    content='%include "b"',
                ),
                ScriptRegion(
                    script=script_d,
                    content='%include "d"',
                ),
            ],
        )

        self.assertEqual(
            [
                'local arg1 = ARGV[1]',
                'local arg2 = ARGV[2]',
                'local arg3 = ARGV[3]',
                'local arg4 = ARGV[4]',
            ],
            script.render().split('\n'),
        )