pytrilogy 0.0.3.44__tar.gz → 0.0.3.45__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.

Potentially problematic release.


This version of pytrilogy might be problematic. Click here for more details.

Files changed (141) hide show
  1. {pytrilogy-0.0.3.44/pytrilogy.egg-info → pytrilogy-0.0.3.45}/PKG-INFO +1 -1
  2. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45/pytrilogy.egg-info}/PKG-INFO +1 -1
  3. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/__init__.py +1 -1
  4. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/models/author.py +1 -1
  5. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/processing/concept_strategies_v3.py +2 -0
  6. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/processing/nodes/__init__.py +23 -19
  7. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/LICENSE.md +0 -0
  8. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/README.md +0 -0
  9. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/pyproject.toml +0 -0
  10. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/pytrilogy.egg-info/SOURCES.txt +0 -0
  11. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/pytrilogy.egg-info/dependency_links.txt +0 -0
  12. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/pytrilogy.egg-info/entry_points.txt +0 -0
  13. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/pytrilogy.egg-info/requires.txt +0 -0
  14. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/pytrilogy.egg-info/top_level.txt +0 -0
  15. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/setup.cfg +0 -0
  16. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/setup.py +0 -0
  17. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/tests/test_datatypes.py +0 -0
  18. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/tests/test_declarations.py +0 -0
  19. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/tests/test_derived_concepts.py +0 -0
  20. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/tests/test_discovery_nodes.py +0 -0
  21. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/tests/test_enums.py +0 -0
  22. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/tests/test_environment.py +0 -0
  23. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/tests/test_executor.py +0 -0
  24. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/tests/test_failure.py +0 -0
  25. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/tests/test_functions.py +0 -0
  26. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/tests/test_imports.py +0 -0
  27. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/tests/test_metadata.py +0 -0
  28. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/tests/test_models.py +0 -0
  29. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/tests/test_multi_join_assignments.py +0 -0
  30. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/tests/test_parse_engine.py +0 -0
  31. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/tests/test_parsing.py +0 -0
  32. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/tests/test_parsing_failures.py +0 -0
  33. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/tests/test_partial_handling.py +0 -0
  34. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/tests/test_query_processing.py +0 -0
  35. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/tests/test_query_render.py +0 -0
  36. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/tests/test_select.py +0 -0
  37. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/tests/test_show.py +0 -0
  38. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/tests/test_statements.py +0 -0
  39. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/tests/test_typing.py +0 -0
  40. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/tests/test_undefined_concept.py +0 -0
  41. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/tests/test_user_functions.py +0 -0
  42. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/tests/test_where_clause.py +0 -0
  43. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/authoring/__init__.py +0 -0
  44. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/compiler.py +0 -0
  45. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/constants.py +0 -0
  46. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/__init__.py +0 -0
  47. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/constants.py +0 -0
  48. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/enums.py +0 -0
  49. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/env_processor.py +0 -0
  50. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/environment_helpers.py +0 -0
  51. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/ergonomics.py +0 -0
  52. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/exceptions.py +0 -0
  53. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/functions.py +0 -0
  54. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/graph_models.py +0 -0
  55. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/internal.py +0 -0
  56. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/models/__init__.py +0 -0
  57. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/models/build.py +0 -0
  58. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/models/build_environment.py +0 -0
  59. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/models/core.py +0 -0
  60. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/models/datasource.py +0 -0
  61. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/models/environment.py +0 -0
  62. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/models/execute.py +0 -0
  63. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/optimization.py +0 -0
  64. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/optimizations/__init__.py +0 -0
  65. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/optimizations/base_optimization.py +0 -0
  66. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/optimizations/inline_constant.py +0 -0
  67. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/optimizations/inline_datasource.py +0 -0
  68. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/optimizations/predicate_pushdown.py +0 -0
  69. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/processing/__init__.py +0 -0
  70. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/processing/graph_utils.py +0 -0
  71. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/processing/node_generators/__init__.py +0 -0
  72. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/processing/node_generators/basic_node.py +0 -0
  73. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/processing/node_generators/common.py +0 -0
  74. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/processing/node_generators/filter_node.py +0 -0
  75. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/processing/node_generators/group_node.py +0 -0
  76. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/processing/node_generators/group_to_node.py +0 -0
  77. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/processing/node_generators/multiselect_node.py +0 -0
  78. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/processing/node_generators/node_merge_node.py +0 -0
  79. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/processing/node_generators/rowset_node.py +0 -0
  80. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/processing/node_generators/select_helpers/__init__.py +0 -0
  81. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/processing/node_generators/select_helpers/datasource_injection.py +0 -0
  82. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/processing/node_generators/select_merge_node.py +0 -0
  83. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/processing/node_generators/select_node.py +0 -0
  84. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/processing/node_generators/synonym_node.py +0 -0
  85. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/processing/node_generators/union_node.py +0 -0
  86. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/processing/node_generators/unnest_node.py +0 -0
  87. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/processing/node_generators/window_node.py +0 -0
  88. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/processing/nodes/base_node.py +0 -0
  89. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/processing/nodes/filter_node.py +0 -0
  90. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/processing/nodes/group_node.py +0 -0
  91. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/processing/nodes/merge_node.py +0 -0
  92. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/processing/nodes/select_node_v2.py +0 -0
  93. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/processing/nodes/union_node.py +0 -0
  94. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/processing/nodes/unnest_node.py +0 -0
  95. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/processing/nodes/window_node.py +0 -0
  96. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/processing/utility.py +0 -0
  97. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/query_processor.py +0 -0
  98. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/statements/__init__.py +0 -0
  99. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/statements/author.py +0 -0
  100. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/statements/build.py +0 -0
  101. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/statements/common.py +0 -0
  102. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/core/statements/execute.py +0 -0
  103. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/dialect/__init__.py +0 -0
  104. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/dialect/base.py +0 -0
  105. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/dialect/bigquery.py +0 -0
  106. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/dialect/common.py +0 -0
  107. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/dialect/config.py +0 -0
  108. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/dialect/dataframe.py +0 -0
  109. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/dialect/duckdb.py +0 -0
  110. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/dialect/enums.py +0 -0
  111. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/dialect/postgres.py +0 -0
  112. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/dialect/presto.py +0 -0
  113. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/dialect/snowflake.py +0 -0
  114. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/dialect/sql_server.py +0 -0
  115. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/engine.py +0 -0
  116. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/executor.py +0 -0
  117. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/hooks/__init__.py +0 -0
  118. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/hooks/base_hook.py +0 -0
  119. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/hooks/graph_hook.py +0 -0
  120. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/hooks/query_debugger.py +0 -0
  121. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/metadata/__init__.py +0 -0
  122. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/parser.py +0 -0
  123. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/parsing/__init__.py +0 -0
  124. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/parsing/common.py +0 -0
  125. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/parsing/config.py +0 -0
  126. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/parsing/exceptions.py +0 -0
  127. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/parsing/helpers.py +0 -0
  128. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/parsing/parse_engine.py +0 -0
  129. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/parsing/render.py +0 -0
  130. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/parsing/trilogy.lark +0 -0
  131. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/py.typed +0 -0
  132. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/render.py +0 -0
  133. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/scripts/__init__.py +0 -0
  134. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/scripts/trilogy.py +0 -0
  135. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/std/__init__.py +0 -0
  136. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/std/date.preql +0 -0
  137. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/std/display.preql +0 -0
  138. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/std/geography.preql +0 -0
  139. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/std/money.preql +0 -0
  140. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/std/report.preql +0 -0
  141. {pytrilogy-0.0.3.44 → pytrilogy-0.0.3.45}/trilogy/utility.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pytrilogy
