pbi-parsers 0.7.12__py3-none-any.whl → 0.7.20__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pbi_parsers/__init__.py +1 -1
- pbi_parsers/base/lexer.py +32 -33
- pbi_parsers/base/tokens.py +18 -13
- pbi_parsers/dax/exprs/_base.py +13 -13
- pbi_parsers/dax/exprs/_utils.py +11 -0
- pbi_parsers/dax/exprs/add_sub.py +10 -10
- pbi_parsers/dax/exprs/add_sub_unary.py +10 -10
- pbi_parsers/dax/exprs/array.py +13 -13
- pbi_parsers/dax/exprs/column.py +12 -12
- pbi_parsers/dax/exprs/comparison.py +10 -10
- pbi_parsers/dax/exprs/concatenation.py +10 -10
- pbi_parsers/dax/exprs/div_mul.py +10 -10
- pbi_parsers/dax/exprs/exponent.py +10 -10
- pbi_parsers/dax/exprs/function.py +31 -31
- pbi_parsers/dax/exprs/hierarchy.py +13 -13
- pbi_parsers/dax/exprs/identifier.py +9 -9
- pbi_parsers/dax/exprs/ins.py +10 -10
- pbi_parsers/dax/exprs/keyword.py +9 -9
- pbi_parsers/dax/exprs/literal_number.py +9 -8
- pbi_parsers/dax/exprs/literal_string.py +8 -8
- pbi_parsers/dax/exprs/logical.py +10 -10
- pbi_parsers/dax/exprs/measure.py +8 -8
- pbi_parsers/dax/exprs/none.py +9 -9
- pbi_parsers/dax/exprs/parens.py +12 -12
- pbi_parsers/dax/exprs/returns.py +17 -17
- pbi_parsers/dax/exprs/table.py +11 -11
- pbi_parsers/dax/exprs/variable.py +14 -14
- pbi_parsers/dax/formatter.py +8 -8
- pbi_parsers/dax/lexer.py +97 -97
- pbi_parsers/dax/main.py +16 -16
- pbi_parsers/dax/parser.py +8 -8
- pbi_parsers/dax/utils.py +19 -19
- {pbi_parsers-0.7.12.dist-info → pbi_parsers-0.7.20.dist-info}/METADATA +13 -1
- {pbi_parsers-0.7.12.dist-info → pbi_parsers-0.7.20.dist-info}/RECORD +36 -35
- pbi_parsers-0.7.20.dist-info/licenses/LICENSE +21 -0
- {pbi_parsers-0.7.12.dist-info → pbi_parsers-0.7.20.dist-info}/WHEEL +0 -0
pbi_parsers/dax/exprs/ins.py
CHANGED
@@ -26,6 +26,13 @@ class InExpression(Expression):
|
|
26
26
|
self.value = value
|
27
27
|
self.array = array
|
28
28
|
|
29
|
+
def children(self) -> list[Expression]:
|
30
|
+
"""Returns a list of child expressions."""
|
31
|
+
return [self.value, self.array]
|
32
|
+
|
33
|
+
def full_text(self) -> str:
|
34
|
+
return self.value.full_text()
|
35
|
+
|
29
36
|
@classmethod
|
30
37
|
@lexer_reset
|
31
38
|
def match(cls, parser: "Parser") -> "InExpression | None":
|
@@ -47,6 +54,9 @@ class InExpression(Expression):
|
|
47
54
|
raise ValueError(msg)
|
48
55
|
return InExpression(value=left_term, array=right_term)
|
49
56
|
|
57
|
+
def position(self) -> tuple[int, int]:
|
58
|
+
return self.value.position()[0], self.array.position()[1]
|
59
|
+
|
50
60
|
def pprint(self) -> str:
|
51
61
|
value_str = textwrap.indent(self.value.pprint(), " " * 11)[11:]
|
52
62
|
array_str = textwrap.indent(self.array.pprint(), " " * 11)[11:]
|
@@ -55,13 +65,3 @@ In (
|
|
55
65
|
value: {value_str},
|
56
66
|
array: {array_str}
|
57
67
|
)""".strip()
|
58
|
-
|
59
|
-
def children(self) -> list[Expression]:
|
60
|
-
"""Returns a list of child expressions."""
|
61
|
-
return [self.value, self.array]
|
62
|
-
|
63
|
-
def position(self) -> tuple[int, int]:
|
64
|
-
return self.value.position()[0], self.array.position()[1]
|
65
|
-
|
66
|
-
def full_text(self) -> str:
|
67
|
-
return self.value.full_text()
|
pbi_parsers/dax/exprs/keyword.py
CHANGED
@@ -24,9 +24,12 @@ class KeywordExpression(Expression):
|
|
24
24
|
def __init__(self, name: Token) -> None:
|
25
25
|
self.name = name
|
26
26
|
|
27
|
-
def
|
28
|
-
|
29
|
-
|
27
|
+
def children(self) -> list[Expression]: # noqa: PLR6301
|
28
|
+
"""Returns a list of child expressions."""
|
29
|
+
return []
|
30
|
+
|
31
|
+
def full_text(self) -> str:
|
32
|
+
return self.name.text_slice.full_text
|
30
33
|
|
31
34
|
@classmethod
|
32
35
|
@lexer_reset
|
@@ -49,12 +52,9 @@ Keyword ({self.name.text})""".strip()
|
|
49
52
|
)
|
50
53
|
return KeywordExpression(name=name)
|
51
54
|
|
52
|
-
def children(self) -> list[Expression]: # noqa: PLR6301
|
53
|
-
"""Returns a list of child expressions."""
|
54
|
-
return []
|
55
|
-
|
56
55
|
def position(self) -> tuple[int, int]:
|
57
56
|
return self.name.text_slice.start, self.name.text_slice.end
|
58
57
|
|
59
|
-
def
|
60
|
-
return
|
58
|
+
def pprint(self) -> str:
|
59
|
+
return f"""
|
60
|
+
Keyword ({self.name.text})""".strip()
|
@@ -16,6 +16,7 @@ class LiteralNumberExpression(Expression):
|
|
16
16
|
42
|
17
17
|
3.14
|
18
18
|
-1000
|
19
|
+
1.1e2
|
19
20
|
|
20
21
|
"""
|
21
22
|
|
@@ -24,8 +25,12 @@ class LiteralNumberExpression(Expression):
|
|
24
25
|
def __init__(self, value: Token) -> None:
|
25
26
|
self.value = value
|
26
27
|
|
27
|
-
def
|
28
|
-
|
28
|
+
def children(self) -> list[Expression]: # noqa: PLR6301
|
29
|
+
"""Returns a list of child expressions."""
|
30
|
+
return []
|
31
|
+
|
32
|
+
def full_text(self) -> str:
|
33
|
+
return self.value.text_slice.full_text
|
29
34
|
|
30
35
|
@classmethod
|
31
36
|
@lexer_reset
|
@@ -35,12 +40,8 @@ class LiteralNumberExpression(Expression):
|
|
35
40
|
return LiteralNumberExpression(value=value)
|
36
41
|
return None
|
37
42
|
|
38
|
-
def children(self) -> list[Expression]: # noqa: PLR6301
|
39
|
-
"""Returns a list of child expressions."""
|
40
|
-
return []
|
41
|
-
|
42
43
|
def position(self) -> tuple[int, int]:
|
43
44
|
return self.value.text_slice.start, self.value.text_slice.end
|
44
45
|
|
45
|
-
def
|
46
|
-
return self.value.
|
46
|
+
def pprint(self) -> str:
|
47
|
+
return f"Number ({self.value.text})"
|
@@ -23,8 +23,12 @@ class LiteralStringExpression(Expression):
|
|
23
23
|
def __init__(self, value: Token) -> None:
|
24
24
|
self.value = value
|
25
25
|
|
26
|
-
def
|
27
|
-
|
26
|
+
def children(self) -> list[Expression]: # noqa: PLR6301
|
27
|
+
"""Returns a list of child expressions."""
|
28
|
+
return []
|
29
|
+
|
30
|
+
def full_text(self) -> str:
|
31
|
+
return self.value.text_slice.full_text
|
28
32
|
|
29
33
|
@classmethod
|
30
34
|
@lexer_reset
|
@@ -34,12 +38,8 @@ class LiteralStringExpression(Expression):
|
|
34
38
|
return LiteralStringExpression(value=value)
|
35
39
|
return None
|
36
40
|
|
37
|
-
def children(self) -> list[Expression]: # noqa: PLR6301
|
38
|
-
"""Returns a list of child expressions."""
|
39
|
-
return []
|
40
|
-
|
41
41
|
def position(self) -> tuple[int, int]:
|
42
42
|
return self.value.text_slice.start, self.value.text_slice.end
|
43
43
|
|
44
|
-
def
|
45
|
-
return self.value.
|
44
|
+
def pprint(self) -> str:
|
45
|
+
return f"String ({self.value.text})"
|
pbi_parsers/dax/exprs/logical.py
CHANGED
@@ -28,6 +28,13 @@ class LogicalExpression(Expression):
|
|
28
28
|
self.left = left
|
29
29
|
self.right = right
|
30
30
|
|
31
|
+
def children(self) -> list[Expression]:
|
32
|
+
"""Returns a list of child expressions."""
|
33
|
+
return [self.left, self.right]
|
34
|
+
|
35
|
+
def full_text(self) -> str:
|
36
|
+
return self.left.full_text()
|
37
|
+
|
31
38
|
@classmethod
|
32
39
|
@lexer_reset
|
33
40
|
def match(cls, parser: "Parser") -> "LogicalExpression | None":
|
@@ -55,6 +62,9 @@ class LogicalExpression(Expression):
|
|
55
62
|
raise ValueError(msg)
|
56
63
|
return LogicalExpression(operator=operator, left=left_term, right=right_term)
|
57
64
|
|
65
|
+
def position(self) -> tuple[int, int]:
|
66
|
+
return self.left.position()[0], self.right.position()[1]
|
67
|
+
|
58
68
|
def pprint(self) -> str:
|
59
69
|
left_str = textwrap.indent(self.left.pprint(), " " * 10).lstrip()
|
60
70
|
right_str = textwrap.indent(self.right.pprint(), " " * 10).lstrip()
|
@@ -64,13 +74,3 @@ Logical (
|
|
64
74
|
left: {left_str},
|
65
75
|
right: {right_str}
|
66
76
|
)""".strip()
|
67
|
-
|
68
|
-
def children(self) -> list[Expression]:
|
69
|
-
"""Returns a list of child expressions."""
|
70
|
-
return [self.left, self.right]
|
71
|
-
|
72
|
-
def position(self) -> tuple[int, int]:
|
73
|
-
return self.left.position()[0], self.right.position()[1]
|
74
|
-
|
75
|
-
def full_text(self) -> str:
|
76
|
-
return self.left.full_text()
|
pbi_parsers/dax/exprs/measure.py
CHANGED
@@ -22,8 +22,12 @@ class MeasureExpression(Expression):
|
|
22
22
|
def __init__(self, name: Token) -> None:
|
23
23
|
self.name = name
|
24
24
|
|
25
|
-
def
|
26
|
-
|
25
|
+
def children(self) -> list[Expression]: # noqa: PLR6301
|
26
|
+
"""Returns a list of child expressions."""
|
27
|
+
return []
|
28
|
+
|
29
|
+
def full_text(self) -> str:
|
30
|
+
return self.name.text_slice.full_text
|
27
31
|
|
28
32
|
@classmethod
|
29
33
|
@lexer_reset
|
@@ -33,12 +37,8 @@ class MeasureExpression(Expression):
|
|
33
37
|
return MeasureExpression(name=name)
|
34
38
|
return None
|
35
39
|
|
36
|
-
def children(self) -> list[Expression]: # noqa: PLR6301
|
37
|
-
"""Returns a list of child expressions."""
|
38
|
-
return []
|
39
|
-
|
40
40
|
def position(self) -> tuple[int, int]:
|
41
41
|
return self.name.text_slice.start, self.name.text_slice.end
|
42
42
|
|
43
|
-
def
|
44
|
-
return self.name.
|
43
|
+
def pprint(self) -> str:
|
44
|
+
return f"Measure ({self.name.text})"
|
pbi_parsers/dax/exprs/none.py
CHANGED
@@ -9,22 +9,22 @@ if TYPE_CHECKING:
|
|
9
9
|
class NoneExpression(Expression):
|
10
10
|
"""Used to represent the absence of a value, so far only occurring when a argument is skipped in a function."""
|
11
11
|
|
12
|
-
def
|
13
|
-
|
12
|
+
def children(self) -> list[Expression]: # noqa: PLR6301
|
13
|
+
"""Returns a list of child expressions."""
|
14
|
+
return []
|
15
|
+
|
16
|
+
def full_text(self) -> str: # noqa: PLR6301
|
17
|
+
"""Returns the full text of the expression."""
|
18
|
+
return ""
|
14
19
|
|
15
20
|
@classmethod
|
16
21
|
def match(cls, parser: "Parser") -> "NoneExpression | None":
|
17
22
|
msg = "NoneExpression.match should not be called, this is a placeholder for the absence of an expression."
|
18
23
|
raise NotImplementedError(msg)
|
19
24
|
|
20
|
-
def children(self) -> list[Expression]: # noqa: PLR6301
|
21
|
-
"""Returns a list of child expressions."""
|
22
|
-
return []
|
23
|
-
|
24
25
|
def position(self) -> tuple[int, int]: # noqa: PLR6301
|
25
26
|
"""Returns the position of the expression."""
|
26
27
|
return -1, -1
|
27
28
|
|
28
|
-
def
|
29
|
-
|
30
|
-
return ""
|
29
|
+
def pprint(self) -> str: # noqa: PLR6301 # kept this way to match the interface
|
30
|
+
return "None"
|
pbi_parsers/dax/exprs/parens.py
CHANGED
@@ -25,11 +25,13 @@ class ParenthesesExpression(Expression):
|
|
25
25
|
self.inner_statement = inner_statement
|
26
26
|
self.parens = parens
|
27
27
|
|
28
|
-
def
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
28
|
+
def children(self) -> list[Expression]:
|
29
|
+
"""Returns a list of child expressions."""
|
30
|
+
return [self.inner_statement]
|
31
|
+
|
32
|
+
def full_text(self) -> str:
|
33
|
+
"""Returns the full text of the expression."""
|
34
|
+
return self.parens[0].text_slice.full_text
|
33
35
|
|
34
36
|
@classmethod
|
35
37
|
@lexer_reset
|
@@ -48,14 +50,12 @@ Parentheses (
|
|
48
50
|
assert right_paren.tok_type == TokenType.RIGHT_PAREN # Consume the right parenthesis
|
49
51
|
return ParenthesesExpression(inner_statement=value, parens=(left_paren, right_paren))
|
50
52
|
|
51
|
-
def children(self) -> list[Expression]:
|
52
|
-
"""Returns a list of child expressions."""
|
53
|
-
return [self.inner_statement]
|
54
|
-
|
55
53
|
def position(self) -> tuple[int, int]:
|
56
54
|
"""Returns the position of the expression."""
|
57
55
|
return self.parens[0].text_slice.start, self.parens[1].text_slice.end
|
58
56
|
|
59
|
-
def
|
60
|
-
|
61
|
-
|
57
|
+
def pprint(self) -> str:
|
58
|
+
return f"""
|
59
|
+
Parentheses (
|
60
|
+
{self.inner_statement}
|
61
|
+
)""".strip()
|
pbi_parsers/dax/exprs/returns.py
CHANGED
@@ -30,17 +30,12 @@ class ReturnExpression(Expression):
|
|
30
30
|
self.ret = ret
|
31
31
|
self.variable_statements = variable_statements
|
32
32
|
|
33
|
-
def
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
return f"""
|
40
|
-
Return (
|
41
|
-
Return: {return_val},
|
42
|
-
Statements: {statements}
|
43
|
-
)""".strip()
|
33
|
+
def children(self) -> list[Expression]:
|
34
|
+
"""Returns a list of child expressions."""
|
35
|
+
return [self.ret, *self.variable_statements]
|
36
|
+
|
37
|
+
def full_text(self) -> str:
|
38
|
+
return self.ret.full_text()
|
44
39
|
|
45
40
|
@classmethod
|
46
41
|
@lexer_reset
|
@@ -65,12 +60,17 @@ Return (
|
|
65
60
|
raise ValueError(msg)
|
66
61
|
return ReturnExpression(ret=ret, variable_statements=statements)
|
67
62
|
|
68
|
-
def children(self) -> list[Expression]:
|
69
|
-
"""Returns a list of child expressions."""
|
70
|
-
return [self.ret, *self.variable_statements]
|
71
|
-
|
72
63
|
def position(self) -> tuple[int, int]:
|
73
64
|
return self.variable_statements[0].position()[0], self.ret.position()[1]
|
74
65
|
|
75
|
-
def
|
76
|
-
|
66
|
+
def pprint(self) -> str:
|
67
|
+
return_val = textwrap.indent(self.ret.pprint(), " " * 12).lstrip()
|
68
|
+
statements = textwrap.indent(
|
69
|
+
",\n".join(stmt.pprint() for stmt in self.variable_statements),
|
70
|
+
" " * 16,
|
71
|
+
).lstrip()
|
72
|
+
return f"""
|
73
|
+
Return (
|
74
|
+
Return: {return_val},
|
75
|
+
Statements: {statements}
|
76
|
+
)""".strip()
|
pbi_parsers/dax/exprs/table.py
CHANGED
@@ -23,11 +23,12 @@ class TableExpression(Expression):
|
|
23
23
|
def __init__(self, name: Token) -> None:
|
24
24
|
self.name = name
|
25
25
|
|
26
|
-
def
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
26
|
+
def children(self) -> list[Expression]: # noqa: PLR6301
|
27
|
+
"""Returns a list of child expressions."""
|
28
|
+
return []
|
29
|
+
|
30
|
+
def full_text(self) -> str:
|
31
|
+
return self.name.text_slice.full_text
|
31
32
|
|
32
33
|
@classmethod
|
33
34
|
@lexer_reset
|
@@ -40,12 +41,11 @@ Table (
|
|
40
41
|
return None
|
41
42
|
return TableExpression(name=name)
|
42
43
|
|
43
|
-
def children(self) -> list[Expression]: # noqa: PLR6301
|
44
|
-
"""Returns a list of child expressions."""
|
45
|
-
return []
|
46
|
-
|
47
44
|
def position(self) -> tuple[int, int]:
|
48
45
|
return self.name.text_slice.start, self.name.text_slice.end
|
49
46
|
|
50
|
-
def
|
51
|
-
return
|
47
|
+
def pprint(self) -> str:
|
48
|
+
return f"""
|
49
|
+
Table (
|
50
|
+
{self.name.text}
|
51
|
+
)""".strip()
|
@@ -28,14 +28,12 @@ class VariableExpression(Expression):
|
|
28
28
|
self.var_name = var_name
|
29
29
|
self.statement = statement
|
30
30
|
|
31
|
-
def
|
32
|
-
|
33
|
-
return
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
)
|
38
|
-
""".strip()
|
31
|
+
def children(self) -> list[Expression]:
|
32
|
+
"""Returns a list of child expressions."""
|
33
|
+
return [self.statement]
|
34
|
+
|
35
|
+
def full_text(self) -> str:
|
36
|
+
return self.var_name.text_slice.full_text
|
39
37
|
|
40
38
|
@classmethod
|
41
39
|
@lexer_reset
|
@@ -57,12 +55,14 @@ Variable (
|
|
57
55
|
raise ValueError(msg)
|
58
56
|
return VariableExpression(var_name=var_name, statement=statement)
|
59
57
|
|
60
|
-
def children(self) -> list[Expression]:
|
61
|
-
"""Returns a list of child expressions."""
|
62
|
-
return [self.statement]
|
63
|
-
|
64
58
|
def position(self) -> tuple[int, int]:
|
65
59
|
return self.var_name.text_slice.start, self.statement.position()[1]
|
66
60
|
|
67
|
-
def
|
68
|
-
|
61
|
+
def pprint(self) -> str:
|
62
|
+
statement = textwrap.indent(self.statement.pprint(), " " * 15).lstrip()
|
63
|
+
return f"""
|
64
|
+
Variable (
|
65
|
+
name: {self.var_name.text},
|
66
|
+
statement: {statement}
|
67
|
+
)
|
68
|
+
""".strip()
|
pbi_parsers/dax/formatter.py
CHANGED
@@ -103,12 +103,6 @@ class Formatter:
|
|
103
103
|
}}
|
104
104
|
"""
|
105
105
|
|
106
|
-
@classmethod
|
107
|
-
def _format_comparison(cls, expr: ComparisonExpression) -> str:
|
108
|
-
left = cls._format_helper(expr.left)
|
109
|
-
right = cls._format_helper(expr.right)
|
110
|
-
return f"""{left} {expr.operator.text} {right}"""
|
111
|
-
|
112
106
|
@classmethod
|
113
107
|
def _format_column(cls, expr: ColumnExpression) -> str:
|
114
108
|
table = expr.table.text
|
@@ -117,6 +111,12 @@ class Formatter:
|
|
117
111
|
column = expr.column.text
|
118
112
|
return f"{table}{column}"
|
119
113
|
|
114
|
+
@classmethod
|
115
|
+
def _format_comparison(cls, expr: ComparisonExpression) -> str:
|
116
|
+
left = cls._format_helper(expr.left)
|
117
|
+
right = cls._format_helper(expr.right)
|
118
|
+
return f"""{left} {expr.operator.text} {right}"""
|
119
|
+
|
120
120
|
@classmethod
|
121
121
|
def _format_concatenation(cls, expr: ConcatenationExpression) -> str:
|
122
122
|
left = cls._format_helper(expr.left)
|
@@ -170,11 +170,11 @@ class Formatter:
|
|
170
170
|
return expr.name.text
|
171
171
|
|
172
172
|
@classmethod
|
173
|
-
def
|
173
|
+
def _format_literal_number(cls, expr: LiteralNumberExpression) -> str:
|
174
174
|
return expr.value.text
|
175
175
|
|
176
176
|
@classmethod
|
177
|
-
def
|
177
|
+
def _format_literal_string(cls, expr: LiteralStringExpression) -> str:
|
178
178
|
return expr.value.text
|
179
179
|
|
180
180
|
@classmethod
|