Skip to content

Commit 6b8da86

Browse files
committed
Add In Memoriam: Michael R.
1 parent 59968d2 commit 6b8da86

File tree

9 files changed

+276
-2
lines changed

9 files changed

+276
-2
lines changed

input/assets/style/_main.scss

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,20 @@ body {
1313
text-align: left;
1414
}
1515

16+
blockquote {
17+
margin: 0;
18+
padding: 4px 24px;
19+
font-style: italic;
20+
border-radius: 10px;
21+
box-shadow: 0 0 6px rgba(0,0,0,.15);
22+
background-color: rgb(237, 245, 249);
23+
24+
span {
25+
font-style: normal;
26+
}
27+
28+
}
29+
1630
a {
1731
color: #0077aa;
1832
text-decoration: underline;

input/in-memoriam-michael/index.md

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
---
2+
title: "In Memoriam: Michael"
3+
path: "in-memoriam-michael/"
4+
---
5+
6+
In early May of 2025, the long-standing SoCal Python organizer Michael Ryabushkin—known to many as goodwill—passed away.
7+
8+
As possibly the person most responsible for years of thriving of the group and its surrounding community, he had an impact on many of us, both professionally and personally. In light of that, this page is a collection of _in memoriam_ messages submitted through [this form](https://docs.google.com/forms/d/e/1FAIpQLSeoRvyBp5SR4QVY-LK2WwW2qXahf6CfRUmkNhOKUS3NtdLAIQ/viewform?usp=header "In Memoriam: Michael Ryabushkin - Google Forms"). If you would like to share your memories of Michael, please do the same.
9+
10+
<!-- [[[cog
11+
import csv, datetime, pathlib, cog
12+
path = pathlib.Path(__name__).parent.parent.parent / "data" / "in_memoriam.csv"
13+
if path.exists():
14+
with (path).open() as file_:
15+
messages = [
16+
{
17+
"message": message["Message"],
18+
"name": message["Name"].strip(),
19+
"timestamp": datetime.datetime.strptime(message['Timestamp'], '%m/%d/%Y %H:%M:%S')
20+
}
21+
for message in csv.DictReader(file_)
22+
]
23+
messages.sort(key=lambda m: m["timestamp"])
24+
25+
for message in messages:
26+
cog.outl("\n".join([f"> {line.strip()}" for line in message["message"].split("\n")]))
27+
cog.outl(">")
28+
cog.outl(f"> <span>— {message['name']}, {message['timestamp'].strftime('%B %Y')}</span>")
29+
cog.outl("######") # break up blockquotes
30+
]]] -->
31+
<!-- [[[end]]] -->

justfile

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@ html:
1010
css:
1111
pysass input/assets/style/style.scss output/assets/style/style.css
1212

13+
# generate in memoriam (requires uv)
14+
inmemoriam:
15+
python scripts/get_in_memoriam_csv.py
16+
cog -r input/in-memoriam-michael/index.md
17+
1318
# build site in output/ (requires uv)
1419
build:
1520
just html && just css

modd.conf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
input/**/* templates/**/* {
22
prep: just fresh
3+
prep: just inmemoriam
34
daemon: just serve
45
}

pyproject.toml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,19 @@
11
[project]
22
name = "SoCalPython.org"
3-
version = "25.5.5"
3+
version = "25.5.13"
44
description = "SoCal Python website"
55
authors = ["Nik Kantar <nik@nkantar.com>"]
66
license = "Public Domain"
77
requires-python = ">=3.13"
88
dependencies = [
9+
"beautifulsoup4>=4.13.4",
10+
"cogapp>=3.4.1",
911
"corvid>=1.1.1",
12+
"httpx>=0.28.1",
1013
"pysass>=0.1.0",
1114
]
15+
16+
[dependency-groups]
17+
dev = [
18+
"pdbpp>=0.11.6",
19+
]

scripts/get_in_memoriam_csv.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#!/usr/bin/env python
2+
3+
4+
from os import getenv
5+
from pathlib import Path
6+
7+
from bs4 import BeautifulSoup
8+
import httpx
9+
10+
11+
SPREADSHEET_ID = getenv("IN_MEMORIAM_SPREADSHEET_ID")
12+
SPREADSHEET_URL = (
13+
f"https://docs.google.com/spreadsheets/d/{SPREADSHEET_ID}/export?format=csv"
14+
)
15+
16+
OUTPUT_DIR = Path(__file__).parent.parent / "data"
17+
OUTPUT_PATH = OUTPUT_DIR / "in_memoriam.csv"
18+
19+
20+
def get_csv():
21+
if SPREADSHEET_ID is None:
22+
return
23+
24+
response = httpx.get(SPREADSHEET_URL)
25+
soup = BeautifulSoup(response.content, features="html.parser")
26+
redirect_url = soup.find("a").get("href")
27+
28+
redirect_response = httpx.get(redirect_url)
29+
30+
OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
31+
OUTPUT_PATH.write_bytes(redirect_response.content)
32+
33+
34+
if __name__ == "__main__":
35+
get_csv()

scripts/netlify_deploy.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ mise use -g just
99
# install uv
1010
python -m pip install uv
1111

12+
# generate in memoriam
13+
python -m uv run just inmemoriam
14+
1215
# build
1316
python -m uv run just build
1417

templates/default.html

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@ <h1><a href="/">SoCal Python</a></h1>
4545
<li><a href="/speaking">Speaking</a></li>
4646
<li><a href="/sponsorship">Sponsorship</a></li>
4747
<li><a href="/conduct">Code of Conduct</a></li>
48+
<li><a href="/in-memoriam-michael">In Memoriam: Michael</a></li>
49+
</ul>
50+
<ul>
4851
<li><a href="/meetup">Meetup</a></li>
4952
<li><a href="/slack">Slack</a></li>
5053
<li><a href="/github">GitHub</a></li>

uv.lock

Lines changed: 175 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)