3
- Version: 0.0.3.44
3
+ Version: 0.0.3.45
4
4
  Summary: Declarative, typed query language that compiles to SQL.
5
5
  Home-page:
6
6
  Author:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pytrilogy
3
- Version: 0.0.3.44
3
+ Version: 0.0.3.45
4
4
  Summary: Declarative, typed query language that compiles to SQL.
5
5
  Home-page:
6
6
  Author:
@@ -4,6 +4,6 @@ from trilogy.dialect.enums import Dialects
4
4
  from trilogy.executor import Executor
5
5
  from trilogy.parser import parse
6
6
 
7
- __version__ = "0.0.3.44"
7
+ __version__ = "0.0.3.45"
8
8
 
9
9
  __all__ = ["parse", "Executor", "Dialects", "Environment", "CONFIG"]
@@ -1906,7 +1906,7 @@ class AggregateWrapper(Mergeable, DataTyped, ConceptArgs, Namespaced, BaseModel)
1906
1906
 
1907
1907
 
1908
1908
  class FilterItem(DataTyped, Namespaced, ConceptArgs, BaseModel):
1909
- content: Expr
1909
+ content: FuncArgs
1910
1910
  where: "WhereClause"
1911
1911
 
1912
1912
  @field_validator("content", mode="before")
@@ -748,6 +748,7 @@ def search_concepts(
748
748
  accept_partial: bool = False,
749
749
  conditions: BuildWhereClause | None = None,
750
750
  ) -> StrategyNode | None:
