pyplaykit 1.30.2__tar.gz → 1.30.4__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 (219) hide show
  1. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/CHANGELOG.md +29 -0
  2. {pyplaykit-1.30.2/pyplaykit.egg-info → pyplaykit-1.30.4}/PKG-INFO +37 -1
  3. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/core/base_page.py +16 -1
  4. {pyplaykit-1.30.2 → pyplaykit-1.30.4/pyplaykit.egg-info}/PKG-INFO +37 -1
  5. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/pyplaykit.egg-info/requires.txt +37 -0
  6. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/pyproject.toml +42 -1
  7. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/api_client.py +18 -0
  8. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/graphql_client.py +2 -0
  9. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/soap_client.py +14 -1
  10. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/.github/copilot-instructions.md +0 -0
  11. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/.github/prompts/review-execution-plan-and-implement-next-task.prompt.md +0 -0
  12. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/.github/prompts/run-unit-tests-and-coverage.prompt.md +0 -0
  13. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/.github/prompts/security-audit-and-consolidated-report.prompt.md +0 -0
  14. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/CHOOSE_YOUR_STRUCTURE.md +0 -0
  15. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/CLAUDE.md +0 -0
  16. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/COLUMN_MAPPING_AND_IGNORE_FIELDS_GUIDE.md +0 -0
  17. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/COMMANDS_FOR_YOUR_PROJECTS.md +0 -0
  18. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/COMMIT_SUMMARY.md +0 -0
  19. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/CONTRIBUTING.md +0 -0
  20. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/CORRECTED_PROJECT_NAMES.md +0 -0
  21. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/DATABASE_IMPLEMENTATION_SUMMARY.md +0 -0
  22. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/DELIVERABLES_SUMMARY.md +0 -0
  23. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/ENTERPRISE_TEST_STRUCTURE.md +0 -0
  24. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/FINAL_PROJECT_SETUP.md +0 -0
  25. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/GAP_TRACKER.md +0 -0
  26. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/HOW_TO_ACCESS_DOCS.md +0 -0
  27. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/INIT_COMMAND_EXAMPLES.md +0 -0
  28. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/KEY_BASED_MATCHING_SOLUTION.md +0 -0
  29. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/MANIFEST.in +0 -0
  30. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/MIGRATION_COMPLETE.md +0 -0
  31. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/MIGRATION_PLAN.md +0 -0
  32. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/PIP_INSTALL_GUIDE.md +0 -0
  33. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/PYPLAYKIT_CLIENT_OVERVIEW.md +0 -0
  34. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/QUICK_DB_REFERENCE.md +0 -0
  35. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/QUICK_REFERENCE_COMPARISON_FEATURES.md +0 -0
  36. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/QUICK_START_QE.md +0 -0
  37. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/README.md +0 -0
  38. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/STRUCTURE_COMPARISON.md +0 -0
  39. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/TEST_LOCATION_CHEATSHEET.md +0 -0
  40. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/VISUAL_COMPARISON.md +0 -0
  41. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/WINDOWS_INSTALL_GUIDE.md +0 -0
  42. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/YOUR_PROJECTS_IMPLEMENTATION_GUIDE.md +0 -0
  43. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/YOUR_SETUP_SUMMARY.md +0 -0
  44. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/bin/README.md +0 -0
  45. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/components/__init__.py +0 -0
  46. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/components/base_component.py +0 -0
  47. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/components/data_table.py +0 -0
  48. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/components/form_field.py +0 -0
  49. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/components/modal.py +0 -0
  50. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/config/config.yaml +0 -0
  51. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/config/data_comparison_profiles.yaml +0 -0
  52. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/config/environments.yaml +0 -0
  53. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/config/projects/customs_modernization.yaml +0 -0
  54. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/config/projects/dispatcho.yaml +0 -0
  55. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/config/projects/timelyquote.yaml +0 -0
  56. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/core/__init__.py +0 -0
  57. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/core/base_test.py +0 -0
  58. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/core/browser_factory.py +0 -0
  59. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/core/playwright_manager.py +0 -0
  60. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/core/quality_gate.py +0 -0
  61. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/demo/README.md +0 -0
  62. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/demo/functional/database/file_comparison/README.md +0 -0
  63. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/demo/functional/database/postgres_src_tgt/README.md +0 -0
  64. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/dist_pkg/__init__.py +0 -0
  65. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/dist_pkg/distribution.py +0 -0
  66. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/API_TESTING_GUIDE.md +0 -0
  67. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/ARCHITECTURE.md +0 -0
  68. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/CI_INTEGRATION.md +0 -0
  69. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/CLI_REFERENCE.md +0 -0
  70. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/COMPETITIVE_ANALYSIS.md +0 -0
  71. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/COVERAGE_IMPROVEMENTS.md +0 -0
  72. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/CUSTOMER_SCENARIOS.md +0 -0
  73. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/DATABASE_SUPPORT.md +0 -0
  74. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/DATA_VALIDATION_GUIDE.md +0 -0
  75. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/DELIVERABLES_INDEX.md +0 -0
  76. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/EXAMPLE_TESTS_SUMMARY.md +0 -0
  77. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/Enterprise-Framework-Assessment-REVISED.md +0 -0
  78. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/Enterprise-Readiness-Assessment.md +0 -0
  79. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/Example-Tests-Guide.md +0 -0
  80. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/Execution-Plan-Backlog-and-Closure-Tracker.md +0 -0
  81. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/FRAMEWORK_CONTRIBUTION_GUIDE.md +0 -0
  82. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/KT/01_ARCHITECTURE.md +0 -0
  83. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/KT/02_DEPLOYMENT_RUNBOOK.md +0 -0
  84. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/KT/03_ACCESS_MATRIX.md +0 -0
  85. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/KT/04_CLIENT_CONTACT_MATRIX.md +0 -0
  86. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/KT/05_OPEN_RISKS_REGISTER.md +0 -0
  87. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/KT/06_PENDING_ENHANCEMENTS.md +0 -0
  88. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/KT/07_PRODUCT_ROADMAP.md +0 -0
  89. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/KT/08_ENVIRONMENT_DETAILS.md +0 -0
  90. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/KT/09_OPERATIONAL_SOPS.md +0 -0
  91. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/KT/10_ESCALATION_MATRIX.md +0 -0
  92. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/KT/11_KT_RECORDINGS_INDEX.md +0 -0
  93. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/KT/12_REVERSE_KT_SIGNOFF.md +0 -0
  94. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/KT/13_LEADERSHIP_SIGNOFF.md +0 -0
  95. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/KT/README.md +0 -0
  96. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/MCP_SERVER_DESIGN.md +0 -0
  97. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/MULTI_DB_VALIDATION_GUIDE.md +0 -0
  98. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/MULTI_PROJECT_STRUCTURE.md +0 -0
  99. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/OBSERVABILITY.md +0 -0
  100. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/PIP_INSTALL_GUIDE.md +0 -0
  101. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/PLUGIN_AUTHORING_GUIDE.md +0 -0
  102. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/PyPlayKit-Framework-Overview.md +0 -0
  103. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/PyPlayKit-Usage-Scenarios.md +0 -0
  104. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/QE_VISUAL_GUIDE.md +0 -0
  105. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/RESILIENCE_GUIDE.md +0 -0
  106. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/RUN_TESTS_QUICK_REFERENCE.md +0 -0
  107. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/SECRETS_AND_GOVERNANCE.md +0 -0
  108. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/TEST_ORGANIZATION.md +0 -0
  109. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/docs/Usage-Scenarios-Feasibility-Analysis.md +0 -0
  110. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/integrations/__init__.py +0 -0
  111. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/integrations/adapters.py +0 -0
  112. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/mcp_server/__init__.py +0 -0
  113. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/mcp_server/_ast_utils.py +0 -0
  114. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/mcp_server/_config_utils.py +0 -0
  115. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/mcp_server/cli.py +0 -0
  116. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/mcp_server/server.py +0 -0
  117. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/mcp_server/tools/__init__.py +0 -0
  118. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/mcp_server/tools/package_discovery.py +0 -0
  119. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/mcp_server/tools/project_introspection.py +0 -0
  120. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/mcp_server/tools/project_state.py +0 -0
  121. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/orchestration/__init__.py +0 -0
  122. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/orchestration/enforcer.py +0 -0
  123. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/orchestration/planner.py +0 -0
  124. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/pages/__init__.py +0 -0
  125. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/pages/dashboard_page.py +0 -0
  126. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/pages/login_page.py +0 -0
  127. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/pages/orangehrm_login_page.py +0 -0
  128. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/pages/saucedemo_inventory_page.py +0 -0
  129. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/pages/saucedemo_login_page.py +0 -0
  130. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/plugins/__init__.py +0 -0
  131. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/plugins/api_plugin.py +0 -0
  132. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/plugins/base.py +0 -0
  133. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/plugins/data_plugin.py +0 -0
  134. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/plugins/manifest.py +0 -0
  135. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/plugins/registry.py +0 -0
  136. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/plugins/security_plugin.py +0 -0
  137. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/pyplaykit/PIP_INSTALL_GUIDE.md +0 -0
  138. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/pyplaykit/README.md +0 -0
  139. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/pyplaykit/__init__.py +0 -0
  140. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/pyplaykit/cli.py +0 -0
  141. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/pyplaykit/config/__init__.py +0 -0
  142. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/pyplaykit/config/config.yaml +0 -0
  143. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/pyplaykit/config/environments.yaml +0 -0
  144. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/pyplaykit/plugin.py +0 -0
  145. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/pyplaykit/show_docs.py +0 -0
  146. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/pyplaykit.egg-info/SOURCES.txt +0 -0
  147. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/pyplaykit.egg-info/dependency_links.txt +0 -0
  148. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/pyplaykit.egg-info/entry_points.txt +0 -0
  149. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/pyplaykit.egg-info/top_level.txt +0 -0
  150. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/resilience/__init__.py +0 -0
  151. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/resilience/locator_recovery.py +0 -0
  152. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/setup.cfg +0 -0
  153. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/test_data/api/ecom/auth_payloads.json +0 -0
  154. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/test_data/api/ecom/product_payloads.json +0 -0
  155. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/test_data/api_test_data.json +0 -0
  156. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/test_data/data_validation_test_data.json +0 -0
  157. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/test_data/login_test_data.json +0 -0
  158. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/test_data/orangehrm_login_data.json +0 -0
  159. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/test_data/pacts/README.md +0 -0
  160. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/test_data/ui_test_data.json +0 -0
  161. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/tests/projects/README.md +0 -0
  162. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/tests/projects/customs_modernization/README.md +0 -0
  163. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/tests/projects/demo/functional/README.md +0 -0
  164. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/tests/projects/demo/functional/api/README.md +0 -0
  165. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/tests/projects/demo/functional/database/README.md +0 -0
  166. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/tests/projects/demo/functional/ui/README.md +0 -0
  167. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/tests/projects/demo/integration/README.md +0 -0
  168. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/tests/projects/dispatcho/README.md +0 -0
  169. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/tests/projects/timelyquote/README.md +0 -0
  170. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/__init__.py +0 -0
  171. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/api_test_helper.py +0 -0
  172. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/assertion_helper.py +0 -0
  173. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/auth_manager.py +0 -0
  174. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/comparison_config_loader.py +0 -0
  175. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/contract/__init__.py +0 -0
  176. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/contract/pact_consumer.py +0 -0
  177. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/dashboard.py +0 -0
  178. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/data_comparison_report.py +0 -0
  179. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/data_comparison_utils.py +0 -0
  180. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/data_loader.py +0 -0
  181. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/data_source.py +0 -0
  182. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/data_validator.py +0 -0
  183. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/database_clients.py +0 -0
  184. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/db_client.py +0 -0
  185. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/db_drivers/__init__.py +0 -0
  186. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/db_drivers/db2.py +0 -0
  187. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/db_drivers/informix.py +0 -0
  188. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/db_drivers/mongodb.py +0 -0
  189. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/db_drivers/mysql.py +0 -0
  190. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/db_drivers/oracle.py +0 -0
  191. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/db_drivers/snowflake.py +0 -0
  192. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/db_drivers/sqlite.py +0 -0
  193. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/db_drivers/sqlserver.py +0 -0
  194. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/db_factory.py +0 -0
  195. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/db_fixtures.py +0 -0
  196. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/db_pool.py +0 -0
  197. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/db_validation_helper.py +0 -0
  198. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/environment_validator.py +0 -0
  199. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/file_reader.py +0 -0
  200. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/governance.py +0 -0
  201. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/logger.py +0 -0
  202. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/observability.py +0 -0
  203. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/observability_report.py +0 -0
  204. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/org_governance.py +0 -0
  205. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/project_config.py +0 -0
  206. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/response_validator.py +0 -0
  207. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/screenshot_helper.py +0 -0
  208. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/secrets/__init__.py +0 -0
  209. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/secrets/aws_provider.py +0 -0
  210. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/secrets/azure_provider.py +0 -0
  211. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/secrets/base.py +0 -0
  212. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/secrets/env_provider.py +0 -0
  213. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/secrets/vault_provider.py +0 -0
  214. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/tdm.py +0 -0
  215. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/telemetry.py +0 -0
  216. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/transformation_validator.py +0 -0
  217. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/ui_db_validator.py +0 -0
  218. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/version_checker.py +0 -0
  219. {pyplaykit-1.30.2 → pyplaykit-1.30.4}/utils/yaml_config_reader.py +0 -0
