Commit A fixes a functional runtime bug by defining and initializing GITHUB_API_BASE_URL, preventing a NameError during the GitHub OAuth callback when the API base URL is not otherwise set. That directly improves application correctness. Commit B is broader in scope but is primarily maintenance: resolving Clippy warnings, making small idiomatic cleanups, adding a missing #[test] attribute so an existing test runs, and suppressing dead-code warnings in shared test helpers. While valuable for code quality and test coverage, it introduces little new functionality or user-facing behavior compared with fixing a runtime failure.
constitution · epochs · watch · epoch 3
c_4ed2e2cca39b (tommy-mor) vs c_88200cfa5c4d (tommy-mor)
download prompt · raw event · cmp_5aff0a6b5b96d7
council reasoning
Side A fixes a functional runtime issue (a NameError in the GitHub OAuth callback) by properly defining and normalizing the API base URL, which directly impacts application correctness. Side B consists mostly of lint cleanups, minor refactors, and test adjustments that improve code quality but do not materially change behavior. Fixing a breaking bug outweighs stylistic and maintenance improvements.
Side B makes widespread improvements across many files: resolving clippy warnings, refining pattern matches, simplifying code, adding a missing test annotation, introducing a type alias, cleaning up unused variables, and improving helper modules. These changes enhance overall code quality and maintainability across the workspace. In contrast, Side A is a small, targeted fix adding a single environment variable to prevent a NameError. While useful, its scope and impact are much narrower.
sides
A — c_4ed2e2cca39b (tommy-mor)
message
[0d3270d1] Fix GitHub OAuth callback NameError on missing API base URL. Co-authored-by: Cursor <cursoragent@cursor.com>
diff preview
diff --git a/constitution.py b/constitution.py
index f819007252f435680b8356fb4da83469b21e33af..4dd5b9dfbba231d46289c490f91b1dd5b1018bcf 100644
--- a/constitution.py
+++ b/constitution.py
@@ -119,6 +119,9 @@ JSONL_PATH = pathlib.Path(os.environ.get("JSONL_PATH", "/data/ledger.jsonl"))
GITHUB_CLIENT_ID = os.environ.get("GITHUB_CLIENT_ID", "")
GITHUB_CLIENT_SECRET = os.environ.get("GITHUB_CLIENT_SECRET", "")
+GITHUB_API_BASE_URL = os.environ.get(
+ "GITHUB_API_BASE_URL", "https://api.github.com"
+).rstrip("/")
OPENROUTER_API_KEY = os.environ.get("OPENROUTER_API_KEY", "")
OPENROUTER_BASE_URL = os.environ.get("OPENROUTER_BASE_URL", "https://openrouter.ai").rstrip("/")
B — c_88200cfa5c4d (tommy-mor)
message
[10c9caac] Fix all workspace clippy warnings. Wire up a missing ui_action test, allow dead code in shared integration helpers, and apply small clippy cleanups across server and types. Co-authored-by: Cursor <cursoragent@cursor.com>
diff preview
diff --git a/server/src/dsl.rs b/server/src/dsl.rs
index a45c5b33e10d0d2ea48c7313061cfa1e6430bcfc..faa8aac6616bc6ea2b102d08ae999c01a716ef6e 100644
--- a/server/src/dsl.rs
+++ b/server/src/dsl.rs
@@ -927,9 +927,7 @@ mod tests {
#[test]
fn parse_vote_rejects_zero_zero_ratio() {
let err = parse_full("{tie placeholder}\n~/a 0:0 ~/b").unwrap_err();
- let msg = match err {
- DslError::Parse(m) => m,
- };
+ let DslError::Parse(msg) = err;
assert!(
msg.contains("0:0"),
"expected 0:0 rejection message, got: {msg}"
diff --git a/server/src/html/garden/tests.rs b/server/src/html/garden/tests.rs
index c2036fca7752aef63d260e36cfe9649f63b5c550..0a1be1290fdc93197ca191197a473840bb4decbc 100644
--- a/server/src/html/garden/tests.rs
+++ b/server/src/html/garden/tests.rs
@@ -346,7 +346,7 @@ fn vote_compare_item_card_renders_github_import_markup() {
"headline": "#1 Compare card",
"sublines": ["State: open"],
});
- let body = format!("```slug-github-card\n{}\n```", json.to_string());
+ let body = format!("```slug-github-card\n{json}\n```");
let html = vote_compare_item_card(
&nav,
&item,
diff --git a/server/src/html/ui_action.rs b/server/src/html/ui_action.rs
index 2589a2cc00bb7b18cd19ebcbb938083122d6921d..5e4131dd346a6f80bfe091a9b0cf7902721bc47f 100644
--- a/server/src/html/ui_action.rs
+++ b/server/src/html/ui_action.rs
@@ -246,6 +246,7 @@ mod tests {
);
}
+ #[test]
fn set_new_thread_compose_expanded_true() {
let template = serde_json::json!({
"action": "set_new_thread_compose_expanded",
diff --git a/server/src/offline.rs b/server/src/offline.rs
index 2db6f67e22e00a24ce673d13095644dd9fa9342d..93d4d5ee55449da644f732bc0ba007ee4c2c7079 100644
--- a/server/src/offline.rs
+++ b/server/src/offline.rs
@@ -167,7 +167,7 @@ fn rankings_for_simulated(
.iter()
.map(|parent| {
let scoped_content = simulated
- .content_for_scope(&scope)
+ .content_for_scope(scope)
.unwrap_or_else(|| simulated.public());
let scoped = build_children_rankings(scoped_content, parent);
let components: Vec<RankComponent> = scoped
@@ -254,7 +254,9 @@ fn ingest_parse_error(raw: &str) -> Option<String> {
dsl::parse_full(raw).err().map(|e| e.to_string())
}
-fn load_events_from_jsonl(path: &Path) -> Result<(usize, Vec<(usize, Event)>, Vec<BadJsonLine>), std::io::Error> {
+type JsonlEventsLoad = Result<(usize, Vec<(usize, Event)>, Vec<BadJsonLine>), std::io::Error>;
+
+fn load_events_from_jsonl(path: &Path) -> JsonlEventsLoad {
let text = std::fs::read_to_string(path)?;
let total_lines = text.lines().count();
let mut events = Vec::new();
diff --git a/server/src/resolvers/github.rs b/server/src/resolvers/github.rs
index 30dd4cdac96de0e3da4fa03fdf82f91bed73bfe0..3cec5e8b7249a4597c378890cc9e6125104e76c3 100644
--- a/server/src/resolvers/github.rs
+++ b/server/src/resolvers/github.rs
@@ -749,6 +749,6 @@ mod tests {
GithubImportKind::Issue,
);
assert!(card.sublines.iter().any(|l| l.contains("@octo")));
- assert_eq!(card.excerpt.as_deref(), Some("The issue body.").as_deref());
+ assert_eq!(card.excerpt.as_deref(), Some("The issue body."));
}
}
diff --git a/server/tests/basic.rs b/server/tests/basic.rs
index 31a35251a8abd6f4a48c1d7782b6985f621375e1..9d83e7a97e2c7494790db17c4b5b30c181705026 100644
--- a/server/tests/basic.rs
+++ b/server/tests/basic.rs
@@ -337,7 +337,7 @@ async fn event_log_handles_corrupt_lines() {
.unwrap();
// Add empty line.
- writeln!(f, "").unwrap();
+ writeln!(f).unwrap();
let (loaded, bad) = log.load_all().await.unwrap();
assert_eq!(loaded.len(), 2);
@@ -511,9 +511,7 @@ fn dsl_parse_rejects_zero_zero_vote_ratio() {
"~/t/a {a}\n~/t/b {b}\n{zero}\n~/t/a 0:0 ~/t/b\n",
)
.expect_err("0:0 vote must be rejected by the parser");
- let msg = match err {
- slugsocial_server::dsl::DslError::Parse(m) => m,
- };
+ let slugsocial_server::dsl::DslError::Parse(msg) = err;
assert!(
msg.contains("0:0"),
"expected message about invalid 0:0 ratio, got: {msg}"
@@ -904,7 +902,7 @@ fn posts_by_actor_indexes_and_profile_visibility() {
fn feed_query(state: &ReducerState, cutoff: i64, limit: usize) -> (usize, Vec<String>) {
let matching: Vec<&str> = state.ingests_ordered.iter().rev()
.map(|id| id.as_str())
- .take_while(|id| state.ingests_by_id.get(*id).map_or(false, |ing| ing.ts > cutoff))
+ .take_while(|id| state.ingests_by_id.get(*id).is_some_and(|ing| ing.ts > cutoff))
.filter(|id| {
state.ingests_by_id.get(*id).is_some_and(|ing| {
let scope = slugsocial_server::reducer::scope_from_room_wire(&ing.room_id);
diff --git a/server/tests/integration_health.rs b/server/tests/integration_health.rs
index 481222d8c48c44fcfb7e9ba26cf7644b5c26d5f4..351aae6b0e9738021886a076ee08fab5cf5a0001 100644
--- a/server/tests/integration_health.rs
+++ b/server/tests/integration_health.rs
@@ -7,7 +7,7 @@ async fn test_healthz() {
let (addr, _tmp, _log, _handle) = create_test_server().await;
let client = reqwest::Client::new();
let response = client
- .get(&format!("http://{}/healthz", addr))
+ .get(format!("http://{}/healthz", addr))
.send()
.await
.unwrap();
diff --git a/server/tests/integration_rpc.rs b/server/tests/integration_rpc.rs
index ccd89a02594bd2a8e7047edafca04b0e54384139..ec446d94a38c8d6961d2135dd031da7ab2a39b48 100644
--- a/server/tests/integration_rpc.rs
+++ b/server/tests/integration_rpc.rs
@@ -440,7 +440,6 @@ async fn test_rank_history() {
let bearer = test_bearer();
let ingest = |delegate: &str, text: &str| {
let client = client.clone();
- let addr = addr;
let bearer = bearer.clone();
let text = text.to_string();
let delegate = delegate.to_string();
diff --git a/server/tests/support/mod.rs b/server/tests/support/mod.rs
index 84dc1d68b6c1e1fdfdbd0757139c06c3daf1e9a6..4a620eaa875e7a1145f2a4e82cc4ff2be21d5345 100644
--- a/server/tests/support/mod.rs
+++ b/server/tests/support/mod.rs
@@ -1,3 +1,6 @@
+//! Shared helpers for integration tests; each test binary uses a different subset.
+#![allow(dead_code)]
+
use sha2::{Digest, Sha256};
use slugsocial_server::{
event_log::EventLog,
diff --git a/types/src/paths.rs b/types/src/paths.rs
index ebc299c5e1af456c3e4b7fa45ed9fb23313e88c4..d2e799942b98dd7342764475deb17903fb60c600 100644
--- a/types/src/paths.rs
+++ b/types/src/paths.rs
@@ -411,7 +411,7 @@ mod tests {
#[test]
fn garden_item_url_deref_to_str() {
let g = GardenItemUrl::from_storage_str("https://slug.social/~/x", "public");
- let s: &str = &*g;
+ let s: &str = &g;
assert_eq!(s, "https://slug.social/~/x");
}
Hardlinks — judgments / attempts / prompt
judgments
attempts
Prompt text is loaded only by the download route.