persona-dsl 26.1.20.12__tar.gz → 26.1.20.16__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 (92) hide show
  1. {persona_dsl-26.1.20.12/src/persona_dsl.egg-info → persona_dsl-26.1.20.16}/PKG-INFO +1 -1
  2. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/pyproject.toml +1 -1
  3. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/expectations/web/matches_aria_snapshot.py +1 -0
  4. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/ops/web/generate_page_object.py +2 -2
  5. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/ops/web/rich_aria_snapshot.py +34 -21
  6. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16/src/persona_dsl.egg-info}/PKG-INFO +1 -1
  7. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/MANIFEST.in +0 -0
  8. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/README.md +0 -0
  9. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/setup.cfg +0 -0
  10. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/__init__.py +0 -0
  11. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/components/action.py +0 -0
  12. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/components/base_step.py +0 -0
  13. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/components/combined_step.py +0 -0
  14. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/components/expectation.py +0 -0
  15. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/components/fact.py +0 -0
  16. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/components/goal.py +0 -0
  17. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/components/ops.py +0 -0
  18. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/components/step.py +0 -0
  19. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/expectations/generic/__init__.py +0 -0
  20. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/expectations/generic/contains_item.py +0 -0
  21. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/expectations/generic/contains_the_text.py +0 -0
  22. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/expectations/generic/has_entries.py +0 -0
  23. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/expectations/generic/is_equal.py +0 -0
  24. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/expectations/generic/is_greater_than.py +0 -0
  25. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/expectations/generic/path_equal.py +0 -0
  26. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/expectations/web/__init__.py +0 -0
  27. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/expectations/web/is_displayed.py +0 -0
  28. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/expectations/web/matches_screenshot.py +0 -0
  29. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/generators/__init__.py +0 -0
  30. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/generators/api_generator.py +0 -0
  31. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/generators/cli.py +0 -0
  32. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/generators/page_generator.py +0 -0
  33. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/ops/api/__init__.py +0 -0
  34. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/ops/api/json_as.py +0 -0
  35. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/ops/api/json_response.py +0 -0
  36. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/ops/api/send_request.py +0 -0
  37. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/ops/db/__init__.py +0 -0
  38. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/ops/db/execute_sql.py +0 -0
  39. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/ops/db/fetch_all.py +0 -0
  40. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/ops/db/fetch_one.py +0 -0
  41. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/ops/kafka/__init__.py +0 -0
  42. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/ops/kafka/message_in_topic.py +0 -0
  43. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/ops/kafka/send_message.py +0 -0
  44. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/ops/soap/__init__.py +0 -0
  45. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/ops/soap/call_operation.py +0 -0
  46. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/ops/soap/operation_result.py +0 -0
  47. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/ops/web/__init__.py +0 -0
  48. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/ops/web/aria_snapshot.py +0 -0
  49. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/ops/web/click.py +0 -0
  50. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/ops/web/current_path.py +0 -0
  51. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/ops/web/element_attribute.py +0 -0
  52. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/ops/web/element_is_visible.py +0 -0
  53. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/ops/web/element_text.py +0 -0
  54. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/ops/web/elements_count.py +0 -0
  55. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/ops/web/fill.py +0 -0
  56. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/ops/web/input_value.py +0 -0
  57. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/ops/web/navigate.py +0 -0
  58. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/ops/web/press_key.py +0 -0
  59. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/ops/web/screenshot.py +0 -0
  60. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/ops/web/table_data.py +0 -0
  61. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/ops/web/wait_for_navigation.py +0 -0
  62. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/pages/__init__.py +0 -0
  63. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/pages/elements.py +0 -0
  64. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/pages/page.py +0 -0
  65. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/pages/virtual_page.py +0 -0
  66. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/persona.py +0 -0
  67. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/pytest_plugin.py +0 -0
  68. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/runtime/dist/persona_bundle.js +0 -0
  69. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/skills/__init__.py +0 -0
  70. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/skills/core/base.py +0 -0
  71. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/skills/core/skill_definition.py +0 -0
  72. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/skills/use_api.py +0 -0
  73. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/skills/use_browser.py +0 -0
  74. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/skills/use_database.py +0 -0
  75. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/skills/use_kafka.py +0 -0
  76. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/skills/use_soap.py +0 -0
  77. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/utils/__init__.py +0 -0
  78. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/utils/artifacts.py +0 -0
  79. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/utils/config.py +0 -0
  80. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/utils/data_providers.py +0 -0
  81. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/utils/decorators.py +0 -0
  82. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/utils/metrics.py +0 -0
  83. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/utils/naming.py +0 -0
  84. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/utils/path.py +0 -0
  85. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/utils/retry.py +0 -0
  86. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/utils/taas_integration.py +0 -0
  87. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl/utils/waits.py +0 -0
  88. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl.egg-info/SOURCES.txt +0 -0
  89. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl.egg-info/dependency_links.txt +0 -0
  90. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl.egg-info/entry_points.txt +0 -0
  91. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl.egg-info/requires.txt +0 -0
  92. {persona_dsl-26.1.20.12 → persona_dsl-26.1.20.16}/src/persona_dsl.egg-info/top_level.txt +0 -0
@@ -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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "persona-dsl"
7
- version = "26.01.20.012"
7
+ version = "26.01.20.016"
8
8
  description = "DSL для реализации паттерна Screenplay в Python-тестах."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
@@ -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