Five functions across Gmail and Calendar, each calling two live APIs in one pass. How does the skeleton feel after a week of stacking it?
The shape is locked in. Fetch, .get(key, []), transform, return. Swap the field names, the rest is copy-paste.
That is the whole first week. You now know the skeleton for every multi-source read in this track — two-source decisions, merges, dual previews, and the morning overview all hang off that one pattern.
I think the tricky part was remembering which API uses messages versus items. I had to re-read the cheat sheet once per lesson.
Field names are the only per-API friction left. Once your fingers memorise Gmail-to-messages and Calendar-to-items, the skeleton flows without thinking. Let's check the corners before Week 2.
Five two-source functions this week:
inbox_and_events — two reads, one dict with emails + eventsbigger_source — compare counts, return emails, events, or tiecombined_snippets — two comprehensions merged with + into one listformat_dual_preview — prefix each line with MAIL: or MEET: before mergingmorning_overview — counts plus first-item guards in a four-key dictKey patterns: .get(key, []) on every list access, .get(field, "") inside comprehensions, first-item guards via list[0] if list else "", and named dict keys so callers never rely on positional order.
Create a free account to get started. Paid plans unlock all tracks.
Five functions across Gmail and Calendar, each calling two live APIs in one pass. How does the skeleton feel after a week of stacking it?
The shape is locked in. Fetch, .get(key, []), transform, return. Swap the field names, the rest is copy-paste.
That is the whole first week. You now know the skeleton for every multi-source read in this track — two-source decisions, merges, dual previews, and the morning overview all hang off that one pattern.
I think the tricky part was remembering which API uses messages versus items. I had to re-read the cheat sheet once per lesson.
Field names are the only per-API friction left. Once your fingers memorise Gmail-to-messages and Calendar-to-items, the skeleton flows without thinking. Let's check the corners before Week 2.
Five two-source functions this week:
inbox_and_events — two reads, one dict with emails + eventsbigger_source — compare counts, return emails, events, or tiecombined_snippets — two comprehensions merged with + into one listformat_dual_preview — prefix each line with MAIL: or MEET: before mergingmorning_overview — counts plus first-item guards in a four-key dictKey patterns: .get(key, []) on every list access, .get(field, "") inside comprehensions, first-item guards via list[0] if list else "", and named dict keys so callers never rely on positional order.