runbooks 1.1.4__py3-none-any.whl → 1.1.6__py3-none-any.whl

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 (273) hide show
  1. runbooks/__init__.py +31 -2
  2. runbooks/__init___optimized.py +18 -4
  3. runbooks/_platform/__init__.py +1 -5
  4. runbooks/_platform/core/runbooks_wrapper.py +141 -138
  5. runbooks/aws2/accuracy_validator.py +812 -0
  6. runbooks/base.py +7 -0
  7. runbooks/cfat/assessment/compliance.py +1 -1
  8. runbooks/cfat/assessment/runner.py +1 -0
  9. runbooks/cfat/cloud_foundations_assessment.py +227 -239
  10. runbooks/cli/__init__.py +1 -1
  11. runbooks/cli/commands/cfat.py +64 -23
  12. runbooks/cli/commands/finops.py +1005 -54
  13. runbooks/cli/commands/inventory.py +135 -91
  14. runbooks/cli/commands/operate.py +9 -36
  15. runbooks/cli/commands/security.py +42 -18
  16. runbooks/cli/commands/validation.py +432 -18
  17. runbooks/cli/commands/vpc.py +81 -17
  18. runbooks/cli/registry.py +22 -10
  19. runbooks/cloudops/__init__.py +20 -27
  20. runbooks/cloudops/base.py +96 -107
  21. runbooks/cloudops/cost_optimizer.py +544 -542
  22. runbooks/cloudops/infrastructure_optimizer.py +5 -4
  23. runbooks/cloudops/interfaces.py +224 -225
  24. runbooks/cloudops/lifecycle_manager.py +5 -4
  25. runbooks/cloudops/mcp_cost_validation.py +252 -235
  26. runbooks/cloudops/models.py +78 -53
  27. runbooks/cloudops/monitoring_automation.py +5 -4
  28. runbooks/cloudops/notebook_framework.py +177 -213
  29. runbooks/cloudops/security_enforcer.py +125 -159
  30. runbooks/common/accuracy_validator.py +17 -12
  31. runbooks/common/aws_pricing.py +349 -326
  32. runbooks/common/aws_pricing_api.py +211 -212
  33. runbooks/common/aws_profile_manager.py +40 -36
  34. runbooks/common/aws_utils.py +74 -79
  35. runbooks/common/business_logic.py +126 -104
  36. runbooks/common/cli_decorators.py +36 -60
  37. runbooks/common/comprehensive_cost_explorer_integration.py +455 -463
  38. runbooks/common/cross_account_manager.py +197 -204
  39. runbooks/common/date_utils.py +27 -39
  40. runbooks/common/decorators.py +29 -19
  41. runbooks/common/dry_run_examples.py +173 -208
  42. runbooks/common/dry_run_framework.py +157 -155
  43. runbooks/common/enhanced_exception_handler.py +15 -4
  44. runbooks/common/enhanced_logging_example.py +50 -64
  45. runbooks/common/enhanced_logging_integration_example.py +65 -37
  46. runbooks/common/env_utils.py +16 -16
  47. runbooks/common/error_handling.py +40 -38
  48. runbooks/common/lazy_loader.py +41 -23
  49. runbooks/common/logging_integration_helper.py +79 -86
  50. runbooks/common/mcp_cost_explorer_integration.py +476 -493
  51. runbooks/common/mcp_integration.py +99 -79
  52. runbooks/common/memory_optimization.py +140 -118
  53. runbooks/common/module_cli_base.py +37 -58
  54. runbooks/common/organizations_client.py +175 -193
  55. runbooks/common/patterns.py +23 -25
  56. runbooks/common/performance_monitoring.py +67 -71
  57. runbooks/common/performance_optimization_engine.py +283 -274
  58. runbooks/common/profile_utils.py +111 -37
  59. runbooks/common/rich_utils.py +315 -141
  60. runbooks/common/sre_performance_suite.py +177 -186
  61. runbooks/enterprise/__init__.py +1 -1
  62. runbooks/enterprise/logging.py +144 -106
  63. runbooks/enterprise/security.py +187 -204
  64. runbooks/enterprise/validation.py +43 -56
  65. runbooks/finops/__init__.py +26 -30
  66. runbooks/finops/account_resolver.py +1 -1
  67. runbooks/finops/advanced_optimization_engine.py +980 -0
  68. runbooks/finops/automation_core.py +268 -231
  69. runbooks/finops/business_case_config.py +184 -179
  70. runbooks/finops/cli.py +660 -139
  71. runbooks/finops/commvault_ec2_analysis.py +157 -164
  72. runbooks/finops/compute_cost_optimizer.py +336 -320
  73. runbooks/finops/config.py +20 -20
  74. runbooks/finops/cost_optimizer.py +484 -618
  75. runbooks/finops/cost_processor.py +332 -214
  76. runbooks/finops/dashboard_runner.py +1006 -172
  77. runbooks/finops/ebs_cost_optimizer.py +991 -657
  78. runbooks/finops/elastic_ip_optimizer.py +317 -257
  79. runbooks/finops/enhanced_mcp_integration.py +340 -0
  80. runbooks/finops/enhanced_progress.py +32 -29
  81. runbooks/finops/enhanced_trend_visualization.py +3 -2
  82. runbooks/finops/enterprise_wrappers.py +223 -285
  83. runbooks/finops/executive_export.py +203 -160
  84. runbooks/finops/helpers.py +130 -288
  85. runbooks/finops/iam_guidance.py +1 -1
  86. runbooks/finops/infrastructure/__init__.py +80 -0
  87. runbooks/finops/infrastructure/commands.py +506 -0
  88. runbooks/finops/infrastructure/load_balancer_optimizer.py +866 -0
  89. runbooks/finops/infrastructure/vpc_endpoint_optimizer.py +832 -0
  90. runbooks/finops/markdown_exporter.py +337 -174
  91. runbooks/finops/mcp_validator.py +1952 -0
  92. runbooks/finops/nat_gateway_optimizer.py +1512 -481
  93. runbooks/finops/network_cost_optimizer.py +657 -587
  94. runbooks/finops/notebook_utils.py +226 -188
  95. runbooks/finops/optimization_engine.py +1136 -0
  96. runbooks/finops/optimizer.py +19 -23
  97. runbooks/finops/rds_snapshot_optimizer.py +367 -411
  98. runbooks/finops/reservation_optimizer.py +427 -363
  99. runbooks/finops/scenario_cli_integration.py +64 -65
  100. runbooks/finops/scenarios.py +1277 -438
  101. runbooks/finops/schemas.py +218 -182
  102. runbooks/finops/snapshot_manager.py +2289 -0
  103. runbooks/finops/types.py +3 -3
  104. runbooks/finops/validation_framework.py +259 -265
  105. runbooks/finops/vpc_cleanup_exporter.py +189 -144
  106. runbooks/finops/vpc_cleanup_optimizer.py +591 -573
  107. runbooks/finops/workspaces_analyzer.py +171 -182
  108. runbooks/integration/__init__.py +89 -0
  109. runbooks/integration/mcp_integration.py +1920 -0
  110. runbooks/inventory/CLAUDE.md +816 -0
  111. runbooks/inventory/__init__.py +2 -2
  112. runbooks/inventory/aws_decorators.py +2 -3
  113. runbooks/inventory/check_cloudtrail_compliance.py +2 -4
  114. runbooks/inventory/check_controltower_readiness.py +152 -151
  115. runbooks/inventory/check_landingzone_readiness.py +85 -84
  116. runbooks/inventory/cloud_foundations_integration.py +144 -149
  117. runbooks/inventory/collectors/aws_comprehensive.py +1 -1
  118. runbooks/inventory/collectors/aws_networking.py +109 -99
  119. runbooks/inventory/collectors/base.py +4 -0
  120. runbooks/inventory/core/collector.py +495 -313
  121. runbooks/inventory/core/formatter.py +11 -0
  122. runbooks/inventory/draw_org_structure.py +8 -9
  123. runbooks/inventory/drift_detection_cli.py +69 -96
  124. runbooks/inventory/ec2_vpc_utils.py +2 -2
  125. runbooks/inventory/find_cfn_drift_detection.py +5 -7
  126. runbooks/inventory/find_cfn_orphaned_stacks.py +7 -9
  127. runbooks/inventory/find_cfn_stackset_drift.py +5 -6
  128. runbooks/inventory/find_ec2_security_groups.py +48 -42
  129. runbooks/inventory/find_landingzone_versions.py +4 -6
  130. runbooks/inventory/find_vpc_flow_logs.py +7 -9
  131. runbooks/inventory/inventory_mcp_cli.py +48 -46
  132. runbooks/inventory/inventory_modules.py +103 -91
  133. runbooks/inventory/list_cfn_stacks.py +9 -10
  134. runbooks/inventory/list_cfn_stackset_operation_results.py +1 -3
  135. runbooks/inventory/list_cfn_stackset_operations.py +79 -57
  136. runbooks/inventory/list_cfn_stacksets.py +8 -10
  137. runbooks/inventory/list_config_recorders_delivery_channels.py +49 -39
  138. runbooks/inventory/list_ds_directories.py +65 -53
  139. runbooks/inventory/list_ec2_availability_zones.py +2 -4
  140. runbooks/inventory/list_ec2_ebs_volumes.py +32 -35
  141. runbooks/inventory/list_ec2_instances.py +23 -28
  142. runbooks/inventory/list_ecs_clusters_and_tasks.py +26 -34
  143. runbooks/inventory/list_elbs_load_balancers.py +22 -20
  144. runbooks/inventory/list_enis_network_interfaces.py +26 -33
  145. runbooks/inventory/list_guardduty_detectors.py +2 -4
  146. runbooks/inventory/list_iam_policies.py +2 -4
  147. runbooks/inventory/list_iam_roles.py +5 -7
  148. runbooks/inventory/list_iam_saml_providers.py +4 -6
  149. runbooks/inventory/list_lambda_functions.py +38 -38
  150. runbooks/inventory/list_org_accounts.py +6 -8
  151. runbooks/inventory/list_org_accounts_users.py +55 -44
  152. runbooks/inventory/list_rds_db_instances.py +31 -33
  153. runbooks/inventory/list_rds_snapshots_aggregator.py +192 -208
  154. runbooks/inventory/list_route53_hosted_zones.py +3 -5
  155. runbooks/inventory/list_servicecatalog_provisioned_products.py +37 -41
  156. runbooks/inventory/list_sns_topics.py +2 -4
  157. runbooks/inventory/list_ssm_parameters.py +4 -7
  158. runbooks/inventory/list_vpc_subnets.py +2 -4
  159. runbooks/inventory/list_vpcs.py +7 -10
  160. runbooks/inventory/mcp_inventory_validator.py +554 -468
  161. runbooks/inventory/mcp_vpc_validator.py +359 -442
  162. runbooks/inventory/organizations_discovery.py +63 -55
  163. runbooks/inventory/recover_cfn_stack_ids.py +7 -8
  164. runbooks/inventory/requirements.txt +0 -1
  165. runbooks/inventory/rich_inventory_display.py +35 -34
  166. runbooks/inventory/run_on_multi_accounts.py +3 -5
  167. runbooks/inventory/unified_validation_engine.py +281 -253
  168. runbooks/inventory/verify_ec2_security_groups.py +1 -1
  169. runbooks/inventory/vpc_analyzer.py +735 -697
  170. runbooks/inventory/vpc_architecture_validator.py +293 -348
  171. runbooks/inventory/vpc_dependency_analyzer.py +384 -380
  172. runbooks/inventory/vpc_flow_analyzer.py +1 -1
  173. runbooks/main.py +49 -34
  174. runbooks/main_final.py +91 -60
  175. runbooks/main_minimal.py +22 -10
  176. runbooks/main_optimized.py +131 -100
  177. runbooks/main_ultra_minimal.py +7 -2
  178. runbooks/mcp/__init__.py +36 -0
  179. runbooks/mcp/integration.py +679 -0
  180. runbooks/monitoring/performance_monitor.py +9 -4
  181. runbooks/operate/dynamodb_operations.py +3 -1
  182. runbooks/operate/ec2_operations.py +145 -137
  183. runbooks/operate/iam_operations.py +146 -152
  184. runbooks/operate/networking_cost_heatmap.py +29 -8
  185. runbooks/operate/rds_operations.py +223 -254
  186. runbooks/operate/s3_operations.py +107 -118
  187. runbooks/operate/vpc_operations.py +646 -616
  188. runbooks/remediation/base.py +1 -1
  189. runbooks/remediation/commons.py +10 -7
  190. runbooks/remediation/commvault_ec2_analysis.py +70 -66
  191. runbooks/remediation/ec2_unattached_ebs_volumes.py +1 -0
  192. runbooks/remediation/multi_account.py +24 -21
  193. runbooks/remediation/rds_snapshot_list.py +86 -60
  194. runbooks/remediation/remediation_cli.py +92 -146
  195. runbooks/remediation/universal_account_discovery.py +83 -79
  196. runbooks/remediation/workspaces_list.py +46 -41
  197. runbooks/security/__init__.py +19 -0
  198. runbooks/security/assessment_runner.py +1150 -0
  199. runbooks/security/baseline_checker.py +812 -0
  200. runbooks/security/cloudops_automation_security_validator.py +509 -535
  201. runbooks/security/compliance_automation_engine.py +17 -17
  202. runbooks/security/config/__init__.py +2 -2
  203. runbooks/security/config/compliance_config.py +50 -50
  204. runbooks/security/config_template_generator.py +63 -76
  205. runbooks/security/enterprise_security_framework.py +1 -1
  206. runbooks/security/executive_security_dashboard.py +519 -508
  207. runbooks/security/multi_account_security_controls.py +959 -1210
  208. runbooks/security/real_time_security_monitor.py +422 -444
  209. runbooks/security/security_baseline_tester.py +1 -1
  210. runbooks/security/security_cli.py +143 -112
  211. runbooks/security/test_2way_validation.py +439 -0
  212. runbooks/security/two_way_validation_framework.py +852 -0
  213. runbooks/sre/production_monitoring_framework.py +167 -177
  214. runbooks/tdd/__init__.py +15 -0
  215. runbooks/tdd/cli.py +1071 -0
  216. runbooks/utils/__init__.py +14 -17
  217. runbooks/utils/logger.py +7 -2
  218. runbooks/utils/version_validator.py +50 -47
  219. runbooks/validation/__init__.py +6 -6
  220. runbooks/validation/cli.py +9 -3
  221. runbooks/validation/comprehensive_2way_validator.py +745 -704
  222. runbooks/validation/mcp_validator.py +906 -228
  223. runbooks/validation/terraform_citations_validator.py +104 -115
  224. runbooks/validation/terraform_drift_detector.py +461 -454
  225. runbooks/vpc/README.md +617 -0
  226. runbooks/vpc/__init__.py +8 -1
  227. runbooks/vpc/analyzer.py +577 -0
  228. runbooks/vpc/cleanup_wrapper.py +476 -413
  229. runbooks/vpc/cli_cloudtrail_commands.py +339 -0
  230. runbooks/vpc/cli_mcp_validation_commands.py +480 -0
  231. runbooks/vpc/cloudtrail_audit_integration.py +717 -0
  232. runbooks/vpc/config.py +92 -97
  233. runbooks/vpc/cost_engine.py +411 -148
  234. runbooks/vpc/cost_explorer_integration.py +553 -0
  235. runbooks/vpc/cross_account_session.py +101 -106
  236. runbooks/vpc/enhanced_mcp_validation.py +917 -0
  237. runbooks/vpc/eni_gate_validator.py +961 -0
  238. runbooks/vpc/heatmap_engine.py +185 -160
  239. runbooks/vpc/mcp_no_eni_validator.py +680 -639
  240. runbooks/vpc/nat_gateway_optimizer.py +358 -0
  241. runbooks/vpc/networking_wrapper.py +15 -8
  242. runbooks/vpc/pdca_remediation_planner.py +528 -0
  243. runbooks/vpc/performance_optimized_analyzer.py +219 -231
  244. runbooks/vpc/runbooks_adapter.py +1167 -241
  245. runbooks/vpc/tdd_red_phase_stubs.py +601 -0
  246. runbooks/vpc/test_data_loader.py +358 -0
  247. runbooks/vpc/tests/conftest.py +314 -4
  248. runbooks/vpc/tests/test_cleanup_framework.py +1022 -0
  249. runbooks/vpc/tests/test_cost_engine.py +0 -2
  250. runbooks/vpc/topology_generator.py +326 -0
  251. runbooks/vpc/unified_scenarios.py +1297 -1124
  252. runbooks/vpc/vpc_cleanup_integration.py +1943 -1115
  253. runbooks-1.1.6.dist-info/METADATA +327 -0
  254. runbooks-1.1.6.dist-info/RECORD +489 -0
  255. runbooks/finops/README.md +0 -414
  256. runbooks/finops/accuracy_cross_validator.py +0 -647
  257. runbooks/finops/business_cases.py +0 -950
  258. runbooks/finops/dashboard_router.py +0 -922
  259. runbooks/finops/ebs_optimizer.py +0 -973
  260. runbooks/finops/embedded_mcp_validator.py +0 -1629
  261. runbooks/finops/enhanced_dashboard_runner.py +0 -527
  262. runbooks/finops/finops_dashboard.py +0 -584
  263. runbooks/finops/finops_scenarios.py +0 -1218
  264. runbooks/finops/legacy_migration.py +0 -730
  265. runbooks/finops/multi_dashboard.py +0 -1519
  266. runbooks/finops/single_dashboard.py +0 -1113
  267. runbooks/finops/unlimited_scenarios.py +0 -393
  268. runbooks-1.1.4.dist-info/METADATA +0 -800
  269. runbooks-1.1.4.dist-info/RECORD +0 -468
  270. {runbooks-1.1.4.dist-info → runbooks-1.1.6.dist-info}/WHEEL +0 -0
  271. {runbooks-1.1.4.dist-info → runbooks-1.1.6.dist-info}/entry_points.txt +0 -0
  272. {runbooks-1.1.4.dist-info → runbooks-1.1.6.dist-info}/licenses/LICENSE +0 -0
  273. {runbooks-1.1.4.dist-info → runbooks-1.1.6.dist-info}/top_level.txt +0 -0
