3 from argparse import ArgumentParser
4 from email.message import EmailMessage
7 from smtplib import SMTP
15 # Fetch new case counts for Cambridgeshire.
17 "https://api.coronavirus.data.gov.uk/v1/data",
19 "filters": "areaType=utla;areaName=Cambridgeshire",
20 "structure": json.dumps(
21 ["date", "newCasesBySpecimenDate"], separators=(",", ":")
26 # Skip the first three days of the response. This seems to be what the
27 # website does, presumably because recent dates don't have reliable
32 mean = statistics.mean([new_cases for _, new_cases in last_week])
33 return last_week, mean
37 parser = ArgumentParser()
39 "--config", type=toml.load, default={},
40 help="Configuration file (TOML format)")
41 parser.add_argument("--email", action="store_true")
42 args = parser.parse_args()
44 last_week, mean = fetch_data()
45 formatted = io.StringIO()
47 "Most recent week's worth of new cases in Cambridgeshire, "
51 print(f"Mean: {mean:.1f}", file=formatted)
52 for date, new_cases in last_week:
53 print(f"{date}: {new_cases}", file=formatted)
54 if args.email and "email" in args.config:
55 new_cases_message = EmailMessage()
56 new_cases_message["From"] = args.config["email"]["from"]
57 new_cases_message["To"] = ", ".join(args.config["email"]["to_always"])
58 new_cases_message["Subject"] = f"Cambridgeshire case count: {mean:.1f}"
59 new_cases_message.set_content(formatted.getvalue())
60 with SMTP("localhost") as smtp:
61 smtp.send_message(new_cases_message)
63 print(formatted.getvalue(), end="")
66 if __name__ == "__main__":