persona-dsl 26.1.20.12__py3-none-any.whl → 26.1.20.16__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.
@@ -69,6 +69,7 @@ class MatchesAriaSnapshot(Expectation):
69
69
 
70
70
  def _perform(self, persona: Any, *args: Any, **kwargs: Any) -> None:
71
71
  actual_value = args[0]
72
+
72
73
  if not isinstance(actual_value, str):
73
74
  raise TypeError(
74
75
  f"MatchesAriaSnapshot ожидает YAML строку, получено: {type(actual_value)}"
@@ -80,7 +80,7 @@ class GeneratePageObject(Ops):
80
80
 
81
81
  # Используем rich ARIA snapshot вместо стандартного
82
82
  rich_snapshot_op = RichAriaSnapshot()
83
- snapshot_struct = rich_snapshot_op._perform(persona)
83
+ snapshot_struct = rich_snapshot_op.get_tree(persona)
84
84
 
85
85
  # Сохраняем ARIA снепшот на диск как YAML-строку
86
86
  assets_dir = self.output_path.parent / "aria"
@@ -90,7 +90,7 @@ class GeneratePageObject(Ops):
90
90
  snapshot_abs_path = assets_dir / snapshot_file
91
91
 
92
92
  snapshot_yaml: str = (
93
- rich_snapshot_op._tree_to_yaml(snapshot_struct) if snapshot_struct else ""
93
+ RichAriaSnapshot.to_yaml(snapshot_struct) if snapshot_struct else ""
94
94
  )
95
95
  if snapshot_yaml:
96
96
  snapshot_abs_path.write_text(snapshot_yaml, encoding="utf-8")
@@ -22,21 +22,16 @@ class RichAriaSnapshot(Ops):
22
22
  def _get_step_description(self, persona: Any) -> str:
23
23
  return f"{persona} получает богатый ARIA-снепшот страницы (через Runtime)"
24
24
 
25
- def _perform(self, persona: Any, *args: Any, **kwargs: Any) -> Dict[str, Any]:
26
- page = persona.skill(SkillId.BROWSER).page
27
-
28
- # 1. Получаем чистое JSON-дерево от ядра
29
- snapshot_tree = page.evaluate(
30
- "window.__PERSONA__ && window.__PERSONA__.getTreeForTransport && window.__PERSONA__.getTreeForTransport()"
31
- )
32
-
33
- if not snapshot_tree:
34
- raise RuntimeError(
35
- "Persona Runtime не вернул JSON-дерево (getTreeForTransport). Убедитесь, что Runtime инициализирован."
36
- )
25
+ def _perform(self, persona: Any, *args: Any, **kwargs: Any) -> str:
26
+ """
27
+ Выполняет операцию получения снепшота.
28
+ Returns:
29
+ str: YAML-строка снепшота (как в Playwright).
30
+ """
31
+ snapshot_tree = self.get_tree(persona)
37
32
 
38
33
  # 2. Рендерим YAML для отчетов (визуализация)
39
- snapshot_yaml = self._tree_to_yaml(snapshot_tree)
34
+ snapshot_yaml = self.to_yaml(snapshot_tree)
40
35
 
41
36
  try:
42
37
  allure.attach(
@@ -47,10 +42,29 @@ class RichAriaSnapshot(Ops):
47
42
  except Exception:
48
43
  pass
49
44
 
50
- # Возвращаем структуру данных (dict) для Генератора
45
+ return snapshot_yaml
46
+
47
+ def get_tree(self, persona: Any) -> Dict[str, Any] | List[Any]:
48
+ """
49
+ Получает сырое дерево элементов (dict/list) от Persona Runtime.
50
+ Используется в генераторах кода.
51
+ """
52
+ page = persona.skill(SkillId.BROWSER).page
53
+
54
+ # 1. Получаем чистое JSON-дерево от ядра
55
+ snapshot_tree = page.evaluate(
56
+ "window.__PERSONA__ && window.__PERSONA__.getTreeForTransport && window.__PERSONA__.getTreeForTransport()"
57
+ )
58
+
59
+ if not snapshot_tree:
60
+ raise RuntimeError(
61
+ "Persona Runtime не вернул JSON-дерево (getTreeForTransport). Убедитесь, что Runtime инициализирован."
62
+ )
63
+
51
64
  return snapshot_tree
52
65
 
53
- def _tree_to_yaml(self, root: Dict[str, Any] | List[Any]) -> str:
66
+ @staticmethod
67
+ def to_yaml(root: Dict[str, Any] | List[Any]) -> str:
54
68
  """
55
69
  Преобразует JSON-дерево в читаемый структурный YAML формат.
56
70
  Формат:
@@ -60,18 +74,17 @@ class RichAriaSnapshot(Ops):
60
74
  """
61
75
  lines = []
62
76
  if isinstance(root, dict):
63
- lines.extend(self._render_node_yaml(root, indent=0))
77
+ lines.extend(RichAriaSnapshot._render_node_yaml(root, indent=0))
64
78
  elif isinstance(root, list):
65
79
  for node in root:
66
- lines.extend(self._render_node_yaml(node, indent=0))
80
+ lines.extend(RichAriaSnapshot._render_node_yaml(node, indent=0))
67
81
 
68
82
  return "\n".join(lines)
69
83
 
70
- def _render_node_yaml(self, node: Dict[str, Any], indent: int) -> List[str]:
84
+ @staticmethod
85
+ def _render_node_yaml(node: Dict[str, Any] | str, indent: int) -> List[str]:
71
86
  if isinstance(node, str):
72
87
  # Текстовый узел (строка)
73
- # В новом Runtime children могут быть строками? Вроде в TreeWalker мы делаем узлы для текста.
74
- # Но на всякий случай.
75
88
  return [f"{' ' * indent}- \"{node}\""]
76
89
 
77
90
  lines = []
@@ -141,6 +154,6 @@ class RichAriaSnapshot(Ops):
141
154
 
142
155
  # Рендерим детей
143
156
  for child in children:
144
- lines.extend(self._render_node_yaml(child, indent + 1))
157
+ lines.extend(RichAriaSnapshot._render_node_yaml(child, indent + 1))
145
158
 
146
159
  return lines
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: persona-dsl
3
- Version: 26.1.20.12
3
+ Version: 26.1.20.16
4
4
  Summary: DSL для реализации паттерна Screenplay в Python-тестах.
5
5
  Requires-Python: >=3.9
6
6
  Description-Content-Type: text/markdown
@@ -18,7 +18,7 @@ persona_dsl/expectations/generic/is_greater_than.py,sha256=k6V34pyxPhHX1V7uDOmxP
18
18
  persona_dsl/expectations/generic/path_equal.py,sha256=cvxwCdfiDXC_WhosfmIRqfwaQUogfU0YhUtP2duPTlI,967
19
19
  persona_dsl/expectations/web/__init__.py,sha256=lBKeJqO4GO9yjKID37tbdbzS8iD_bZJlSk7GcJ8LCAM,214
20
20
  persona_dsl/expectations/web/is_displayed.py,sha256=VNrGo6yJ_kvmUPrT8gVO0YPL-o-5XMXVM6jsBWqtO9s,578
21
- persona_dsl/expectations/web/matches_aria_snapshot.py,sha256=2YeO5jbfqQNrdH8mCtizpqOsPnQ1Hd6P3sQtqEiILFA,8657
21
+ persona_dsl/expectations/web/matches_aria_snapshot.py,sha256=TP8oe95SUfX64mU4jbsYioIENTJsQS_IvdTqk2zWECg,8658
22
22
  persona_dsl/expectations/web/matches_screenshot.py,sha256=JOg9IdREJ7LNOsZpIbXesLiJa0nHAvMmmgl8x3jgV-Y,7376
23
23
  persona_dsl/generators/__init__.py,sha256=xgjQ0rhC7p6sRir9MFJ4WGt0CWT1fX3_3rsrcy-wkSk,163
24
24
  persona_dsl/generators/api_generator.py,sha256=epA8VEblLt09h5F0oMS04ltn8btDXHtonh4rhDI7OSU,17863
@@ -47,11 +47,11 @@ persona_dsl/ops/web/element_is_visible.py,sha256=xEotfLF9hw83gzRP1ax1Bb7cukC4pUN
47
47
  persona_dsl/ops/web/element_text.py,sha256=MQe1uaerDpqi4pp3w0FUw7K1QY1yKgQbV5dvPDCVGVg,1147
48
48
  persona_dsl/ops/web/elements_count.py,sha256=ME6bjLCxeZIKkiFBx4-jlJELy-CjHG6yFueKcHhq-9I,2034
49
49
  persona_dsl/ops/web/fill.py,sha256=WD4DvcMaTdkUFfVgnWgt05TP3NzQtL48IMcahbDh5l0,1755
50
- persona_dsl/ops/web/generate_page_object.py,sha256=LoiUNTe4cpY7BGhr9FpwR1oykjaPybZ4PmDLSxvZHQE,5413
50
+ persona_dsl/ops/web/generate_page_object.py,sha256=NKo6-vdo792Ns7F9lefIiyiSZ_A1h1_YIdHtQepzuLQ,5407
51
51
  persona_dsl/ops/web/input_value.py,sha256=BAMmJ2XsDBNWT0mjXyCJswwhyk5RJx1dM_zvNtYBjdc,918
52
52
  persona_dsl/ops/web/navigate.py,sha256=hsG6PCt6tnKn1BU3a4kZDpAPDubnZzgQv_yNxXchlUo,2241
53
53
  persona_dsl/ops/web/press_key.py,sha256=QcTo8PtP0Ks-plBOZ6ojPL8bJerB4IUGhvYJRlCNmtY,1709
54
- persona_dsl/ops/web/rich_aria_snapshot.py,sha256=sfcABy8v1eje8mSuLCbMJ5PUdyCgyNpEhxs6QeiTV1o,5671
54
+ persona_dsl/ops/web/rich_aria_snapshot.py,sha256=M1-C5LsGPUo96uv3EArMzAjdFtrdlHO5_N5W-ECsQMo,5948
55
55
  persona_dsl/ops/web/screenshot.py,sha256=Wue5XKIXXbkDNhS5tkHZ5jty7NHd0LLFrFSQ_F01w7c,2378
56
56
  persona_dsl/ops/web/table_data.py,sha256=4nKOUDPofFwzjSUcxiiZauNO7V-jXvNTlXXDmuqZpqQ,1920
57
57
  persona_dsl/ops/web/wait_for_navigation.py,sha256=a1026yNa3LmWzacfFLUXnjleID3sfXIZ67G3SZuTxRI,977
@@ -79,8 +79,8 @@ persona_dsl/utils/path.py,sha256=wwYUS3euYqwKQdxWHD8Lq93Ln1G0M5LIJ6AMqiwpmDI,725
79
79
  persona_dsl/utils/retry.py,sha256=kBbu6rpySdeaqRzUkgdrsEWrc9PwkvRhYtRzyhrYj9g,2215
80
80
  persona_dsl/utils/taas_integration.py,sha256=OZzSjgC1_90eTYXo3WPsCgCtYc35U216SBnxClpdIkw,5046
81
81
  persona_dsl/utils/waits.py,sha256=I9e_9rs_0Rju61yx_hS-qwcXd4zNWfVNyfhY0mOHrj0,4386
82
- persona_dsl-26.1.20.12.dist-info/METADATA,sha256=4LVxQK5kjvq6Ou-dpE3y5PdR7BmdXKnpDTPSOzD_h6s,7057
83
- persona_dsl-26.1.20.12.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
84
- persona_dsl-26.1.20.12.dist-info/entry_points.txt,sha256=8lYko6uS1gGeYX9_FYbbeO5XV_BP62T7RngyKuKDD7k,180
85
- persona_dsl-26.1.20.12.dist-info/top_level.txt,sha256=N1YAJab5h4iPt-srbrjzDk6bY40bwR1AHZS5Z0eOzvM,12
86
- persona_dsl-26.1.20.12.dist-info/RECORD,,
82
+ persona_dsl-26.1.20.16.dist-info/METADATA,sha256=RyYFxQ5cT4Dw2iGagSr2wVPs7Rker7vHCrb4CTx8-Vw,7057
83
+ persona_dsl-26.1.20.16.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
84
+ persona_dsl-26.1.20.16.dist-info/entry_points.txt,sha256=8lYko6uS1gGeYX9_FYbbeO5XV_BP62T7RngyKuKDD7k,180
85
+ persona_dsl-26.1.20.16.dist-info/top_level.txt,sha256=N1YAJab5h4iPt-srbrjzDk6bY40bwR1AHZS5Z0eOzvM,12
86
+ persona_dsl-26.1.20.16.dist-info/RECORD,,