@@ -22,94 +22,82 @@ def get_current_year() -> int:
22
22
  def get_current_month_period() -> Dict[str, str]:
23
23
  """
24
24
  Generate current month's start and end dates for AWS API calls.
25
-
25
+
26
26
  Returns:
27
27
  Dict with 'Start' and 'End' keys in YYYY-MM-DD format
28
28
  """
29
29
  now = datetime.now()
30
- start_date = now.replace(day=1).strftime('%Y-%m-%d')
31
-
30
+ start_date = now.replace(day=1).strftime("%Y-%m-%d")
31
+
32
32
  # Get last day of current month
33
33
  if now.month == 12:
34
34
  next_month = now.replace(year=now.year + 1, month=1, day=1)
35
35
  else:
36
36
  next_month = now.replace(month=now.month + 1, day=1)
37
-
38
- end_date = (next_month - timedelta(days=1)).strftime('%Y-%m-%d')
39
-
40
- return {
41
- 'Start': start_date,
42
- 'End': end_date
43
- }
37
+
38
+ end_date = (next_month - timedelta(days=1)).strftime("%Y-%m-%d")
39
+
40
+ return {"Start": start_date, "End": end_date}
44
41
 
45
42
 
46
43
  def get_previous_month_period() -> Dict[str, str]:
