pyplaykit 1.8.7__tar.gz → 1.8.8__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.
- {pyplaykit-1.8.7/pyplaykit.egg-info → pyplaykit-1.8.8}/PKG-INFO +1 -1
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/pyplaykit/cli.py +1 -1
- pyplaykit-1.8.8/pyplaykit/config/__init__.py +0 -0
- pyplaykit-1.8.8/pyplaykit/config/config.yaml +146 -0
- pyplaykit-1.8.8/pyplaykit/config/environments.yaml +82 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8/pyplaykit.egg-info}/PKG-INFO +1 -1
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/pyplaykit.egg-info/SOURCES.txt +3 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/pyproject.toml +2 -2
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/.github/copilot-instructions.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/.github/prompts/review-execution-plan-and-implement-next-task.prompt.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/.github/prompts/run-unit-tests-and-coverage.prompt.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/.github/prompts/security-audit-and-consolidated-report.prompt.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/CHANGELOG.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/CHOOSE_YOUR_STRUCTURE.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/CLAUDE.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/COMMANDS_FOR_YOUR_PROJECTS.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/COMMIT_SUMMARY.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/CONTRIBUTING.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/CORRECTED_PROJECT_NAMES.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/DATABASE_IMPLEMENTATION_SUMMARY.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/FINAL_PROJECT_SETUP.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/GAP_TRACKER.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/HOW_TO_ACCESS_DOCS.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/MANIFEST.in +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/MIGRATION_COMPLETE.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/MIGRATION_PLAN.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/PIP_INSTALL_GUIDE.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/QUICK_DB_REFERENCE.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/QUICK_START_QE.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/README.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/STRUCTURE_COMPARISON.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/TEST_LOCATION_CHEATSHEET.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/YOUR_PROJECTS_IMPLEMENTATION_GUIDE.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/YOUR_SETUP_SUMMARY.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/bin/README.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/components/__init__.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/components/base_component.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/components/data_table.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/components/form_field.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/components/modal.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/config/config.yaml +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/config/environments.yaml +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/config/projects/customs_modernization.yaml +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/config/projects/dispatcho.yaml +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/config/projects/timelyquote.yaml +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/core/__init__.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/core/base_page.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/core/base_test.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/core/browser_factory.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/core/playwright_manager.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/dist_pkg/__init__.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/dist_pkg/distribution.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/docs/API_TESTING_GUIDE.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/docs/COVERAGE_IMPROVEMENTS.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/docs/DATABASE_SUPPORT.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/docs/DATA_VALIDATION_GUIDE.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/docs/EXAMPLE_TESTS_SUMMARY.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/docs/Enterprise-Framework-Assessment-REVISED.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/docs/Enterprise-Readiness-Assessment.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/docs/Example-Tests-Guide.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/docs/Execution-Plan-Backlog-and-Closure-Tracker.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/docs/FRAMEWORK_CONTRIBUTION_GUIDE.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/docs/MULTI_DB_VALIDATION_GUIDE.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/docs/MULTI_PROJECT_STRUCTURE.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/docs/PIP_INSTALL_GUIDE.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/docs/PyPlayKit-Framework-Overview.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/docs/PyPlayKit-Usage-Scenarios.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/docs/QE_VISUAL_GUIDE.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/docs/RESILIENCE_GUIDE.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/docs/RUN_TESTS_QUICK_REFERENCE.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/docs/TEST_ORGANIZATION.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/docs/Usage-Scenarios-Feasibility-Analysis.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/examples/README.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/integrations/__init__.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/integrations/adapters.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/orchestration/__init__.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/orchestration/enforcer.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/orchestration/planner.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/pages/__init__.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/pages/dashboard_page.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/pages/login_page.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/pages/orangehrm_login_page.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/pages/saucedemo_inventory_page.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/pages/saucedemo_login_page.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/plugins/__init__.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/plugins/api_plugin.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/plugins/base.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/plugins/data_plugin.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/plugins/registry.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/plugins/security_plugin.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/pyplaykit/PIP_INSTALL_GUIDE.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/pyplaykit/README.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/pyplaykit/__init__.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/pyplaykit/plugin.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/pyplaykit/show_docs.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/pyplaykit.egg-info/dependency_links.txt +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/pyplaykit.egg-info/entry_points.txt +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/pyplaykit.egg-info/requires.txt +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/pyplaykit.egg-info/top_level.txt +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/resilience/__init__.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/resilience/locator_recovery.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/setup.cfg +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/test_data/api/ecom/auth_payloads.json +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/test_data/api/ecom/product_payloads.json +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/test_data/api_test_data.json +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/test_data/data_validation_test_data.json +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/test_data/login_test_data.json +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/test_data/orangehrm_login_data.json +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/test_data/ui_test_data.json +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/tests/projects/README.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/tests/projects/customs_modernization/README.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/tests/projects/demo/functional/README.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/tests/projects/demo/functional/api/README.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/tests/projects/demo/functional/database/README.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/tests/projects/demo/functional/ui/README.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/tests/projects/demo/integration/README.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/tests/projects/dispatcho/README.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/tests/projects/timelyquote/README.md +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/utils/__init__.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/utils/api_client.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/utils/api_test_helper.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/utils/assertion_helper.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/utils/auth_manager.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/utils/data_comparison_report.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/utils/data_comparison_utils.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/utils/data_loader.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/utils/data_source.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/utils/data_validator.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/utils/database_clients.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/utils/db_client.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/utils/db_drivers/__init__.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/utils/db_drivers/db2.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/utils/db_drivers/informix.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/utils/db_drivers/mysql.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/utils/db_drivers/oracle.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/utils/db_drivers/snowflake.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/utils/db_drivers/sqlite.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/utils/db_drivers/sqlserver.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/utils/db_factory.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/utils/db_fixtures.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/utils/db_pool.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/utils/db_validation_helper.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/utils/environment_validator.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/utils/file_reader.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/utils/graphql_client.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/utils/logger.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/utils/observability.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/utils/response_validator.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/utils/screenshot_helper.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/utils/soap_client.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/utils/tdm.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/utils/transformation_validator.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/utils/ui_db_validator.py +0 -0
- {pyplaykit-1.8.7 → pyplaykit-1.8.8}/utils/yaml_config_reader.py +0 -0
|
@@ -12,7 +12,7 @@ import shutil
|
|
|
12
12
|
import sys
|
|
13
13
|
from pathlib import Path
|
|
14
14
|
|
|
15
|
-
_BUNDLED_CONFIG = Path(__file__).parent
|
|
15
|
+
_BUNDLED_CONFIG = Path(__file__).parent / "config"
|
|
16
16
|
|
|
17
17
|
_CONFTEST_TEMPLATE = '''\
|
|
18
18
|
"""Project conftest — delegates all framework fixtures to the installed plugin."""
|
|
File without changes
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
framework:
|
|
2
|
+
name: "PyPlayKit - Enterprise Test Automation Framework"
|
|
3
|
+
tagline: "A modular, scalable, and CI/CD-ready Python + Playwright framework for enterprise automation"
|
|
4
|
+
|
|
5
|
+
execution:
|
|
6
|
+
environment: "qa"
|
|
7
|
+
browser: "chromium"
|
|
8
|
+
headless: true
|
|
9
|
+
slow_mo_ms: 0
|
|
10
|
+
timeout_ms: 30000
|
|
11
|
+
navigation_timeout_ms: 45000
|
|
12
|
+
retries: 1
|
|
13
|
+
parallel_workers: 2
|
|
14
|
+
screenshot_on_failure: true
|
|
15
|
+
video_on_failure: true
|
|
16
|
+
video_dir: "reports/videos"
|
|
17
|
+
readiness_checks_enabled: false
|
|
18
|
+
readiness_timeout_seconds: 5
|
|
19
|
+
readiness_health_endpoint: "/health"
|
|
20
|
+
viewport:
|
|
21
|
+
width: 1440
|
|
22
|
+
height: 900
|
|
23
|
+
|
|
24
|
+
reporting:
|
|
25
|
+
allure_results_dir: "reports/allure-results"
|
|
26
|
+
html_report_path: "reports/report.html"
|
|
27
|
+
observability_summary_path: "reports/observability/summary.json"
|
|
28
|
+
kpi_summary_path: "reports/observability/kpi_summary.json"
|
|
29
|
+
engineering_report_path: "reports/observability/engineering_report.json"
|
|
30
|
+
qa_report_path: "reports/observability/qa_functional_report.json"
|
|
31
|
+
leadership_report_path: "reports/observability/leadership_kpi_summary.json"
|
|
32
|
+
|
|
33
|
+
quality:
|
|
34
|
+
automation_coverage_target: 100
|
|
35
|
+
|
|
36
|
+
tdm:
|
|
37
|
+
enabled: false
|
|
38
|
+
synthetic_schema:
|
|
39
|
+
user_id: int
|
|
40
|
+
username: string
|
|
41
|
+
email: email
|
|
42
|
+
active: bool
|
|
43
|
+
masking_rules:
|
|
44
|
+
email:
|
|
45
|
+
strategy: partial
|
|
46
|
+
visible_prefix: 2
|
|
47
|
+
visible_suffix: 8
|
|
48
|
+
token:
|
|
49
|
+
strategy: full
|
|
50
|
+
reset_mode: none
|
|
51
|
+
provisioning_by_env:
|
|
52
|
+
qa: qa-default
|
|
53
|
+
uat: uat-default
|
|
54
|
+
prod: prod-readonly
|
|
55
|
+
default_provisioner: qa-default
|
|
56
|
+
|
|
57
|
+
integrations:
|
|
58
|
+
enabled: false
|
|
59
|
+
jira_export_path: "reports/integrations/jira_export.json"
|
|
60
|
+
test_management_export_path: "reports/integrations/test_management_export.json"
|
|
61
|
+
api_enabled: false
|
|
62
|
+
jira_api_endpoint: "/integrations/jira/results"
|
|
63
|
+
test_management_api_endpoint: "/integrations/test-management/results"
|
|
64
|
+
|
|
65
|
+
plugins:
|
|
66
|
+
enabled: false
|
|
67
|
+
enabled_plugins:
|
|
68
|
+
- api_plugin
|
|
69
|
+
- data_plugin
|
|
70
|
+
- security_plugin
|
|
71
|
+
|
|
72
|
+
orchestration:
|
|
73
|
+
# Master switch. When false, orchestration is parsed but never enforced.
|
|
74
|
+
# Pass --pyplaykit-orchestration at runtime to activate enforcement.
|
|
75
|
+
enabled: false
|
|
76
|
+
suites:
|
|
77
|
+
# id: unique suite identifier used in dependency references
|
|
78
|
+
# marker: pytest marker name(s) that identify this suite's tests.
|
|
79
|
+
# Defaults to the suite id when omitted. Comma-separated for multiple.
|
|
80
|
+
# depends_on: list of suite ids that must pass before this suite runs.
|
|
81
|
+
- id: smoke
|
|
82
|
+
marker: smoke
|
|
83
|
+
depends_on: []
|
|
84
|
+
- id: regression
|
|
85
|
+
marker: regression
|
|
86
|
+
depends_on:
|
|
87
|
+
- smoke
|
|
88
|
+
pipelines:
|
|
89
|
+
- name: default_pipeline
|
|
90
|
+
stages:
|
|
91
|
+
- name: baseline
|
|
92
|
+
suites:
|
|
93
|
+
- smoke
|
|
94
|
+
- name: full_validation
|
|
95
|
+
suites:
|
|
96
|
+
- regression
|
|
97
|
+
|
|
98
|
+
database:
|
|
99
|
+
# Connection pool settings used by the db_pool / db_client fixtures.
|
|
100
|
+
# The pool is session-scoped — one pool per pytest-xdist worker.
|
|
101
|
+
# Each test checks out one connection and returns it when done.
|
|
102
|
+
# For non-parallel runs (no -n flag) min: 1, max: 5 is sufficient.
|
|
103
|
+
pool_min_connections: 2
|
|
104
|
+
pool_max_connections: 10
|
|
105
|
+
# connect_timeout applies per connection checkout attempt (seconds).
|
|
106
|
+
connect_timeout: 10
|
|
107
|
+
|
|
108
|
+
resilience:
|
|
109
|
+
# Master switch. Keep false until your locators are stable; enable only when
|
|
110
|
+
# you experience genuine flakiness from dynamic DOMs or slow-rendering SPAs.
|
|
111
|
+
# Enabling this on a green suite adds overhead without benefit.
|
|
112
|
+
enabled: false
|
|
113
|
+
|
|
114
|
+
# How many times to re-evaluate the full selector list when all candidates fail.
|
|
115
|
+
# 0 = single pass (no retries). Increase to 1–2 for pages with animated loaders
|
|
116
|
+
# or deferred rendering. Each retry waits for Playwright's default timeout.
|
|
117
|
+
dom_retry_count: 0
|
|
118
|
+
|
|
119
|
+
# Global fallback selector list applied when a page does not pass its own
|
|
120
|
+
# fallback_selectors to wait_for_visible(). Prefer per-call overrides instead;
|
|
121
|
+
# global fallbacks are a last resort and can match unintended elements.
|
|
122
|
+
fallback_selectors: []
|
|
123
|
+
|
|
124
|
+
# Confidence penalty per fallback hop (0.0–1.0).
|
|
125
|
+
# Score = 1.0 - (selector_index * hop_decay) - (attempt * retry_decay)
|
|
126
|
+
# At the default 0.15, the 2nd fallback scores 0.85, the 3rd scores 0.70.
|
|
127
|
+
confidence_decay_per_hop: 0.15
|
|
128
|
+
|
|
129
|
+
# Confidence penalty per DOM retry attempt (0.0–1.0).
|
|
130
|
+
# At the default 0.1, a 2nd attempt costs an extra 0.10 off the score.
|
|
131
|
+
confidence_decay_per_retry: 0.1
|
|
132
|
+
|
|
133
|
+
# Minimum confidence score before a WARNING is logged. Tests still pass —
|
|
134
|
+
# this is a signal that your fallback chain is being leaned on heavily.
|
|
135
|
+
# Set to 0.0 to disable the warning. Recommended: 0.5
|
|
136
|
+
confidence_threshold: 0.5
|
|
137
|
+
|
|
138
|
+
# Write every recovery event (fallback used or retry triggered) to a JSONL
|
|
139
|
+
# file for post-run analysis. Keep false in CI unless actively debugging.
|
|
140
|
+
audit_enabled: false
|
|
141
|
+
audit_log_path: "reports/resilience/recovery_audit.jsonl"
|
|
142
|
+
|
|
143
|
+
logging:
|
|
144
|
+
level: "INFO"
|
|
145
|
+
file: "reports/framework.log"
|
|
146
|
+
format: "%(asctime)s | %(levelname)s | %(name)s | %(message)s"
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
environments:
|
|
2
|
+
dev:
|
|
3
|
+
base_url: "https://www.saucedemo.com"
|
|
4
|
+
api_base_url: ""
|
|
5
|
+
src_db:
|
|
6
|
+
db_type: "postgresql"
|
|
7
|
+
host: "localhost"
|
|
8
|
+
port: 5432
|
|
9
|
+
database: ""
|
|
10
|
+
tgt_db:
|
|
11
|
+
db_type: "postgresql"
|
|
12
|
+
host: "localhost"
|
|
13
|
+
port: 5432
|
|
14
|
+
database: ""
|
|
15
|
+
qa:
|
|
16
|
+
base_url: "https://opensource-demo.orangehrmlive.com"
|
|
17
|
+
api_base_url: ""
|
|
18
|
+
src_db:
|
|
19
|
+
db_type: "postgresql"
|
|
20
|
+
host: "localhost"
|
|
21
|
+
port: 5432
|
|
22
|
+
database: ""
|
|
23
|
+
tgt_db:
|
|
24
|
+
db_type: "postgresql"
|
|
25
|
+
host: "localhost"
|
|
26
|
+
port: 5432
|
|
27
|
+
database: ""
|
|
28
|
+
uat:
|
|
29
|
+
base_url: "https://www.saucedemo.com"
|
|
30
|
+
api_base_url: "http://192.168.1.102:8000"
|
|
31
|
+
# Auth block — configure per environment when the API requires authentication.
|
|
32
|
+
# token_url: path appended to api_base_url for the token endpoint
|
|
33
|
+
# token_path: JMESPath expression to extract the token from the response
|
|
34
|
+
# grant_type: OAuth2 grant type sent in the form body (password / client_credentials)
|
|
35
|
+
# credential_env_vars: maps form field names → environment variable names
|
|
36
|
+
# timeout_seconds: per-request timeout for the auth client (default 30)
|
|
37
|
+
# retries: retry count for transient auth failures (default 1)
|
|
38
|
+
auth:
|
|
39
|
+
token_url: "/api/v1/auth/token"
|
|
40
|
+
token_path: "access_token"
|
|
41
|
+
grant_type: "password"
|
|
42
|
+
credential_env_vars:
|
|
43
|
+
username: PYPLAYKIT_TEST_USERNAME
|
|
44
|
+
password: PYPLAYKIT_TEST_PASSWORD
|
|
45
|
+
timeout_seconds: 30
|
|
46
|
+
retries: 1
|
|
47
|
+
src_db:
|
|
48
|
+
db_type: "postgresql"
|
|
49
|
+
host: "192.168.1.102"
|
|
50
|
+
port: 5432
|
|
51
|
+
database: "ecom_db"
|
|
52
|
+
tgt_db:
|
|
53
|
+
db_type: "postgresql"
|
|
54
|
+
host: "192.168.1.102"
|
|
55
|
+
port: 5432
|
|
56
|
+
database: "ecom_db_replica"
|
|
57
|
+
prod:
|
|
58
|
+
base_url: "https://www.saucedemo.com"
|
|
59
|
+
api_base_url: ""
|
|
60
|
+
src_db:
|
|
61
|
+
db_type: "postgresql"
|
|
62
|
+
host: "localhost"
|
|
63
|
+
port: 5432
|
|
64
|
+
database: ""
|
|
65
|
+
tgt_db:
|
|
66
|
+
db_type: "postgresql"
|
|
67
|
+
host: "localhost"
|
|
68
|
+
port: 5432
|
|
69
|
+
database: ""
|
|
70
|
+
orangehrm:
|
|
71
|
+
base_url: "https://opensource-demo.orangehrmlive.com"
|
|
72
|
+
api_base_url: ""
|
|
73
|
+
src_db:
|
|
74
|
+
db_type: "postgresql"
|
|
75
|
+
host: "localhost"
|
|
76
|
+
port: 5432
|
|
77
|
+
database: ""
|
|
78
|
+
tgt_db:
|
|
79
|
+
db_type: "postgresql"
|
|
80
|
+
host: "localhost"
|
|
81
|
+
port: 5432
|
|
82
|
+
database: ""
|
|
@@ -93,6 +93,9 @@ pyplaykit.egg-info/dependency_links.txt
|
|
|
93
93
|
pyplaykit.egg-info/entry_points.txt
|
|
94
94
|
pyplaykit.egg-info/requires.txt
|
|
95
95
|
pyplaykit.egg-info/top_level.txt
|
|
96
|
+
pyplaykit/config/__init__.py
|
|
97
|
+
pyplaykit/config/config.yaml
|
|
98
|
+
pyplaykit/config/environments.yaml
|
|
96
99
|
resilience/__init__.py
|
|
97
100
|
resilience/locator_recovery.py
|
|
98
101
|
test_data/api_test_data.json
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "pyplaykit"
|
|
7
|
-
version = "1.8.
|
|
7
|
+
version = "1.8.8"
|
|
8
8
|
description = "Enterprise Python + Playwright automation framework"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = { text = "MIT" }
|
|
@@ -139,7 +139,7 @@ Repository = "https://github.com/ShanKonduru/pyplaykit"
|
|
|
139
139
|
include-package-data = true
|
|
140
140
|
|
|
141
141
|
[tool.setuptools.package-data]
|
|
142
|
-
pyplaykit = ["*.md"]
|
|
142
|
+
pyplaykit = ["*.md", "config/*.yaml"]
|
|
143
143
|
|
|
144
144
|
[tool.setuptools.packages.find]
|
|
145
145
|
where = ["."]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyplaykit-1.8.7 → pyplaykit-1.8.8}/.github/prompts/security-audit-and-consolidated-report.prompt.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|