From 3e757d16359f5c7e1eb704d6fff0e412c1652a14 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Fri, 12 Dec 2025 22:38:28 +0000 Subject: [PATCH 1/2] feat: Add sync summary table and fix syntax error - Added a neat summary table at the end of execution showing profile ID, folder count, rule count, and status. - Fixed a SyntaxError in `create_folder` where `_api_post` was called with incorrect argument order. - Improved UX by providing a clear overview of the sync operation results. --- main.py | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/main.py b/main.py index 0355a19..145ecfa 100644 --- a/main.py +++ b/main.py @@ -227,9 +227,9 @@ def create_folder(client: httpx.Client, profile_id: str, name: str, do: int, sta """ try: _api_post( + client, f"{API_BASE}/{profile_id}/groups", data={"name": name, "do": do, "status": status}, - client, ) # Re-fetch the list and pick the folder we just created @@ -458,16 +458,50 @@ def main(): plan: List[Dict[str, Any]] = [] success_count = 0 + sync_results = [] + for profile_id in (profile_ids or ["dry-run-placeholder"]): log.info("Starting sync for profile %s", profile_id) - if sync_profile(profile_id, folder_urls, dry_run=args.dry_run, no_delete=args.no_delete, plan_accumulator=plan): + status = sync_profile( + profile_id, + folder_urls, + dry_run=args.dry_run, + no_delete=args.no_delete, + plan_accumulator=plan, + ) + + if status: success_count += 1 + # Calculate stats for this profile from the plan + entry = next((p for p in plan if p["profile"] == profile_id), None) + folder_count = len(entry["folders"]) if entry else 0 + rule_count = sum(f["rules"] for f in entry["folders"]) if entry else 0 + + sync_results.append({ + "profile": profile_id, + "folders": folder_count, + "rules": rule_count, + "status": "✅ Success" if status else "❌ Failed", + }) + if args.plan_json: with open(args.plan_json, "w", encoding="utf-8") as f: json.dump(plan, f, indent=2) log.info("Plan written to %s", args.plan_json) + # Print Summary Table + print("\n" + "=" * 80) + print(f"{'SYNC SUMMARY':^80}") + print("=" * 80) + print(f"{'Profile ID':<25} | {'Folders':<10} | {'Rules':<10} | {'Status':<15}") + print("-" * 80) + for res in sync_results: + print( + f"{res['profile']:<25} | {res['folders']:<10} | {res['rules']:<10,} | {res['status']:<15}" + ) + print("=" * 80 + "\n") + total = len(profile_ids or ["dry-run-placeholder"]) log.info(f"All profiles processed: {success_count}/{total} successful") exit(0 if success_count == total else 1) From f06cd44aa27048ff8725d45fca137656ce81bf22 Mon Sep 17 00:00:00 2001 From: Abhi Mehrotra Date: Fri, 12 Dec 2025 18:26:04 -0600 Subject: [PATCH 2/2] Update main.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main.py b/main.py index 145ecfa..3690ff7 100644 --- a/main.py +++ b/main.py @@ -494,11 +494,11 @@ def main(): print("\n" + "=" * 80) print(f"{'SYNC SUMMARY':^80}") print("=" * 80) - print(f"{'Profile ID':<25} | {'Folders':<10} | {'Rules':<10} | {'Status':<15}") + print(f"{'Profile ID':<25} | {'Folders':>10} | {'Rules':>10} | {'Status':<15}") print("-" * 80) for res in sync_results: print( - f"{res['profile']:<25} | {res['folders']:<10} | {res['rules']:<10,} | {res['status']:<15}" + f"{res['profile']:<25} | {res['folders']:>10} | {res['rules']:>10,} | {res['status']:<15}" ) print("=" * 80 + "\n")