pyplaykit 1.30.2__tar.gz → 1.30.3__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.3}/CHANGELOG.md +16 -0
  2. {pyplaykit-1.30.2/pyplaykit.egg-info → pyplaykit-1.30.3}/PKG-INFO +1 -1
  3. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/core/base_page.py +16 -1
  4. {pyplaykit-1.30.2 → pyplaykit-1.30.3/pyplaykit.egg-info}/PKG-INFO +1 -1
  5. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/pyproject.toml +1 -1
  6. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/api_client.py +18 -0
  7. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/graphql_client.py +2 -0
  8. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/soap_client.py +14 -1
  9. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/.github/copilot-instructions.md +0 -0
  10. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/.github/prompts/review-execution-plan-and-implement-next-task.prompt.md +0 -0
  11. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/.github/prompts/run-unit-tests-and-coverage.prompt.md +0 -0
  12. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/.github/prompts/security-audit-and-consolidated-report.prompt.md +0 -0
  13. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/CHOOSE_YOUR_STRUCTURE.md +0 -0
  14. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/CLAUDE.md +0 -0
  15. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/COLUMN_MAPPING_AND_IGNORE_FIELDS_GUIDE.md +0 -0
  16. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/COMMANDS_FOR_YOUR_PROJECTS.md +0 -0
  17. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/COMMIT_SUMMARY.md +0 -0
  18. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/CONTRIBUTING.md +0 -0
  19. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/CORRECTED_PROJECT_NAMES.md +0 -0
  20. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/DATABASE_IMPLEMENTATION_SUMMARY.md +0 -0
  21. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/DELIVERABLES_SUMMARY.md +0 -0
  22. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/ENTERPRISE_TEST_STRUCTURE.md +0 -0
  23. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/FINAL_PROJECT_SETUP.md +0 -0
  24. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/GAP_TRACKER.md +0 -0
  25. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/HOW_TO_ACCESS_DOCS.md +0 -0
  26. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/INIT_COMMAND_EXAMPLES.md +0 -0
  27. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/KEY_BASED_MATCHING_SOLUTION.md +0 -0
  28. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/MANIFEST.in +0 -0
  29. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/MIGRATION_COMPLETE.md +0 -0
  30. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/MIGRATION_PLAN.md +0 -0
  31. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/PIP_INSTALL_GUIDE.md +0 -0
  32. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/PYPLAYKIT_CLIENT_OVERVIEW.md +0 -0
  33. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/QUICK_DB_REFERENCE.md +0 -0
  34. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/QUICK_REFERENCE_COMPARISON_FEATURES.md +0 -0
  35. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/QUICK_START_QE.md +0 -0
  36. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/README.md +0 -0
  37. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/STRUCTURE_COMPARISON.md +0 -0
  38. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/TEST_LOCATION_CHEATSHEET.md +0 -0
  39. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/VISUAL_COMPARISON.md +0 -0
  40. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/WINDOWS_INSTALL_GUIDE.md +0 -0
  41. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/YOUR_PROJECTS_IMPLEMENTATION_GUIDE.md +0 -0
  42. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/YOUR_SETUP_SUMMARY.md +0 -0
  43. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/bin/README.md +0 -0
  44. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/components/__init__.py +0 -0
  45. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/components/base_component.py +0 -0
  46. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/components/data_table.py +0 -0
  47. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/components/form_field.py +0 -0
  48. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/components/modal.py +0 -0
  49. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/config/config.yaml +0 -0
  50. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/config/data_comparison_profiles.yaml +0 -0
  51. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/config/environments.yaml +0 -0
  52. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/config/projects/customs_modernization.yaml +0 -0
  53. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/config/projects/dispatcho.yaml +0 -0
  54. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/config/projects/timelyquote.yaml +0 -0
  55. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/core/__init__.py +0 -0
  56. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/core/base_test.py +0 -0
  57. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/core/browser_factory.py +0 -0
  58. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/core/playwright_manager.py +0 -0
  59. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/core/quality_gate.py +0 -0
  60. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/demo/README.md +0 -0
  61. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/demo/functional/database/file_comparison/README.md +0 -0
  62. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/demo/functional/database/postgres_src_tgt/README.md +0 -0
  63. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/dist_pkg/__init__.py +0 -0
  64. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/dist_pkg/distribution.py +0 -0
  65. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/API_TESTING_GUIDE.md +0 -0
  66. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/ARCHITECTURE.md +0 -0
  67. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/CI_INTEGRATION.md +0 -0
  68. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/CLI_REFERENCE.md +0 -0
  69. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/COMPETITIVE_ANALYSIS.md +0 -0
  70. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/COVERAGE_IMPROVEMENTS.md +0 -0
  71. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/CUSTOMER_SCENARIOS.md +0 -0
  72. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/DATABASE_SUPPORT.md +0 -0
  73. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/DATA_VALIDATION_GUIDE.md +0 -0
  74. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/DELIVERABLES_INDEX.md +0 -0
  75. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/EXAMPLE_TESTS_SUMMARY.md +0 -0
  76. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/Enterprise-Framework-Assessment-REVISED.md +0 -0
  77. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/Enterprise-Readiness-Assessment.md +0 -0
  78. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/Example-Tests-Guide.md +0 -0
  79. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/Execution-Plan-Backlog-and-Closure-Tracker.md +0 -0
  80. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/FRAMEWORK_CONTRIBUTION_GUIDE.md +0 -0
  81. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/KT/01_ARCHITECTURE.md +0 -0
  82. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/KT/02_DEPLOYMENT_RUNBOOK.md +0 -0
  83. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/KT/03_ACCESS_MATRIX.md +0 -0
  84. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/KT/04_CLIENT_CONTACT_MATRIX.md +0 -0
  85. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/KT/05_OPEN_RISKS_REGISTER.md +0 -0
  86. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/KT/06_PENDING_ENHANCEMENTS.md +0 -0
  87. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/KT/07_PRODUCT_ROADMAP.md +0 -0
  88. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/KT/08_ENVIRONMENT_DETAILS.md +0 -0
  89. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/KT/09_OPERATIONAL_SOPS.md +0 -0
  90. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/KT/10_ESCALATION_MATRIX.md +0 -0
  91. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/KT/11_KT_RECORDINGS_INDEX.md +0 -0
  92. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/KT/12_REVERSE_KT_SIGNOFF.md +0 -0
  93. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/KT/13_LEADERSHIP_SIGNOFF.md +0 -0
  94. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/KT/README.md +0 -0
  95. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/MCP_SERVER_DESIGN.md +0 -0
  96. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/MULTI_DB_VALIDATION_GUIDE.md +0 -0
  97. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/MULTI_PROJECT_STRUCTURE.md +0 -0
  98. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/OBSERVABILITY.md +0 -0
  99. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/PIP_INSTALL_GUIDE.md +0 -0
  100. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/PLUGIN_AUTHORING_GUIDE.md +0 -0
  101. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/PyPlayKit-Framework-Overview.md +0 -0
  102. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/PyPlayKit-Usage-Scenarios.md +0 -0
  103. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/QE_VISUAL_GUIDE.md +0 -0
  104. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/RESILIENCE_GUIDE.md +0 -0
  105. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/RUN_TESTS_QUICK_REFERENCE.md +0 -0
  106. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/SECRETS_AND_GOVERNANCE.md +0 -0
  107. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/TEST_ORGANIZATION.md +0 -0
  108. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/docs/Usage-Scenarios-Feasibility-Analysis.md +0 -0
  109. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/integrations/__init__.py +0 -0
  110. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/integrations/adapters.py +0 -0
  111. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/mcp_server/__init__.py +0 -0
  112. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/mcp_server/_ast_utils.py +0 -0
  113. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/mcp_server/_config_utils.py +0 -0
  114. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/mcp_server/cli.py +0 -0
  115. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/mcp_server/server.py +0 -0
  116. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/mcp_server/tools/__init__.py +0 -0
  117. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/mcp_server/tools/package_discovery.py +0 -0
  118. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/mcp_server/tools/project_introspection.py +0 -0
  119. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/mcp_server/tools/project_state.py +0 -0
  120. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/orchestration/__init__.py +0 -0
  121. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/orchestration/enforcer.py +0 -0
  122. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/orchestration/planner.py +0 -0
  123. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/pages/__init__.py +0 -0
  124. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/pages/dashboard_page.py +0 -0
  125. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/pages/login_page.py +0 -0
  126. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/pages/orangehrm_login_page.py +0 -0
  127. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/pages/saucedemo_inventory_page.py +0 -0
  128. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/pages/saucedemo_login_page.py +0 -0
  129. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/plugins/__init__.py +0 -0
  130. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/plugins/api_plugin.py +0 -0
  131. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/plugins/base.py +0 -0
  132. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/plugins/data_plugin.py +0 -0
  133. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/plugins/manifest.py +0 -0
  134. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/plugins/registry.py +0 -0
  135. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/plugins/security_plugin.py +0 -0
  136. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/pyplaykit/PIP_INSTALL_GUIDE.md +0 -0
  137. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/pyplaykit/README.md +0 -0
  138. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/pyplaykit/__init__.py +0 -0
  139. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/pyplaykit/cli.py +0 -0
  140. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/pyplaykit/config/__init__.py +0 -0
  141. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/pyplaykit/config/config.yaml +0 -0
  142. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/pyplaykit/config/environments.yaml +0 -0
  143. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/pyplaykit/plugin.py +0 -0
  144. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/pyplaykit/show_docs.py +0 -0
  145. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/pyplaykit.egg-info/SOURCES.txt +0 -0
  146. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/pyplaykit.egg-info/dependency_links.txt +0 -0
  147. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/pyplaykit.egg-info/entry_points.txt +0 -0
  148. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/pyplaykit.egg-info/requires.txt +0 -0
  149. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/pyplaykit.egg-info/top_level.txt +0 -0
  150. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/resilience/__init__.py +0 -0
  151. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/resilience/locator_recovery.py +0 -0
  152. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/setup.cfg +0 -0
  153. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/test_data/api/ecom/auth_payloads.json +0 -0
  154. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/test_data/api/ecom/product_payloads.json +0 -0
  155. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/test_data/api_test_data.json +0 -0
  156. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/test_data/data_validation_test_data.json +0 -0
  157. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/test_data/login_test_data.json +0 -0
  158. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/test_data/orangehrm_login_data.json +0 -0
  159. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/test_data/pacts/README.md +0 -0
  160. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/test_data/ui_test_data.json +0 -0
  161. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/tests/projects/README.md +0 -0
  162. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/tests/projects/customs_modernization/README.md +0 -0
  163. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/tests/projects/demo/functional/README.md +0 -0
  164. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/tests/projects/demo/functional/api/README.md +0 -0
  165. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/tests/projects/demo/functional/database/README.md +0 -0
  166. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/tests/projects/demo/functional/ui/README.md +0 -0
  167. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/tests/projects/demo/integration/README.md +0 -0
  168. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/tests/projects/dispatcho/README.md +0 -0
  169. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/tests/projects/timelyquote/README.md +0 -0
  170. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/__init__.py +0 -0
  171. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/api_test_helper.py +0 -0
  172. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/assertion_helper.py +0 -0
  173. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/auth_manager.py +0 -0
  174. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/comparison_config_loader.py +0 -0
  175. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/contract/__init__.py +0 -0
  176. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/contract/pact_consumer.py +0 -0
  177. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/dashboard.py +0 -0
  178. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/data_comparison_report.py +0 -0
  179. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/data_comparison_utils.py +0 -0
  180. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/data_loader.py +0 -0
  181. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/data_source.py +0 -0
  182. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/data_validator.py +0 -0
  183. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/database_clients.py +0 -0
  184. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/db_client.py +0 -0
  185. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/db_drivers/__init__.py +0 -0
  186. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/db_drivers/db2.py +0 -0
  187. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/db_drivers/informix.py +0 -0
  188. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/db_drivers/mongodb.py +0 -0
  189. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/db_drivers/mysql.py +0 -0
  190. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/db_drivers/oracle.py +0 -0
  191. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/db_drivers/snowflake.py +0 -0
  192. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/db_drivers/sqlite.py +0 -0
  193. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/db_drivers/sqlserver.py +0 -0
  194. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/db_factory.py +0 -0
  195. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/db_fixtures.py +0 -0
  196. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/db_pool.py +0 -0
  197. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/db_validation_helper.py +0 -0
  198. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/environment_validator.py +0 -0
  199. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/file_reader.py +0 -0
  200. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/governance.py +0 -0
  201. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/logger.py +0 -0
  202. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/observability.py +0 -0
  203. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/observability_report.py +0 -0
  204. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/org_governance.py +0 -0
  205. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/project_config.py +0 -0
  206. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/response_validator.py +0 -0
  207. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/screenshot_helper.py +0 -0
  208. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/secrets/__init__.py +0 -0
  209. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/secrets/aws_provider.py +0 -0
  210. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/secrets/azure_provider.py +0 -0
  211. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/secrets/base.py +0 -0
  212. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/secrets/env_provider.py +0 -0
  213. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/secrets/vault_provider.py +0 -0
  214. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/tdm.py +0 -0
  215. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/telemetry.py +0 -0
  216. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/transformation_validator.py +0 -0
  217. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/ui_db_validator.py +0 -0
  218. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/version_checker.py +0 -0
  219. {pyplaykit-1.30.2 → pyplaykit-1.30.3}/utils/yaml_config_reader.py +0 -0
@@ -11,6 +11,22 @@ Versioning follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
11
11
 
12
12
  ---
13
13
 
14
+ ## [1.30.3] — 2026-08-20
15
+
16
+ ### Added
17
+
18
+ - **`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`.
19
+ - **`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.
20
+
21
+ ### Fixed
22
+
23
+ - **`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.
24
+ - **`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`.
25
+
26
+ _(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.)_
27
+
28
+ ---
29
+
14
30
  ## [1.30.2] — 2026-08-20
15
31
 
16
32
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyplaykit
3
- Version: 1.30.2
3
+ Version: 1.30.3
4
4
  Summary: Enterprise Python + Playwright automation framework
5
5
  Author-email: Shan Konduru <shankonduru@gmail.com>
6
6
  License: MIT
@@ -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.3
4
4
  Summary: Enterprise Python + Playwright automation framework
5
5
  Author-email: Shan Konduru <shankonduru@gmail.com>
6
6
  License: MIT
@@ -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.3"
8
8
  description = "Enterprise Python + Playwright automation framework"
9
9
  readme = "README.md"
10
10
  license = { text = "MIT" }
@@ -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
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes