pbi-parsers 0.7.19__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.
Files changed (36) hide show
  1. pbi_parsers/__init__.py +1 -1
  2. pbi_parsers/base/lexer.py +32 -33
  3. pbi_parsers/base/tokens.py +18 -13
  4. pbi_parsers/dax/exprs/_base.py +13 -13
  5. pbi_parsers/dax/exprs/_utils.py +11 -0
  6. pbi_parsers/dax/exprs/add_sub.py +10 -10
  7. pbi_parsers/dax/exprs/add_sub_unary.py +10 -10
  8. pbi_parsers/dax/exprs/array.py +13 -13
  9. pbi_parsers/dax/exprs/column.py +12 -12
  10. pbi_parsers/dax/exprs/comparison.py +10 -10
  11. pbi_parsers/dax/exprs/concatenation.py +10 -10
  12. pbi_parsers/dax/exprs/div_mul.py +10 -10
  13. pbi_parsers/dax/exprs/exponent.py +10 -10
  14. pbi_parsers/dax/exprs/function.py +31 -31
  15. pbi_parsers/dax/exprs/hierarchy.py +13 -13
  16. pbi_parsers/dax/exprs/identifier.py +9 -9
  17. pbi_parsers/dax/exprs/ins.py +10 -10
  18. pbi_parsers/dax/exprs/keyword.py +9 -9
  19. pbi_parsers/dax/exprs/literal_number.py +9 -8
  20. pbi_parsers/dax/exprs/literal_string.py +8 -8
  21. pbi_parsers/dax/exprs/logical.py +10 -10
  22. pbi_parsers/dax/exprs/measure.py +8 -8
  23. pbi_parsers/dax/exprs/none.py +9 -9
  24. pbi_parsers/dax/exprs/parens.py +12 -12
  25. pbi_parsers/dax/exprs/returns.py +17 -17
  26. pbi_parsers/dax/exprs/table.py +11 -11
  27. pbi_parsers/dax/exprs/variable.py +14 -14
  28. pbi_parsers/dax/formatter.py +8 -8
  29. pbi_parsers/dax/lexer.py +97 -97
  30. pbi_parsers/dax/main.py +16 -16
  31. pbi_parsers/dax/parser.py +8 -8
  32. pbi_parsers/dax/utils.py +19 -19
  33. {pbi_parsers-0.7.19.dist-info → pbi_parsers-0.7.20.dist-info}/METADATA +13 -1
  34. {pbi_parsers-0.7.19.dist-info → pbi_parsers-0.7.20.dist-info}/RECORD +36 -35
  35. pbi_parsers-0.7.20.dist-info/licenses/LICENSE +21 -0
  36. {pbi_parsers-0.7.19.dist-info → pbi_parsers-0.7.20.dist-info}/WHEEL +0 -0
@@ -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()
@@ -24,9 +24,12 @@ class KeywordExpression(Expression):
24
24
  def __init__(self, name: Token) -> None:
25
25
  self.name = name
26
26
 
27
- def pprint(self) -> str:
28
- return f"""
29
- Keyword ({self.name.text})""".strip()
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 full_text(self) -> str:
60
- return self.name.text_slice.full_text
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 pprint(self) -> str:
28
- return f"Number ({self.value.text})"
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 full_text(self) -> str:
46
- return self.value.text_slice.full_text
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 pprint(self) -> str:
27
- return f"String ({self.value.text})"
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 full_text(self) -> str:
45
- return self.value.text_slice.full_text
44
+ def pprint(self) -> str:
45
+ return f"String ({self.value.text})"
@@ -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()
@@ -22,8 +22,12 @@ class MeasureExpression(Expression):
22
22
  def __init__(self, name: Token) -> None:
23
23
  self.name = name
24
24
 
25
- def pprint(self) -> str:
26
- return f"Measure ({self.name.text})"
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 full_text(self) -> str:
44
- return self.name.text_slice.full_text
43
+ def pprint(self) -> str:
44
+ return f"Measure ({self.name.text})"
@@ -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 pprint(self) -> str: # noqa: PLR6301 # kept this way to match the interface
13
- return "None"
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 full_text(self) -> str: # noqa: PLR6301
29
- """Returns the full text of the expression."""
30
- return ""
29
+ def pprint(self) -> str: # noqa: PLR6301 # kept this way to match the interface
30
+ return "None"
@@ -25,11 +25,13 @@ class ParenthesesExpression(Expression):
25
25
  self.inner_statement = inner_statement
26
26
  self.parens = parens
27
27
 
28
- def pprint(self) -> str:
29
- return f"""
30
- Parentheses (
31
- {self.inner_statement}
32
- )""".strip()
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 full_text(self) -> str:
60
- """Returns the full text of the expression."""
61
- return self.parens[0].text_slice.full_text
57
+ def pprint(self) -> str:
58
+ return f"""
59
+ Parentheses (
60
+ {self.inner_statement}
61
+ )""".strip()
@@ -30,17 +30,12 @@ class ReturnExpression(Expression):
30
30
  self.ret = ret
31
31
  self.variable_statements = variable_statements
32
32
 
33
- def pprint(self) -> str:
34
- return_val = textwrap.indent(self.ret.pprint(), " " * 12).lstrip()
35
- statements = textwrap.indent(
36
- ",\n".join(stmt.pprint() for stmt in self.variable_statements),
37
- " " * 16,
38
- ).lstrip()
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 full_text(self) -> str:
76
- return self.ret.full_text()
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()
@@ -23,11 +23,12 @@ class TableExpression(Expression):
23
23
  def __init__(self, name: Token) -> None:
24
24
  self.name = name
25
25
 
26
- def pprint(self) -> str:
27
- return f"""
28
- Table (
29
- {self.name.text}
30
- )""".strip()
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 full_text(self) -> str:
51
- return self.name.text_slice.full_text
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 pprint(self) -> str:
32
- statement = textwrap.indent(self.statement.pprint(), " " * 15).lstrip()
33
- return f"""
34
- Variable (
35
- name: {self.var_name.text},
36
- statement: {statement}
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 full_text(self) -> str:
68
- return self.var_name.text_slice.full_text
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()
@@ -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 _format_literal_string(cls, expr: LiteralStringExpression) -> str:
173
+ def _format_literal_number(cls, expr: LiteralNumberExpression) -> str:
174
174
  return expr.value.text
175
175
 
176
176
  @classmethod
177
- def _format_literal_number(cls, expr: LiteralNumberExpression) -> str:
177
+ def _format_literal_string(cls, expr: LiteralStringExpression) -> str:
178
178
  return expr.value.text
179
179
 
180
180
  @classmethod