pbi-parsers 0.7.21__tar.gz → 0.8.0__tar.gz

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 (120) hide show
  1. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/PKG-INFO +1 -1
  2. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/__init__.py +1 -1
  3. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/dax/exprs/_base.py +36 -1
  4. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/.github/workflows/deploy-docs.yml +0 -0
  5. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/.github/workflows/deploy.yml +0 -0
  6. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/.gitignore +0 -0
  7. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/LICENSE +0 -0
  8. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/README.md +0 -0
  9. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/docs/docs/api/dax/formatter.md +0 -0
  10. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/docs/docs/api/dax/lexer.md +0 -0
  11. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/docs/docs/api/dax/parser.md +0 -0
  12. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/docs/docs/api/pq/formatter.md +0 -0
  13. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/docs/docs/api/pq/lexer.md +0 -0
  14. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/docs/docs/api/pq/parser.md +0 -0
  15. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/docs/docs/api/shared/lexer.md +0 -0
  16. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/docs/docs/api/shared/text_slice.md +0 -0
  17. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/docs/docs/api/shared/token.md +0 -0
  18. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/docs/docs/index.md +0 -0
  19. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/docs/mkdocs.yml +0 -0
  20. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/base/__init__.py +0 -0
  21. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/base/lexer.py +0 -0
  22. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/base/tokens.py +0 -0
  23. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/dax/__init__.py +0 -0
  24. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/dax/exprs/__init__.py +0 -0
  25. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/dax/exprs/_utils.py +0 -0
  26. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/dax/exprs/add_sub.py +0 -0
  27. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/dax/exprs/add_sub_unary.py +0 -0
  28. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/dax/exprs/array.py +0 -0
  29. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/dax/exprs/column.py +0 -0
  30. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/dax/exprs/comparison.py +0 -0
  31. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/dax/exprs/concatenation.py +0 -0
  32. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/dax/exprs/div_mul.py +0 -0
  33. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/dax/exprs/exponent.py +0 -0
  34. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/dax/exprs/function.py +0 -0
  35. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/dax/exprs/hierarchy.py +0 -0
  36. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/dax/exprs/identifier.py +0 -0
  37. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/dax/exprs/ins.py +0 -0
  38. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/dax/exprs/keyword.py +0 -0
  39. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/dax/exprs/literal_number.py +0 -0
  40. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/dax/exprs/literal_string.py +0 -0
  41. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/dax/exprs/logical.py +0 -0
  42. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/dax/exprs/measure.py +0 -0
  43. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/dax/exprs/none.py +0 -0
  44. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/dax/exprs/parens.py +0 -0
  45. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/dax/exprs/returns.py +0 -0
  46. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/dax/exprs/table.py +0 -0
  47. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/dax/exprs/variable.py +0 -0
  48. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/dax/formatter.py +0 -0
  49. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/dax/lexer.py +0 -0
  50. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/dax/main.py +0 -0
  51. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/dax/parser.py +0 -0
  52. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/dax/tokens.py +0 -0
  53. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/dax/utils.py +0 -0
  54. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/pq/__init__.py +0 -0
  55. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/pq/exprs/__init__.py +0 -0
  56. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/pq/exprs/_base.py +0 -0
  57. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/pq/exprs/_utils.py +0 -0
  58. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/pq/exprs/add_sub.py +0 -0
  59. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/pq/exprs/add_sub_unary.py +0 -0
  60. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/pq/exprs/and_or_expr.py +0 -0
  61. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/pq/exprs/array.py +0 -0
  62. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/pq/exprs/arrow.py +0 -0
  63. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/pq/exprs/column.py +0 -0
  64. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/pq/exprs/comparison.py +0 -0
  65. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/pq/exprs/concatenation.py +0 -0
  66. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/pq/exprs/div_mul.py +0 -0
  67. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/pq/exprs/each.py +0 -0
  68. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/pq/exprs/ellipsis_expr.py +0 -0
  69. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/pq/exprs/function.py +0 -0
  70. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/pq/exprs/identifier.py +0 -0
  71. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/pq/exprs/if_expr.py +0 -0
  72. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/pq/exprs/is_expr.py +0 -0
  73. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/pq/exprs/keyword.py +0 -0
  74. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/pq/exprs/literal_number.py +0 -0
  75. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/pq/exprs/literal_string.py +0 -0
  76. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/pq/exprs/meta.py +0 -0
  77. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/pq/exprs/negation.py +0 -0
  78. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/pq/exprs/none.py +0 -0
  79. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/pq/exprs/not_expr.py +0 -0
  80. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/pq/exprs/parens.py +0 -0
  81. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/pq/exprs/record.py +0 -0
  82. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/pq/exprs/row.py +0 -0
  83. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/pq/exprs/row_index.py +0 -0
  84. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/pq/exprs/statement.py +0 -0
  85. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/pq/exprs/try_expr.py +0 -0
  86. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/pq/exprs/type_expr.py +0 -0
  87. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/pq/exprs/variable.py +0 -0
  88. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/pq/formatter.py +0 -0
  89. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/pq/lexer.py +0 -0
  90. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/pq/main.py +0 -0
  91. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/pq/parser.py +0 -0
  92. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pbi_parsers/pq/tokens.py +0 -0
  93. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/pyproject.toml +0 -0
  94. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/tests/__init__.py +0 -0
  95. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/tests/test_dax/__init__.py +0 -0
  96. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/tests/test_dax/test_exprs/__init__.py +0 -0
  97. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/tests/test_dax/test_exprs/test_add_sub.py +0 -0
  98. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/tests/test_dax/test_exprs/test_add_sub_unary.py +0 -0
  99. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/tests/test_dax/test_exprs/test_array.py +0 -0
  100. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/tests/test_dax/test_exprs/test_column.py +0 -0
  101. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/tests/test_dax/test_exprs/test_comparison.py +0 -0
  102. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/tests/test_dax/test_exprs/test_concatenation.py +0 -0
  103. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/tests/test_dax/test_exprs/test_div_mul.py +0 -0
  104. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/tests/test_dax/test_exprs/test_exponent.py +0 -0
  105. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/tests/test_dax/test_exprs/test_function.py +0 -0
  106. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/tests/test_dax/test_exprs/test_hierarchy.py +0 -0
  107. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/tests/test_dax/test_exprs/test_identifier.py +0 -0
  108. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/tests/test_dax/test_exprs/test_ins.py +0 -0
  109. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/tests/test_dax/test_exprs/test_keyword.py +0 -0
  110. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/tests/test_dax/test_exprs/test_literal_number.py +0 -0
  111. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/tests/test_dax/test_exprs/test_literal_string.py +0 -0
  112. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/tests/test_dax/test_exprs/test_logical.py +0 -0
  113. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/tests/test_dax/test_exprs/test_measure.py +0 -0
  114. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/tests/test_dax/test_exprs/test_parens.py +0 -0
  115. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/tests/test_dax/test_exprs/test_returns.py +0 -0
  116. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/tests/test_dax/test_exprs/test_table.py +0 -0
  117. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/tests/test_dax/test_exprs/test_variable.py +0 -0
  118. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/tests/test_dax/test_formatter/__init__.py +0 -0
  119. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/tests/test_dax/test_formatter/test_basic.py +0 -0
  120. {pbi_parsers-0.7.21 → pbi_parsers-0.8.0}/tests/test_dax/test_lexer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pbi_parsers