@@ -11,6 +11,35 @@ Versioning follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
11
11
 
12
12
  ---
13
13
 
14
+ ## [1.30.4] — 2026-08-20
15
+
16
+ ### Fixed
17
+
18
+ - **API reference docs (GAP-23) are now actually generated and complete.** The CI "Generate API reference docs" step previously produced an empty or near-empty reference and was masked by `continue-on-error`. Root cause: pdoc's submodule discovery **respects a package's `__all__`**, and several PyPlayKit packages (`utils`, `utils.secrets`, `utils.contract`, `components`, `pyplaykit`) define `__all__` to list their public *symbols* — not their submodules — so pdoc silently excluded ~65 submodules (`utils.api_client`, `utils.tdm`, `core.quality_gate`, …), documenting only the top-level package pages. A secondary hazard: pdoc aborts the *entire* build on the first submodule it cannot import.
19
+ - New resilient driver **`scripts/generate_api_docs.py`** discovers every submodule via `pkgutil` (ignoring `__all__`), test-imports each, and hands pdoc an explicit spec list of the modules that import cleanly — excluding (with a logged, non-silent warning) any module whose optional dependency is genuinely absent, instead of aborting. The reference now covers **69 modules** (was 4 top-level pages) and is always produced. `scripts/generate_api_docs.sh` is now a thin wrapper around it.
20
+
21
+ ### Added
22
+
23
+ - **`docs` optional-dependency extra** — `pip install '.[docs]'` installs the full optional set (mirrors `all` plus the pure-Python extras: mcp, contracts, pact, accessibility, mongodb, telemetry, prometheus, dashboard, vault, aws, azure) so the generated API reference is complete with no modules skipped. The publish workflow now installs `.[docs]` before generating docs.
24
+
25
+ ---
26
+
27
+ ## [1.30.3] — 2026-08-20
28
+
29
+ ### Added
30
+
31
+ - **`ApiClient.options()` and `ApiClient.head()` shortcuts** — the client had GET/POST/PUT/PATCH/DELETE convenience methods but no `OPTIONS` (needed for CORS-preflight and capability probes) or `HEAD` shortcut, so `api_client.options(endpoint)` raised `AttributeError`. Both now delegate to the existing `request()` verb dispatcher, exactly like the other shortcuts, and accept `params`/`headers`.
32
+ - **`BasePage.has_any_visible(selector)`** — returns `True` when *at least one* element matches, via `page.locator(selector).count() > 0`. `is_visible()` wraps Playwright's strict-mode `expect(...).to_be_visible()`, which raises when a selector resolves to multiple elements (rows, cards, list items); `has_any_visible()` is the correct check for repeated elements. `is_visible()`'s docstring now points to it.
33
+
34
+ ### Fixed
35
+
36
+ - **`SoapClient` now accepts `verify_ssl` (default `True`)** — the constructor built its zeep `Transport` with default settings and offered no way to disable TLS verification, so on a corporate network behind a TLS-inspection proxy (whose internal CA is not in Python's trust store) every call raised `SSLCertVerificationError`, with the only escape being the internal `_zeep_client` injection hook. Passing `verify_ssl=False` now configures the underlying `requests` session with `verify=False` for both the WSDL fetch and operation calls.
37
+ - **`GraphQLClient` now accepts `verify_ssl` (default `True`)** — for parity with `ApiClient` (which already supported it). Previously callers had to hand-build an `httpx.HTTPTransport(verify=False)` and pass it via `transport=`; `verify_ssl=False` is now a direct passthrough to the underlying `ApiClient`.
38
+
39
+ _(Note: `BasePage.wait_for_url_contains()` — which previously passed a Python predicate to Playwright's `to_have_url()` and raised "value must be a string or regular expression" — was already fixed to use `page.wait_for_url("**{url_part}**")` and shipped in 1.30.2.)_
40
+
41
+ ---
42
+
14
43
  ## [1.30.2] — 2026-08-20
15
44
 
16
45
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyplaykit
3
- Version: 1.30.2
3
+ Version: 1.30.4
4
4
  Summary: Enterprise Python + Playwright automation framework
5
5
  Author-email: Shan Konduru <shankonduru@gmail.com>
6
6
  License: MIT
@@ -121,6 +121,42 @@ Requires-Dist: mysql-connector-python>=8.0.0; extra == "all"
121
121
  Requires-Dist: snowflake-connector-python>=3.0.0; extra == "all"
122
122
  Requires-Dist: allure-pytest==2.16.0; extra == "all"
123
123
  Requires-Dist: pytest-html==4.2.0; extra == "all"
124
+ Provides-Extra: docs
125
+ Requires-Dist: httpx>=0.27.0; extra == "docs"
126
+ Requires-Dist: jmespath>=1.0.0; extra == "docs"
127
+ Requires-Dist: gql[httpx]>=3.5.0; extra == "docs"
128
+ Requires-Dist: zeep>=4.2.1; extra == "docs"
129
+ Requires-Dist: pandas>=2.0.0; extra == "docs"
130
+ Requires-Dist: openpyxl>=3.1.0; extra == "docs"
131
+ Requires-Dist: xlrd>=2.0.1; extra == "docs"
132
+ Requires-Dist: psycopg2-binary>=2.9.0; extra == "docs"
133
+ Requires-Dist: pyodbc>=4.0.0; extra == "docs"
134
+ Requires-Dist: oracledb>=1.0.0; extra == "docs"
135
+ Requires-Dist: ibm_db>=3.0.0; extra == "docs"
136
+ Requires-Dist: ibm_db_dbi>=3.0.0; extra == "docs"
137
+ Requires-Dist: IfxPy>=3.0.0; extra == "docs"
138
+ Requires-Dist: IfxPyDbi>=3.0.0; extra == "docs"
139
+ Requires-Dist: mysql-connector-python>=8.0.0; extra == "docs"
140
+ Requires-Dist: snowflake-connector-python>=3.0.0; extra == "docs"
141
+ Requires-Dist: allure-pytest==2.16.0; extra == "docs"
142
+ Requires-Dist: pytest-html==4.2.0; extra == "docs"
143
+ Requires-Dist: fastmcp>=2.0.0; extra == "docs"
144
+ Requires-Dist: jsonschema>=4.0; extra == "docs"
145
+ Requires-Dist: openapi-spec-validator>=0.5; extra == "docs"
146
+ Requires-Dist: schemathesis>=3.0; extra == "docs"
147
+ Requires-Dist: pact-python>=2.0; extra == "docs"
148
+ Requires-Dist: axe-playwright-python>=0.1.3; extra == "docs"
149
+ Requires-Dist: pymongo>=4.0.0; extra == "docs"
150
+ Requires-Dist: opentelemetry-api>=1.0; extra == "docs"
151
+ Requires-Dist: opentelemetry-sdk>=1.0; extra == "docs"
152
+ Requires-Dist: opentelemetry-exporter-otlp>=1.0; extra == "docs"
153
+ Requires-Dist: prometheus-client>=0.17; extra == "docs"
154
+ Requires-Dist: fastapi>=0.100; extra == "docs"
155
+ Requires-Dist: uvicorn>=0.20; extra == "docs"
156
+ Requires-Dist: hvac>=1.0; extra == "docs"
157
+ Requires-Dist: boto3>=1.26; extra == "docs"
158
+ Requires-Dist: azure-keyvault-secrets>=4.0; extra == "docs"
159
+ Requires-Dist: azure-identity>=1.0; extra == "docs"
124
160
 
125
161
  # PyPlayKit - Enterprise Test Automation Framework
126
162
 
@@ -129,7 +129,13 @@ class BasePage:
129
129
  return self.wait_for_visible(selector).inner_text().strip()
130
130
 
131
131
  def is_visible(self, selector: str, timeout: float = 5000) -> bool:
132
- """Return visibility state for selector, auto-waiting for it to be visible."""
132
+ """Return visibility state for a selector, auto-waiting for it to be visible.
133
+
134
+ Use this only when ``selector`` resolves to **exactly one** element. For a
135
+ selector that may match repeated elements (rows, cards, list items), use
136
+ :meth:`has_any_visible` instead — ``expect(...).to_be_visible()`` is
137
+ strict-mode and raises when the locator resolves to multiple elements.
138
+ """
133
139
  locator = self.page.locator(selector)
134
140
  try:
135
141
  expect(locator).to_be_visible(timeout=timeout)
@@ -137,6 +143,15 @@ class BasePage:
137
143
  except AssertionError:
138
144
  return False
139
145
 
146
+ def has_any_visible(self, selector: str) -> bool:
147
+ """Return True if **at least one** element matches ``selector``.
148
+
149
+ Use for repeated elements (table rows, cards, list items) where you only
150
+ need to confirm presence, not uniqueness. Unlike :meth:`is_visible`, this
151
+ never raises on a multi-element match — it counts matches instead.
152
+ """
153
+ return self.page.locator(selector).count() > 0
154
+
140
155
  def get_title(self) -> str:
141
156
  """Return current page title."""
142
157
  return self.page.title()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyplaykit
3
- Version: 1.30.2
3
+ Version: 1.30.4
4
4
  Summary: Enterprise Python + Playwright automation framework
5
5
  Author-email: Shan Konduru <shankonduru@gmail.com>
6
6
  License: MIT
@@ -121,6 +121,42 @@ Requires-Dist: mysql-connector-python>=8.0.0; extra == "all"
121
121
  Requires-Dist: snowflake-connector-python>=3.0.0; extra == "all"
122
122
  Requires-Dist: allure-pytest==2.16.0; extra == "all"
123
123
  Requires-Dist: pytest-html==4.2.0; extra == "all"
124
+ Provides-Extra: docs
125
+ Requires-Dist: httpx>=0.27.0; extra == "docs"
126
+ Requires-Dist: jmespath>=1.0.0; extra == "docs"
127
+ Requires-Dist: gql[httpx]>=3.5.0; extra == "docs"
128
+ Requires-Dist: zeep>=4.2.1; extra == "docs"
129
+ Requires-Dist: pandas>=2.0.0; extra == "docs"
130
+ Requires-Dist: openpyxl>=3.1.0; extra == "docs"
131
+ Requires-Dist: xlrd>=2.0.1; extra == "docs"
132
+ Requires-Dist: psycopg2-binary>=2.9.0; extra == "docs"
133
+ Requires-Dist: pyodbc>=4.0.0; extra == "docs"
134
+ Requires-Dist: oracledb>=1.0.0; extra == "docs"
135
+ Requires-Dist: ibm_db>=3.0.0; extra == "docs"
136
+ Requires-Dist: ibm_db_dbi>=3.0.0; extra == "docs"
137
+ Requires-Dist: IfxPy>=3.0.0; extra == "docs"
138
+ Requires-Dist: IfxPyDbi>=3.0.0; extra == "docs"
139
+ Requires-Dist: mysql-connector-python>=8.0.0; extra == "docs"
140
+ Requires-Dist: snowflake-connector-python>=3.0.0; extra == "docs"
141
+ Requires-Dist: allure-pytest==2.16.0; extra == "docs"
142
+ Requires-Dist: pytest-html==4.2.0; extra == "docs"
143
+ Requires-Dist: fastmcp>=2.0.0; extra == "docs"
144
+ Requires-Dist: jsonschema>=4.0; extra == "docs"
145
+ Requires-Dist: openapi-spec-validator>=0.5; extra == "docs"
146
+ Requires-Dist: schemathesis>=3.0; extra == "docs"
147
+ Requires-Dist: pact-python>=2.0; extra == "docs"
148
+ Requires-Dist: axe-playwright-python>=0.1.3; extra == "docs"
149
+ Requires-Dist: pymongo>=4.0.0; extra == "docs"
150
+ Requires-Dist: opentelemetry-api>=1.0; extra == "docs"
151
+ Requires-Dist: opentelemetry-sdk>=1.0; extra == "docs"
152
+ Requires-Dist: opentelemetry-exporter-otlp>=1.0; extra == "docs"
153
+ Requires-Dist: prometheus-client>=0.17; extra == "docs"
154
+ Requires-Dist: fastapi>=0.100; extra == "docs"
155
+ Requires-Dist: uvicorn>=0.20; extra == "docs"
156
+ Requires-Dist: hvac>=1.0; extra == "docs"
157
+ Requires-Dist: boto3>=1.26; extra == "docs"
158
+ Requires-Dist: azure-keyvault-secrets>=4.0; extra == "docs"
159
+ Requires-Dist: azure-identity>=1.0; extra == "docs"
124
160
 
125
161
  # PyPlayKit - Enterprise Test Automation Framework
126
162
 
@@ -79,6 +79,43 @@ xlrd>=2.0.1
79
79
  ibm_db>=3.0.0
80
80
  ibm_db_dbi>=3.0.0
81
81
 
82
+ [docs]
83
+ httpx>=0.27.0
84
+ jmespath>=1.0.0
85
+ gql[httpx]>=3.5.0
86
+ zeep>=4.2.1
87
+ pandas>=2.0.0
88
+ openpyxl>=3.1.0
89
+ xlrd>=2.0.1
90
+ psycopg2-binary>=2.9.0
91
+ pyodbc>=4.0.0
92
+ oracledb>=1.0.0
93
+ ibm_db>=3.0.0
94
+ ibm_db_dbi>=3.0.0
95
+ IfxPy>=3.0.0
96
+ IfxPyDbi>=3.0.0
97
+ mysql-connector-python>=8.0.0
98
+ snowflake-connector-python>=3.0.0
99
+ allure-pytest==2.16.0
100
+ pytest-html==4.2.0
101
+ fastmcp>=2.0.0
102
+ jsonschema>=4.0
103
+ openapi-spec-validator>=0.5
104
+ schemathesis>=3.0
105
+ pact-python>=2.0
106
+ axe-playwright-python>=0.1.3
107
+ pymongo>=4.0.0
108
+ opentelemetry-api>=1.0
109
+ opentelemetry-sdk>=1.0
110
+ opentelemetry-exporter-otlp>=1.0
111
+ prometheus-client>=0.17
112
+ fastapi>=0.100
113
+ uvicorn>=0.20
114
+ hvac>=1.0
115
+ boto3>=1.26
116
+ azure-keyvault-secrets>=4.0
117
+ azure-identity>=1.0
118
+
82
119
  [graphql-client]
83
120
  gql[httpx]>=3.5.0
84
121
  httpx>=0.27.0
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "pyplaykit"
7
- version = "1.30.2"
7
+ version = "1.30.4"
8
8
  description = "Enterprise Python + Playwright automation framework"
9
9
  readme = "README.md"
10
10
  license = { text = "MIT" }
@@ -172,6 +172,47 @@ all = [
172
172
  "allure-pytest==2.16.0",
173
173
  "pytest-html==4.2.0",
174
174
  ]
175
+ # Full optional-dependency set — used to generate a COMPLETE API reference
176
+ # (pip install '.[docs]') so no module is skipped during the pdoc walk. Mirrors
177
+ # 'all' plus every pure-Python optional extra whose module imports its dependency
178
+ # at load time (secrets, telemetry, contracts, dashboard, mongodb, mcp, ...).
179
+ docs = [
180
+ "httpx>=0.27.0",
181
+ "jmespath>=1.0.0",
182
+ "gql[httpx]>=3.5.0",
183
+ "zeep>=4.2.1",
184
+ "pandas>=2.0.0",
185
+ "openpyxl>=3.1.0",
186
+ "xlrd>=2.0.1",
187
+ "psycopg2-binary>=2.9.0",
188
+ "pyodbc>=4.0.0",
189
+ "oracledb>=1.0.0",
190
+ "ibm_db>=3.0.0",
191
+ "ibm_db_dbi>=3.0.0",
192
+ "IfxPy>=3.0.0",
193
+ "IfxPyDbi>=3.0.0",
194
+ "mysql-connector-python>=8.0.0",
195
+ "snowflake-connector-python>=3.0.0",
196
+ "allure-pytest==2.16.0",
197
+ "pytest-html==4.2.0",
198
+ "fastmcp>=2.0.0",
199
+ "jsonschema>=4.0",
200
+ "openapi-spec-validator>=0.5",
201
+ "schemathesis>=3.0",
202
+ "pact-python>=2.0",
203
+ "axe-playwright-python>=0.1.3",
204
+ "pymongo>=4.0.0",
205
+ "opentelemetry-api>=1.0",
206
+ "opentelemetry-sdk>=1.0",
207
+ "opentelemetry-exporter-otlp>=1.0",
208
+ "prometheus-client>=0.17",
209
+ "fastapi>=0.100",
210
+ "uvicorn>=0.20",
211
+ "hvac>=1.0",
212
+ "boto3>=1.26",
213
+ "azure-keyvault-secrets>=4.0",
214
+ "azure-identity>=1.0",
215
+ ]
175
216
 
176
217
  [project.scripts]
177
218
  pyplaykit = "pyplaykit.cli:main"
@@ -356,6 +356,24 @@ class ApiClient:
356
356
  """Shortcut for DELETE requests."""
357
357
  return self.request("DELETE", endpoint, headers=headers)
358
358
 
359
+ def options(
360
+ self,
361
+ endpoint: str,
362
+ params: dict[str, Any] | None = None,
363
+ headers: dict[str, str] | None = None,
364
+ ) -> ApiResponse:
365
+ """Shortcut for OPTIONS requests (e.g. CORS preflight / capability probes)."""
366
+ return self.request("OPTIONS", endpoint, params=params, headers=headers)
367
+
368
+ def head(
369
+ self,
370
+ endpoint: str,
371
+ params: dict[str, Any] | None = None,
372
+ headers: dict[str, str] | None = None,
373
+ ) -> ApiResponse:
374
+ """Shortcut for HEAD requests (headers/status only, no body)."""
375
+ return self.request("HEAD", endpoint, params=params, headers=headers)
376
+
359
377
  # ── Internal helpers ───────────────────────────────────────────────────────
360
378
 
361
379
  def _build_url(self, endpoint: str, params: dict[str, Any] | None = None) -> str:
@@ -92,6 +92,7 @@ class GraphQLClient:
92
92
  retries: int = 1,
93
93
  logger=None,
94
94
  transport=None,
95
+ verify_ssl: bool = True,
95
96
  ) -> None:
96
97
  self._endpoint = endpoint
97
98
  self._http = ApiClient(
@@ -100,6 +101,7 @@ class GraphQLClient:
100
101
  retries=retries,
101
102
  logger=logger,
102
103
  transport=transport,
104
+ verify_ssl=verify_ssl,
103
105
  )
104
106
  self._logger = logger
105
107
 
@@ -79,6 +79,7 @@ class SoapClient:
79
79
  password: str | None = None,
80
80
  timeout_seconds: int = 30,
81
81
  logger=None,
82
+ verify_ssl: bool = True,
82
83
  _zeep_client=None,
83
84
  ) -> None:
