ic-code 1.1.10__tar.gz → 1.2.2__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.
- {ic_code-1.1.10/src/ic_code.egg-info → ic_code-1.2.2}/PKG-INFO +9 -9
- {ic_code-1.1.10 → ic_code-1.2.2}/pyproject.toml +15 -15
- ic_code-1.2.2/scripts/ci-detect-platforms.py +151 -0
- ic_code-1.2.2/scripts/ci-generate-matrix.py +62 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/__init__.py +1 -1
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/ec2/list_tags.py +2 -2
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/lb/list_tags.py +2 -2
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/nat/list_tags.py +39 -7
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/rds/list_tags.py +41 -8
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/s3/list_tags.py +41 -6
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/vpc/list_tags.py +2 -2
- {ic_code-1.1.10 → ic_code-1.2.2/src/ic_code.egg-info}/PKG-INFO +9 -9
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic_code.egg-info/SOURCES.txt +2 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic_code.egg-info/requires.txt +8 -8
- {ic_code-1.1.10 → ic_code-1.2.2}/LICENSE +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/MANIFEST.in +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/README.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/SECURITY.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/docs/README.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/docs/_templates/configuration.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/docs/_templates/installation.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/docs/_templates/troubleshooting.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/docs/_templates/usage.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/docs/aws/README.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/docs/aws/aws_cli_prd.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/docs/aws/installation.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/docs/azure/README.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/docs/ci-workflow-guide.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/docs/config_migration.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/docs/deployment.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/docs/development/README.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/docs/development/cleanup_summary.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/docs/development/development_guide.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/docs/development/import_patterns.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/docs/development/migration_guide.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/docs/gcp/GCP_CONFIGURATION_GUIDE.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/docs/gcp/GCP_SECURITY_BEST_PRACTICES.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/docs/gcp/README.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/docs/general/configuration.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/docs/installation.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/docs/mcp_integration.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/docs/migration.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/docs/migration_guide.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/docs/ncp/README.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/docs/ncp/configuration.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/docs/ncp/installation.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/docs/ncp/troubleshooting.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/docs/ncp/usage.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/docs/ncpgov/README.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/docs/ncpgov/installation.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/docs/oci/README.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/docs/oci/installation.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/docs/release-guide.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/docs/security.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/docs/ssh/configuration.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/docs/troubleshooting.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/docs/user_guide.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/requirements.txt +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/scripts/analysis_summary.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/scripts/bump-version.sh +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/scripts/cf_edge_nsg_make/cf_edge_nsg_make.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/scripts/cli_usage_analysis.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/scripts/dependency_mapper.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/scripts/deploy.sh +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/scripts/final_validation_and_documentation.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/scripts/fix_consolidated_imports.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/scripts/migration_execution_and_validation.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/scripts/ncp_security_scanner.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/scripts/oracle-policy/user_policy.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/scripts/performance_optimization.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/scripts/setup_venv.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/scripts/test-ci-detection.sh +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/scripts/unset_env.sh +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/scripts/validate_config.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/scripts/validate_dependencies.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/scripts/validate_ncp_security.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/setup.cfg +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/setup.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/common/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/common/azure_utils.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/common/gather_env.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/common/gcp_config_validator.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/common/gcp_monitoring.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/common/gcp_utils.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/common/log.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/common/ncp_security_utils.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/common/ncp_utils.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/common/ncpgov_utils.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/common/progress_decorator.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/common/slack.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/common/utils.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/cli.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/cli_backup.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/commands/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/commands/config.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/commands/migration.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/commands/security.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/compat/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/compat/cli.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/compat/common.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/config/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/config/cleanup.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/config/docs_organizer.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/config/external.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/config/installer.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/config/manager.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/config/migration.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/config/migration_utils.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/config/path_manager.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/config/schema.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/config/secrets.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/config/security.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/core/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/core/dependency_validator.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/core/logging.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/core/mcp_manager.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/core/platform_discovery.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/core/session.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/core/silence_logging.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/migration/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/migration/manager.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/migration/post_validation.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/migration/rollback.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/migration/validation.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/cloudfront/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/cloudfront/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/codepipeline/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/codepipeline/build.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/codepipeline/deploy.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/ec2/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/ec2/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/ec2/tag_check.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/ecs/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/ecs/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/ecs/service.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/ecs/task.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/eks/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/eks/addons.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/eks/fargate.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/eks/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/eks/nodes.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/eks/pods.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/eks/update_config.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/fargate/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/fargate/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/lb/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/lb/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/lb/tag_check.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/msk/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/msk/broker.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/msk/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/nat/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/nat/tag_check.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/profile/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/profile/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/rds/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/rds/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/rds/tag_check.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/s3/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/s3/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/s3/tag_check.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/sg/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/sg/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/vpc/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/vpc/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/vpc/tag_check.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/vpn/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/vpn/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/azure/README.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/azure/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/azure/aci/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/azure/aci/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/azure/aks/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/azure/aks/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/azure/lb/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/azure/lb/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/azure/nsg/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/azure/nsg/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/azure/storage/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/azure/storage/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/azure/vm/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/azure/vm/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/azure/vm/mock_data.json +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/azure/vnet/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/azure/vnet/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/azure/vnet/mock_data.json +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/cloudflare/README.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/cloudflare/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/cloudflare/dns/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/cloudflare/dns/list_info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/README.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/billing/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/billing/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/billing/mock_data.json +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/compute/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/compute/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/compute/mock_data.json +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/firewall/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/firewall/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/functions/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/functions/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/gke/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/gke/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/gke/mock_data.json +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/lb/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/lb/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/run/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/run/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/sql/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/sql/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/storage/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/storage/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/vpc/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/vpc/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/vpc/mock_data.json +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncp/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncp/client.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncp/ec2/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncp/ec2/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncp/rds/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncp/rds/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncp/s3/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncp/s3/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncp/sg/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncp/sg/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncp/vpc/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncp/vpc/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncpgov/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncpgov/client.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncpgov/ec2/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncpgov/ec2/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncpgov/rds/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncpgov/rds/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncpgov/s3/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncpgov/s3/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncpgov/sg/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncpgov/sg/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncpgov/vpc/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncpgov/vpc/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/README.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/common/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/common/utils.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/compartment/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/compartment/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/cost/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/cost/credit.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/cost/usage.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/info/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/info/oci_info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/lb/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/lb/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/nsg/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/nsg/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/obj/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/obj/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/policy/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/policy/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/policy/search.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/vcn/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/vcn/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/vm/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/vm/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/volume/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/volume/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ssh/README.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ssh/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ssh/auto/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ssh/auto/scan.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ssh/auto_ssh.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ssh/server/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ssh/server/info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ssh/server_info.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/security/README.md +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/security/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/security/config.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/security/detector.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/security/guidance.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/security/hooks.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/security/patterns.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/security/scanner.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic_code.egg-info/dependency_links.txt +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic_code.egg-info/entry_points.txt +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/ic_code.egg-info/top_level.txt +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/mcp/__init__.py +0 -0
- {ic_code-1.1.10 → ic_code-1.2.2}/src/mcp/gcp_connector.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ic-code
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.2.2
|
|
4
4
|
Summary: Infrastructure CLI tool for managing AWS, Azure, GCP, OCI, NCP, CloudFlare, SSH, and more
|
|
5
5
|
Home-page: https://github.com/dgr009/ic
|
|
6
6
|
Author: SangYun Kim
|
|
@@ -32,7 +32,7 @@ Requires-Dist: boto3<2.0.0,>=1.26.0
|
|
|
32
32
|
Requires-Dist: botocore<2.0.0,>=1.29.0
|
|
33
33
|
Requires-Dist: oci<3.0.0,>=2.149.0
|
|
34
34
|
Requires-Dist: requests<3.0.0,>=2.28.0
|
|
35
|
-
Requires-Dist: kubernetes<
|
|
35
|
+
Requires-Dist: kubernetes<32.0.0,>=29.0.0
|
|
36
36
|
Requires-Dist: awscli<2.0.0,>=1.42.0
|
|
37
37
|
Requires-Dist: google-cloud-compute<2.0.0,>=1.36.0
|
|
38
38
|
Requires-Dist: google-cloud-container<3.0.0,>=2.44.0
|
|
@@ -45,15 +45,15 @@ Requires-Dist: google-auth<3.0.0,>=2.29.0
|
|
|
45
45
|
Requires-Dist: google-auth-oauthlib<2.0.0,>=1.2.0
|
|
46
46
|
Requires-Dist: google-auth-httplib2<1.0.0,>=0.2.0
|
|
47
47
|
Requires-Dist: azure-identity<2.0.0,>=1.15.0
|
|
48
|
-
Requires-Dist: azure-mgmt-compute<
|
|
49
|
-
Requires-Dist: azure-mgmt-network<
|
|
48
|
+
Requires-Dist: azure-mgmt-compute<32.0.0,>=29.0.0
|
|
49
|
+
Requires-Dist: azure-mgmt-network<27.0.0,>=24.0.0
|
|
50
50
|
Requires-Dist: azure-mgmt-containerinstance<11.0.0,>=10.1.0
|
|
51
|
-
Requires-Dist: azure-mgmt-containerservice<
|
|
51
|
+
Requires-Dist: azure-mgmt-containerservice<31.0.0,>=28.0.0
|
|
52
52
|
Requires-Dist: azure-mgmt-storage<22.0.0,>=21.1.0
|
|
53
53
|
Requires-Dist: azure-mgmt-sql<4.0.0,>=3.0.1
|
|
54
54
|
Requires-Dist: azure-mgmt-rdbms<11.0.0,>=10.1.0
|
|
55
55
|
Requires-Dist: azure-mgmt-eventhub<11.0.0,>=10.1.0
|
|
56
|
-
Requires-Dist: azure-mgmt-resource<
|
|
56
|
+
Requires-Dist: azure-mgmt-resource<25.0.0,>=22.0.0
|
|
57
57
|
Requires-Dist: azure-mgmt-subscription<4.0.0,>=3.1.1
|
|
58
58
|
Requires-Dist: paramiko<5.0.0,>=2.11.0
|
|
59
59
|
Requires-Dist: netifaces<1.0.0,>=0.11.0
|
|
@@ -62,17 +62,17 @@ Requires-Dist: InquirerPy<1.0.0,>=0.3.4
|
|
|
62
62
|
Requires-Dist: tqdm<5.0.0,>=4.67.0
|
|
63
63
|
Requires-Dist: python-dotenv<2.0.0,>=0.19.0
|
|
64
64
|
Requires-Dist: python-dateutil<3.0.0,>=2.8.0
|
|
65
|
-
Requires-Dist: PyYAML<
|
|
65
|
+
Requires-Dist: PyYAML<8.0.0,>=6.0
|
|
66
66
|
Requires-Dist: click<9.0.0,>=8.0.0
|
|
67
67
|
Requires-Dist: docutils<1.0.0,>=0.19
|
|
68
68
|
Requires-Dist: invoke<3.0.0,>=2.2.0
|
|
69
69
|
Requires-Dist: jsonschema<5.0.0,>=4.23.0
|
|
70
70
|
Requires-Dist: cryptography<50.0.0,>=3.4.8
|
|
71
|
-
Requires-Dist: watchdog<
|
|
71
|
+
Requires-Dist: watchdog<6.0.0,>=3.0.0
|
|
72
72
|
Requires-Dist: cerberus<2.0.0,>=1.3.4
|
|
73
73
|
Requires-Dist: pydantic<3.0.0,>=2.0.0
|
|
74
74
|
Requires-Dist: packaging<25.0,>=21.0
|
|
75
|
-
Requires-Dist: setuptools<
|
|
75
|
+
Requires-Dist: setuptools<75.0,>=61.0
|
|
76
76
|
Provides-Extra: dev
|
|
77
77
|
Requires-Dist: pytest<9.0.0,>=7.0.0; extra == "dev"
|
|
78
78
|
Requires-Dist: pytest-cov<6.0.0,>=4.0.0; extra == "dev"
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ic-code"
|
|
7
|
-
version = "1.
|
|
7
|
+
version = "1.2.2"
|
|
8
8
|
authors = [
|
|
9
9
|
{name = "sykim", email = "cruiser594@gmail.com"},
|
|
10
10
|
]
|
|
@@ -30,15 +30,15 @@ classifiers = [
|
|
|
30
30
|
]
|
|
31
31
|
keywords = ["cli", "infrastructure", "aws", "oci", "gcp", "azure", "ncp", "naver-cloud", "cloudflare", "ssh", "devops", "multi-cloud"]
|
|
32
32
|
dependencies = [
|
|
33
|
-
# Core Cloud SDKs - Compatible with Python 3.9-3.
|
|
33
|
+
# Core Cloud SDKs - Compatible with Python 3.9-3.13
|
|
34
34
|
"boto3>=1.26.0,<2.0.0", # AWS SDK for Python
|
|
35
35
|
"botocore>=1.29.0,<2.0.0", # AWS SDK core library
|
|
36
36
|
"oci>=2.149.0,<3.0.0", # Oracle Cloud Infrastructure SDK
|
|
37
37
|
"requests>=2.28.0,<3.0.0", # HTTP library for API calls (required for NCP REST API)
|
|
38
|
-
"kubernetes>=29.0.0,<
|
|
38
|
+
"kubernetes>=29.0.0,<32.0.0", # Kubernetes Python client
|
|
39
39
|
"awscli>=1.42.0,<2.0.0", # AWS CLI for additional functionality
|
|
40
40
|
|
|
41
|
-
# Google Cloud SDKs - Compatible with Python 3.9-3.
|
|
41
|
+
# Google Cloud SDKs - Compatible with Python 3.9-3.13
|
|
42
42
|
"google-cloud-compute>=1.36.0,<2.0.0", # Google Compute Engine API
|
|
43
43
|
"google-cloud-container>=2.44.0,<3.0.0", # Google Kubernetes Engine API
|
|
44
44
|
"google-cloud-storage>=2.18.0,<3.0.0", # Google Cloud Storage API
|
|
@@ -50,17 +50,17 @@ dependencies = [
|
|
|
50
50
|
"google-auth-oauthlib>=1.2.0,<2.0.0", # Google OAuth2 authentication
|
|
51
51
|
"google-auth-httplib2>=0.2.0,<1.0.0", # Google HTTP transport for authentication
|
|
52
52
|
|
|
53
|
-
# Azure SDKs - Compatible with Python 3.9-3.
|
|
53
|
+
# Azure SDKs - Compatible with Python 3.9-3.13
|
|
54
54
|
"azure-identity>=1.15.0,<2.0.0", # Azure identity and authentication
|
|
55
|
-
"azure-mgmt-compute>=29.
|
|
56
|
-
"azure-mgmt-network>=24.0.0,<
|
|
55
|
+
"azure-mgmt-compute>=29.0.0,<32.0.0", # Azure Virtual Machines management
|
|
56
|
+
"azure-mgmt-network>=24.0.0,<27.0.0", # Azure networking management
|
|
57
57
|
"azure-mgmt-containerinstance>=10.1.0,<11.0.0", # Azure Container Instances
|
|
58
|
-
"azure-mgmt-containerservice>=28.0.0,<
|
|
58
|
+
"azure-mgmt-containerservice>=28.0.0,<31.0.0", # Azure Kubernetes Service
|
|
59
59
|
"azure-mgmt-storage>=21.1.0,<22.0.0", # Azure Storage management
|
|
60
60
|
"azure-mgmt-sql>=3.0.1,<4.0.0", # Azure SQL management
|
|
61
61
|
"azure-mgmt-rdbms>=10.1.0,<11.0.0", # Azure Database services
|
|
62
62
|
"azure-mgmt-eventhub>=10.1.0,<11.0.0", # Azure Event Hubs
|
|
63
|
-
"azure-mgmt-resource>=22.0.0,<
|
|
63
|
+
"azure-mgmt-resource>=22.0.0,<25.0.0", # Azure Resource Manager
|
|
64
64
|
"azure-mgmt-subscription>=3.1.1,<4.0.0", # Azure Subscription management
|
|
65
65
|
|
|
66
66
|
# SSH and Network - Compatible with Python 3.9-3.12
|
|
@@ -72,26 +72,26 @@ dependencies = [
|
|
|
72
72
|
"InquirerPy>=0.3.4,<1.0.0", # Interactive command line prompts
|
|
73
73
|
"tqdm>=4.67.0,<5.0.0", # Progress bars
|
|
74
74
|
|
|
75
|
-
# Configuration and Utilities - Compatible with Python 3.9-3.
|
|
75
|
+
# Configuration and Utilities - Compatible with Python 3.9-3.13
|
|
76
76
|
"python-dotenv>=0.19.0,<2.0.0", # Environment variable loading
|
|
77
77
|
"python-dateutil>=2.8.0,<3.0.0", # Date/time utilities
|
|
78
|
-
"PyYAML>=6.0,<
|
|
78
|
+
"PyYAML>=6.0,<8.0.0", # YAML parser (required for NCP config files)
|
|
79
79
|
"click>=8.0.0,<9.0.0", # Command line interface framework
|
|
80
80
|
"docutils>=0.19,<1.0.0", # Documentation utilities
|
|
81
81
|
"invoke>=2.2.0,<3.0.0", # Task execution library
|
|
82
82
|
|
|
83
|
-
# Security and Validation - Compatible with Python 3.9-3.
|
|
83
|
+
# Security and Validation - Compatible with Python 3.9-3.13
|
|
84
84
|
"jsonschema>=4.23.0,<5.0.0", # JSON schema validation
|
|
85
85
|
"cryptography>=3.4.8,<50.0.0", # Cryptographic recipes and primitives (required for NCP HMAC-SHA256 signatures)
|
|
86
86
|
|
|
87
|
-
# Additional dependencies for new config system (v2.0) - Compatible with Python 3.9-3.
|
|
88
|
-
"watchdog>=3.0.0,<
|
|
87
|
+
# Additional dependencies for new config system (v2.0) - Compatible with Python 3.9-3.13
|
|
88
|
+
"watchdog>=3.0.0,<6.0.0", # File change monitoring
|
|
89
89
|
"cerberus>=1.3.4,<2.0.0", # Schema validation
|
|
90
90
|
"pydantic>=2.0.0,<3.0.0", # Data validation and settings management
|
|
91
91
|
|
|
92
92
|
# Package management and compatibility
|
|
93
93
|
"packaging>=21.0,<25.0", # Version parsing and comparison
|
|
94
|
-
"setuptools>=61.0,<
|
|
94
|
+
"setuptools>=61.0,<75.0", # Package building tools
|
|
95
95
|
]
|
|
96
96
|
|
|
97
97
|
[project.optional-dependencies]
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
CI Platform Detection Script
|
|
4
|
+
Detects which platforms to test based on commit messages and changed files.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import json
|
|
8
|
+
import os
|
|
9
|
+
import re
|
|
10
|
+
import subprocess
|
|
11
|
+
import sys
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def get_commit_message():
|
|
16
|
+
"""Get the latest commit message."""
|
|
17
|
+
try:
|
|
18
|
+
result = subprocess.run(
|
|
19
|
+
["git", "log", "-1", "--pretty=%B"],
|
|
20
|
+
capture_output=True,
|
|
21
|
+
text=True,
|
|
22
|
+
check=True
|
|
23
|
+
)
|
|
24
|
+
return result.stdout.strip()
|
|
25
|
+
except subprocess.CalledProcessError:
|
|
26
|
+
return ""
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def get_changed_files(event_name, base_sha=None, head_sha=None):
|
|
30
|
+
"""Get list of changed files."""
|
|
31
|
+
try:
|
|
32
|
+
if event_name == "pull_request" and base_sha and head_sha:
|
|
33
|
+
cmd = ["git", "diff", "--name-only", base_sha, head_sha]
|
|
34
|
+
else:
|
|
35
|
+
cmd = ["git", "diff", "--name-only", "HEAD~1", "HEAD"]
|
|
36
|
+
|
|
37
|
+
result = subprocess.run(cmd, capture_output=True, text=True, check=True)
|
|
38
|
+
return result.stdout.strip().split("\n") if result.stdout.strip() else []
|
|
39
|
+
except subprocess.CalledProcessError:
|
|
40
|
+
return []
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def detect_platforms_from_commit(commit_msg, all_platforms):
|
|
44
|
+
"""Detect platforms from commit message tags."""
|
|
45
|
+
detected = []
|
|
46
|
+
|
|
47
|
+
# Check for [all] or [test-all] tag
|
|
48
|
+
if re.search(r'\[(all|test-all)\]', commit_msg, re.IGNORECASE):
|
|
49
|
+
return list(all_platforms)
|
|
50
|
+
|
|
51
|
+
# Check for platform tags: [platform], (platform), or platform:
|
|
52
|
+
for platform in all_platforms:
|
|
53
|
+
pattern = rf'\[{platform}\]|\({platform}\)|{platform}:'
|
|
54
|
+
if re.search(pattern, commit_msg, re.IGNORECASE):
|
|
55
|
+
detected.append(platform)
|
|
56
|
+
|
|
57
|
+
return detected
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def detect_platforms_from_files(changed_files, all_platforms):
|
|
61
|
+
"""Detect platforms from changed files."""
|
|
62
|
+
detected = set()
|
|
63
|
+
|
|
64
|
+
for file_path in changed_files:
|
|
65
|
+
for platform in all_platforms:
|
|
66
|
+
if f"src/ic/platforms/{platform}/" in file_path or \
|
|
67
|
+
f"tests/platforms/{platform}/" in file_path:
|
|
68
|
+
detected.add(platform)
|
|
69
|
+
|
|
70
|
+
return list(detected)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def filter_platforms_with_tests(platforms):
|
|
74
|
+
"""Filter platforms that have actual test files."""
|
|
75
|
+
platforms_with_tests = []
|
|
76
|
+
|
|
77
|
+
for platform in platforms:
|
|
78
|
+
test_dir = Path(f"tests/platforms/{platform}")
|
|
79
|
+
if test_dir.exists():
|
|
80
|
+
# Check if there are any test files
|
|
81
|
+
test_files = list(test_dir.rglob("test_*.py"))
|
|
82
|
+
if test_files:
|
|
83
|
+
platforms_with_tests.append(platform)
|
|
84
|
+
print(f"✓ Platform {platform} has {len(test_files)} test files")
|
|
85
|
+
else:
|
|
86
|
+
print(f"⚠ Platform {platform} directory exists but has no test files")
|
|
87
|
+
else:
|
|
88
|
+
print(f"⚠ Platform {platform} has no test directory")
|
|
89
|
+
|
|
90
|
+
return platforms_with_tests
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def main():
|
|
94
|
+
# All available platforms
|
|
95
|
+
ALL_PLATFORMS = ["ncp", "ncpgov", "oci", "azure", "aws", "gcp", "ssh", "cf"]
|
|
96
|
+
|
|
97
|
+
# Get environment variables
|
|
98
|
+
event_name = os.environ.get("GITHUB_EVENT_NAME", "")
|
|
99
|
+
base_sha = os.environ.get("BASE_SHA", "")
|
|
100
|
+
head_sha = os.environ.get("HEAD_SHA", "")
|
|
101
|
+
|
|
102
|
+
# Get commit message
|
|
103
|
+
commit_msg = os.environ.get("COMMIT_MSG", "") or get_commit_message()
|
|
104
|
+
print(f"Commit message: {commit_msg}")
|
|
105
|
+
|
|
106
|
+
# Detect platforms from commit message
|
|
107
|
+
detected_platforms = detect_platforms_from_commit(commit_msg, ALL_PLATFORMS)
|
|
108
|
+
|
|
109
|
+
if detected_platforms:
|
|
110
|
+
print(f"✓ Found platforms from commit message: {detected_platforms}")
|
|
111
|
+
else:
|
|
112
|
+
# Detect from changed files
|
|
113
|
+
print("No platform tags in commit message, checking changed files...")
|
|
114
|
+
changed_files = get_changed_files(event_name, base_sha, head_sha)
|
|
115
|
+
if changed_files:
|
|
116
|
+
print(f"Changed files: {len(changed_files)} files")
|
|
117
|
+
detected_platforms = detect_platforms_from_files(changed_files, ALL_PLATFORMS)
|
|
118
|
+
if detected_platforms:
|
|
119
|
+
print(f"✓ Found platforms from changed files: {detected_platforms}")
|
|
120
|
+
|
|
121
|
+
# Use defaults if nothing detected
|
|
122
|
+
if not detected_platforms:
|
|
123
|
+
print("No platforms detected, using defaults: ncp, ncpgov")
|
|
124
|
+
detected_platforms = ["ncp", "ncpgov"]
|
|
125
|
+
|
|
126
|
+
# Filter platforms that have tests
|
|
127
|
+
platforms_with_tests = filter_platforms_with_tests(detected_platforms)
|
|
128
|
+
|
|
129
|
+
# Remove duplicates and sort
|
|
130
|
+
platforms_with_tests = sorted(set(platforms_with_tests))
|
|
131
|
+
|
|
132
|
+
# Output as JSON (compact, single line)
|
|
133
|
+
platforms_json = json.dumps(platforms_with_tests, separators=(',', ':'))
|
|
134
|
+
print(f"\nFinal platforms to test: {platforms_json}")
|
|
135
|
+
|
|
136
|
+
# Write to GitHub output if in CI
|
|
137
|
+
github_output = os.environ.get("GITHUB_OUTPUT")
|
|
138
|
+
if github_output:
|
|
139
|
+
with open(github_output, "a") as f:
|
|
140
|
+
f.write(f"platforms={platforms_json}\n")
|
|
141
|
+
f.write(f"should-run-tests={'true' if platforms_with_tests else 'false'}\n")
|
|
142
|
+
else:
|
|
143
|
+
# For local testing
|
|
144
|
+
print(f"platforms={platforms_json}")
|
|
145
|
+
print(f"should-run-tests={'true' if platforms_with_tests else 'false'}")
|
|
146
|
+
|
|
147
|
+
return 0 if platforms_with_tests else 1
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
if __name__ == "__main__":
|
|
151
|
+
sys.exit(main())
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
CI Matrix Generation Script
|
|
4
|
+
Generates test matrix for GitHub Actions.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import json
|
|
8
|
+
import os
|
|
9
|
+
import sys
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def main():
|
|
13
|
+
# Get inputs
|
|
14
|
+
test_types_str = os.environ.get("TEST_TYPES", '["unit", "integration", "performance"]')
|
|
15
|
+
platforms_str = os.environ.get("PLATFORMS", '["ncp", "ncpgov"]')
|
|
16
|
+
|
|
17
|
+
try:
|
|
18
|
+
test_types = json.loads(test_types_str)
|
|
19
|
+
platforms = json.loads(platforms_str)
|
|
20
|
+
except json.JSONDecodeError as e:
|
|
21
|
+
print(f"Error parsing JSON: {e}", file=sys.stderr)
|
|
22
|
+
return 1
|
|
23
|
+
|
|
24
|
+
# Python versions to test
|
|
25
|
+
python_versions = ["3.11", "3.12"]
|
|
26
|
+
|
|
27
|
+
# Generate matrix
|
|
28
|
+
matrix = []
|
|
29
|
+
for python_version in python_versions:
|
|
30
|
+
for platform in platforms:
|
|
31
|
+
for test_type in test_types:
|
|
32
|
+
matrix.append({
|
|
33
|
+
"python-version": python_version,
|
|
34
|
+
"platform": platform,
|
|
35
|
+
"test-type": test_type,
|
|
36
|
+
"os": "ubuntu-latest"
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
# Output as compact JSON
|
|
40
|
+
matrix_json = json.dumps({"include": matrix}, separators=(',', ':'))
|
|
41
|
+
|
|
42
|
+
print(f"Generated matrix with {len(matrix)} jobs")
|
|
43
|
+
print(f"Platforms: {platforms}")
|
|
44
|
+
print(f"Test types: {test_types}")
|
|
45
|
+
print(f"Python versions: {python_versions}")
|
|
46
|
+
|
|
47
|
+
# Write to GitHub output if in CI
|
|
48
|
+
github_output = os.environ.get("GITHUB_OUTPUT")
|
|
49
|
+
if github_output:
|
|
50
|
+
with open(github_output, "a") as f:
|
|
51
|
+
f.write(f"matrix={matrix_json}\n")
|
|
52
|
+
f.write(f"test-types={json.dumps(test_types, separators=(',', ':'))}\n")
|
|
53
|
+
f.write(f"platforms={json.dumps(platforms, separators=(',', ':'))}\n")
|
|
54
|
+
else:
|
|
55
|
+
# For local testing
|
|
56
|
+
print(f"\nmatrix={matrix_json}")
|
|
57
|
+
|
|
58
|
+
return 0
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
if __name__ == "__main__":
|
|
62
|
+
sys.exit(main())
|
|
@@ -4,7 +4,7 @@ IC (Infra Resource Management CLI) - A comprehensive tool for managing cloud inf
|
|
|
4
4
|
This package provides CLI tools and libraries for managing AWS, Azure, GCP, OCI, and CloudFlare resources.
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
|
-
__version__ = "1.
|
|
7
|
+
__version__ = "1.2.2"
|
|
8
8
|
__author__ = "SangYun"
|
|
9
9
|
__email__ = "cruiser594@gmail.com"
|
|
10
10
|
|
|
@@ -42,8 +42,8 @@ def get_tag_keys():
|
|
|
42
42
|
"""설정에서 태그 키를 가져옵니다."""
|
|
43
43
|
if config and 'aws' in config and 'tags' in config['aws']:
|
|
44
44
|
aws_tags = config['aws']['tags']
|
|
45
|
-
required_tags = aws_tags.get('required', [
|
|
46
|
-
optional_tags = aws_tags.get('optional', [
|
|
45
|
+
required_tags = aws_tags.get('required', [])
|
|
46
|
+
optional_tags = aws_tags.get('optional', [])
|
|
47
47
|
else:
|
|
48
48
|
# Fallback to environment variables
|
|
49
49
|
env_required = os.getenv("REQUIRED_TAGS", "User,Team,Environment")
|
|
@@ -45,8 +45,8 @@ def get_tag_keys():
|
|
|
45
45
|
"""설정에서 태그 키를 가져옵니다."""
|
|
46
46
|
if config and 'aws' in config and 'tags' in config['aws']:
|
|
47
47
|
aws_tags = config['aws']['tags']
|
|
48
|
-
required_tags = aws_tags.get('required', [
|
|
49
|
-
optional_tags = aws_tags.get('optional', [
|
|
48
|
+
required_tags = aws_tags.get('required', [])
|
|
49
|
+
optional_tags = aws_tags.get('optional', [])
|
|
50
50
|
else:
|
|
51
51
|
# Fallback to environment variables
|
|
52
52
|
env_required = os.getenv("REQUIRED_TAGS", "User,Team,Environment")
|
|
@@ -18,17 +18,49 @@ except ImportError:
|
|
|
18
18
|
from rich.console import Console
|
|
19
19
|
from rich.table import Table
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
# 새로운 설정 시스템 import
|
|
22
|
+
try:
|
|
23
|
+
from src.ic.config.manager import ConfigManager
|
|
24
|
+
config_manager = ConfigManager()
|
|
25
|
+
config = config_manager.get_config()
|
|
26
|
+
except ImportError:
|
|
27
|
+
try:
|
|
28
|
+
from ic.config.manager import ConfigManager
|
|
29
|
+
config_manager = ConfigManager()
|
|
30
|
+
config = config_manager.get_config()
|
|
31
|
+
except ImportError:
|
|
32
|
+
# Legacy fallback for development
|
|
33
|
+
import sys
|
|
34
|
+
import os
|
|
35
|
+
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', '..', '..'))
|
|
36
|
+
from ic.config.manager import ConfigManager
|
|
37
|
+
config_manager = ConfigManager()
|
|
38
|
+
config = config_manager.get_config()
|
|
39
|
+
except ImportError:
|
|
40
|
+
# 호환성을 위한 fallback
|
|
41
|
+
from dotenv import load_dotenv
|
|
42
|
+
load_dotenv()
|
|
43
|
+
config = {}
|
|
22
44
|
|
|
23
45
|
console = Console()
|
|
24
46
|
|
|
25
|
-
#
|
|
26
|
-
|
|
27
|
-
|
|
47
|
+
# 새로운 설정 시스템에서 태그 키 가져오기
|
|
48
|
+
def get_tag_keys():
|
|
49
|
+
"""설정에서 태그 키를 가져옵니다."""
|
|
50
|
+
if config and 'aws' in config and 'tags' in config['aws']:
|
|
51
|
+
aws_tags = config['aws']['tags']
|
|
52
|
+
required_tags = aws_tags.get('required', [])
|
|
53
|
+
optional_tags = aws_tags.get('optional', [])
|
|
54
|
+
else:
|
|
55
|
+
# Fallback to environment variables
|
|
56
|
+
env_required = os.getenv("REQUIRED_TAGS", "User,Team,Environment")
|
|
57
|
+
env_optional = os.getenv("OPTIONAL_TAGS", "Service,Application")
|
|
58
|
+
required_tags = [t.strip() for t in env_required.split(",") if t.strip()]
|
|
59
|
+
optional_tags = [t.strip() for t in env_optional.split(",") if t.strip()]
|
|
60
|
+
|
|
61
|
+
return required_tags + optional_tags
|
|
28
62
|
|
|
29
|
-
|
|
30
|
-
optional_tags = [t.strip() for t in env_optional.split(",") if t.strip()]
|
|
31
|
-
TAG_KEYS = required_tags + optional_tags
|
|
63
|
+
TAG_KEYS = get_tag_keys()
|
|
32
64
|
|
|
33
65
|
@log_decorator
|
|
34
66
|
def fetch_nat_tags(account_id, profile_name, region):
|
|
@@ -14,16 +14,49 @@ except ImportError:
|
|
|
14
14
|
from rich.console import Console
|
|
15
15
|
from rich.table import Table
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
# 새로운 설정 시스템 import
|
|
18
|
+
try:
|
|
19
|
+
from src.ic.config.manager import ConfigManager
|
|
20
|
+
config_manager = ConfigManager()
|
|
21
|
+
config = config_manager.get_config()
|
|
22
|
+
except ImportError:
|
|
23
|
+
try:
|
|
24
|
+
from ic.config.manager import ConfigManager
|
|
25
|
+
config_manager = ConfigManager()
|
|
26
|
+
config = config_manager.get_config()
|
|
27
|
+
except ImportError:
|
|
28
|
+
# Legacy fallback for development
|
|
29
|
+
import sys
|
|
30
|
+
import os
|
|
31
|
+
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', '..', '..'))
|
|
32
|
+
from ic.config.manager import ConfigManager
|
|
33
|
+
config_manager = ConfigManager()
|
|
34
|
+
config = config_manager.get_config()
|
|
35
|
+
except ImportError:
|
|
36
|
+
# 호환성을 위한 fallback
|
|
37
|
+
from dotenv import load_dotenv
|
|
38
|
+
load_dotenv()
|
|
39
|
+
config = {}
|
|
19
40
|
|
|
20
|
-
|
|
21
|
-
env_required = os.getenv("REQUIRED_TAGS", "User,Team,Environment")
|
|
22
|
-
env_optional = os.getenv("OPTIONAL_TAGS", "Service,Application")
|
|
41
|
+
console = Console()
|
|
23
42
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
43
|
+
# 새로운 설정 시스템에서 태그 키 가져오기
|
|
44
|
+
def get_tag_keys():
|
|
45
|
+
"""설정에서 태그 키를 가져옵니다."""
|
|
46
|
+
if config and 'aws' in config and 'tags' in config['aws']:
|
|
47
|
+
aws_tags = config['aws']['tags']
|
|
48
|
+
required_tags = aws_tags.get('required', [])
|
|
49
|
+
optional_tags = aws_tags.get('optional', [])
|
|
50
|
+
else:
|
|
51
|
+
# Fallback to environment variables
|
|
52
|
+
env_required = os.getenv("REQUIRED_TAGS", "User,Team,Environment")
|
|
53
|
+
env_optional = os.getenv("OPTIONAL_TAGS", "Service,Application")
|
|
54
|
+
required_tags = [t.strip() for t in env_required.split(",") if t.strip()]
|
|
55
|
+
optional_tags = [t.strip() for t in env_optional.split(",") if t.strip()]
|
|
56
|
+
|
|
57
|
+
return required_tags + optional_tags
|
|
58
|
+
|
|
59
|
+
TAG_KEYS = get_tag_keys()
|
|
27
60
|
|
|
28
61
|
@log_decorator
|
|
29
62
|
def fetch_rds_tags(account_id, profile_name, region):
|
|
@@ -15,14 +15,49 @@ except ImportError:
|
|
|
15
15
|
from rich.console import Console
|
|
16
16
|
from rich.table import Table
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
# 새로운 설정 시스템 import
|
|
19
|
+
try:
|
|
20
|
+
from src.ic.config.manager import ConfigManager
|
|
21
|
+
config_manager = ConfigManager()
|
|
22
|
+
config = config_manager.get_config()
|
|
23
|
+
except ImportError:
|
|
24
|
+
try:
|
|
25
|
+
from ic.config.manager import ConfigManager
|
|
26
|
+
config_manager = ConfigManager()
|
|
27
|
+
config = config_manager.get_config()
|
|
28
|
+
except ImportError:
|
|
29
|
+
# Legacy fallback for development
|
|
30
|
+
import sys
|
|
31
|
+
import os
|
|
32
|
+
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', '..', '..'))
|
|
33
|
+
from ic.config.manager import ConfigManager
|
|
34
|
+
config_manager = ConfigManager()
|
|
35
|
+
config = config_manager.get_config()
|
|
36
|
+
except ImportError:
|
|
37
|
+
# 호환성을 위한 fallback
|
|
38
|
+
from dotenv import load_dotenv
|
|
39
|
+
load_dotenv()
|
|
40
|
+
config = {}
|
|
41
|
+
|
|
19
42
|
console = Console()
|
|
20
43
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
44
|
+
# 새로운 설정 시스템에서 태그 키 가져오기
|
|
45
|
+
def get_tag_keys():
|
|
46
|
+
"""설정에서 태그 키를 가져옵니다."""
|
|
47
|
+
if config and 'aws' in config and 'tags' in config['aws']:
|
|
48
|
+
aws_tags = config['aws']['tags']
|
|
49
|
+
required_tags = aws_tags.get('required', [])
|
|
50
|
+
optional_tags = aws_tags.get('optional', [])
|
|
51
|
+
else:
|
|
52
|
+
# Fallback to environment variables
|
|
53
|
+
env_required = os.getenv("REQUIRED_TAGS", "User,Team,Environment")
|
|
54
|
+
env_optional = os.getenv("OPTIONAL_TAGS", "Service,Application")
|
|
55
|
+
required_tags = [t.strip() for t in env_required.split(",") if t.strip()]
|
|
56
|
+
optional_tags = [t.strip() for t in env_optional.split(",") if t.strip()]
|
|
57
|
+
|
|
58
|
+
return required_tags + optional_tags
|
|
59
|
+
|
|
60
|
+
TAG_KEYS = get_tag_keys()
|
|
26
61
|
|
|
27
62
|
@log_decorator
|
|
28
63
|
def fetch_s3_tags(account_id, profile_name, region):
|
|
@@ -45,8 +45,8 @@ def get_tag_keys():
|
|
|
45
45
|
"""설정에서 태그 키를 가져옵니다."""
|
|
46
46
|
if config and 'aws' in config and 'tags' in config['aws']:
|
|
47
47
|
aws_tags = config['aws']['tags']
|
|
48
|
-
required_tags = aws_tags.get('required', [
|
|
49
|
-
optional_tags = aws_tags.get('optional', [
|
|
48
|
+
required_tags = aws_tags.get('required', [])
|
|
49
|
+
optional_tags = aws_tags.get('optional', [])
|
|
50
50
|
else:
|
|
51
51
|
# Fallback to environment variables
|
|
52
52
|
env_required = os.getenv("REQUIRED_TAGS", "User,Team,Environment")
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ic-code
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.2.2
|
|
4
4
|
Summary: Infrastructure CLI tool for managing AWS, Azure, GCP, OCI, NCP, CloudFlare, SSH, and more
|
|
5
5
|
Home-page: https://github.com/dgr009/ic
|
|
6
6
|
Author: SangYun Kim
|
|
@@ -32,7 +32,7 @@ Requires-Dist: boto3<2.0.0,>=1.26.0
|
|
|
32
32
|
Requires-Dist: botocore<2.0.0,>=1.29.0
|
|
33
33
|
Requires-Dist: oci<3.0.0,>=2.149.0
|
|
34
34
|
Requires-Dist: requests<3.0.0,>=2.28.0
|
|
35
|
-
Requires-Dist: kubernetes<
|
|
35
|
+
Requires-Dist: kubernetes<32.0.0,>=29.0.0
|
|
36
36
|
Requires-Dist: awscli<2.0.0,>=1.42.0
|
|
37
37
|
Requires-Dist: google-cloud-compute<2.0.0,>=1.36.0
|
|
38
38
|
Requires-Dist: google-cloud-container<3.0.0,>=2.44.0
|
|
@@ -45,15 +45,15 @@ Requires-Dist: google-auth<3.0.0,>=2.29.0
|
|
|
45
45
|
Requires-Dist: google-auth-oauthlib<2.0.0,>=1.2.0
|
|
46
46
|
Requires-Dist: google-auth-httplib2<1.0.0,>=0.2.0
|
|
47
47
|
Requires-Dist: azure-identity<2.0.0,>=1.15.0
|
|
48
|
-
Requires-Dist: azure-mgmt-compute<
|
|
49
|
-
Requires-Dist: azure-mgmt-network<
|
|
48
|
+
Requires-Dist: azure-mgmt-compute<32.0.0,>=29.0.0
|
|
49
|
+
Requires-Dist: azure-mgmt-network<27.0.0,>=24.0.0
|
|
50
50
|
Requires-Dist: azure-mgmt-containerinstance<11.0.0,>=10.1.0
|
|
51
|
-
Requires-Dist: azure-mgmt-containerservice<
|
|
51
|
+
Requires-Dist: azure-mgmt-containerservice<31.0.0,>=28.0.0
|
|
52
52
|
Requires-Dist: azure-mgmt-storage<22.0.0,>=21.1.0
|
|
53
53
|
Requires-Dist: azure-mgmt-sql<4.0.0,>=3.0.1
|
|
54
54
|
Requires-Dist: azure-mgmt-rdbms<11.0.0,>=10.1.0
|
|
55
55
|
Requires-Dist: azure-mgmt-eventhub<11.0.0,>=10.1.0
|
|
56
|
-
Requires-Dist: azure-mgmt-resource<
|
|
56
|
+
Requires-Dist: azure-mgmt-resource<25.0.0,>=22.0.0
|
|
57
57
|
Requires-Dist: azure-mgmt-subscription<4.0.0,>=3.1.1
|
|
58
58
|
Requires-Dist: paramiko<5.0.0,>=2.11.0
|
|
59
59
|
Requires-Dist: netifaces<1.0.0,>=0.11.0
|
|
@@ -62,17 +62,17 @@ Requires-Dist: InquirerPy<1.0.0,>=0.3.4
|
|
|
62
62
|
Requires-Dist: tqdm<5.0.0,>=4.67.0
|
|
63
63
|
Requires-Dist: python-dotenv<2.0.0,>=0.19.0
|
|
64
64
|
Requires-Dist: python-dateutil<3.0.0,>=2.8.0
|
|
65
|
-
Requires-Dist: PyYAML<
|
|
65
|
+
Requires-Dist: PyYAML<8.0.0,>=6.0
|
|
66
66
|
Requires-Dist: click<9.0.0,>=8.0.0
|
|
67
67
|
Requires-Dist: docutils<1.0.0,>=0.19
|
|
68
68
|
Requires-Dist: invoke<3.0.0,>=2.2.0
|
|
69
69
|
Requires-Dist: jsonschema<5.0.0,>=4.23.0
|
|
70
70
|
Requires-Dist: cryptography<50.0.0,>=3.4.8
|
|
71
|
-
Requires-Dist: watchdog<
|
|
71
|
+
Requires-Dist: watchdog<6.0.0,>=3.0.0
|
|
72
72
|
Requires-Dist: cerberus<2.0.0,>=1.3.4
|
|
73
73
|
Requires-Dist: pydantic<3.0.0,>=2.0.0
|
|
74
74
|
Requires-Dist: packaging<25.0,>=21.0
|
|
75
|
-
Requires-Dist: setuptools<
|
|
75
|
+
Requires-Dist: setuptools<75.0,>=61.0
|
|
76
76
|
Provides-Extra: dev
|
|
77
77
|
Requires-Dist: pytest<9.0.0,>=7.0.0; extra == "dev"
|
|
78
78
|
Requires-Dist: pytest-cov<6.0.0,>=4.0.0; extra == "dev"
|
|
@@ -46,6 +46,8 @@ docs/oci/installation.md
|
|
|
46
46
|
docs/ssh/configuration.md
|
|
47
47
|
scripts/analysis_summary.py
|
|
48
48
|
scripts/bump-version.sh
|
|
49
|
+
scripts/ci-detect-platforms.py
|
|
50
|
+
scripts/ci-generate-matrix.py
|
|
49
51
|
scripts/cli_usage_analysis.py
|
|
50
52
|
scripts/dependency_mapper.py
|
|
51
53
|
scripts/deploy.sh
|