From fd7488bd04334df21998e890992b72991e8bd4d1 Mon Sep 17 00:00:00 2001 From: Edward Betts Date: Tue, 12 Aug 2025 10:59:56 +0100 Subject: [PATCH] Move format_launch_changes to agenda.thespacedevs --- agenda/thespacedevs.py | 65 ++++++++++++++++++++++++++++++++++++++++ update.py | 67 +----------------------------------------- 2 files changed, 66 insertions(+), 66 deletions(-) diff --git a/agenda/thespacedevs.py b/agenda/thespacedevs.py index b839065..d5311a2 100644 --- a/agenda/thespacedevs.py +++ b/agenda/thespacedevs.py @@ -183,3 +183,68 @@ def get_launches( filename = os.path.join(rocket_dir, f) data = json.load(open(filename)) return [summarize_launch(launch) for launch in data["results"]] + + +def format_launch_changes(differences: StrDict) -> str: + """Convert deepdiff output to human-readable format.""" + changes = [] + # Handle value changes + if "values_changed" in differences: + for path, change in differences["values_changed"].items(): + field = path.replace("root['", "").replace("']", "").replace("root.", "") + old_val = change["old_value"] + new_val = change["new_value"] + # Format specific fields nicely + if field == "net": + try: + old_dt = datetime.fromisoformat(old_val.replace("Z", "+00:00")) + new_dt = datetime.fromisoformat(new_val.replace("Z", "+00:00")) + changes.append( + "Launch time changed from " + + old_dt.strftime("%d %b %Y at %H:%M UTC") + + " to " + + new_dt.strftime("%d %b %Y at %H:%M UTC") + ) + except: + changes.append(f"Launch time changed from {old_val} to {new_val}") + elif field == "name": + changes.append(f"Mission name changed from '{old_val}' to '{new_val}'") + elif field == "probability": + if old_val is None: + changes.append(f"Launch probability set to {new_val}%") + elif new_val is None: + changes.append("Launch probability removed") + else: + changes.append( + f"Launch probability changed from {old_val}% to {new_val}%" + ) + elif "status" in field: + changes.append(f"Status changed from '{old_val}' to '{new_val}'") + else: + changes.append( + f"{field.replace('_', ' ').title()} changed " + + f"from '{old_val}' to '{new_val}'" + ) + # Handle additions + if "dictionary_item_added" in differences: + for path in differences["dictionary_item_added"]: + field = path.replace("root['", "").replace("']", "").replace("root.", "") + changes.append(f"New field added: {field.replace('_', ' ').title()}") + # Handle removals + if "dictionary_item_removed" in differences: + for path in differences["dictionary_item_removed"]: + field = path.replace("root['", "").replace("']", "").replace("root.", "") + changes.append(f"Field removed: {field.replace('_', ' ').title()}") + # Handle type changes + if "type_changes" in differences: + for path, change in differences["type_changes"].items(): + field = path.replace("root['", "").replace("']", "").replace("root.", "") + changes.append( + f"{field.replace('_', ' ').title()} type changed " + + f"from {change['old_type'].__name__} to {change['new_type'].__name__}" + ) + return ( + "\n".join(f"• {change}" for change in changes) + if changes + else "No specific changes detected" + ) diff --git a/update.py b/update.py index a0a851e..cf72c7b 100755 --- a/update.py +++ b/update.py @@ -109,71 +109,6 @@ Agenda: https://edwardbetts.com/agenda/ agenda.mail.send_mail(config, subject, body) -def format_launch_changes(differences: StrDict) -> str: - """Convert deepdiff output to human-readable format.""" - changes = [] - # Handle value changes - if "values_changed" in differences: - for path, change in differences["values_changed"].items(): - field = path.replace("root['", "").replace("']", "").replace("root.", "") - old_val = change["old_value"] - new_val = change["new_value"] - # Format specific fields nicely - if field == "net": - try: - old_dt = datetime.fromisoformat(old_val.replace("Z", "+00:00")) - new_dt = datetime.fromisoformat(new_val.replace("Z", "+00:00")) - changes.append( - "Launch time changed from " - + old_dt.strftime("%d %b %Y at %H:%M UTC") - + " to " - + new_dt.strftime("%d %b %Y at %H:%M UTC") - ) - except: - changes.append(f"Launch time changed from {old_val} to {new_val}") - elif field == "name": - changes.append(f"Mission name changed from '{old_val}' to '{new_val}'") - elif field == "probability": - if old_val is None: - changes.append(f"Launch probability set to {new_val}%") - elif new_val is None: - changes.append("Launch probability removed") - else: - changes.append( - f"Launch probability changed from {old_val}% to {new_val}%" - ) - elif "status" in field: - changes.append(f"Status changed from '{old_val}' to '{new_val}'") - else: - changes.append( - f"{field.replace('_', ' ').title()} changed " - + f"from '{old_val}' to '{new_val}'" - ) - # Handle additions - if "dictionary_item_added" in differences: - for path in differences["dictionary_item_added"]: - field = path.replace("root['", "").replace("']", "").replace("root.", "") - changes.append(f"New field added: {field.replace('_', ' ').title()}") - # Handle removals - if "dictionary_item_removed" in differences: - for path in differences["dictionary_item_removed"]: - field = path.replace("root['", "").replace("']", "").replace("root.", "") - changes.append(f"Field removed: {field.replace('_', ' ').title()}") - # Handle type changes - if "type_changes" in differences: - for path, change in differences["type_changes"].items(): - field = path.replace("root['", "").replace("']", "").replace("root.", "") - changes.append( - f"{field.replace('_', ' ').title()} type changed " - + f"from {change['old_type'].__name__} to {change['new_type'].__name__}" - ) - return ( - "\n".join(f"• {change}" for change in changes) - if changes - else "No specific changes detected" - ) - - def report_space_launch_change( config: flask.config.Config, prev_launch: StrDict | None, cur_launch: StrDict | None ) -> None: @@ -277,7 +212,7 @@ View all launches: https://edwardbetts.com/agenda/launches subject = f"Space Launch Update: {name}" differences = deepdiff.DeepDiff(prev_launch, cur_launch) - changes_text = format_launch_changes(differences) + changes_text = agenda.thespacedevs.format_launch_changes(differences) # Format launch date nicely formatted_date = "Unknown" if launch_date and launch_date != "Unknown":