84
85
  """Create a SoapClient.
@@ -89,6 +90,11 @@ class SoapClient:
89
90
  password: Optional WS-Security UsernameToken password.
90
91
  timeout_seconds: HTTP request timeout.
91
92
  logger: Optional logger for request/response logging.
93
+ verify_ssl: Verify TLS certificates (default True). Set False on
94
+ corporate networks behind a TLS-inspection proxy whose
95
+ internal CA is not in Python's trust store — this
96
+ configures the underlying ``requests`` session with
97
+ ``verify=False`` for both the WSDL fetch and calls.
92
98
  _zeep_client: Inject a pre-built zeep Client for testing.
93
99
  """
94
100
  self._wsdl = wsdl
@@ -101,7 +107,14 @@ class SoapClient:
101
107
  import zeep
102
108
  import zeep.transports
103
109
 
104
- transport = zeep.transports.Transport(timeout=timeout_seconds)
110
+ session = None
111
+ if not verify_ssl:
112
+ import requests
113
+ session = requests.Session()
114
+ session.verify = False
115
+ transport = zeep.transports.Transport(
116
+ timeout=timeout_seconds, session=session
117
+ )
105
118
  self._client = zeep.Client(wsdl=wsdl, transport=transport)
106
119
 
107
120
  if username and password:
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