47
44
  """
48
45
  Generate previous month's start and end dates for AWS API calls.
49
-
46
+
50
47
  Returns:
51
48
  Dict with 'Start' and 'End' keys in YYYY-MM-DD format
52
49
  """
53
50
  now = datetime.now()
54
-
51
+
55
52
  # Get first day of previous month
56
53
  if now.month == 1:
57
54
  prev_month = now.replace(year=now.year - 1, month=12, day=1)
58
55
  else:
59
56
  prev_month = now.replace(month=now.month - 1, day=1)
60
-
61
- start_date = prev_month.strftime('%Y-%m-%d')
62
-
63
- # Get last day of previous month
64
- end_date = (now.replace(day=1) - timedelta(days=1)).strftime('%Y-%m-%d')
65
-
66
- return {
67
- 'Start': start_date,
68
- 'End': end_date
69
- }
57
+
58
+ start_date = prev_month.strftime("%Y-%m-%d")
59
+
60
+ # Get last day of previous month
61
+ end_date = (now.replace(day=1) - timedelta(days=1)).strftime("%Y-%m-%d")
62
+
63
+ return {"Start": start_date, "End": end_date}
70
64
 
71
65
 
72
66
  def get_test_date_period(days_back: int = 30) -> Dict[str, str]:
73
67
  """
74
68
  Generate test date periods for consistent test data.
75
-
69
+
76
70
  Args:
77
71
  days_back: Number of days back from today for start date
78
-
72
+
79
73
  Returns:
80
74
  Dict with 'Start' and 'End' keys in YYYY-MM-DD format
81
75
  """
