dialyzer fixes

This commit is contained in:
Graham McIntire 2025-07-03 10:56:06 -05:00
parent 7f06d3200a
commit 4baf3cffe7
No known key found for this signature in database
7 changed files with 96 additions and 16 deletions

View file

@ -1 +1,5 @@
[]
[
# Ignore all guard_test warnings from these files (false positives)
{"lib/aprsme_web/live/info_live/show.html.heex", :guard_test},
{"lib/aprsme/packet_consumer.ex", :guard_test}
]

View file

@ -304,8 +304,6 @@ defmodule Aprsme.Packet do
|> put_message_fields(combined_data)
end
defp extract_from_map(_), do: %{}
defp put_symbol_fields(map, data_extended) do
map
|> maybe_put(:symbol_code, data_extended[:symbol_code] || data_extended["symbol_code"])

View file

@ -308,9 +308,6 @@ defmodule Aprsme.PacketConsumer do
:error -> nil
end
nil ->
nil
_ ->
nil
end

View file

@ -298,8 +298,6 @@ defmodule Aprsme.Packets do
end
end
defp extract_position_from_mic_e_struct(_), do: {nil, nil}
defp extract_position_from_mic_e(data_extended) do
if is_number(data_extended[:lat_degrees]) and is_number(data_extended[:lat_minutes]) and
is_number(data_extended[:lon_degrees]) and is_number(data_extended[:lon_minutes]) do

View file

@ -49,12 +49,12 @@
</h1>
<%= if @packet do %>
<div class="text-sm text-gray-500 mb-6">
{@packet.comment}
{@packet.comment || ""}
</div>
<div class="grid grid-cols-1 md:grid-cols-2 gap-6 mb-8">
<div>
<div class="mb-2">
<span class="font-semibold">Location:</span> {@packet.lat}, {@packet.lon}
<span class="font-semibold">Location:</span> {@packet.lat || ""}, {@packet.lon || ""}
</div>
<div class="mb-2">
<span class="font-semibold">Last position:</span> {AprsmeWeb.MapLive.PacketUtils.get_timestamp(
@ -67,15 +67,16 @@
</div>
<div>
<div class="mb-2">
<span class="font-semibold">Device:</span> {@packet.manufacturer} {@packet.equipment_type}
<span class="font-semibold">Device:</span> {@packet.manufacturer || ""} {@packet.equipment_type ||
""}
</div>
<div class="mb-2"><span class="font-semibold">Path:</span> {@packet.path}</div>
<div class="mb-2"><span class="font-semibold">Path:</span> {@packet.path || ""}</div>
<div class="mb-2">
<span class="font-semibold">Raw:</span>
<%= if is_binary(@packet.raw_packet) do %>
{Aprsme.EncodingUtils.sanitize_string(@packet.raw_packet)}
<% else %>
{@packet.raw_packet}
{@packet.raw_packet || ""}
<% end %>
</div>
</div>
@ -124,8 +125,8 @@
/>
<% end %>
</td>
<td class="px-4 py-2">{neighbor.distance}</td>
<td class="px-4 py-2">{neighbor.last_heard}</td>
<td class="px-4 py-2">{neighbor.distance || ""}</td>
<td class="px-4 py-2">{neighbor.last_heard || ""}</td>
</tr>
<% end %>
</tbody>

View file

@ -1219,4 +1219,80 @@ defmodule AprsmeWeb.MapLive.Index do
round4.(Map.get(b1, key)) == round4.(Map.get(b2, key))
end)
end
# --- Private bounds update helpers ---
@spec handle_bounds_update(map(), Socket.t()) :: {:noreply, Socket.t()}
defp handle_bounds_update(bounds, socket) do
# Update the map bounds from the client, converting to atom keys
map_bounds = %{
north: bounds["north"],
south: bounds["south"],
east: bounds["east"],
west: bounds["west"]
}
# Validate bounds to prevent invalid coordinates
if valid_bounds?(map_bounds) do
handle_valid_bounds_update(map_bounds, socket)
else
# Invalid bounds, skip update
{:noreply, socket}
end
end
defp valid_bounds?(map_bounds) do
map_bounds.north <= 90 and map_bounds.south >= -90 and map_bounds.north > map_bounds.south
end
defp handle_valid_bounds_update(map_bounds, socket) do
# Only schedule a bounds update if the bounds have actually changed (with rounding)
if compare_bounds(map_bounds, socket.assigns.map_bounds) do
{:noreply, socket}
else
schedule_bounds_update(map_bounds, socket)
end
end
defp schedule_bounds_update(map_bounds, socket) do
if socket.assigns[:bounds_update_timer] do
Process.cancel_timer(socket.assigns.bounds_update_timer)
end
timer_ref = Process.send_after(self(), {:process_bounds_update, map_bounds}, 250)
socket = assign(socket, bounds_update_timer: timer_ref, pending_bounds: map_bounds)
{:noreply, socket}
end
@spec process_bounds_update(map(), Socket.t()) :: Socket.t()
defp process_bounds_update(map_bounds, socket) do
# Remove out-of-bounds packets and markers immediately
new_visible_packets =
socket.assigns.visible_packets
|> Enum.filter(fn {_k, packet} -> within_bounds?(packet, map_bounds) end)
|> Map.new()
packets_to_remove =
socket.assigns.visible_packets
|> Enum.reject(fn {_k, packet} -> within_bounds?(packet, map_bounds) end)
|> Enum.map(fn {k, _} -> k end)
# Remove markers for out-of-bounds packets
socket =
if packets_to_remove == [] do
socket
else
Enum.reduce(packets_to_remove, socket, fn k, acc ->
push_event(acc, "remove_marker", %{id: k})
end)
end
# Remove only out-of-bounds historical packets instead of clearing all
socket = push_event(socket, "filter_markers_by_bounds", %{bounds: map_bounds})
# Load additional historical packets for the new bounds if needed
socket = load_historical_packets_for_bounds(socket, map_bounds)
# Update map bounds and visible packets
assign(socket, map_bounds: map_bounds, visible_packets: new_visible_packets)
end
end

View file

@ -12,7 +12,13 @@ defmodule Aprsme.MixProject do
deps: deps(),
releases: releases(),
test_coverage: [tool: ExCoveralls],
listeners: [Phoenix.CodeReloader]
listeners: [Phoenix.CodeReloader],
dialyzer: [
ignore_warnings: ".dialyzer_ignore.exs",
plt_file:
{:no_warn,
"_build/dev/dialyxir_erlang-#{:erlang.system_info(:otp_release)}_elixir-#{System.version()}_deps-dev.plt"}
]
]
end