iris-devtester 1.9.1__tar.gz → 1.9.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 (241) hide show
  1. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/AGENTS.md +129 -0
  2. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/PKG-INFO +45 -1
  3. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/README.md +44 -0
  4. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/SKILL.md +1 -1
  5. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/__init__.py +1 -1
  6. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/cli/container.py +45 -4
  7. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/config/container_config.py +6 -7
  8. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/config/container_state.py +6 -7
  9. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/config/yaml_loader.py +1 -1
  10. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/containers/iris_container.py +4 -7
  11. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/ports/registry.py +2 -2
  12. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/utils/health_checks.py +1 -1
  13. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/utils/password.py +2 -2
  14. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester.egg-info/PKG-INFO +45 -1
  15. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/pyproject.toml +1 -1
  16. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/CLAUDE.md +0 -0
  17. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/CONSTITUTION.md +0 -0
  18. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/LICENSE +0 -0
  19. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/MANIFEST.in +0 -0
  20. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/GETTING_STARTED.md +0 -0
  21. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/LANGCHAIN_INTEGRATION_QUICKSTART.md +0 -0
  22. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/ROADMAP.md +0 -0
  23. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/SQL_VS_OBJECTSCRIPT.md +0 -0
  24. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/TROUBLESHOOTING.md +0 -0
  25. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/WHATS_NEW_v1.4.0.md +0 -0
  26. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/archive/AGENTIC_SANDBOX_ENHANCEMENT_REPORT.md +0 -0
  27. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/archive/IMPACT_ANALYSIS.md +0 -0
  28. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/archive/IRIS_DEVTESTER_POSITIONING_REPORT.md +0 -0
  29. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/archive/LANGCHAIN_INTEGRATION_STRATEGY.md +0 -0
  30. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/archive/LANGCHAIN_INTEGRATION_TEST_RESULTS.md +0 -0
  31. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/archive/PHASE_2_PLAN.md +0 -0
  32. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/archive/RAG_TEMPLATES_ANALYSIS.md +0 -0
  33. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/archive/README.md +0 -0
  34. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/archive/STRATEGIC_ROADMAP_SUMMARY.md +0 -0
  35. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/archive/feature-009-refactor-plan.md +0 -0
  36. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/development/BUG_REPORT.md +0 -0
  37. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/development/EXTRACTION_SUMMARY.md +0 -0
  38. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/development/FEATURE_006_SUMMARY.md +0 -0
  39. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/development/PHASE2_RESULTS.md +0 -0
  40. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/development/PRE_PUBLISH_REVIEW.md +0 -0
  41. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/development/PROGRESS.md +0 -0
  42. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/development/PYPI_READINESS.md +0 -0
  43. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/development/SESSION-INTEGRATION-TESTS.md +0 -0
  44. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/development/SESSION-SUMMARY.md +0 -0
  45. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/development/STATUS-002-PIVOTED.md +0 -0
  46. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/development/STATUS-003-COMPLETE.md +0 -0
  47. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/development/STATUS.md +0 -0
  48. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/development/V1_COMPLETION_PLAN.md +0 -0
  49. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/development/V1_RELEASE_SUMMARY.md +0 -0
  50. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/features/WSGI-ASGI-SERVER-SETUP.md +0 -0
  51. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/features/agent-skills.md +0 -0
  52. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/features/dat-fixtures.md +0 -0
  53. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/features/docker-compose.md +0 -0
  54. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/features/performance-monitoring.md +0 -0
  55. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/features/testcontainers.md +0 -0
  56. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/api-contract-synchronization.md +0 -0
  57. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/callin-service-requirement.md +0 -0
  58. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/cpf-merge-and-container-restarts.md +0 -0
  59. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/dat-fixtures-docker-exec-pattern.md +0 -0
  60. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/dat-restore-database-isolation-problem.md +0 -0
  61. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/dbapi-bulk-insert-performance-issue.md +0 -0
  62. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/dbapi-objectscript-limitation.md +0 -0
  63. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/dbapi-password-reset-limitation.md +0 -0
  64. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/dbapi-private-module-myth.md +0 -0
  65. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/docker-hub-image-naming.md +0 -0
  66. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/embedded-python-considerations.md +0 -0
  67. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/feature-002-pivot-summary.md +0 -0
  68. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/integration-test-dbapi-limitation.md +0 -0
  69. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/iris-backup-patterns.md +0 -0
  70. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/iris-container-performance.md +0 -0
  71. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/iris-container-readiness.md +0 -0
  72. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/iris-docker-sdk-environment-variables.md +0 -0
  73. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/iris-performance-monitoring-landscape.md +0 -0
  74. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/iris-security-users-api.md +0 -0
  75. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/password-reset-changeflag-fix.md +0 -0
  76. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/rag-templates-production-patterns.md +0 -0
  77. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/sql-task-manager-operations.md +0 -0
  78. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/test-isolation-fix-summary.md +0 -0
  79. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/test-isolation-investigation.md +0 -0
  80. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/testcontainers-ryuk-lifecycle.md +0 -0
  81. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/examples/01_quickstart.py +0 -0
  82. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/examples/02_connection_management.py +0 -0
  83. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/examples/04_pytest_fixtures.py +0 -0
  84. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/examples/05_ci_cd.py +0 -0
  85. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/examples/08_auto_discovery.py +0 -0
  86. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/examples/09_enterprise.py +0 -0
  87. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/examples/10_docker_compose_integration.py +0 -0
  88. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/examples/langchain_integration_example.py +0 -0
  89. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/cli/__init__.py +0 -0
  90. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/cli/__main__.py +0 -0
  91. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/cli/connection_commands.py +0 -0
  92. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/cli/container_commands.py +0 -0
  93. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/cli/fixture_commands.py +0 -0
  94. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/config/__init__.py +0 -0
  95. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/config/auto_discovery.py +0 -0
  96. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/config/defaults.py +0 -0
  97. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/config/discovery.py +0 -0
  98. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/config/models.py +0 -0
  99. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/config/presets.py +0 -0
  100. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/connections/__init__.py +1 -1
  101. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/connections/auto_discovery.py +0 -0
  102. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/connections/connection.py +0 -0
  103. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/connections/dbapi.py +0 -0
  104. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/connections/jdbc.py +0 -0
  105. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/connections/manager.py +0 -0
  106. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/connections/models.py +0 -0
  107. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/connections/retry.py +0 -0
  108. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/containers/__init__.py +0 -0
  109. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/containers/cpf_manager.py +0 -0
  110. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/containers/models.py +0 -0
  111. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/containers/monitor_utils.py +0 -0
  112. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/containers/monitoring.py +0 -0
  113. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/containers/performance.py +0 -0
  114. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/containers/validation.py +0 -0
  115. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/containers/wait_strategies.py +0 -0
  116. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/fixtures/__init__.py +0 -0
  117. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/fixtures/creator.py +0 -0
  118. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/fixtures/loader.py +0 -0
  119. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/fixtures/manifest.py +0 -0
  120. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/fixtures/obj_export.py +0 -0
  121. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/fixtures/validator.py +0 -0
  122. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/integrations/__init__.py +0 -0
  123. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/integrations/langchain.py +0 -0
  124. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/ports/__init__.py +0 -0
  125. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/ports/assignment.py +0 -0
  126. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/ports/exceptions.py +0 -0
  127. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/testing/__init__.py +0 -0
  128. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/testing/fixtures.py +0 -0
  129. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/testing/helpers.py +0 -0
  130. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/testing/models.py +0 -0
  131. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/testing/schema_reset.py +0 -0
  132. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/utils/__init__.py +0 -0
  133. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/utils/container_port.py +0 -0
  134. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/utils/container_status.py +0 -0
  135. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/utils/dbapi_compat.py +0 -0
  136. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/utils/enable_callin.py +0 -0
  137. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/utils/iris_container_adapter.py +0 -0
  138. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/utils/progress.py +0 -0
  139. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/utils/test_connection.py +0 -0
  140. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester.egg-info/SOURCES.txt +0 -0
  141. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester.egg-info/dependency_links.txt +0 -0
  142. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester.egg-info/entry_points.txt +0 -0
  143. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester.egg-info/requires.txt +0 -0
  144. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester.egg-info/top_level.txt +0 -0
  145. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/setup.cfg +0 -0
  146. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/__init__.py +0 -0
  147. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/conftest.py +0 -0
  148. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/__init__.py +0 -0
  149. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/cli/test_container_logs_contract.py +0 -0
  150. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/cli/test_container_remove_contract.py +0 -0
  151. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/cli/test_container_restart_contract.py +0 -0
  152. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/cli/test_container_start_contract.py +0 -0
  153. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/cli/test_container_status_contract.py +0 -0
  154. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/cli/test_container_stop_contract.py +0 -0
  155. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/cli/test_container_up_contract.py +0 -0
  156. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_agent_skills.py +0 -0
  157. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_cli_container_commands.py +0 -0
  158. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_cli_fixture_commands.py +0 -0
  159. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_connection_api.py +0 -0
  160. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_container_api.py +0 -0
  161. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_container_integration_contract.py +0 -0
  162. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_container_status_api.py +0 -0
  163. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_container_validation_api.py +0 -0
  164. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_enable_callin_api.py +0 -0
  165. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_fixture_creator_api.py +0 -0
  166. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_fixture_loader_api.py +0 -0
  167. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_fixture_validator_api.py +0 -0
  168. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_iriscontainer_attach.py +0 -0
  169. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_legacy_package_contract.py +0 -0
  170. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_modern_package_contract.py +0 -0
  171. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_monitoring_config_api.py +0 -0
  172. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_package_detection.py +0 -0
  173. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_port_registry_contract.py +0 -0
  174. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_preconfig_contract.py +0 -0
  175. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_reset_verification_contract.py +0 -0
  176. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_resource_monitoring_api.py +0 -0
  177. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_retry_logic_contract.py +0 -0
  178. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_task_manager_api.py +0 -0
  179. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_test_connection_api.py +0 -0
  180. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_testing_fixtures_api.py +0 -0
  181. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/e2e/__init__.py +0 -0
  182. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/e2e/test_skill_workflow.py +0 -0
  183. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/__init__.py +0 -0
  184. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/conftest.py +0 -0
  185. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/ports/__init__.py +0 -0
  186. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/ports/test_manual_port_override.py +0 -0
  187. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/ports/test_multi_project_isolation.py +0 -0
  188. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/ports/test_port_exhaustion.py +0 -0
  189. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/ports/test_port_persistence.py +0 -0
  190. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/ports/test_stale_cleanup.py +0 -0
  191. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_bug_fixes.py +0 -0
  192. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_bug_fixes_011.py +0 -0
  193. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_cli_container_integration.py +0 -0
  194. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_connection_integration.py +0 -0
  195. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_container_health_monitor.py +0 -0
  196. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_container_status_integration.py +0 -0
  197. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_container_validation.py +0 -0
  198. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_cpf_merge.py +0 -0
  199. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_cpf_presets.py +0 -0
  200. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_cpf_security.py +0 -0
  201. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_custom_user_remediation.py +0 -0
  202. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_dat_fixtures_integration.py +0 -0
  203. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_enable_callin_integration.py +0 -0
  204. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_fixture_export_patterns.py +0 -0
  205. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_fixture_performance.py +0 -0
  206. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_fixture_refresh.py +0 -0
  207. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_iriscontainer_attach_integration.py +0 -0
  208. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_monitor_utils_integration.py +0 -0
  209. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_monitoring_integration.py +0 -0
  210. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_password_preconfig_integration.py +0 -0
  211. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_password_reset_both_editions.py +0 -0
  212. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_password_reset_integration.py +0 -0
  213. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_password_reset_macos.py +0 -0
  214. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_password_reset_timing.py +0 -0
  215. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_password_reset_validation.py +0 -0
  216. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_proactive_password_reset.py +0 -0
  217. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_real_world_problems.py +0 -0
  218. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_reliable_password_reset.py +0 -0
  219. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_test_connection_integration.py +0 -0
  220. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/__init__.py +0 -0
  221. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/config/test_config_hierarchy.py +0 -0
  222. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/config/test_container_config.py +0 -0
  223. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/config/test_yaml_loader.py +0 -0
  224. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/test_auto_discovery.py +0 -0
  225. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/test_config_discovery.py +0 -0
  226. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/test_connection_fallback.py +0 -0
  227. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/test_connection_info.py +0 -0
  228. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/test_cpf_manager.py +0 -0
  229. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/test_iris_config.py +0 -0
  230. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/test_iris_container.py +0 -0
  231. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/test_manifest.py +0 -0
  232. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/test_monitoring_policy.py +0 -0
  233. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/test_password_preconfig.py +0 -0
  234. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/test_password_preconfig_unit.py +0 -0
  235. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/test_performance_metrics.py +0 -0
  236. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/test_resource_thresholds.py +0 -0
  237. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/test_retry.py +0 -0
  238. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/test_schema_models.py +0 -0
  239. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/test_validation_results.py +0 -0
  240. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/test_wait_strategies.py +0 -0
  241. {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/utils/test_iris_container_adapter.py +0 -0
@@ -287,3 +287,132 @@ The repository exposes core functionality as "Skills" to help AI agents work aut
287
287
 
288
288
  ## Recent Changes
289
289
  - 023-docs-cleanup: Added N/A (documentation only)
290
+ ---
291
+
292
+ ## COMPOUND KNOWLEDGE BASE & DEVELOPMENT ENVIRONMENT
293
+
294
+ **Last Updated**: $(date +%Y-%m-%d)
295
+
296
+ > Central registry of development knowledge, tools, capabilities, and automation
297
+
298
+
299
+ ### 📚 Knowledge Base
300
+
301
+ **Location**: `~/.config/opencode/compound-knowledge/`
302
+
303
+
304
+ **Structure**:
305
+ - `global/` - Project-agnostic knowledge (frameworks, tools, patterns)
306
+ - `projects/[name]/` - Project-specific knowledge (domain, architecture)
307
+
308
+ **Stats**: 7 solutions (7 global, 0 project)
309
+
310
+ **Quick Search**:
311
+ ```bash
312
+ # Search everything
313
+ grep -ri "keywords" ~/.config/opencode/compound-knowledge/
314
+
315
+ # Global only
316
+ grep -ri "keywords" ~/.config/opencode/compound-knowledge/global/
317
+
318
+ # This project
319
+ grep -ri "keywords" ~/.config/opencode/compound-knowledge/projects/$(basename $(pwd))/
320
+ ```
321
+
322
+ **Time Savings**: First solve: 30min → Next solve: 3min (90% faster)
323
+
324
+
325
+ ### 🔌 MCP Servers
326
+
327
+ - `atlassian` - local
328
+ - `gemini-impl` - local
329
+ - `hallucination-detector` - local
330
+ - `jama` - local
331
+ - `perplexity` - local
332
+ - `playwright` - local
333
+ - `qwen-impl` - local
334
+ - `support-tools` - local
335
+
336
+ ### 🤖 Automation & Hooks
337
+
338
+ **Orchestrator Behavior** (configured via `~/.config/opencode/oh-my-opencode-slim.json`):
339
+ - **Before tasks**: Search compound KB for similar solutions
340
+ - **After completion**: Remind to document solution
341
+
342
+ **Periodic Maintenance** (recommended):
343
+ ```bash
344
+ # Weekly: Regenerate KB index
345
+ ~/.config/opencode/compound-knowledge/generate-index.sh
346
+
347
+ # Monthly: Review and consolidate similar solutions
348
+ # Quarterly: Extract patterns from repeated solutions
349
+ ```
350
+
351
+ **Auto-Documentation Triggers**:
352
+ - Tests pass after fixing failure → Document solution
353
+ - Error resolved → Document fix
354
+ - Performance improved → Document optimization
355
+ - Integration working → Document configuration
356
+
357
+
358
+ ### 🛠️ Tools & Utilities
359
+
360
+ **Compound Engineering**:
361
+ - `~/.config/opencode/compound-knowledge/new-solution.sh` - Create solution doc
362
+ - `~/.config/opencode/compound-knowledge/generate-index.sh` - Regenerate index
363
+ - `~/.config/opencode/compound-knowledge/sync-to-agents.sh` - Update AGENTS.md files
364
+
365
+ **OpenCode Agents** (oh-my-opencode-slim):
366
+ - `orchestrator` - Master coordinator (with compound engineering)
367
+ - `explorer` - Codebase reconnaissance
368
+ - `oracle` - Strategic advisor
369
+ - `librarian` - External knowledge (websearch, context7, grep_app MCPs)
370
+ - `designer` - UI/UX implementation
371
+ - `fixer` - Fast implementation
372
+ - `code-simplifier` - Post-work code refinement
373
+
374
+
375
+ ### 🎯 Skills
376
+
377
+ **speckit** (feature specification):
378
+ - `speckit.plan` - Implementation planning
379
+ - `speckit.specify` - Feature specification
380
+ - `speckit.tasks` - Task generation
381
+ - `speckit.implement` - Implementation guidance
382
+
383
+
384
+ ### 📋 Quick Reference
385
+
386
+ **Full Index**: `~/.config/opencode/compound-knowledge/INDEX.md`
387
+
388
+ **Documentation Templates**:
389
+ ```markdown
390
+ ---
391
+ title: "Problem description"
392
+ category: [build-errors|test-failures|runtime-errors|performance-issues|
393
+ database-issues|security-issues|ui-bugs|integration-issues|logic-errors]
394
+ date: YYYY-MM-DD
395
+ severity: high|medium|low
396
+ tags: [tag1, tag2]
397
+ time_to_solve: XXmin
398
+ ---
399
+
400
+ ## Problem Symptom
401
+ [What was observed]
402
+
403
+ ## Solution
404
+ [How you fixed it]
405
+
406
+ ## Prevention
407
+ [How to avoid future]
408
+ ```
409
+
410
+ **Decision Tree** (Global vs Project-Specific):
411
+ - Framework/tool issue → `global/`
412
+ - General pattern → `global/`
413
+ - Project domain logic → `projects/[name]/`
414
+ - Project architecture → `projects/[name]/`
415
+ - When in doubt → `global/`
416
+
417
+ ---
418
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iris-devtester
3
- Version: 1.9.1
3
+ Version: 1.9.3
4
4
  Summary: Battle-tested InterSystems IRIS infrastructure utilities for Python development
5
5
  Author-email: InterSystems Community <community@intersystems.com>
6
6
  Maintainer-email: Thomas Dyar <thomas.dyar@intersystems.com>
@@ -107,6 +107,50 @@ def test_connection():
107
107
  assert cursor.fetchone()[0] == 1
108
108
  ```
109
109
 
110
+ ## Container API
111
+
112
+ ### Basic Usage
113
+ ```python
114
+ from iris_devtester.containers import IRISContainer
115
+
116
+ # Community Edition (auto-detects ARM64 vs x86)
117
+ with IRISContainer.community() as iris:
118
+ conn = iris.get_connection()
119
+
120
+ # Enterprise Edition (requires license)
121
+ with IRISContainer.enterprise(license_key="/path/to/iris.key") as iris:
122
+ conn = iris.get_connection()
123
+ ```
124
+
125
+ ### Builder Methods
126
+ ```python
127
+ # Set a custom container name (for debugging, logs, multiple containers)
128
+ iris = IRISContainer.community().with_name("my-test-db")
129
+
130
+ # Set credentials
131
+ iris = IRISContainer.community().with_credentials("_SYSTEM", "MyPassword")
132
+
133
+ # Pre-configure password (set via IRIS_PASSWORD env var at startup)
134
+ iris = IRISContainer.community().with_preconfigured_password("MyPassword")
135
+
136
+ # Chain multiple options
137
+ with IRISContainer.community() \
138
+ .with_name("integration-test-db") \
139
+ .with_credentials("_SYSTEM", "TestPass123") as iris:
140
+ conn = iris.get_connection()
141
+ ```
142
+
143
+ ### Constructor Parameters
144
+ ```python
145
+ IRISContainer(
146
+ image="intersystemsdc/iris-community:latest", # Docker image
147
+ username="SuperUser", # Default username
148
+ password="SYS", # Default password
149
+ namespace="USER", # Default namespace
150
+ name="my-container", # Container name (alternative to with_name)
151
+ )
152
+ ```
153
+
110
154
  ## Key Features
111
155
 
112
156
  - **🔐 Automatic Password Management**: Remediates security flags using official system APIs.
@@ -43,6 +43,50 @@ def test_connection():
43
43
  assert cursor.fetchone()[0] == 1
44
44
  ```
45
45
 
46
+ ## Container API
47
+
48
+ ### Basic Usage
49
+ ```python
50
+ from iris_devtester.containers import IRISContainer
51
+
52
+ # Community Edition (auto-detects ARM64 vs x86)
53
+ with IRISContainer.community() as iris:
54
+ conn = iris.get_connection()
55
+
56
+ # Enterprise Edition (requires license)
57
+ with IRISContainer.enterprise(license_key="/path/to/iris.key") as iris:
58
+ conn = iris.get_connection()
59
+ ```
60
+
61
+ ### Builder Methods
62
+ ```python
63
+ # Set a custom container name (for debugging, logs, multiple containers)
64
+ iris = IRISContainer.community().with_name("my-test-db")
65
+
66
+ # Set credentials
67
+ iris = IRISContainer.community().with_credentials("_SYSTEM", "MyPassword")
68
+
69
+ # Pre-configure password (set via IRIS_PASSWORD env var at startup)
70
+ iris = IRISContainer.community().with_preconfigured_password("MyPassword")
71
+
72
+ # Chain multiple options
73
+ with IRISContainer.community() \
74
+ .with_name("integration-test-db") \
75
+ .with_credentials("_SYSTEM", "TestPass123") as iris:
76
+ conn = iris.get_connection()
77
+ ```
78
+
79
+ ### Constructor Parameters
80
+ ```python
81
+ IRISContainer(
82
+ image="intersystemsdc/iris-community:latest", # Docker image
83
+ username="SuperUser", # Default username
84
+ password="SYS", # Default password
85
+ namespace="USER", # Default namespace
86
+ name="my-container", # Container name (alternative to with_name)
87
+ )
88
+ ```
89
+
46
90
  ## Key Features
47
91
 
48
92
  - **🔐 Automatic Password Management**: Remediates security flags using official system APIs.
@@ -3,7 +3,7 @@ name: iris-devtester
3
3
  description: Battle-tested InterSystems IRIS infrastructure utilities for Python database testing.
4
4
  triggers: [iris, database, testing, container, fixture, gof, connection, remediation]
5
5
  metadata:
6
- version: 1.9.1
6
+ version: 1.9.3
7
7
  author: InterSystems Community
8
8
  principles: [library-first, dbapi-first, isolation-by-default, fail-fast]
9
9
  ---
@@ -26,7 +26,7 @@ LangChain Integration:
26
26
  ... # Build your RAG app...
27
27
  """
28
28
 
29
- __version__ = "1.9.1"
29
+ __version__ = "1.9.3"
30
30
  __author__ = "InterSystems Community"
31
31
  __license__ = "MIT"
32
32
 
@@ -31,6 +31,12 @@ def container_group(ctx):
31
31
  @click.option(
32
32
  "--config", type=click.Path(exists=True), help="Path to iris-config.yml configuration file"
33
33
  )
34
+ @click.option(
35
+ "--name",
36
+ type=str,
37
+ default=None,
38
+ help="Container name (default: iris_db)",
39
+ )
34
40
  @click.option(
35
41
  "--detach/--no-detach",
36
42
  default=True,
@@ -41,7 +47,7 @@ def container_group(ctx):
41
47
  )
42
48
  @click.option("--cpf", help="Path to CPF merge file or raw CPF content")
43
49
  @click.pass_context
44
- def up(ctx, config, detach, timeout, cpf):
50
+ def up(ctx, config, name, detach, timeout, cpf):
45
51
  """
46
52
  Create and start IRIS container from configuration.
47
53
 
@@ -58,6 +64,9 @@ def up(ctx, config, detach, timeout, cpf):
58
64
  # Zero-config (uses Community edition defaults)
59
65
  iris-devtester container up
60
66
 
67
+ # With custom container name
68
+ iris-devtester container up --name my-test-db
69
+
61
70
  # With custom configuration including volumes
62
71
  iris-devtester container up --config iris-config.yml
63
72
 
@@ -85,6 +94,11 @@ def up(ctx, config, detach, timeout, cpf):
85
94
  container_config = ContainerConfig.default()
86
95
  click.echo("⚡ Creating container from zero-config defaults")
87
96
 
97
+ # Override container name if provided via --name
98
+ if name:
99
+ container_config.container_name = name
100
+ click.echo(f" → Container name: {name}")
101
+
88
102
  if cpf:
89
103
  container_config.cpf_merge = cpf
90
104
  click.echo(f" → CPF Merge: {cpf[:50]}...")
@@ -95,6 +109,36 @@ def up(ctx, config, detach, timeout, cpf):
95
109
  if existing_container:
96
110
  # Container exists - check if running
97
111
  existing_container.reload()
112
+
113
+ # Warn if using default name and container already exists
114
+ # (user might be connecting to wrong container from different project)
115
+ if container_config.container_name == "iris_db" and not name:
116
+ existing_image = (
117
+ existing_container.image.tags[0] if existing_container.image.tags else "unknown"
118
+ )
119
+ click.echo("")
120
+ click.echo(
121
+ click.style(
122
+ "⚠️ WARNING: Using default container name 'iris_db'", fg="yellow", bold=True
123
+ )
124
+ )
125
+ click.echo(
126
+ click.style(
127
+ f" A container with this name already exists (image: {existing_image})",
128
+ fg="yellow",
129
+ )
130
+ )
131
+ click.echo(
132
+ click.style(
133
+ " If this is from a different project, use --name to avoid conflicts:",
134
+ fg="yellow",
135
+ )
136
+ )
137
+ click.echo(
138
+ click.style(" iris-devtester container up --name my-project-db", fg="cyan")
139
+ )
140
+ click.echo("")
141
+
98
142
  if existing_container.status == "running":
99
143
  click.echo(f"✓ Container '{container_config.container_name}' is already running")
100
144
 
@@ -808,9 +852,6 @@ def enable_callin(ctx, container_name, timeout):
808
852
  except (ImportError, ModuleNotFoundError) as e:
809
853
  progress.print_error(f"enable_callin utility not available: {e}")
810
854
  ctx.exit(1)
811
- except (click.exceptions.Exit, SystemExit, KeyboardInterrupt):
812
- # Let Click handle these - don't catch them
813
- raise
814
855
  except Exception as e:
815
856
  progress.print_error(f"Failed to enable CallIn: {e}")
816
857
  ctx.exit(1)
@@ -3,9 +3,9 @@
3
3
  import os
4
4
  import re
5
5
  from pathlib import Path
6
- from typing import List, Literal, Optional
6
+ from typing import List, Literal, Optional, Union
7
7
 
8
- from pydantic import BaseModel, Field, field_validator, model_validator
8
+ from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
9
9
 
10
10
  from iris_devtester.config.yaml_loader import load_yaml
11
11
 
@@ -122,7 +122,7 @@ class ContainerConfig(BaseModel):
122
122
  return self
123
123
 
124
124
  @classmethod
125
- def from_yaml(cls, file_path: str | Path) -> "ContainerConfig":
125
+ def from_yaml(cls, file_path: Union[str, Path]) -> "ContainerConfig":
126
126
  """
127
127
  Load configuration from YAML file.
128
128
 
@@ -290,10 +290,8 @@ class ContainerConfig(BaseModel):
290
290
 
291
291
  return errors
292
292
 
293
- class Config:
294
- """Pydantic model configuration."""
295
-
296
- json_schema_extra = {
293
+ model_config = ConfigDict(
294
+ json_schema_extra={
297
295
  "example": {
298
296
  "edition": "community",
299
297
  "container_name": "iris_db",
@@ -306,3 +304,4 @@ class ContainerConfig(BaseModel):
306
304
  "image_tag": "latest",
307
305
  }
308
306
  }
307
+ )
@@ -3,9 +3,9 @@
3
3
  from datetime import datetime
4
4
  from enum import Enum
5
5
  from pathlib import Path
6
- from typing import Dict, Literal, Optional
6
+ from typing import Dict, Optional
7
7
 
8
- from pydantic import BaseModel, Field, field_validator
8
+ from pydantic import BaseModel, ConfigDict, Field, field_validator
9
9
 
10
10
 
11
11
  class ContainerStatus(str, Enum):
@@ -304,10 +304,8 @@ class ContainerState(BaseModel):
304
304
  "config_source": str(self.config_source) if self.config_source else None,
305
305
  }
306
306
 
307
- class Config:
308
- """Pydantic model configuration."""
309
-
310
- json_schema_extra = {
307
+ model_config = ConfigDict(
308
+ json_schema_extra={
311
309
  "example": {
312
310
  "container_id": "a1b2c3d4e5f6" + "0" * 52, # 64 chars
313
311
  "container_name": "iris_db",
@@ -316,8 +314,9 @@ class ContainerState(BaseModel):
316
314
  "created_at": "2025-01-10T14:30:00Z",
317
315
  "started_at": "2025-01-10T14:30:15Z",
318
316
  "finished_at": None,
319
- "ports": {1972: 1972, 52773: 52773},
317
+ "ports": {"1972": 1972, "52773": 52773},
320
318
  "image": "intersystems/iris-community:latest",
321
319
  "config_source": None,
322
320
  }
323
321
  }
322
+ )
@@ -28,7 +28,7 @@ def load_yaml(file_path: Path) -> Dict[str, Any]:
28
28
  config = yaml.safe_load(f)
29
29
  if config is None:
30
30
  return {}
31
- return config
31
+ return dict(config)
32
32
  except yaml.YAMLError as e:
33
33
  raise yaml.YAMLError(f"Invalid YAML syntax in {file_path}: {e}")
34
34
 
@@ -1,10 +1,9 @@
1
1
  import logging
2
- import os
3
2
  import subprocess
4
3
  import time
5
- from typing import Any, Dict, List, Literal, Optional, Tuple, Type, Union
4
+ from typing import Any, Optional
6
5
 
7
- from iris_devtester.config import IRISConfig, discover_config
6
+ from iris_devtester.config import IRISConfig
8
7
  from iris_devtester.connections import get_connection
9
8
 
10
9
  logger = logging.getLogger(__name__)
@@ -185,7 +184,7 @@ class IRISContainer(IRISBase):
185
184
  if is_enabled:
186
185
  self._callin_enabled = True
187
186
  return is_enabled
188
- except:
187
+ except Exception:
189
188
  return False
190
189
 
191
190
  def get_test_namespace(self, prefix: str = "TEST") -> str:
@@ -238,9 +237,7 @@ class IRISContainer(IRISBase):
238
237
  self.host = self.get_container_host_ip()
239
238
  self._mapped_port = int(self.get_exposed_port(1972)) # Use internal port to get mapping
240
239
  config.host = self.host
241
- config.port = (
242
- self._mapped_port
243
- ) # Config uses the host-mapped port for connections
240
+ config.port = self._mapped_port # Config uses the host-mapped port for connections
244
241
  except Exception:
245
242
  pass
246
243
  return config
@@ -7,7 +7,7 @@ Provides atomic file-based persistence with file locking for concurrent safety.
7
7
  import json
8
8
  from datetime import datetime
9
9
  from pathlib import Path
10
- from typing import List, Optional
10
+ from typing import List, Literal, Optional
11
11
 
12
12
  from filelock import FileLock, Timeout
13
13
 
@@ -89,7 +89,7 @@ class PortRegistry:
89
89
  # Manual port assignment
90
90
  self._validate_port_available(assignments, preferred_port, project_path)
91
91
  port = preferred_port
92
- assignment_type = "manual"
92
+ assignment_type: Literal["auto", "manual"] = "manual"
93
93
  else:
94
94
  # Auto-assignment
95
95
  port = self._find_available_port(assignments)
@@ -379,7 +379,7 @@ def enable_callin_service(container: Container) -> None:
379
379
  """
380
380
  # Execute ObjectScript to enable CallIn
381
381
  objectscript_cmd = (
382
- "iris session iris -U%SYS "
382
+ "iris session IRIS -U%SYS "
383
383
  '"Do ##class(Security.Services).Get("%Service_CallIn", .service) '
384
384
  "Set service.Enabled = 1 "
385
385
  'Do ##class(Security.Services).Modify("%Service_CallIn", .service)"'
@@ -572,7 +572,7 @@ Halt
572
572
  container_name,
573
573
  "sh",
574
574
  "-c",
575
- f'iris session iris -U %SYS << "EOF"\n{objectscript_commands}\nEOF',
575
+ f'iris session IRIS -U %SYS << "EOF"\n{objectscript_commands}\nEOF',
576
576
  ]
577
577
 
578
578
  logger.info(f"Unexpiring passwords in container: {container_name}")
@@ -626,7 +626,7 @@ Halt
626
626
  "\n"
627
627
  "Manual fix:\n"
628
628
  f" docker exec {container_name} bash -c 'echo \"do ##class(Security.Users)"
629
- f'.UnExpireUserPasswords(\\"*\\")" | iris session iris -U %SYS\'\n',
629
+ f'.UnExpireUserPasswords(\\"*\\")" | iris session IRIS -U %SYS\'\n',
630
630
  )