82
- end_date = datetime.now().strftime('%Y-%m-%d')
83
- start_date = (datetime.now() - timedelta(days=days_back)).strftime('%Y-%m-%d')
84
-
85
- return {
86
- 'Start': start_date,
87
- 'End': end_date
88
- }
76
+ end_date = datetime.now().strftime("%Y-%m-%d")
77
+ start_date = (datetime.now() - timedelta(days=days_back)).strftime("%Y-%m-%d")
78
+
79
+ return {"Start": start_date, "End": end_date}
89
80
 
90
81
 
91
82
  def get_aws_cli_example_period() -> Tuple[str, str]:
92
83
  """
93
84
  Generate example date period for AWS CLI documentation.
94
85
  Uses yesterday and today to ensure valid time range.
95
-
86
+
96
87
  Returns:
97
88
  Tuple of (start_date, end_date) in YYYY-MM-DD format
98
89
  """
99
90
  today = datetime.now()
100
91
  yesterday = today - timedelta(days=1)
101
-
102
- return (
103
- yesterday.strftime('%Y-%m-%d'),
104
- today.strftime('%Y-%m-%d')
105
- )
92
+
93
+ return (yesterday.strftime("%Y-%m-%d"), today.strftime("%Y-%m-%d"))
106
94
 
107
95
 
