diff --git a/lib/aprsme/cluster/leader_election.ex b/lib/aprsme/cluster/leader_election.ex index 93ac74d..30ece57 100644 --- a/lib/aprsme/cluster/leader_election.ex +++ b/lib/aprsme/cluster/leader_election.ex @@ -89,7 +89,7 @@ defmodule Aprsme.Cluster.LeaderElection do :no -> leader_pid = :global.whereis_name(@election_key) - leader_node = if leader_pid, do: node(leader_pid) + leader_node = if leader_pid != :undefined and is_pid(leader_pid), do: node(leader_pid) Logger.info("Not elected as leader. Current leader is on node #{inspect(leader_node)}") {:noreply, %{state | is_leader: false, leader_node: leader_node}} end diff --git a/lib/aprsme/connection_monitor.ex b/lib/aprsme/connection_monitor.ex index c694f5f..4a1fa48 100644 --- a/lib/aprsme/connection_monitor.ex +++ b/lib/aprsme/connection_monitor.ex @@ -197,8 +197,8 @@ defmodule Aprsme.ConnectionMonitor do # Get CPU usage from scheduler utilization # Use Erlang's cpu_sup if available, otherwise estimate from scheduler utilization case :cpu_sup.util() do - {:ok, busy, _, _} -> - busy / 100.0 + util when is_number(util) -> + util / 100.0 _ -> # Fallback to scheduler wall time diff --git a/lib/aprsme/encoding_utils.ex b/lib/aprsme/encoding_utils.ex index f531f61..433f4b3 100644 --- a/lib/aprsme/encoding_utils.ex +++ b/lib/aprsme/encoding_utils.ex @@ -49,12 +49,15 @@ defmodule Aprsme.EncodingUtils do """ @spec to_float(any()) :: float() | nil def to_float(value) when is_float(value) do - if finite_float?(value), do: value + # In Elixir, floats are always finite (no infinity or NaN) + value end def to_float(value) when is_integer(value) do if value >= -9.0e15 and value <= 9.0e15 do value * 1.0 + else + nil end end @@ -69,19 +72,11 @@ defmodule Aprsme.EncodingUtils do end def to_float(%Decimal{} = value) do - float = Decimal.to_float(value) - if finite_float?(float), do: float + Decimal.to_float(value) end def to_float(_), do: nil - # Helper to check if a float is finite (not infinity or NaN) - @spec finite_float?(any()) :: boolean() - defp finite_float?(float) when is_float(float) do - # In Elixir, we can't have infinity or NaN in regular floats - # This function is kept for defensive programming - true - end @doc """ Converts various types to Decimal for database storage. diff --git a/lib/aprsme/packets/query_builder.ex b/lib/aprsme/packets/query_builder.ex index f5d68a2..25e17ea 100644 --- a/lib/aprsme/packets/query_builder.ex +++ b/lib/aprsme/packets/query_builder.ex @@ -154,7 +154,7 @@ defmodule Aprsme.Packets.QueryBuilder do def recent_position_packets(opts \\ %{}) do limit = opts[:limit] || opts["limit"] || 100 - Packet + from(p in Packet) |> with_position() |> with_time_range(opts) |> maybe_filter_region(opts) @@ -175,7 +175,7 @@ defmodule Aprsme.Packets.QueryBuilder do def callsign_history(callsign, opts \\ %{}) do limit = opts[:limit] || opts["limit"] || 100 - Packet + from(p in Packet) |> for_callsign(callsign) |> with_time_range(opts) |> recent_first() @@ -197,7 +197,7 @@ defmodule Aprsme.Packets.QueryBuilder do callsign = opts[:callsign] || opts["callsign"] query = - Packet + from(p in Packet) |> weather_only() |> with_time_range(opts) |> recent_first() diff --git a/lib/aprsme/signal_handler.ex b/lib/aprsme/signal_handler.ex index 280a592..3397f65 100644 --- a/lib/aprsme/signal_handler.ex +++ b/lib/aprsme/signal_handler.ex @@ -13,13 +13,9 @@ defmodule Aprsme.SignalHandler do def init(_opts) do # Install signal handler for SIGTERM - case :os.set_signal(:sigterm, :handle) do - :ok -> - Logger.info("SIGTERM signal handler installed") - - error -> - Logger.warning("Failed to install SIGTERM handler: #{inspect(error)}") - end + # :os.set_signal/2 always returns :ok + :ok = :os.set_signal(:sigterm, :handle) + Logger.info("SIGTERM signal handler installed") {:ok, %{}} end diff --git a/lib/aprsme/telemetry/database_metrics.ex b/lib/aprsme/telemetry/database_metrics.ex index ff601ab..ab7bec4 100644 --- a/lib/aprsme/telemetry/database_metrics.ex +++ b/lib/aprsme/telemetry/database_metrics.ex @@ -104,21 +104,6 @@ defmodule Aprsme.Telemetry.DatabaseMetrics do %{} ) end - - _ -> - # No children, use defaults - :telemetry.execute( - [:aprsme, :repo, :pool], - %{ - size: pool_size, - idle: 0, - busy: 0, - available: 0, - queue_length: 0, - total: 0 - }, - %{} - ) end end rescue diff --git a/lib/aprsme_web/live/info_live/show.html.heex b/lib/aprsme_web/live/info_live/show.html.heex index f3a31f9..eba6dbb 100644 --- a/lib/aprsme_web/live/info_live/show.html.heex +++ b/lib/aprsme_web/live/info_live/show.html.heex @@ -374,11 +374,7 @@ ssid_info.packet.lon ) %> <% locale = Map.get(assigns, :locale, "en") %> - <%= if course do %> - {format_distance(dist, locale)} @ {Float.round(course, 0)}° - <% else %> - {format_distance(dist, locale)} - <% end %> + {format_distance(dist, locale)} @ {Float.round(course, 0)}° <% else %> - <% end %> diff --git a/lib/aprsme_web/live/map_live/data_builder.ex b/lib/aprsme_web/live/map_live/data_builder.ex index 8061742..db2a654 100644 --- a/lib/aprsme_web/live/map_live/data_builder.ex +++ b/lib/aprsme_web/live/map_live/data_builder.ex @@ -198,7 +198,7 @@ defmodule AprsmeWeb.MapLive.DataBuilder do def build_simple_popup(packet, has_weather) do # Build popup HTML directly without database queries callsign = get_packet_field(packet, :sender, "Unknown") - timestamp_dt = get_packet_received_at(packet) || DateTime.utc_now() + timestamp_dt = get_packet_received_at(packet) cache_buster = System.system_time(:millisecond) # Check if this packet itself is a weather packet diff --git a/lib/aprsme_web/live/map_live/url_params.ex b/lib/aprsme_web/live/map_live/url_params.ex index 26f64fd..9636034 100644 --- a/lib/aprsme_web/live/map_live/url_params.ex +++ b/lib/aprsme_web/live/map_live/url_params.ex @@ -30,7 +30,7 @@ defmodule AprsmeWeb.MapLive.UrlParams do def parse_latitude(nil), do: @default_center.lat def parse_latitude(lat_str) do - ParamUtils.parse_float_in_range(lat_str, @default_center.lat, -90, 90) + ParamUtils.parse_float_in_range(lat_str, @default_center.lat, -90.0, 90.0) end @doc """ @@ -40,7 +40,7 @@ defmodule AprsmeWeb.MapLive.UrlParams do def parse_longitude(nil), do: @default_center.lng def parse_longitude(lng_str) do - ParamUtils.parse_float_in_range(lng_str, @default_center.lng, -180, 180) + ParamUtils.parse_float_in_range(lng_str, @default_center.lng, -180.0, 180.0) end @doc """ diff --git a/lib/aprsme_web/live/weather_live/callsign_view.ex b/lib/aprsme_web/live/weather_live/callsign_view.ex index db99024..c932a6b 100644 --- a/lib/aprsme_web/live/weather_live/callsign_view.ex +++ b/lib/aprsme_web/live/weather_live/callsign_view.ex @@ -220,9 +220,6 @@ defmodule AprsmeWeb.WeatherLive.CallsignView do nil -> "#{value}" end - - _ -> - "#{value}" end end end diff --git a/lib/aprsme_web/live/weather_live/callsign_view.html.heex b/lib/aprsme_web/live/weather_live/callsign_view.html.heex index 294953d..bd5a66a 100644 --- a/lib/aprsme_web/live/weather_live/callsign_view.html.heex +++ b/lib/aprsme_web/live/weather_live/callsign_view.html.heex @@ -15,7 +15,7 @@ AprsmeWeb.MapLive.PacketUtils.get_symbol_info(@weather_packet) %> <% symbol_table = if symbol_table_id in ["/", "\\", "]"], do: symbol_table_id, else: "/" %> - <% symbol_code = symbol_code || ">" %> + <% symbol_code = (symbol_code || ">") |> to_string() %> <% table_id = if symbol_table == "/", do: "0", else: if(symbol_table == "]", do: "2", else: "1") %> <% symbol_code_ord = diff --git a/mix.exs b/mix.exs index aecb914..5cbe4d2 100644 --- a/mix.exs +++ b/mix.exs @@ -75,7 +75,7 @@ defmodule Aprsme.MixProject do {:phoenix_html, "~> 4.0"}, {:phoenix_live_dashboard, "~> 0.8"}, {:phoenix_live_reload, "~> 1.2", only: :dev}, - {:phoenix_live_view, "~> 1.0.17"}, + {:phoenix_live_view, "~> 1.1.1"}, {:phoenix_pubsub_redis, "~> 3.0"}, {:postgrex, ">= 0.0.0"}, {:swoosh, "~> 1.16"}, @@ -102,8 +102,8 @@ defmodule Aprsme.MixProject do {:stream_data, "~> 1.2.0", only: [:dev, :test]}, {:igniter, "~> 0.6", only: [:dev, :test]}, {:mox, "~> 1.2", only: :test}, - {:styler, "~> 1.5.0", only: [:dev, :test], runtime: false}, - {:httpoison, "~> 1.8"}, + {:styler, "~> 1.6.0", only: [:dev, :test], runtime: false}, + # {:httpoison, "~> 1.8"}, {:hammer, "~> 7.0"}, {:cachex, "~> 4.1"}, {:gettext_pseudolocalize, "~> 0.1"}, diff --git a/mix.lock b/mix.lock index 55d654b..060dece 100644 --- a/mix.lock +++ b/mix.lock @@ -39,13 +39,13 @@ "gettext_pseudolocalize": {:hex, :gettext_pseudolocalize, "0.1.1", "0bdc33fa12cb2297fe020a44f5548c10ac789e325638ba4ac206119f2aa78caa", [:mix], [{:expo, "~> 1.1", [hex: :expo, repo: "hexpm", optional: false]}, {:gettext, "~> 0.26", [hex: :gettext, repo: "hexpm", optional: false]}], "hexpm", "5a2d6e1732ae61d742a2ecddbf03776de3fe4a5394dce98611355b11a9f5cf49"}, "glob_ex": {:hex, :glob_ex, "0.1.11", "cb50d3f1ef53f6ca04d6252c7fde09fd7a1cf63387714fe96f340a1349e62c93", [:mix], [], "hexpm", "342729363056e3145e61766b416769984c329e4378f1d558b63e341020525de4"}, "gridsquare": {:hex, :gridsquare, "0.2.0", "c556a5b5101db89743264b0d728601023035863487bbe36e9e50e93839adb4d7", [:mix], [], "hexpm", "dbf0dbb484681a1e97819b0667bfeaa8c8a48cf06a54bf96a8f26ee4158ad31a"}, - "hackney": {:hex, :hackney, "1.24.1", "f5205a125bba6ed4587f9db3cc7c729d11316fa8f215d3e57ed1c067a9703fa9", [:rebar3], [{:certifi, "~> 2.15.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~> 6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~> 1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~> 1.4", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.4.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~> 1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "f4a7392a0b53d8bbc3eb855bdcc919cd677358e65b2afd3840b5b3690c4c8a39"}, - "hammer": {:hex, :hammer, "7.0.1", "136edcd81af44becbe6b73a958c109e2364ab0dc026d7b19892037dc2632078c", [:mix], [], "hexpm", "796edf14ab2aa80df72080210fcf944ee5e8868d8ece7a7511264d802f58cc2d"}, + "hackney": {:hex, :hackney, "1.25.0", "390e9b83f31e5b325b9f43b76e1a785cbdb69b5b6cd4e079aa67835ded046867", [:rebar3], [{:certifi, "~> 2.15.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~> 6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~> 1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~> 1.4", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.4.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~> 1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~> 0.7.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "7209bfd75fd1f42467211ff8f59ea74d6f2a9e81cbcee95a56711ee79fd6b1d4"}, + "hammer": {:hex, :hammer, "7.1.0", "9b55acd9951035f330aa1556e575e72d93334e8732daf5f2f602793d16008fe9", [:mix], [], "hexpm", "0ef3f0b9b92ae10a01604ca58adc2bfc8df0af4414a3afcf2dd79e256bc94c17"}, "heroicons": {:git, "https://github.com/tailwindlabs/heroicons.git", "88ab3a0d790e6a47404cba02800a6b25d2afae50", [tag: "v2.1.1", sparse: "optimized", depth: 1]}, "hpax": {:hex, :hpax, "1.0.3", "ed67ef51ad4df91e75cc6a1494f851850c0bd98ebc0be6e81b026e765ee535aa", [:mix], [], "hexpm", "8eab6e1cfa8d5918c2ce4ba43588e894af35dbd8e91e6e55c817bca5847df34a"}, "httpoison": {:hex, :httpoison, "1.8.2", "9eb9c63ae289296a544842ef816a85d881d4a31f518a0fec089aaa744beae290", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "2bb350d26972e30c96e2ca74a1aaf8293d61d0742ff17f01e0279fef11599921"}, "idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"}, - "igniter": {:hex, :igniter, "0.6.19", "d87703b36890bc4278341d966a7ed8e10604a18610a4331ac10c75d1af48fff4", [:mix], [{:glob_ex, "~> 0.1.7", [hex: :glob_ex, repo: "hexpm", optional: false]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:owl, "~> 0.11", [hex: :owl, repo: "hexpm", optional: false]}, {:phx_new, "~> 1.7", [hex: :phx_new, repo: "hexpm", optional: true]}, {:req, "~> 0.5", [hex: :req, repo: "hexpm", optional: false]}, {:rewrite, ">= 1.1.1 and < 2.0.0-0", [hex: :rewrite, repo: "hexpm", optional: false]}, {:sourceror, "~> 1.4", [hex: :sourceror, repo: "hexpm", optional: false]}, {:spitfire, ">= 0.1.3 and < 1.0.0-0", [hex: :spitfire, repo: "hexpm", optional: false]}], "hexpm", "c2070b3fdbd238fc0a0bfbc1f125b5c0f79a1fe2f5b3c7b43cd33de696783663"}, + "igniter": {:hex, :igniter, "0.6.25", "e2774a4605c2bc9fc38f689232604aea0fc925c7966ae8e928fd9ea2fa9d300c", [:mix], [{:glob_ex, "~> 0.1.7", [hex: :glob_ex, repo: "hexpm", optional: false]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:owl, "~> 0.11", [hex: :owl, repo: "hexpm", optional: false]}, {:phx_new, "~> 1.7", [hex: :phx_new, repo: "hexpm", optional: true]}, {:req, "~> 0.5", [hex: :req, repo: "hexpm", optional: false]}, {:rewrite, ">= 1.1.1 and < 2.0.0-0", [hex: :rewrite, repo: "hexpm", optional: false]}, {:sourceror, "~> 1.4", [hex: :sourceror, repo: "hexpm", optional: false]}, {:spitfire, ">= 0.1.3 and < 1.0.0-0", [hex: :spitfire, repo: "hexpm", optional: false]}], "hexpm", "b1916e1e45796d5c371c7671305e81277231617eb58b1c120915aba237fbce6a"}, "jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"}, "jsx": {:hex, :jsx, "2.8.3", "a05252d381885240744d955fbe3cf810504eb2567164824e19303ea59eef62cf", [:mix, :rebar3], [], "hexpm", "fc3499fed7a726995aa659143a248534adc754ebd16ccd437cd93b649a95091f"}, "jumper": {:hex, :jumper, "1.0.2", "68cdcd84472a00ac596b4e6459a41b3062d4427cbd4f1e8c8793c5b54f1406a7", [:mix], [], "hexpm", "9b7782409021e01ab3c08270e26f36eb62976a38c1aa64b2eaf6348422f165e1"}, @@ -68,7 +68,7 @@ "phoenix_html": {:hex, :phoenix_html, "4.2.1", "35279e2a39140068fc03f8874408d58eef734e488fc142153f055c5454fd1c08", [:mix], [], "hexpm", "cff108100ae2715dd959ae8f2a8cef8e20b593f8dfd031c9cba92702cf23e053"}, "phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.8.7", "405880012cb4b706f26dd1c6349125bfc903fb9e44d1ea668adaf4e04d4884b7", [:mix], [{:ecto, "~> 3.6.2 or ~> 3.7", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_mysql_extras, "~> 0.5", [hex: :ecto_mysql_extras, repo: "hexpm", optional: true]}, {:ecto_psql_extras, "~> 0.7", [hex: :ecto_psql_extras, repo: "hexpm", optional: true]}, {:ecto_sqlite3_extras, "~> 1.1.7 or ~> 1.2.0", [hex: :ecto_sqlite3_extras, repo: "hexpm", optional: true]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.19 or ~> 1.0", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6 or ~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "3a8625cab39ec261d48a13b7468dc619c0ede099601b084e343968309bd4d7d7"}, "phoenix_live_reload": {:hex, :phoenix_live_reload, "1.6.0", "2791fac0e2776b640192308cc90c0dbcf67843ad51387ed4ecae2038263d708d", [:mix], [{:file_system, "~> 0.2.10 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "b3a1fa036d7eb2f956774eda7a7638cf5123f8f2175aca6d6420a7f95e598e1c"}, - "phoenix_live_view": {:hex, :phoenix_live_view, "1.0.17", "beeb16d83a7d3760f7ad463df94e83b087577665d2acc0bf2987cd7d9778068f", [:mix], [{:floki, "~> 0.36", [hex: :floki, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0 or ~> 1.8.0-rc", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.15", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a4ca05c1eb6922c4d07a508a75bfa12c45e5f4d8f77ae83283465f02c53741e1"}, + "phoenix_live_view": {:hex, :phoenix_live_view, "1.1.1", "dfb8b5d60bb581eeeff0152d3dbe5d4f10f66d80cac8b6d9ad731454de2e16a3", [:mix], [{:igniter, ">= 0.6.16 and < 1.0.0-0", [hex: :igniter, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:lazy_html, "~> 0.1.0", [hex: :lazy_html, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0 or ~> 1.8.0-rc", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.15", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c77e3a7af23f10de1eab0b9aa0c8b6ad6bee395517a69dbc8f0ac4bb625b64b9"}, "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.3", "3168d78ba41835aecad272d5e8cd51aa87a7ac9eb836eabc42f6e57538e3731d", [:mix], [], "hexpm", "bba06bc1dcfd8cb086759f0edc94a8ba2bc8896d5331a1e2c2902bf8e36ee502"}, "phoenix_pubsub_redis": {:hex, :phoenix_pubsub_redis, "3.0.1", "d4d856b1e57a21358e448543e1d091e07e83403dde4383b8be04ed9d2c201cbc", [:mix], [{:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:poolboy, "~> 1.5.1 or ~> 1.6", [hex: :poolboy, repo: "hexpm", optional: false]}, {:redix, "~> 0.10.0 or ~> 1.0", [hex: :redix, repo: "hexpm", optional: false]}], "hexpm", "0b36a17ff6e9a56159f8df8933d62b5c1f0695eae995a02e0c86c035ace6a309"}, "phoenix_template": {:hex, :phoenix_template, "1.0.4", "e2092c132f3b5e5b2d49c96695342eb36d0ed514c5b252a77048d5969330d639", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "2c0c81f0e5c6753faf5cca2f229c9709919aba34fab866d3bc05060c9c444206"}, @@ -82,15 +82,15 @@ "req": {:hex, :req, "0.5.15", "662020efb6ea60b9f0e0fac9be88cd7558b53fe51155a2d9899de594f9906ba9", [:mix], [{:brotli, "~> 0.3.1", [hex: :brotli, repo: "hexpm", optional: true]}, {:ezstd, "~> 1.0", [hex: :ezstd, repo: "hexpm", optional: true]}, {:finch, "~> 0.17", [hex: :finch, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mime, "~> 2.0.6 or ~> 2.1", [hex: :mime, repo: "hexpm", optional: false]}, {:nimble_csv, "~> 1.0", [hex: :nimble_csv, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "a6513a35fad65467893ced9785457e91693352c70b58bbc045b47e5eb2ef0c53"}, "resend": {:hex, :resend, "0.4.4", "f80c6efb6f5d1043f57a1ae1e02cd366a562cac6338097aca38675c7ebe94156", [:mix], [{:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: false]}, {:swoosh, "~> 1.3", [hex: :swoosh, repo: "hexpm", optional: false]}, {:tesla, "~> 1.5", [hex: :tesla, repo: "hexpm", optional: false]}], "hexpm", "7dab4e8ae395e8ea984e4402988cc9e02b13739707deef127d8f14d181cb88ed"}, "rewrite": {:hex, :rewrite, "1.1.2", "f5a5d10f5fed1491a6ff48e078d4585882695962ccc9e6c779bae025d1f92eda", [:mix], [{:glob_ex, "~> 0.1", [hex: :glob_ex, repo: "hexpm", optional: false]}, {:sourceror, "~> 1.0", [hex: :sourceror, repo: "hexpm", optional: false]}, {:text_diff, "~> 0.1", [hex: :text_diff, repo: "hexpm", optional: false]}], "hexpm", "7f8b94b1e3528d0a47b3e8b7bfeca559d2948a65fa7418a9ad7d7712703d39d4"}, - "sentry": {:hex, :sentry, "11.0.1", "e4e0ae12a74c59639808442a79d7ddd224fd5987fb9a14b35a1d01d9606117a3", [:mix], [{:hackney, "~> 1.8", [hex: :hackney, repo: "hexpm", optional: true]}, {:igniter, "~> 0.5", [hex: :igniter, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: true]}, {:nimble_options, "~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_ownership, "~> 0.3.0 or ~> 1.0", [hex: :nimble_ownership, repo: "hexpm", optional: false]}, {:opentelemetry, "~> 1.5", [hex: :opentelemetry, repo: "hexpm", optional: true]}, {:opentelemetry_api, "~> 1.4", [hex: :opentelemetry_api, repo: "hexpm", optional: true]}, {:opentelemetry_exporter, "~> 1.0", [hex: :opentelemetry_exporter, repo: "hexpm", optional: true]}, {:opentelemetry_semantic_conventions, "~> 1.27", [hex: :opentelemetry_semantic_conventions, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6", [hex: :phoenix, repo: "hexpm", optional: true]}, {:phoenix_live_view, "~> 0.20 or ~> 1.0", [hex: :phoenix_live_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.6", [hex: :plug, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "ef12b6ee61c24bee3807eee92563567c89f5eec954d6bb913eb797e04625a613"}, + "sentry": {:hex, :sentry, "11.0.2", "74cd4005d8ccf45a674113d8415a646690b465e7724cc9b69524fdcd906c5e21", [:mix], [{:hackney, "~> 1.8", [hex: :hackney, repo: "hexpm", optional: true]}, {:igniter, "~> 0.5", [hex: :igniter, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: true]}, {:nimble_options, "~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_ownership, "~> 0.3.0 or ~> 1.0", [hex: :nimble_ownership, repo: "hexpm", optional: false]}, {:opentelemetry, "~> 1.5", [hex: :opentelemetry, repo: "hexpm", optional: true]}, {:opentelemetry_api, "~> 1.4", [hex: :opentelemetry_api, repo: "hexpm", optional: true]}, {:opentelemetry_exporter, "~> 1.0", [hex: :opentelemetry_exporter, repo: "hexpm", optional: true]}, {:opentelemetry_semantic_conventions, "~> 1.27", [hex: :opentelemetry_semantic_conventions, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6", [hex: :phoenix, repo: "hexpm", optional: true]}, {:phoenix_live_view, "~> 0.20 or ~> 1.0", [hex: :phoenix_live_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.6", [hex: :plug, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "e7910d44fdd7b8283e2e0c26ca4074fbe719d98b2783031f4533700d1427f7a7"}, "sleeplocks": {:hex, :sleeplocks, "1.1.3", "96a86460cc33b435c7310dbd27ec82ca2c1f24ae38e34f8edde97f756503441a", [:rebar3], [], "hexpm", "d3b3958552e6eb16f463921e70ae7c767519ef8f5be46d7696cc1ed649421321"}, "sobelow": {:hex, :sobelow, "0.14.0", "dd82aae8f72503f924fe9dd97ffe4ca694d2f17ec463dcfd365987c9752af6ee", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "7ecf91e298acfd9b24f5d761f19e8f6e6ac585b9387fb6301023f1f2cd5eed5f"}, "sourceror": {:hex, :sourceror, "1.10.0", "38397dedbbc286966ec48c7af13e228b171332be1ad731974438c77791945ce9", [:mix], [], "hexpm", "29dbdfc92e04569c9d8e6efdc422fc1d815f4bd0055dc7c51b8800fb75c4b3f1"}, "spitfire": {:hex, :spitfire, "0.2.1", "29e154873f05444669c7453d3d931820822cbca5170e88f0f8faa1de74a79b47", [:mix], [], "hexpm", "6eeed75054a38341b2e1814d41bb0a250564092358de2669fdb57ff88141d91b"}, "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.7", "354c321cf377240c7b8716899e182ce4890c5938111a1296add3ec74cf1715df", [:make, :mix, :rebar3], [], "hexpm", "fe4c190e8f37401d30167c8c405eda19469f34577987c76dde613e838bbc67f8"}, "stream_data": {:hex, :stream_data, "1.2.0", "58dd3f9e88afe27dc38bef26fce0c84a9e7a96772b2925c7b32cd2435697a52b", [:mix], [], "hexpm", "eb5c546ee3466920314643edf68943a5b14b32d1da9fe01698dc92b73f89a9ed"}, - "styler": {:hex, :styler, "1.5.0", "1ccdf5aeb0bea82a8635f010fac82b0a960352e251ec011843da5eaa1b1e4242", [:mix], [], "hexpm", "d53cb95ba928a496315b8f5291fd4dfbd5f54f12548d3be7c5331cab8693b5ab"}, - "swoosh": {:hex, :swoosh, "1.19.3", "02ad4455939f502386e4e1443d4de94c514995fd0e51b3cafffd6bd270ffe81c", [:mix], [{:bandit, ">= 1.0.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:ex_aws, "~> 2.1", [hex: :ex_aws, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mua, "~> 0.2.3", [hex: :mua, repo: "hexpm", optional: true]}, {:multipart, "~> 0.4", [hex: :multipart, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: true]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:req, "~> 0.5.10 or ~> 0.6 or ~> 1.0", [hex: :req, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "04a10f8496786b744b84130e3510eb53ca51e769c39511b65023bdf4136b732f"}, + "styler": {:hex, :styler, "1.6.0", "211339c7c16db2b159bf07014a302864b17f1b651b33bb24a58a7e47ef35ef22", [:mix], [], "hexpm", "7019dfa15317a1a5bab141cfa3a751b3aae440a146e28c6a45caccf726c9d765"}, + "swoosh": {:hex, :swoosh, "1.19.5", "5abd71be78302ba21be56a2b68d05c9946ff1f1bd254f949efef09d253b771ac", [:mix], [{:bandit, ">= 1.0.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:ex_aws, "~> 2.1", [hex: :ex_aws, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mua, "~> 0.2.3", [hex: :mua, repo: "hexpm", optional: true]}, {:multipart, "~> 0.4", [hex: :multipart, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: true]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:req, "~> 0.5.10 or ~> 0.6 or ~> 1.0", [hex: :req, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c953f51ee0a8b237e0f4307c9cefd3eb1eb751c35fcdda2a8bccb991766473be"}, "table_rex": {:hex, :table_rex, "4.1.0", "fbaa8b1ce154c9772012bf445bfb86b587430fb96f3b12022d3f35ee4a68c918", [:mix], [], "hexpm", "95932701df195d43bc2d1c6531178fc8338aa8f38c80f098504d529c43bc2601"}, "tailwind": {:hex, :tailwind, "0.3.1", "a89d2835c580748c7a975ad7dd3f2ea5e63216dc16d44f9df492fbd12c094bed", [:mix], [], "hexpm", "98a45febdf4a87bc26682e1171acdedd6317d0919953c353fcd1b4f9f4b676a2"}, "telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"}, diff --git a/test/aprsme/device_identification_test.exs b/test/aprsme/device_identification_test.exs index 49b7d2e..4af1c09 100644 --- a/test/aprsme/device_identification_test.exs +++ b/test/aprsme/device_identification_test.exs @@ -99,10 +99,10 @@ defmodule Aprsme.DeviceIdentificationTest do # Should match found = DeviceIdentification.lookup_device_by_identifier("APSK21") - assert found != nil + assert found assert found.identifier == "APS???" - assert found.model != nil - assert found.vendor != nil + assert found.model + assert found.vendor end test "matches Mic-E device identifier from raw packet" do @@ -111,10 +111,10 @@ defmodule Aprsme.DeviceIdentificationTest do # The device identifier extracted from the raw packet is "]=" found = DeviceIdentification.lookup_device_by_identifier("]=") - assert found != nil + assert found assert found.identifier == "]=" - assert found.model != nil - assert found.vendor != nil + assert found.model + assert found.vendor end end end diff --git a/test/aprsme/geometry_test.exs b/test/aprsme/geometry_test.exs index 094d4d3..d5edd3c 100644 --- a/test/aprsme/geometry_test.exs +++ b/test/aprsme/geometry_test.exs @@ -62,7 +62,7 @@ defmodule Aprsme.GeometryTest do changeset = Packet.changeset(%Packet{}, attrs) assert changeset.valid? - assert get_change(changeset, :location) != nil + assert get_change(changeset, :location) assert get_change(changeset, :has_position) == true location = get_change(changeset, :location) @@ -112,7 +112,7 @@ defmodule Aprsme.GeometryTest do assert {:ok, packet} = Packets.store_packet(attrs) assert packet.sender == "TEST-1" assert packet.has_position == true - assert packet.location != nil + assert packet.location assert %Geo.Point{} = packet.location assert_in_delta elem(packet.location.coordinates, 1), 32.2743, 0.0001 assert_in_delta elem(packet.location.coordinates, 0), -96.7970, 0.0001 @@ -195,18 +195,18 @@ defmodule Aprsme.GeometryTest do describe "coordinate conversion and validation" do test "handles various coordinate formats" do # Test float coordinates - assert Packet.create_point(32.7767, -96.7970) != nil + assert Packet.create_point(32.7767, -96.7970) # Test integer coordinates - assert Packet.create_point(33, -97) != nil + assert Packet.create_point(33, -97) # Test boundary values - assert Packet.create_point(90.0, 180.0) != nil - assert Packet.create_point(-90.0, -180.0) != nil + assert Packet.create_point(90.0, 180.0) + assert Packet.create_point(-90.0, -180.0) # Test just inside boundaries - assert Packet.create_point(89.9999, 179.9999) != nil - assert Packet.create_point(-89.9999, -179.9999) != nil + assert Packet.create_point(89.9999, 179.9999) + assert Packet.create_point(-89.9999, -179.9999) end test "rejects coordinates outside valid ranges" do @@ -221,13 +221,13 @@ defmodule Aprsme.GeometryTest do test "handles edge case coordinates" do # Test zero coordinates - assert Packet.create_point(0.0, 0.0) != nil + assert Packet.create_point(0.0, 0.0) # Test very small coordinates - assert Packet.create_point(0.000001, 0.000001) != nil + assert Packet.create_point(0.000001, 0.000001) # Test coordinates near boundaries - assert Packet.create_point(89.999999, 179.999999) != nil + assert Packet.create_point(89.999999, 179.999999) end end @@ -252,7 +252,7 @@ defmodule Aprsme.GeometryTest do assert {:ok, packet} = Packets.store_packet(attrs) assert packet.sender == "TEST-1" assert packet.has_position == true - assert packet.location != nil + assert packet.location end test "stores packet with standard position data" do diff --git a/test/aprsme/is_test.exs b/test/aprsme/is_test.exs index cb271b9..1c729d2 100644 --- a/test/aprsme/is_test.exs +++ b/test/aprsme/is_test.exs @@ -66,7 +66,7 @@ defmodule Aprsme.IsTest do assert AprsIsMock.simulate_connection_state(true) == :ok status = AprsIsMock.get_status() assert status.connected == true - assert status.connected_at != nil + assert status.connected_at # Simulate disconnected state assert AprsIsMock.simulate_connection_state(false) == :ok diff --git a/test/aprsme_web/live/map_live/overlay_rendering_test.exs b/test/aprsme_web/live/map_live/overlay_rendering_test.exs index 956f12e..dcdf4f7 100644 --- a/test/aprsme_web/live/map_live/overlay_rendering_test.exs +++ b/test/aprsme_web/live/map_live/overlay_rendering_test.exs @@ -93,7 +93,7 @@ defmodule AprsmeWeb.MapLive.OverlayRenderingTest do # Verify it's a single background image (no overlay) assert symbol_html =~ "background-image: url(/aprs-symbols/aprs-symbols-128-0@2x.png)" - assert not (symbol_html =~ "background-image: url(/aprs-symbols/aprs-symbols-128-0@2x.png), url") + refute symbol_html =~ "background-image: url(/aprs-symbols/aprs-symbols-128-0@2x.png), url" # Verify the position for _ symbol assert symbol_html =~ "background-position: -448.0px -96.0px" diff --git a/test/aprsme_web/live/map_live/packet_utils_test.exs b/test/aprsme_web/live/map_live/packet_utils_test.exs index 56b9c13..b34251c 100644 --- a/test/aprsme_web/live/map_live/packet_utils_test.exs +++ b/test/aprsme_web/live/map_live/packet_utils_test.exs @@ -29,8 +29,8 @@ defmodule AprsmeWeb.MapLive.PacketUtilsTest do result = PacketUtils.build_packet_data(packet, true) - assert result != nil - assert result["popup"] != nil + assert result + assert result["popup"] popup = result["popup"] @@ -81,8 +81,8 @@ defmodule AprsmeWeb.MapLive.PacketUtilsTest do result = PacketUtils.build_packet_data(packet, true) - assert result != nil - assert result["popup"] != nil + assert result + assert result["popup"] popup = result["popup"] @@ -119,8 +119,8 @@ defmodule AprsmeWeb.MapLive.PacketUtilsTest do result = PacketUtils.build_packet_data(packet, true) - assert result != nil - assert result["popup"] != nil + assert result + assert result["popup"] popup = result["popup"] @@ -157,8 +157,8 @@ defmodule AprsmeWeb.MapLive.PacketUtilsTest do result = PacketUtils.build_packet_data(packet, true) - assert result != nil - assert result["popup"] != nil + assert result + assert result["popup"] popup = result["popup"] @@ -194,8 +194,8 @@ defmodule AprsmeWeb.MapLive.PacketUtilsTest do result = PacketUtils.build_packet_data(packet, true) - assert result != nil - assert result["popup"] != nil + assert result + assert result["popup"] popup = result["popup"] @@ -227,8 +227,8 @@ defmodule AprsmeWeb.MapLive.PacketUtilsTest do result = PacketUtils.build_packet_data(packet, true) - assert result != nil - assert result["popup"] != nil + assert result + assert result["popup"] popup = result["popup"] @@ -261,8 +261,8 @@ defmodule AprsmeWeb.MapLive.PacketUtilsTest do result = PacketUtils.build_packet_data(packet, true) - assert result != nil - assert result["popup"] != nil + assert result + assert result["popup"] popup = result["popup"]