631
631
 
632
632
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iris-devtester
3
- Version: 1.9.1
3
+ Version: 1.9.3
4
4
  Summary: Battle-tested InterSystems IRIS infrastructure utilities for Python development
5
5
  Author-email: InterSystems Community <community@intersystems.com>
6
6
  Maintainer-email: Thomas Dyar <thomas.dyar@intersystems.com>
@@ -107,6 +107,50 @@ def test_connection():
107
107
  assert cursor.fetchone()[0] == 1
108
108
  ```
109
109
 
110
+ ## Container API
111
+
112
+ ### Basic Usage
113
+ ```python
114
+ from iris_devtester.containers import IRISContainer
115
+
116
+ # Community Edition (auto-detects ARM64 vs x86)
117
+ with IRISContainer.community() as iris:
118
+ conn = iris.get_connection()
119
+
120
+ # Enterprise Edition (requires license)
121
+ with IRISContainer.enterprise(license_key="/path/to/iris.key") as iris:
122
+ conn = iris.get_connection()
123
+ ```
124
+
125
+ ### Builder Methods
126
+ ```python
127
+ # Set a custom container name (for debugging, logs, multiple containers)
128
+ iris = IRISContainer.community().with_name("my-test-db")
129
+
130
+ # Set credentials
131
+ iris = IRISContainer.community().with_credentials("_SYSTEM", "MyPassword")
132
+
133
+ # Pre-configure password (set via IRIS_PASSWORD env var at startup)
134
+ iris = IRISContainer.community().with_preconfigured_password("MyPassword")
135
+
136
+ # Chain multiple options
137
+ with IRISContainer.community() \
138
+ .with_name("integration-test-db") \
139
+ .with_credentials("_SYSTEM", "TestPass123") as iris:
140
+ conn = iris.get_connection()
141
+ ```
142
+
143
+ ### Constructor Parameters
144
+ ```python
145
+ IRISContainer(
146
+ image="intersystemsdc/iris-community:latest", # Docker image
147
+ username="SuperUser", # Default username
148
+ password="SYS", # Default password
149
+ namespace="USER", # Default namespace
150
+ name="my-container", # Container name (alternative to with_name)
151
+ )
152
+ ```
153
+
110
154
  ## Key Features
111
155
 
112
156
  - **🔐 Automatic Password Management**: Remediates security flags using official system APIs.
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "iris-devtester"
7
- version = "1.9.1"
7
+ version = "1.9.3"
8
8
  description = "Battle-tested InterSystems IRIS infrastructure utilities for Python development"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
File without changes
File without changes