1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
|
"""Test Python parser"""
import astroid
from autoapi._parser import Parser
class TestPythonParser:
def parse(self, source):
node = astroid.extract_node(source)
return Parser().parse(node)
def test_parses_basic_file(self):
source = """
def foo(bar):
pass
"""
data = self.parse(source)[0]
assert data["name"] == "foo"
assert data["type"] == "function"
def test_parses_all(self):
source = """
__all__ = ['Foo', 5.0]
"""
data = self.parse(source)[0]
assert data["name"] == "__all__"
assert data["value"] == "['Foo', 5.0]"
def test_parses_all_multiline(self):
source = """
__all__ = [
'foo',
'bar',
]
"""
data = self.parse(source)[0]
assert data["value"] == "['foo', 'bar']"
def test_parses_name(self):
source = "foo.bar"
assert self.parse(source) == []
def test_parses_list(self):
name = "__all__"
value = "[1, 2, 3, 4]"
source = f"{name} = {value}"
data = self.parse(source)[0]
assert data["name"] == name
assert data["value"] == value
def test_parses_nested_list(self):
name = "__all__"
value = "[[1, 2], [3, 4]]"
source = f"{name} = {value}"
data = self.parse(source)[0]
assert data["name"] == name
assert data["value"] == value
def test_arguments(self):
"""Argument parsing of source"""
source = (
"def foobar(self, bar, baz=42, foo=True,\n"
" *args, **kwargs):\n"
' "This is a docstring"\n'
" return True\n"
)
data = self.parse(source)[0]
expected = [
(None, "self", None, None),
(None, "bar", None, None),
(None, "baz", None, "42"),
(None, "foo", None, "True"),
("*", "args", None, None),
("**", "kwargs", None, None),
]
assert data["args"] == expected
def test_advanced_arguments(self):
"""Advanced argument parsing"""
source = (
'def foobar(self, a, b, c=42, d="string", e=(1,2),\n'
' f={"a": True}, g=None, h=[1,2,3,4],\n'
" i=dict(a=True), j=False, *args, **kwargs):\n"
' "This is a docstring"\n'
" return True\n"
)
data = self.parse(source)[0]
expected = [
(None, "self", None, None),
(None, "a", None, None),
(None, "b", None, None),
(None, "c", None, "42"),
(None, "d", None, "'string'"),
(None, "e", None, "(1, 2)"),
(None, "f", None, "{'a': True}"),
(None, "g", None, "None"),
(None, "h", None, "[1, 2, 3, 4]"),
(None, "i", None, "dict(a=True)"),
(None, "j", None, "False"),
("*", "args", None, None),
("**", "kwargs", None, None),
]
assert data["args"] == expected
def test_dict_key_assignment(self):
"""Ignore assignment to dictionary entries."""
source = """
MY_DICT = {} #@
if condition:
MY_DICT['key'] = 'value'
MY_DICT['key2'] = 'value2'
"""
data = self.parse(source)[0]
assert data["name"] == "MY_DICT"
def test_list_index_assignment(self):
"""Ignore assignment to indexes."""
source = """
COLOUR = [255, 128, 0] #@
if condition:
COLOUR[1] = 255
COLOUR[2] = 255
"""
data = self.parse(source)[0]
assert data["name"] == "COLOUR"
|