コード例 #1
0
ファイル: test_regions.py プロジェクト: ereOn/redis-lua
    def test_text_region_render(self):
        content = 'a\nb\nc'
        text_region = TextRegion(content=content)
        render_context = MagicMock()
        result = text_region.render(context=render_context)

        render_context.render_text.assert_called_once_with(text=content)
        self.assertEqual(render_context.render_text.return_value, result)
コード例 #2
0
    def test_text_region_render(self):
        content = 'a\nb\nc'
        text_region = TextRegion(content=content)
        render_context = MagicMock()
        result = text_region.render(context=render_context)

        render_context.render_text.assert_called_once_with(text=content)
        self.assertEqual(render_context.render_text.return_value, result)
コード例 #3
0
    def test_text_region_equality(self):
        content = 'a\nb\nc'
        text_region_a = TextRegion(content=content)
        text_region_b = TextRegion(content=content)
        text_region_c = TextRegion(content=content + 'd')

        self.assertIsNot(text_region_a, text_region_b)
        self.assertTrue(text_region_a == text_region_b)
        self.assertFalse(text_region_a == text_region_c)
        self.assertFalse(text_region_a == 42)
コード例 #4
0
ファイル: test_script.py プロジェクト: ereOn/redis-lua
    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
ファイル: test_script.py プロジェクト: ereOn/redis-lua
    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)
コード例 #6
0
ファイル: test_script.py プロジェクト: ereOn/redis-lua
    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)
コード例 #7
0
    def test_text_region_representation(self):
        content = 'a\nb\nc'
        text_region = TextRegion(content=content)

        self.assertEqual(
            "TextRegion(line_count=3)",
            repr(text_region),
        )
コード例 #8
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)
コード例 #9
0
ファイル: test_script.py プロジェクト: ereOn/redis-lua
    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
ファイル: test_script.py プロジェクト: ereOn/redis-lua
    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,
        )
コード例 #11
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)
コード例 #12
0
ファイル: test_script.py プロジェクト: ereOn/redis-lua
    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,
        )
コード例 #13
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,
        )
コード例 #14
0
ファイル: test_script.py プロジェクト: ereOn/redis-lua
    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
ファイル: test_script.py プロジェクト: ereOn/redis-lua
    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)
コード例 #16
0
ファイル: test_script.py プロジェクト: ereOn/redis-lua
    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())
コード例 #17
0
ファイル: test_script.py プロジェクト: ereOn/redis-lua
    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)
コード例 #18
0
ファイル: test_script.py プロジェクト: ereOn/redis-lua
    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)
コード例 #19
0
ファイル: test_script.py プロジェクト: ereOn/redis-lua
    def test_script_representation(self):
        name = 'foo'
        regions = [
            TextRegion(content='a'),
        ]
        script = Script(
            name=name,
            regions=regions,
        )

        self.assertEqual(
            "Script(name='foo')",
            repr(script),
        )
コード例 #20
0
ファイル: test_script.py プロジェクト: ereOn/redis-lua
    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)
コード例 #21
0
ファイル: test_script.py プロジェクト: ereOn/redis-lua
    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)
コード例 #22
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)
コード例 #23
0
ファイル: test_script.py プロジェクト: ereOn/redis-lua
    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())
コード例 #24
0
    def test_parse_regions_text_only(self):
        content = 'local a = 1;\nlocal b = 2;'
        get_script_by_name = MagicMock()
        regions = self.parser.parse_regions(
            content=content,
            current_path=".",
            get_script_by_name=get_script_by_name,
        )

        self.assertEqual(
            [
                TextRegion(content=content),
            ],
            regions,
        )
        self.assertEqual(2, regions[0].line_count)
        self.assertEqual(2, regions[0].real_line_count)
        self.assertEqual(0, get_script_by_name.call_count)
コード例 #25
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),
        )
コード例 #26
0
    def test_parse_with_empty_script(self):
        name = 'foo'
        content = ""

        script = self.parser.parse(
            name=name,
            content=content,
            script_class=self.ScriptClass,
            get_script_by_name=None,
        )

        self.assertEqual(name, script.name)
        self.assertEqual(content, script.render())
        self.assertEqual(
            [
                TextRegion(content=content),
            ],
            script.regions,
        )
コード例 #27
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)
コード例 #28
0
    def test_script_region_arguments(self):
        name = 'foo'
        regions = [
            ArgumentRegion(
                name='arg1',
                index=1,
                type_='string',
                content='%arg arg1',
            ),
            TextRegion(content='b'),
        ]
        script = Script(
            name=name,
            regions=regions,
        )
        script_region = ScriptRegion(
            script=script,
            content='%include "foo"',
        )

        self.assertEqual(script.args, script_region.args)
コード例 #29
0
def test_load_scripts_cache_hit():
    names = ['sum', 'foo']
    cache = {
        'foo': Script(
            name='foo',
            regions=[TextRegion(content='')],
        ),
    }
    scripts = load_scripts(
        names=names,
        path=LUA_SEARCH_PATH,
        cache=cache,
    )

    assert_equal(set(names), {script.name for script in scripts.values()})
    assert_equal(set(names), set(scripts.keys()))
    assert_equal(
        {
            'sum': scripts['sum'],
            'foo': scripts['foo'],
        },
        cache,
    )
コード例 #30
0
ファイル: test_script.py プロジェクト: ereOn/redis-lua
    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_script = 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_script.assert_called_once_with(
            keys=['KEY', 'KEY 2'],
            args=[
                'ARG',
                2,
                0,
                jdumps([1, 2.5, None, 'a']),
                jdumps({'b': None}),
            ],
            client=None,
        )
コード例 #31
0
    def test_extract_regions_include(self):
        contents = [
            'local a = 1;',
            '%include "foo"',
            'local d = 4;',
            '%include "foo"',
            '%include "foo"',
            'local e = 4;',
            '%include "../foo"',
            '%include "./bar/../foo"',
        ]
        content = '\n'.join(contents)
        script = Script(
            name='foo',
            regions=[
                TextRegion(content='local b = 2;\nlocal c = 3;'),
            ],
        )
        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(
            [
                TextRegion(content=contents[0]),
                ScriptRegion(
                    script=script,
                    content='%include "foo"',
                ),
                TextRegion(content=contents[2]),
                ScriptRegion(
                    script=script,
                    content='%include "foo"',
                ),
                ScriptRegion(
                    script=script,
                    content='%include "foo"',
                ),
                TextRegion(content=contents[5]),
                ScriptRegion(
                    script=script,
                    content='%include "../foo"',
                ),
                ScriptRegion(
                    script=script,
                    content='%include "./bar/../foo"',
                ),
            ],
            regions,
        )
        self.assertEqual(
            [
                call(name="%s" % script.name),
                call(name="%s" % script.name),
                call(name="%s" % script.name),
                call(name="../%s" % script.name),
                call(name="%s" % script.name),
            ],
            get_script_by_name.mock_calls[:],
        )