neiam
/apollos_crib
It's Apollo's Crib
public · Issues · Pulls 1 · Labels · Forks · Compare · Actions failure · Badges · Packages
⭐
Log in to mark this repository.
Credo: atom-or-string query keys read through one field/2
b722703 · Gabe Morell · 2026-11-04 21:21
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