108
96
  def get_collection_timestamp() -> str:
109
97
  """
110
98
  Generate collection timestamp for test data.
111
-
99
+
112
100
  Returns:
113
101
  ISO format timestamp string
114
102
  """
115
- return datetime.now().isoformat()
103
+ return datetime.now().isoformat()
@@ -41,8 +41,13 @@ def common_output_options(f):
41
41
  - --format: Output format selection (table, csv, json, markdown, pdf)
42
42
  - --output-file: File output destination
43
43
  """
44
- f = click.option("--format", "output_format", type=click.Choice(['table', 'csv', 'json', 'markdown', 'pdf']),
45
- default='table', help="Output format")(f)
44
+ f = click.option(
45
+ "--format",
46
+ "output_format",
47
+ type=click.Choice(["table", "csv", "json", "markdown", "pdf"]),
48
+ default="table",
49
+ help="Output format",
50
+ )(f)
46
51
  f = click.option("--output-file", type=click.Path(), help="Output file path")(f)
47
52
  return f
48
53
 
@@ -69,6 +74,7 @@ def performance_timing(f):
69
74
  Automatically tracks and reports command execution time for performance
70
75
  monitoring and optimization analysis.
71
76
  """
77
+
72
78
  @functools.wraps(f)
73
79
  def wrapper(*args, **kwargs):
