22import difflib
33from rich .console import Console
44from rich .text import Text
5-
5+ import typer
66def clean_policy (policy ):
77 """
88 Remove empty statements ({} entries) from the policy's 'Statement' list.
@@ -13,21 +13,21 @@ def clean_policy(policy):
1313 policy ["Statement" ] = [s for s in statements if s ]
1414 return policy
1515
16- def detect_drift (local_doc : dict , aws_doc : dict ) -> bool :
17- """
18- Detect if the local policy would remove permissions from the AWS policy.
19- Returns True if drift is detected, False otherwise.
20- """
21- local_doc = clean_policy (local_doc )
22- aws_doc = clean_policy (aws_doc )
16+ def detect_drift (local_doc , aws_doc ) -> bool :
17+ """Detect removal drift: AWS has permissions missing from local (danger)."""
18+ local_statements = {json .dumps (s , sort_keys = True ) for s in local_doc .get ("Statement" , [])}
19+ aws_statements = {json .dumps (s , sort_keys = True ) for s in aws_doc .get ("Statement" , [])}
20+
21+ missing_in_local = aws_statements - local_statements
2322
24- local_statements = local_doc .get ("Statement" , [])
25- aws_statements = aws_doc .get ("Statement" , [])
23+ if missing_in_local :
24+ typer .echo ("❌ Drift detected: Local is missing permissions present in AWS." )
25+ # No need to print each JSON line — rich diff will handle details
26+ return True
2627
27- # Check if any AWS statement is missing in local (i.e., local would remove something )
28- missing_in_local = [ stmt for stmt in aws_statements if stmt not in local_statements ]
28+ typer . echo ( "✅ No removal drift detected ( local may have extra permissions; that's fine)." )
29+ return False
2930
30- return bool (missing_in_local )
3131
3232def generate_diff_lines (local_doc : dict , aws_doc : dict ):
3333 """
0 commit comments