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.
Files changed (289) hide show
  1. {ic_code-1.1.10/src/ic_code.egg-info → ic_code-1.2.2}/PKG-INFO +9 -9
  2. {ic_code-1.1.10 → ic_code-1.2.2}/pyproject.toml +15 -15
  3. ic_code-1.2.2/scripts/ci-detect-platforms.py +151 -0
  4. ic_code-1.2.2/scripts/ci-generate-matrix.py +62 -0
  5. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/__init__.py +1 -1
  6. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/ec2/list_tags.py +2 -2
  7. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/lb/list_tags.py +2 -2
  8. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/nat/list_tags.py +39 -7
  9. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/rds/list_tags.py +41 -8
  10. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/s3/list_tags.py +41 -6
  11. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/vpc/list_tags.py +2 -2
  12. {ic_code-1.1.10 → ic_code-1.2.2/src/ic_code.egg-info}/PKG-INFO +9 -9
  13. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic_code.egg-info/SOURCES.txt +2 -0
  14. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic_code.egg-info/requires.txt +8 -8
  15. {ic_code-1.1.10 → ic_code-1.2.2}/LICENSE +0 -0
  16. {ic_code-1.1.10 → ic_code-1.2.2}/MANIFEST.in +0 -0
  17. {ic_code-1.1.10 → ic_code-1.2.2}/README.md +0 -0
  18. {ic_code-1.1.10 → ic_code-1.2.2}/SECURITY.md +0 -0
  19. {ic_code-1.1.10 → ic_code-1.2.2}/docs/README.md +0 -0
  20. {ic_code-1.1.10 → ic_code-1.2.2}/docs/_templates/configuration.md +0 -0
  21. {ic_code-1.1.10 → ic_code-1.2.2}/docs/_templates/installation.md +0 -0
  22. {ic_code-1.1.10 → ic_code-1.2.2}/docs/_templates/troubleshooting.md +0 -0
  23. {ic_code-1.1.10 → ic_code-1.2.2}/docs/_templates/usage.md +0 -0
  24. {ic_code-1.1.10 → ic_code-1.2.2}/docs/aws/README.md +0 -0
  25. {ic_code-1.1.10 → ic_code-1.2.2}/docs/aws/aws_cli_prd.md +0 -0
  26. {ic_code-1.1.10 → ic_code-1.2.2}/docs/aws/installation.md +0 -0
  27. {ic_code-1.1.10 → ic_code-1.2.2}/docs/azure/README.md +0 -0
  28. {ic_code-1.1.10 → ic_code-1.2.2}/docs/ci-workflow-guide.md +0 -0
  29. {ic_code-1.1.10 → ic_code-1.2.2}/docs/config_migration.md +0 -0
  30. {ic_code-1.1.10 → ic_code-1.2.2}/docs/deployment.md +0 -0
  31. {ic_code-1.1.10 → ic_code-1.2.2}/docs/development/README.md +0 -0
  32. {ic_code-1.1.10 → ic_code-1.2.2}/docs/development/cleanup_summary.md +0 -0
  33. {ic_code-1.1.10 → ic_code-1.2.2}/docs/development/development_guide.md +0 -0
  34. {ic_code-1.1.10 → ic_code-1.2.2}/docs/development/import_patterns.md +0 -0
  35. {ic_code-1.1.10 → ic_code-1.2.2}/docs/development/migration_guide.md +0 -0
  36. {ic_code-1.1.10 → ic_code-1.2.2}/docs/gcp/GCP_CONFIGURATION_GUIDE.md +0 -0
  37. {ic_code-1.1.10 → ic_code-1.2.2}/docs/gcp/GCP_SECURITY_BEST_PRACTICES.md +0 -0
  38. {ic_code-1.1.10 → ic_code-1.2.2}/docs/gcp/README.md +0 -0
  39. {ic_code-1.1.10 → ic_code-1.2.2}/docs/general/configuration.md +0 -0
  40. {ic_code-1.1.10 → ic_code-1.2.2}/docs/installation.md +0 -0
  41. {ic_code-1.1.10 → ic_code-1.2.2}/docs/mcp_integration.md +0 -0
  42. {ic_code-1.1.10 → ic_code-1.2.2}/docs/migration.md +0 -0
  43. {ic_code-1.1.10 → ic_code-1.2.2}/docs/migration_guide.md +0 -0
  44. {ic_code-1.1.10 → ic_code-1.2.2}/docs/ncp/README.md +0 -0
  45. {ic_code-1.1.10 → ic_code-1.2.2}/docs/ncp/configuration.md +0 -0
  46. {ic_code-1.1.10 → ic_code-1.2.2}/docs/ncp/installation.md +0 -0
  47. {ic_code-1.1.10 → ic_code-1.2.2}/docs/ncp/troubleshooting.md +0 -0
  48. {ic_code-1.1.10 → ic_code-1.2.2}/docs/ncp/usage.md +0 -0
  49. {ic_code-1.1.10 → ic_code-1.2.2}/docs/ncpgov/README.md +0 -0
  50. {ic_code-1.1.10 → ic_code-1.2.2}/docs/ncpgov/installation.md +0 -0
  51. {ic_code-1.1.10 → ic_code-1.2.2}/docs/oci/README.md +0 -0
  52. {ic_code-1.1.10 → ic_code-1.2.2}/docs/oci/installation.md +0 -0
  53. {ic_code-1.1.10 → ic_code-1.2.2}/docs/release-guide.md +0 -0
  54. {ic_code-1.1.10 → ic_code-1.2.2}/docs/security.md +0 -0
  55. {ic_code-1.1.10 → ic_code-1.2.2}/docs/ssh/configuration.md +0 -0
  56. {ic_code-1.1.10 → ic_code-1.2.2}/docs/troubleshooting.md +0 -0
  57. {ic_code-1.1.10 → ic_code-1.2.2}/docs/user_guide.md +0 -0
  58. {ic_code-1.1.10 → ic_code-1.2.2}/requirements.txt +0 -0
  59. {ic_code-1.1.10 → ic_code-1.2.2}/scripts/analysis_summary.py +0 -0
  60. {ic_code-1.1.10 → ic_code-1.2.2}/scripts/bump-version.sh +0 -0
  61. {ic_code-1.1.10 → ic_code-1.2.2}/scripts/cf_edge_nsg_make/cf_edge_nsg_make.py +0 -0
  62. {ic_code-1.1.10 → ic_code-1.2.2}/scripts/cli_usage_analysis.py +0 -0
  63. {ic_code-1.1.10 → ic_code-1.2.2}/scripts/dependency_mapper.py +0 -0
  64. {ic_code-1.1.10 → ic_code-1.2.2}/scripts/deploy.sh +0 -0
  65. {ic_code-1.1.10 → ic_code-1.2.2}/scripts/final_validation_and_documentation.py +0 -0
  66. {ic_code-1.1.10 → ic_code-1.2.2}/scripts/fix_consolidated_imports.py +0 -0
  67. {ic_code-1.1.10 → ic_code-1.2.2}/scripts/migration_execution_and_validation.py +0 -0
  68. {ic_code-1.1.10 → ic_code-1.2.2}/scripts/ncp_security_scanner.py +0 -0
  69. {ic_code-1.1.10 → ic_code-1.2.2}/scripts/oracle-policy/user_policy.py +0 -0
  70. {ic_code-1.1.10 → ic_code-1.2.2}/scripts/performance_optimization.py +0 -0
  71. {ic_code-1.1.10 → ic_code-1.2.2}/scripts/setup_venv.py +0 -0
  72. {ic_code-1.1.10 → ic_code-1.2.2}/scripts/test-ci-detection.sh +0 -0
  73. {ic_code-1.1.10 → ic_code-1.2.2}/scripts/unset_env.sh +0 -0
  74. {ic_code-1.1.10 → ic_code-1.2.2}/scripts/validate_config.py +0 -0
  75. {ic_code-1.1.10 → ic_code-1.2.2}/scripts/validate_dependencies.py +0 -0
  76. {ic_code-1.1.10 → ic_code-1.2.2}/scripts/validate_ncp_security.py +0 -0
  77. {ic_code-1.1.10 → ic_code-1.2.2}/setup.cfg +0 -0
  78. {ic_code-1.1.10 → ic_code-1.2.2}/setup.py +0 -0
  79. {ic_code-1.1.10 → ic_code-1.2.2}/src/common/__init__.py +0 -0
  80. {ic_code-1.1.10 → ic_code-1.2.2}/src/common/azure_utils.py +0 -0
  81. {ic_code-1.1.10 → ic_code-1.2.2}/src/common/gather_env.py +0 -0
  82. {ic_code-1.1.10 → ic_code-1.2.2}/src/common/gcp_config_validator.py +0 -0
  83. {ic_code-1.1.10 → ic_code-1.2.2}/src/common/gcp_monitoring.py +0 -0
  84. {ic_code-1.1.10 → ic_code-1.2.2}/src/common/gcp_utils.py +0 -0
  85. {ic_code-1.1.10 → ic_code-1.2.2}/src/common/log.py +0 -0
  86. {ic_code-1.1.10 → ic_code-1.2.2}/src/common/ncp_security_utils.py +0 -0
  87. {ic_code-1.1.10 → ic_code-1.2.2}/src/common/ncp_utils.py +0 -0
  88. {ic_code-1.1.10 → ic_code-1.2.2}/src/common/ncpgov_utils.py +0 -0
  89. {ic_code-1.1.10 → ic_code-1.2.2}/src/common/progress_decorator.py +0 -0
  90. {ic_code-1.1.10 → ic_code-1.2.2}/src/common/slack.py +0 -0
  91. {ic_code-1.1.10 → ic_code-1.2.2}/src/common/utils.py +0 -0
  92. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/cli.py +0 -0
  93. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/cli_backup.py +0 -0
  94. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/commands/__init__.py +0 -0
  95. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/commands/config.py +0 -0
  96. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/commands/migration.py +0 -0
  97. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/commands/security.py +0 -0
  98. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/compat/__init__.py +0 -0
  99. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/compat/cli.py +0 -0
  100. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/compat/common.py +0 -0
  101. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/config/__init__.py +0 -0
  102. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/config/cleanup.py +0 -0
  103. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/config/docs_organizer.py +0 -0
  104. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/config/external.py +0 -0
  105. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/config/installer.py +0 -0
  106. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/config/manager.py +0 -0
  107. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/config/migration.py +0 -0
  108. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/config/migration_utils.py +0 -0
  109. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/config/path_manager.py +0 -0
  110. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/config/schema.py +0 -0
  111. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/config/secrets.py +0 -0
  112. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/config/security.py +0 -0
  113. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/core/__init__.py +0 -0
  114. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/core/dependency_validator.py +0 -0
  115. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/core/logging.py +0 -0
  116. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/core/mcp_manager.py +0 -0
  117. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/core/platform_discovery.py +0 -0
  118. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/core/session.py +0 -0
  119. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/core/silence_logging.py +0 -0
  120. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/migration/__init__.py +0 -0
  121. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/migration/manager.py +0 -0
  122. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/migration/post_validation.py +0 -0
  123. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/migration/rollback.py +0 -0
  124. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/migration/validation.py +0 -0
  125. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/__init__.py +0 -0
  126. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/__init__.py +0 -0
  127. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/cloudfront/__init__.py +0 -0
  128. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/cloudfront/info.py +0 -0
  129. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/codepipeline/__init__.py +0 -0
  130. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/codepipeline/build.py +0 -0
  131. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/codepipeline/deploy.py +0 -0
  132. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/ec2/__init__.py +0 -0
  133. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/ec2/info.py +0 -0
  134. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/ec2/tag_check.py +0 -0
  135. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/ecs/__init__.py +0 -0
  136. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/ecs/info.py +0 -0
  137. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/ecs/service.py +0 -0
  138. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/ecs/task.py +0 -0
  139. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/eks/__init__.py +0 -0
  140. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/eks/addons.py +0 -0
  141. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/eks/fargate.py +0 -0
  142. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/eks/info.py +0 -0
  143. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/eks/nodes.py +0 -0
  144. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/eks/pods.py +0 -0
  145. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/eks/update_config.py +0 -0
  146. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/fargate/__init__.py +0 -0
  147. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/fargate/info.py +0 -0
  148. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/lb/__init__.py +0 -0
  149. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/lb/info.py +0 -0
  150. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/lb/tag_check.py +0 -0
  151. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/msk/__init__.py +0 -0
  152. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/msk/broker.py +0 -0
  153. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/msk/info.py +0 -0
  154. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/nat/__init__.py +0 -0
  155. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/nat/tag_check.py +0 -0
  156. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/profile/__init__.py +0 -0
  157. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/profile/info.py +0 -0
  158. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/rds/__init__.py +0 -0
  159. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/rds/info.py +0 -0
  160. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/rds/tag_check.py +0 -0
  161. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/s3/__init__.py +0 -0
  162. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/s3/info.py +0 -0
  163. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/s3/tag_check.py +0 -0
  164. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/sg/__init__.py +0 -0
  165. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/sg/info.py +0 -0
  166. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/vpc/__init__.py +0 -0
  167. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/vpc/info.py +0 -0
  168. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/vpc/tag_check.py +0 -0
  169. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/vpn/__init__.py +0 -0
  170. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/aws/vpn/info.py +0 -0
  171. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/azure/README.md +0 -0
  172. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/azure/__init__.py +0 -0
  173. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/azure/aci/__init__.py +0 -0
  174. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/azure/aci/info.py +0 -0
  175. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/azure/aks/__init__.py +0 -0
  176. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/azure/aks/info.py +0 -0
  177. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/azure/lb/__init__.py +0 -0
  178. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/azure/lb/info.py +0 -0
  179. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/azure/nsg/__init__.py +0 -0
  180. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/azure/nsg/info.py +0 -0
  181. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/azure/storage/__init__.py +0 -0
  182. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/azure/storage/info.py +0 -0
  183. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/azure/vm/__init__.py +0 -0
  184. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/azure/vm/info.py +0 -0
  185. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/azure/vm/mock_data.json +0 -0
  186. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/azure/vnet/__init__.py +0 -0
  187. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/azure/vnet/info.py +0 -0
  188. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/azure/vnet/mock_data.json +0 -0
  189. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/cloudflare/README.md +0 -0
  190. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/cloudflare/__init__.py +0 -0
  191. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/cloudflare/dns/__init__.py +0 -0
  192. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/cloudflare/dns/list_info.py +0 -0
  193. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/README.md +0 -0
  194. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/__init__.py +0 -0
  195. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/billing/__init__.py +0 -0
  196. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/billing/info.py +0 -0
  197. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/billing/mock_data.json +0 -0
  198. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/compute/__init__.py +0 -0
  199. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/compute/info.py +0 -0
  200. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/compute/mock_data.json +0 -0
  201. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/firewall/__init__.py +0 -0
  202. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/firewall/info.py +0 -0
  203. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/functions/__init__.py +0 -0
  204. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/functions/info.py +0 -0
  205. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/gke/__init__.py +0 -0
  206. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/gke/info.py +0 -0
  207. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/gke/mock_data.json +0 -0
  208. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/lb/__init__.py +0 -0
  209. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/lb/info.py +0 -0
  210. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/run/__init__.py +0 -0
  211. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/run/info.py +0 -0
  212. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/sql/__init__.py +0 -0
  213. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/sql/info.py +0 -0
  214. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/storage/__init__.py +0 -0
  215. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/storage/info.py +0 -0
  216. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/vpc/__init__.py +0 -0
  217. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/vpc/info.py +0 -0
  218. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/gcp/vpc/mock_data.json +0 -0
  219. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncp/__init__.py +0 -0
  220. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncp/client.py +0 -0
  221. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncp/ec2/__init__.py +0 -0
  222. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncp/ec2/info.py +0 -0
  223. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncp/rds/__init__.py +0 -0
  224. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncp/rds/info.py +0 -0
  225. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncp/s3/__init__.py +0 -0
  226. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncp/s3/info.py +0 -0
  227. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncp/sg/__init__.py +0 -0
  228. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncp/sg/info.py +0 -0
  229. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncp/vpc/__init__.py +0 -0
  230. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncp/vpc/info.py +0 -0
  231. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncpgov/__init__.py +0 -0
  232. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncpgov/client.py +0 -0
  233. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncpgov/ec2/__init__.py +0 -0
  234. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncpgov/ec2/info.py +0 -0
  235. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncpgov/rds/__init__.py +0 -0
  236. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncpgov/rds/info.py +0 -0
  237. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncpgov/s3/__init__.py +0 -0
  238. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncpgov/s3/info.py +0 -0
  239. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncpgov/sg/__init__.py +0 -0
  240. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncpgov/sg/info.py +0 -0
  241. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncpgov/vpc/__init__.py +0 -0
  242. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ncpgov/vpc/info.py +0 -0
  243. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/README.md +0 -0
  244. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/__init__.py +0 -0
  245. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/common/__init__.py +0 -0
  246. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/common/utils.py +0 -0
  247. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/compartment/__init__.py +0 -0
  248. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/compartment/info.py +0 -0
  249. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/cost/__init__.py +0 -0
  250. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/cost/credit.py +0 -0
  251. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/cost/usage.py +0 -0
  252. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/info/__init__.py +0 -0
  253. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/info/oci_info.py +0 -0
  254. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/lb/__init__.py +0 -0
  255. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/lb/info.py +0 -0
  256. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/nsg/__init__.py +0 -0
  257. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/nsg/info.py +0 -0
  258. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/obj/__init__.py +0 -0
  259. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/obj/info.py +0 -0
  260. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/policy/__init__.py +0 -0
  261. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/policy/info.py +0 -0
  262. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/policy/search.py +0 -0
  263. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/vcn/__init__.py +0 -0
  264. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/vcn/info.py +0 -0
  265. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/vm/__init__.py +0 -0
  266. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/vm/info.py +0 -0
  267. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/volume/__init__.py +0 -0
  268. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/oci/volume/info.py +0 -0
  269. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ssh/README.md +0 -0
  270. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ssh/__init__.py +0 -0
  271. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ssh/auto/__init__.py +0 -0
  272. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ssh/auto/scan.py +0 -0
  273. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ssh/auto_ssh.py +0 -0
  274. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ssh/server/__init__.py +0 -0
  275. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ssh/server/info.py +0 -0
  276. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/platforms/ssh/server_info.py +0 -0
  277. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/security/README.md +0 -0
  278. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/security/__init__.py +0 -0
  279. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/security/config.py +0 -0
  280. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/security/detector.py +0 -0
  281. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/security/guidance.py +0 -0
  282. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/security/hooks.py +0 -0
  283. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/security/patterns.py +0 -0
  284. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic/security/scanner.py +0 -0
  285. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic_code.egg-info/dependency_links.txt +0 -0
  286. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic_code.egg-info/entry_points.txt +0 -0
  287. {ic_code-1.1.10 → ic_code-1.2.2}/src/ic_code.egg-info/top_level.txt +0 -0
  288. {ic_code-1.1.10 → ic_code-1.2.2}/src/mcp/__init__.py +0 -0
  289. {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.1.10
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<31.0.0,>=29.0.0
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<31.0.0,>=29.1.0
49
- Requires-Dist: azure-mgmt-network<26.0.0,>=24.0.0
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<30.0.0,>=28.0.0
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<24.0.0,>=22.0.0
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<7.0.0,>=6.0
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<4.0.0,>=3.0.0
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<71.0,>=61.0
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.1.10"
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.12
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,<31.0.0", # Kubernetes Python client
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.12
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.12
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.1.0,<31.0.0", # Azure Virtual Machines management
56
- "azure-mgmt-network>=24.0.0,<26.0.0", # Azure networking management
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,<30.0.0", # Azure Kubernetes Service
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,<24.0.0", # Azure Resource Manager
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.12
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,<7.0.0", # YAML parser (required for NCP config files)
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.12
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.12
88
- "watchdog>=3.0.0,<4.0.0", # File change monitoring
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,<71.0", # Package building tools
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.1.10"
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', ['User', 'Team', 'Environment'])
46
- optional_tags = aws_tags.get('optional', ['Service', 'Application'])
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', ['User', 'Team', 'Environment'])
49
- optional_tags = aws_tags.get('optional', ['Service', 'Application'])
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
- load_dotenv()
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
- # .env에서 공통 태그 키를 읽기 (EC2 / LB와 동일)
26
- env_required = os.getenv("REQUIRED_TAGS", "User,Team,Environment")
27
- env_optional = os.getenv("OPTIONAL_TAGS", "Service,Application")
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
- required_tags = [t.strip() for t in env_required.split(",") if t.strip()]
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
- load_dotenv()
18
- console = Console()
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
- # .env에서 공통 태그 키 불러오기
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
- required_tags = [t.strip() for t in env_required.split(",") if t.strip()]
25
- optional_tags = [t.strip() for t in env_optional.split(",") if t.strip()]
26
- TAG_KEYS = required_tags + optional_tags
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
- load_dotenv()
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
- env_required = os.getenv("REQUIRED_TAGS", "User,Team,Environment")
22
- env_optional = os.getenv("OPTIONAL_TAGS", "Service,Application")
23
- required_tags = [t.strip() for t in env_required.split(",") if t.strip()]
24
- optional_tags = [t.strip() for t in env_optional.split(",") if t.strip()]
25
- TAG_KEYS = required_tags + optional_tags
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', ['User', 'Team', 'Environment'])
49
- optional_tags = aws_tags.get('optional', ['Service', 'Application'])
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.1.10
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<31.0.0,>=29.0.0
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<31.0.0,>=29.1.0
49
- Requires-Dist: azure-mgmt-network<26.0.0,>=24.0.0
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<30.0.0,>=28.0.0
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<24.0.0,>=22.0.0
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<7.0.0,>=6.0
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<4.0.0,>=3.0.0
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<71.0,>=61.0
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