74
80
  start_time = time.time()
@@ -98,6 +104,7 @@ def error_handler(f):
98
104
  - Consistent error message structure
99
105
  - Debug information when enabled
100
106
  """
107
+
101
108
  @functools.wraps(f)
102
109
  def wrapper(*args, **kwargs):
103
110
  try:
@@ -124,14 +131,16 @@ def require_aws_profile(f):
124
131
  Validates that the AWS profile exists and is accessible before
125
132
  executing commands that require AWS API access.
126
133
  """
134
+
127
135
  @functools.wraps(f)
128
136
  def wrapper(*args, **kwargs):
129
137
  # Get profile from context or kwargs
130
138
  ctx = click.get_current_context()
131
- profile = ctx.obj.get('profile', 'default')
139
+ profile = ctx.obj.get("profile", "default")
132
140
 
133
141
  try:
134
142
  import boto3
143
+
135
144
  # Test profile access
136
145
  session = boto3.Session(profile_name=profile)
137
146
  session.get_credentials()
@@ -154,36 +163,37 @@ def enterprise_audit_trail(f):
154
163
  - User context and timestamp
155
164
  - Execution results and duration
156
165
  """
166
+
157
167
  @functools.wraps(f)
158
168
  def wrapper(*args, **kwargs):
159
169
  ctx = click.get_current_context()
160
170
 
161
171
  # Log command execution start
162
172
  audit_data = {
163
- 'command': ctx.command.name,
164
- 'profile': ctx.obj.get('profile', 'default'),
165
- 'region': ctx.obj.get('region', 'default'),
166
- 'dry_run': ctx.obj.get('dry_run', False),
167
- 'timestamp': time.time()
173
+ "command": ctx.command.name,
174
+ "profile": ctx.obj.get("profile", "default"),
175
+ "region": ctx.obj.get("region", "default"),
176
+ "dry_run": ctx.obj.get("dry_run", False),
177
+ "timestamp": time.time(),
168
178
  }
169
179
 
170
180
  try:
171
181
  result = f(*args, **kwargs)
172
- audit_data['status'] = 'success'
173
- audit_data['duration'] = time.time() - audit_data['timestamp']
182
+ audit_data["status"] = "success"
183
+ audit_data["duration"] = time.time() - audit_data["timestamp"]
174
184
 
175
185
  # Log successful execution
176
- if ctx.obj.get('debug'):
186
+ if ctx.obj.get("debug"):
177
187
  console.print(f"[dim]📋 Audit: {audit_data}[/dim]")
178
188
 
179
189
  return result
180
190
  except Exception as e:
181
- audit_data['status'] = 'error'
182
- audit_data['error'] = str(e)
183
- audit_data['duration'] = time.time() - audit_data['timestamp']
191
+ audit_data["status"] = "error"
192
+ audit_data["error"] = str(e)
193
+ audit_data["duration"] = time.time() - audit_data["timestamp"]
184
194
 
185
195
  # Log failed execution
186
- if ctx.obj.get('debug'):
196
+ if ctx.obj.get("debug"):
187
197
  console.print(f"[dim]📋 Audit: {audit_data}[/dim]")
188
198
 
189
199
  raise
@@ -201,15 +211,14 @@ def rich_progress(description: str = "Processing"):
201
211
  Automatically shows a progress spinner for operations that take time,
202
212
  improving user experience for long-running commands.
203
213
  """
214
+
204
215
  def decorator(f):
205
216
  @functools.wraps(f)
206
217
  def wrapper(*args, **kwargs):
207
218
  from rich.progress import Progress, SpinnerColumn, TextColumn
208
219
 
209
220
  with Progress(
210
- SpinnerColumn(),
211
- TextColumn("[progress.description]{task.description}"),
212
- console=console
221
+ SpinnerColumn(), TextColumn("[progress.description]{task.description}"), console=console
213
222
  ) as progress:
214
223
  task = progress.add_task(description, total=None)
215
224
 
@@ -222,4 +231,5 @@ def rich_progress(description: str = "Processing"):
222
231
  raise
223
232
 
224
233
  return wrapper
225
- return decorator
234
+
235
+ return decorator