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.
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/AGENTS.md +129 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/PKG-INFO +45 -1
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/README.md +44 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/SKILL.md +1 -1
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/__init__.py +1 -1
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/cli/container.py +45 -4
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/config/container_config.py +6 -7
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/config/container_state.py +6 -7
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/config/yaml_loader.py +1 -1
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/containers/iris_container.py +4 -7
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/ports/registry.py +2 -2
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/utils/health_checks.py +1 -1
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/utils/password.py +2 -2
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester.egg-info/PKG-INFO +45 -1
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/pyproject.toml +1 -1
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/CLAUDE.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/CONSTITUTION.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/LICENSE +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/MANIFEST.in +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/GETTING_STARTED.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/LANGCHAIN_INTEGRATION_QUICKSTART.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/ROADMAP.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/SQL_VS_OBJECTSCRIPT.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/TROUBLESHOOTING.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/WHATS_NEW_v1.4.0.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/archive/AGENTIC_SANDBOX_ENHANCEMENT_REPORT.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/archive/IMPACT_ANALYSIS.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/archive/IRIS_DEVTESTER_POSITIONING_REPORT.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/archive/LANGCHAIN_INTEGRATION_STRATEGY.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/archive/LANGCHAIN_INTEGRATION_TEST_RESULTS.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/archive/PHASE_2_PLAN.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/archive/RAG_TEMPLATES_ANALYSIS.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/archive/README.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/archive/STRATEGIC_ROADMAP_SUMMARY.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/archive/feature-009-refactor-plan.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/development/BUG_REPORT.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/development/EXTRACTION_SUMMARY.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/development/FEATURE_006_SUMMARY.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/development/PHASE2_RESULTS.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/development/PRE_PUBLISH_REVIEW.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/development/PROGRESS.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/development/PYPI_READINESS.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/development/SESSION-INTEGRATION-TESTS.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/development/SESSION-SUMMARY.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/development/STATUS-002-PIVOTED.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/development/STATUS-003-COMPLETE.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/development/STATUS.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/development/V1_COMPLETION_PLAN.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/development/V1_RELEASE_SUMMARY.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/features/WSGI-ASGI-SERVER-SETUP.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/features/agent-skills.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/features/dat-fixtures.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/features/docker-compose.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/features/performance-monitoring.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/features/testcontainers.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/api-contract-synchronization.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/callin-service-requirement.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/cpf-merge-and-container-restarts.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/dat-fixtures-docker-exec-pattern.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/dat-restore-database-isolation-problem.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/dbapi-bulk-insert-performance-issue.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/dbapi-objectscript-limitation.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/dbapi-password-reset-limitation.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/dbapi-private-module-myth.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/docker-hub-image-naming.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/embedded-python-considerations.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/feature-002-pivot-summary.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/integration-test-dbapi-limitation.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/iris-backup-patterns.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/iris-container-performance.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/iris-container-readiness.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/iris-docker-sdk-environment-variables.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/iris-performance-monitoring-landscape.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/iris-security-users-api.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/password-reset-changeflag-fix.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/rag-templates-production-patterns.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/sql-task-manager-operations.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/test-isolation-fix-summary.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/test-isolation-investigation.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/learnings/testcontainers-ryuk-lifecycle.md +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/examples/01_quickstart.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/examples/02_connection_management.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/examples/04_pytest_fixtures.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/examples/05_ci_cd.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/examples/08_auto_discovery.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/examples/09_enterprise.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/examples/10_docker_compose_integration.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/examples/langchain_integration_example.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/cli/__init__.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/cli/__main__.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/cli/connection_commands.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/cli/container_commands.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/cli/fixture_commands.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/config/__init__.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/config/auto_discovery.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/config/defaults.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/config/discovery.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/config/models.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/config/presets.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/connections/__init__.py +1 -1
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/connections/auto_discovery.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/connections/connection.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/connections/dbapi.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/connections/jdbc.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/connections/manager.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/connections/models.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/connections/retry.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/containers/__init__.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/containers/cpf_manager.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/containers/models.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/containers/monitor_utils.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/containers/monitoring.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/containers/performance.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/containers/validation.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/containers/wait_strategies.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/fixtures/__init__.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/fixtures/creator.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/fixtures/loader.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/fixtures/manifest.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/fixtures/obj_export.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/fixtures/validator.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/integrations/__init__.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/integrations/langchain.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/ports/__init__.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/ports/assignment.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/ports/exceptions.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/testing/__init__.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/testing/fixtures.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/testing/helpers.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/testing/models.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/testing/schema_reset.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/utils/__init__.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/utils/container_port.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/utils/container_status.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/utils/dbapi_compat.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/utils/enable_callin.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/utils/iris_container_adapter.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/utils/progress.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester/utils/test_connection.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester.egg-info/SOURCES.txt +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester.egg-info/dependency_links.txt +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester.egg-info/entry_points.txt +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester.egg-info/requires.txt +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/iris_devtester.egg-info/top_level.txt +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/setup.cfg +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/__init__.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/conftest.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/__init__.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/cli/test_container_logs_contract.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/cli/test_container_remove_contract.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/cli/test_container_restart_contract.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/cli/test_container_start_contract.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/cli/test_container_status_contract.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/cli/test_container_stop_contract.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/cli/test_container_up_contract.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_agent_skills.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_cli_container_commands.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_cli_fixture_commands.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_connection_api.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_container_api.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_container_integration_contract.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_container_status_api.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_container_validation_api.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_enable_callin_api.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_fixture_creator_api.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_fixture_loader_api.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_fixture_validator_api.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_iriscontainer_attach.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_legacy_package_contract.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_modern_package_contract.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_monitoring_config_api.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_package_detection.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_port_registry_contract.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_preconfig_contract.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_reset_verification_contract.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_resource_monitoring_api.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_retry_logic_contract.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_task_manager_api.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_test_connection_api.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/contract/test_testing_fixtures_api.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/e2e/__init__.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/e2e/test_skill_workflow.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/__init__.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/conftest.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/ports/__init__.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/ports/test_manual_port_override.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/ports/test_multi_project_isolation.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/ports/test_port_exhaustion.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/ports/test_port_persistence.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/ports/test_stale_cleanup.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_bug_fixes.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_bug_fixes_011.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_cli_container_integration.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_connection_integration.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_container_health_monitor.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_container_status_integration.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_container_validation.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_cpf_merge.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_cpf_presets.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_cpf_security.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_custom_user_remediation.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_dat_fixtures_integration.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_enable_callin_integration.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_fixture_export_patterns.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_fixture_performance.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_fixture_refresh.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_iriscontainer_attach_integration.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_monitor_utils_integration.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_monitoring_integration.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_password_preconfig_integration.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_password_reset_both_editions.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_password_reset_integration.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_password_reset_macos.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_password_reset_timing.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_password_reset_validation.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_proactive_password_reset.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_real_world_problems.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_reliable_password_reset.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/integration/test_test_connection_integration.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/__init__.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/config/test_config_hierarchy.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/config/test_container_config.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/config/test_yaml_loader.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/test_auto_discovery.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/test_config_discovery.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/test_connection_fallback.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/test_connection_info.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/test_cpf_manager.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/test_iris_config.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/test_iris_container.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/test_manifest.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/test_monitoring_policy.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/test_password_preconfig.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/test_password_preconfig_unit.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/test_performance_metrics.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/test_resource_thresholds.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/test_retry.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/test_schema_models.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/test_validation_results.py +0 -0
- {iris_devtester-1.9.1 → iris_devtester-1.9.3}/tests/unit/test_wait_strategies.py +0 -0
- {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.
|
|
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.
|
|
6
|
+
version: 1.9.3
|
|
7
7
|
author: InterSystems Community
|
|
8
8
|
principles: [library-first, dbapi-first, isolation-by-default, fail-fast]
|
|
9
9
|
---
|
|
@@ -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
|
|
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
|
-
|
|
294
|
-
|
|
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,
|
|
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
|
-
|
|
308
|
-
|
|
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
|
+
)
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import logging
|
|
2
|
-
import os
|
|
3
2
|
import subprocess
|
|
4
3
|
import time
|
|
5
|
-
from typing import Any,
|
|
4
|
+
from typing import Any, Optional
|
|
6
5
|
|
|
7
|
-
from iris_devtester.config import IRISConfig
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/archive/AGENTIC_SANDBOX_ENHANCEMENT_REPORT.md
RENAMED
|
File without changes
|
|
File without changes
|
{iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/archive/IRIS_DEVTESTER_POSITIONING_REPORT.md
RENAMED
|
File without changes
|
{iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/archive/LANGCHAIN_INTEGRATION_STRATEGY.md
RENAMED
|
File without changes
|
{iris_devtester-1.9.1 → iris_devtester-1.9.3}/docs/archive/LANGCHAIN_INTEGRATION_TEST_RESULTS.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|