3
- Version: 0.7.21
3
+ Version: 0.8.0
4
4
  Summary: Power BI lexer, parsers, and formatters for DAX and M (Power Query) languages
5
5
  Project-URL: Homepage, https://github.com/douglassimonsen/pbi_parsers
6
6
  Project-URL: Documentation, https://douglassimonsen.github.io/pbi_parsers/
@@ -1,6 +1,6 @@
1
1
  from . import dax, pq
2
2
 
3
- __version__ = "0.7.21"
3
+ __version__ = "0.8.0"
4
4
 
5
5
 
6
6
  __all__ = [
@@ -1,4 +1,5 @@
1
- from typing import TYPE_CHECKING, Any
1
+ from collections.abc import Callable
2
+ from typing import TYPE_CHECKING, Any, TypeVar
2
3
 
3
4
  from pbi_parsers.dax.tokens import TokenType
4
5
 
@@ -6,6 +7,9 @@ if TYPE_CHECKING:
6
7
  from pbi_parsers.dax.parser import Parser
7
8
 
8
9
 
10
+ T = TypeVar("T", bound="Expression")
11
+
12
+
9
13
  class Expression:
10
14
  pre_comments: list[Any] = []
11
15
  post_comments: list[Any] = []
@@ -23,6 +27,37 @@ class Expression:
23
27
  msg = "This method should be implemented by subclasses."
24
28
  raise NotImplementedError(msg)
25
29
 
30
+ def find(self, cls_type: type[T] | tuple[type[T], ...], attributes: Callable[[T], bool] | None = None) -> T:
31
+ attributes = attributes or (lambda _x: True)
32
+
33
+ if isinstance(self, cls_type) and attributes(self):
34
+ return self
35
+
36
+ for child in self.children():
37
+ try:
38
+ return child.find(cls_type, attributes)
39
+ except ValueError:
40
+ continue
41
+
42
+ msg = f"Matching {cls_type} not found in expression tree."
43
+ raise ValueError(msg)
44
+
45
+ def find_all(
46
+ self,
47
+ cls_type: type[T] | tuple[type[T], ...],
48
+ attributes: Callable[[T], bool] | None = None,
49
+ ) -> list[T]:
50
+ attributes = attributes or (lambda _x: True)
51
+ results: list[T] = []
52
+
53
+ if isinstance(self, cls_type) and attributes(self):
54
+ results.append(self)
55
+
56
+ for child in self.children():
57
+ results.extend(child.find_all(cls_type, attributes))
58
+
59
+ return results
60
+
26
61
  @classmethod
27
62
  def match(cls, parser: "Parser") -> "Expression | None":
28
63
  """Attempt to match the current tokens to this expression type.
File without changes
File without changes
File without changes
File without changes