751
+ logger.error(f"starting search for {mandatory_list}")
751
752
  hist = history.get_history(
752
753
  search=mandatory_list, accept_partial=accept_partial, conditions=conditions
753
754
  )
@@ -1094,6 +1095,7 @@ def _search_concepts(
1094
1095
  logger.error(
1095
1096
  f"{depth_to_prefix(depth)}{LOGGER_PREFIX} Could not resolve concepts {[c.address for c in mandatory_list]}, network outcome was {complete}, missing {all_mandatory - found},"
1096
1097
  )
1098
+
1097
1099
  return None
1098
1100
 
1099
1101
 
@@ -1,5 +1,6 @@
1
1
  from pydantic import BaseModel, ConfigDict, Field
2
2
 
3
+ from trilogy.core.exceptions import UnresolvableQueryException
3
4
  from trilogy.core.models.build import BuildConcept, BuildWhereClause
4
5
  from trilogy.core.models.build_environment import BuildEnvironment
5
6
  from trilogy.core.models.environment import Environment
@@ -18,7 +19,7 @@ class History(BaseModel):
18
19
  base_environment: Environment
19
20
  history: dict[str, StrategyNode | None] = Field(default_factory=dict)
20
21
  select_history: dict[str, StrategyNode | None] = Field(default_factory=dict)
21
- started: set[str] = Field(default_factory=set)
22
+ started: dict[str, int] = Field(default_factory=dict)
22
23
  model_config = ConfigDict(arbitrary_types_allowed=True)
23
24
 
24
25
  def _concepts_to_lookup(
@@ -27,13 +28,10 @@ class History(BaseModel):
27
28
  accept_partial: bool,
28
29
  conditions: BuildWhereClause | None = None,
29
30
  ) -> str:
31
+ base = sorted([c.address for c in search])
30
32
  if conditions:
31
- return (
32
- "-".join([c.address for c in search])
33
- + str(accept_partial)
34
- + str(conditions)
35
- )
36
- return "-".join([c.address for c in search]) + str(accept_partial)
33
+ return "-".join(base) + str(accept_partial) + str(conditions)
34
+ return "-".join(base) + str(accept_partial)
37
35
 
38
36
  def search_to_history(
39
37
  self,
@@ -80,13 +78,19 @@ class History(BaseModel):
80
78
  accept_partial: bool = False,
81
79
  conditions: BuildWhereClause | None = None,
82
80
  ):
83
- self.started.add(
84
- self._concepts_to_lookup(
85
- search,
86
- accept_partial=accept_partial,
87
- conditions=conditions,
88
- )
81
+ key = self._concepts_to_lookup(
82
+ search,
83
+ accept_partial=accept_partial,
84
+ conditions=conditions,
89
85
  )
86
+ if key in self.started:
87
+ self.started[key] += 1
88
+ else:
89
+ self.started[key] = 1
90
+ if self.started[key] > 5:
91
+ raise UnresolvableQueryException(
92
+ f"Was unable to resolve datasources to serve this query from model; unresolvable set was {search}. You may be querying unrelated concepts."
93
+ )
90
94
 
91
95
  def log_end(
92
96
  self,
@@ -94,13 +98,13 @@ class History(BaseModel):
94
98
  accept_partial: bool = False,
95
99
  conditions: BuildWhereClause | None = None,
96
100
  ):
97
- self.started.discard(
98
- self._concepts_to_lookup(
99
- search,
100
- accept_partial=accept_partial,
101
- conditions=conditions,
102
- )
101
+ key = self._concepts_to_lookup(
102
+ search,
103
+ accept_partial=accept_partial,
104
+ conditions=conditions,
103
105
  )
106
+ if key in self.started:
107
+ del self.started[key]
104
108
 
105
109
  def check_started(
106
110
  self,
File without changes
File without changes
File without changes
File without changes