Credo: atom-or-string query keys read through one field/2

b722703 · Gabe Morell · 2026-11-04 21:21

32 files +36 -18

Files changed

modified apps/room_drought/lib/room_drought/worker.ex
+5 −3
@@ -91,7 +91,7 @@ defmodule RoomDrought.Worker do
91 91
92 92 # Call handlers
93 93 def handle_call({:read, query}, _from, state) do
94 − product = Map.get(query, :product) || Map.get(query, "product") || "usdm"
94 + product = field(query, :product) || "usdm"
95 95
96 96 {:reply, read_product(product, query, state), state}
97 97 end
@@ -142,8 +142,8 @@ defmodule RoomDrought.Worker do
142 142 defp usdm_enabled?(_), do: false
143 143
144 144 defp scope_from_query(query) do
145 − fips = Map.get(query, :fips) || Map.get(query, "fips")
146 − state = Map.get(query, :state) || Map.get(query, "state")
145 + fips = field(query, :fips)
146 + state = field(query, :state)
147 147
148 148 cond do
149 149 is_binary(fips) and fips != "" -> {:county, fips}
@@ -152,6 +152,8 @@ defmodule RoomDrought.Worker do
152 152 end
153 153 end
154 154
155 + defp field(query, key), do: Map.get(query, key) || Map.get(query, Atom.to_string(key))
156 +
155 157 defp normalize_scope({:county, fips}) when is_binary(fips), do: {:county, fips}
156 158 defp normalize_scope({:state, st}) when is_binary(st), do: {:state, String.upcase(st)}
157 159 defp normalize_scope(_), do: nil
modified apps/room_github/lib/room_github/worker.ex
+4 −2
@@ -507,8 +507,8 @@ defmodule RoomGithub.Worker do
507 507 end
508 508
509 509 defp target_repos(query, state) do
510 − repo = Map.get(query, :repo) || Map.get(query, "repo")
511 − owner = Map.get(query, :owner) || Map.get(query, "owner")
510 + repo = field(query, :repo)
511 + owner = field(query, :owner)
512 512
513 513 cond do
514 514 is_binary(repo) and repo != "" ->
@@ -524,6 +524,8 @@ defmodule RoomGithub.Worker do
524 524 end
525 525 end
526 526
527 + defp field(query, key), do: Map.get(query, key) || Map.get(query, Atom.to_string(key))
528 +
527 529 defp filter_runs_by_status(runs, query) do
528 530 runs
529 531 |> filter_by_field(query, "status", :status)
modified apps/room_gitlab/lib/room_gitlab/gitlab_worker.ex
+5 −3
@@ -286,7 +286,7 @@ defmodule RoomGitlab.Worker do
286 286
287 287 def handle_call({:read_jobs, query}, _from, state) do
288 288 project_ids = jobs_target_ids(query, state)
289 − statuses = parse_statuses(Map.get(query, :statuses) || Map.get(query, "statuses"))
289 + statuses = parse_statuses(field(query, :statuses))
290 290
291 291 jobs =
292 292 project_ids
@@ -297,8 +297,8 @@ defmodule RoomGitlab.Worker do
297 297 end
298 298
299 299 defp jobs_target_ids(query, state) do
300 − id = Map.get(query, :id) || Map.get(query, "id")
301 − ns = Map.get(query, :namespace) || Map.get(query, "namespace")
300 + id = field(query, :id)
301 + ns = field(query, :namespace)
302 302
303 303 cond do
304 304 not is_nil(id) ->
@@ -314,6 +314,8 @@ defmodule RoomGitlab.Worker do
314 314 end
315 315 end
316 316
317 + defp field(query, key), do: Map.get(query, key) || Map.get(query, Atom.to_string(key))
318 +
317 319 defp parse_statuses(nil), do: :all
318 320 defp parse_statuses(s) when is_list(s), do: s
319 321
modified apps/room_icarus/lib/room_icarus/flight.ex
+5 −2
@@ -164,11 +164,14 @@ defmodule RoomIcarus.Flight do
164 164 defp near_destination?(_), do: false
165 165
166 166 defp position_of(pos) do
167 − lat = pos["lat"] || pos[:lat]
168 − lon = pos["lon"] || pos[:lon]
167 + lat = field(pos, :lat)
168 + lon = field(pos, :lon)
169 169 if is_number(lat) and is_number(lon), do: {lat, lon}, else: nil
170 170 end
171 171
172 + # Decoded-JSON string keys first, then atom keys.
173 + defp field(pos, key), do: Map.get(pos, Atom.to_string(key)) || Map.get(pos, key)
174 +
172 175 @doc """
173 176 Estimated touchdown from current position, ground speed, and the great-circle
174 177 distance to the destination.
modified apps/room_packages/lib/room_packages/package_worker.ex
+2 −2
@@ -100,12 +100,12 @@ defmodule RoomPackages.Worker do
100 100 # add another identical entry and the history would be nothing but noise.
101 101 defp changed?(%{entries: entries}, summary) when is_list(entries) do
102 102 last = List.last(entries)
103 − last == nil or status_of(last) != summary.status
103 + last == nil or field(last, :status) != summary.status
104 104 end
105 105
106 106 defp changed?(_, _), do: true
107 107
108 − defp status_of(entry), do: Map.get(entry, :status) || Map.get(entry, "status")
108 + defp field(entry, key), do: Map.get(entry, key) || Map.get(entry, Atom.to_string(key))
109 109
110 110 def handle_call({:read, query}, _from, state) do
111 111 {:reply, state.data, state}
modified apps/room_pollen/lib/room_pollen/worker.ex
+4 −2
@@ -133,9 +133,9 @@ defmodule RoomPollen.Worker do
133 133 # A place if one was handed over, otherwise the foci named in the query.
134 134 anchor =
135 135 RoomSanctum.Configuration.place_for!(query) ||
136 − Map.get(query, :foci_id) || Map.get(query, "foci_id")
136 + field(query, :foci_id)
137 137
138 − days = days_from_query(Map.get(query, :days) || Map.get(query, "days"))
138 + days = days_from_query(field(query, :days))
139 139
140 140 case resolve_foci(anchor) do
141 141 {lat, lng} -> {lat, lng, days}
@@ -143,6 +143,8 @@ defmodule RoomPollen.Worker do
143 143 end
144 144 end
145 145
146 + defp field(query, key), do: Map.get(query, key) || Map.get(query, Atom.to_string(key))
147 +
146 148 defp days_from_query(n) when is_integer(n) and n in 1..5, do: n
147 149 defp days_from_query(n) when is_binary(n), do: String.to_integer(n) |> max(1) |> min(5)
148 150 defp days_from_query(_), do: 3
modified apps/room_sanctum/lib/room_sanctum/workers/keryx_item_cache.ex
+5 −2
@@ -127,7 +127,7 @@ defmodule RoomSanctum.Worker.KeryxItemCache do
127 127 defp extract_item_id(_item, _type), do: generate_stub()
128 128
129 129 defp item_id_value(item, :pollen) do
130 − case Map.get(item, "date") || Map.get(item, :date) do
130 + case field(item, :date) do
131 131 %{"year" => y, "month" => m, "day" => d} -> "#{y}-#{m}-#{d}"
132 132 %{year: y, month: m, day: d} -> "#{y}-#{m}-#{d}"
133 133 other -> inspect(other)
@@ -140,7 +140,7 @@ defmodule RoomSanctum.Worker.KeryxItemCache do
140 140 defp item_id_value(item, :icarus) do
141 141 case Map.get(item, "kind") do
142 142 "flight" -> "#{Map.get(item, "callsign")}/#{Map.get(item, "sched_arrival")}"
143 − _ -> Map.get(item, "hex") || Map.get(item, :hex)
143 + _ -> field(item, :hex)
144 144 end
145 145 end
146 146
@@ -154,6 +154,9 @@ defmodule RoomSanctum.Worker.KeryxItemCache do
154 154 Enum.reduce(keys, nil, fn key, found -> found || Map.get(item, key) end)
155 155 end
156 156
157 + # Decoded-JSON string keys first, then atom keys.
158 + defp field(item, key), do: Map.get(item, Atom.to_string(key)) || Map.get(item, key)
159 +
157 160 defp stubbify(nil), do: generate_stub()
158 161
159 162 defp stubbify(value) when is_binary(value) do
modified apps/room_sanctum/lib/room_sanctum/workers/keryx_worker.ex
+3 −1
@@ -252,7 +252,7 @@ defmodule RoomSanctum.Worker.Keryx do
252 252 []
253 253
254 254 _val ->
255 − level = Map.get(q.query, :level) || Map.get(q.query, "level") || "runs"
255 + level = field(q.query, :level) || "runs"
256 256
257 257 if Process.alive?(RoomGithub.Worker.pid(q.source.id)) do
258 258 case level do
@@ -277,6 +277,8 @@ defmodule RoomSanctum.Worker.Keryx do
277 277 end
278 278 end
279 279
280 + defp field(query, key), do: Map.get(query, key) || Map.get(query, Atom.to_string(key))
281 +
280 282 # Private helper to query all workers and publish to MQTT
281 283 defp query_all_workers(keryx_q, keryx) do
282 284 results =
modified apps/room_sanctum/lib/room_sanctum/workers/vision_worker.ex
+3 −1
@@ -359,7 +359,7 @@ defmodule RoomSanctum.Worker.Vision do
359 359 []
360 360
361 361 _val ->
362 − level = Map.get(q.query, :level) || Map.get(q.query, "level") || "runs"
362 + level = field(q.query, :level) || "runs"
363 363
364 364 if Process.alive?(RoomGithub.Worker.pid(q.source.id)) do
365 365 case level do
@@ -383,4 +383,6 @@ defmodule RoomSanctum.Worker.Vision do
383 383 _pid -> worker.read(q.source.id, q.query) || []
384 384 end
385 385 end
386 +
387 + defp field(query, key), do: Map.get(query, key) || Map.get(query, Atom.to_string(key))
386 388 end

Parents: d197dc1