1717ProjectOpt = Annotated [Optional [str ], typer .Option ("--project" , help = "GCP/Emulator project id" )]
1818EmulatorHostOpt = Annotated [Optional [str ], typer .Option ("--emulator-host" , help = "Emulator host, e.g. localhost:8010" )]
1919LogLevelOpt = Annotated [Optional [str ], typer .Option ("--log-level" , help = "Logging level" )]
20- NamespacesOpt = Annotated [
21- Optional [List [str ]],
22- typer .Option ("--namespace" , "-n" , help = "Namespaces to process (omit to process all)" )
23- ]
2420KindsOpt = Annotated [
2521 Optional [List [str ]],
26- typer .Option ("--kind" , "-k" , help = "Kinds to process (omit to process all in each namespace)" )
22+ typer .Option ("--kind" , "-k" , help = "Kinds to process (omit or empty to process all in each namespace)" )
2723]
28- SingleNamespaceOpt = Annotated [Optional [str ], typer .Option ("--namespace" , "-n" , help = "Namespace to query (omit to use all)" )]
2924SingleKindOpt = Annotated [Optional [str ], typer .Option ("--kind" , "-k" , help = "Kind to analyze (falls back to config.kind)" )]
3025
31-
3226def _load_cfg (
3327 config_path : Optional [str ],
3428 project : Optional [str ],
@@ -44,25 +38,22 @@ def _load_cfg(
4438 overrides ["log_level" ] = log_level
4539 return load_config (config_path , overrides )
4640
47-
4841@app .command ("analyze-kinds" )
4942def cmd_analyze_kinds (
5043 config : ConfigOpt = None ,
5144 project : ProjectOpt = None ,
5245 emulator_host : EmulatorHostOpt = None ,
5346 log_level : LogLevelOpt = None ,
54- namespace : NamespacesOpt = None ,
5547 kind : KindsOpt = None ,
5648 output : Annotated [Optional [str ], typer .Option ("--output" , help = "Output CSV file path" )] = None ,
5749):
5850 cfg = _load_cfg (config , project , emulator_host , log_level )
5951
60- if namespace :
61- cfg .namespaces = list (namespace )
62- if kind :
63- cfg .kinds = list (kind )
64-
52+ if kind is not None :
53+ # Normalise: treat [""] as empty (all kinds)
54+ cfg .kinds = [k for k in kind if k ] # drop empty strings
6555 rows = analyze_kinds (cfg )
56+
6657 if output :
6758 with open (output , "w" , encoding = "utf-8" ) as fh :
6859 fh .write ("namespace,kind,count,size,bytes\n " )
@@ -73,11 +64,10 @@ def cmd_analyze_kinds(
7364 else :
7465 print_summary_table (rows )
7566
76-
7767@app .command ("analyze-fields" )
7868def cmd_analyze_fields (
7969 kind : SingleKindOpt = None ,
80- namespace : SingleNamespaceOpt = None ,
70+ namespace : Annotated [ Optional [ str ], typer . Option ( "--namespace" , "-n" , help = "Namespace to query (omit to use all)" )] = None ,
8171 group_by : Annotated [Optional [str ], typer .Option ("--group-by" , help = "Group results by this field value (falls back to config.group_by_field)" )] = None ,
8272 only_field : Annotated [Optional [List [str ]], typer .Option ("--only-field" , help = "Only consider these fields" )] = None ,
8373 config : ConfigOpt = None ,
@@ -100,7 +90,7 @@ def cmd_analyze_fields(
10090 kind = target_kind ,
10191 namespace = target_namespace ,
10292 group_by_field = group_by_field ,
103- only_fields = list ( only_field ) if only_field else None ,
93+ only_fields = [ f for f in only_field ] if only_field else None ,
10494 )
10595
10696 if output_json :
@@ -110,14 +100,12 @@ def cmd_analyze_fields(
110100 else :
111101 print_field_summary (result )
112102
113-
114103@app .command ("cleanup" )
115104def cmd_cleanup (
116105 config : ConfigOpt = None ,
117106 project : ProjectOpt = None ,
118107 emulator_host : EmulatorHostOpt = None ,
119108 log_level : LogLevelOpt = None ,
120- namespace : NamespacesOpt = None ,
121109 kind : KindsOpt = None ,
122110 ttl_field : Annotated [Optional [str ], typer .Option ("--ttl-field" , help = "TTL field name (falls back to config.ttl_field)" )] = None ,
123111 delete_missing_ttl : Annotated [Optional [bool ], typer .Option ("--delete-missing-ttl" , help = "Delete when TTL field is missing (falls back to config.delete_missing_ttl)" )] = None ,
@@ -126,10 +114,8 @@ def cmd_cleanup(
126114):
127115 cfg = _load_cfg (config , project , emulator_host , log_level )
128116
129- if namespace :
130- cfg .namespaces = list (namespace )
131- if kind :
132- cfg .kinds = list (kind )
117+ if kind is not None :
118+ cfg .kinds = [k for k in kind if k ]
133119 if ttl_field is not None :
134120 cfg .ttl_field = ttl_field
135121 if delete_missing_ttl is not None :
@@ -141,6 +127,5 @@ def cmd_cleanup(
141127 deleted_sum = sum (totals .values ())
142128 typer .echo (f"Total entities { 'to delete' if dry_run else 'deleted' } : { deleted_sum } " )
143129
144-
145130if __name__ == "__main__" :
146131 app ()
0 commit comments