aprs.me/.dialyzer_ignore.exs
Graham McIntire adaf9599e2
chore: update dependencies and fix pre-existing issues
Dep upgrades (mix deps.update --all):
- phoenix_live_view 1.1.27 → 1.1.28
- swoosh 1.23.1 → 1.25.0
- bandit 1.10.3 → 1.10.4
- credo 1.7.17 → 1.7.18
- hammer 7.2.0 → 7.3.0
- igniter 0.7.6 → 0.7.9
- and minor: fine, lazy_html, meck, mimerl
- removed stale lock entries: geocalc, gettext_pseudolocalize, gridsquare

Bug fixes surfaced during update:
- ETS cache tables were :protected (owned by Application master), preventing
  the Cache GenServer from writing; change to :public + write_concurrency
  so device/symbol/query caches actually work
- historical_dot_html returned Phoenix.HTML.safe tuple instead of plain string;
  symbol_html is JSON-encoded for JS so it must be binary
- String.slice always returns binary so the || "Unknown error" fallback was
  unreachable dead code (dialyzer guard_fail)
- Supervisor.which_children always returns a list so the _ -> branch in
  database_metrics was unreachable dead code (dialyzer pattern_match_cov)
- Add @type t :: %__MODULE__{} to User schema to resolve unknown_type in user_auth spec
- Extract nested if in leader_election to fix Credo nesting depth violation
- Update .dialyzer_ignore.exs: remove 2 stale entries, add false positives for
  Ecto.Multi/Gettext opaque types and Mix.Task PLT limitations
2026-04-15 14:07:29 -05:00

40 lines
2.2 KiB
Elixir

[
# Template compilation warnings - these are false positives from Phoenix LiveView template compilation
# These warnings are due to template compilation and cannot be easily fixed without breaking UI logic
~r/lib\/aprsme_web\/live\/info_live\/show\.html\.heex/,
~r/lib\/aprsme_web\/live\/weather_live\/callsign_view\.html\.heex/,
# False positive: The nil pattern is handled in the case statement above, dialyzer doesn't track this correctly
{"lib/aprsme/packets.ex"},
# False positive: Aprs.parse/1 does return {:ok, _} but dialyzer can't see the vendored library types
{"lib/aprsme/is/is.ex"},
# False positive: PacketUtils.get_weather_field can return various types including nil
{"lib/aprsme_web/live/weather_live/callsign_view.ex"},
# False positive: Ecto.Multi uses opaque internal types — call_without_opaque on Ecto.Multi.update/3
# is a known dialyzer limitation with Ecto.Multi's opaque MapSet-backed names field
{"lib/aprsme/accounts.ex", :call_without_opaque},
# False positive: Gettext uses Expo.PluralForms opaque types internally; Gettext.Plural.plural/2
# is called with a tuple that satisfies the runtime contract but violates the opaque type spec
{"lib/aprsme_web/gettext.ex", :call_without_opaque},
# False positive: MapSet.t() is opaque; the @spec is correct at the semantic level but dialyzer
# sees through the opaque wrapper to the underlying map representation
{"lib/aprsme/packets/prepared_queries.ex", :contract_with_opaque},
# False positive: to_float/1 has a %Decimal{} clause for completeness but dialyzer infers
# nil | number() from the call sites in mobile_channel — the clause is defensive dead code
{"lib/aprsme_web/channels/mobile_channel.ex"},
# False positive: symbol_table_id is typed as binary() by dialyzer at this call site; the nil
# guard in the && expression can't match binary(), but the function can receive nil in practice
{"lib/aprsme_web/live/info_live/show.ex", :guard_fail},
# Mix.Task PLT limitations: Mix.Task behaviour types and Mix.shell/0 are not available
# in the dialyzer PLT; also the aprs library's return type is inferred incorrectly from
# the compiled beam without full type specs
{"lib/mix/tasks/aprs.parse_file.ex"}
]