From 04e7d5ac23811fc263c4bc4af562b9790cf5a153 Mon Sep 17 00:00:00 2001 From: Graham McIntire Date: Tue, 21 Apr 2026 09:43:18 -0500 Subject: [PATCH] =?UTF-8?q?dialyzer:=20fix=20unknown=5Ftype=20warnings=20(?= =?UTF-8?q?60=20=E2=86=92=200)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add @type t :: %__MODULE__{} to schemas referenced by callers: ApiToken, Monitoring.Check, OnCall.Schedule, SiteOutage, NotificationDigest, Snmp.WirelessClient, Topology.DeviceLink, Agent.AgentJob, Agent.MikrotikResult. - Proto.Types: qualify forward references to nested modules with Types. prefix, and fix Metric typo (should be union type metric()). - data_loaders.ex / chart_builders.ex: Snmp.SNMPDevice.t was a ghost spec — module is Snmp.Device. Warnings: 328 → 242. --- lib/towerops/alerts/notification_digest.ex | 2 + lib/towerops/alerts/site_outage.ex | 2 + lib/towerops/api_tokens/api_token.ex | 2 + lib/towerops/monitoring/check.ex | 2 + lib/towerops/on_call/schedule.ex | 2 + lib/towerops/proto/agent.ex | 4 ++ lib/towerops/proto/types.ex | 46 +++++++++---------- lib/towerops/snmp/wireless_client.ex | 2 + lib/towerops/topology/device_link.ex | 2 + .../device_live/helpers/chart_builders.ex | 4 +- .../live/device_live/helpers/data_loaders.ex | 18 ++++---- 11 files changed, 52 insertions(+), 34 deletions(-) diff --git a/lib/towerops/alerts/notification_digest.ex b/lib/towerops/alerts/notification_digest.ex index 2e204105..3b56e208 100644 --- a/lib/towerops/alerts/notification_digest.ex +++ b/lib/towerops/alerts/notification_digest.ex @@ -12,6 +12,8 @@ defmodule Towerops.Alerts.NotificationDigest do alias Towerops.Accounts.User alias Towerops.Organizations.Organization + @type t :: %__MODULE__{} + @primary_key {:id, :binary_id, autogenerate: true} @foreign_key_type :binary_id schema "notification_digests" do diff --git a/lib/towerops/alerts/site_outage.ex b/lib/towerops/alerts/site_outage.ex index 16eabacf..211a22d9 100644 --- a/lib/towerops/alerts/site_outage.ex +++ b/lib/towerops/alerts/site_outage.ex @@ -14,6 +14,8 @@ defmodule Towerops.Alerts.SiteOutage do alias Towerops.Organizations.Organization alias Towerops.Sites.Site + @type t :: %__MODULE__{} + @primary_key {:id, :binary_id, autogenerate: true} @foreign_key_type :binary_id schema "site_outages" do diff --git a/lib/towerops/api_tokens/api_token.ex b/lib/towerops/api_tokens/api_token.ex index faa37048..24546ce8 100644 --- a/lib/towerops/api_tokens/api_token.ex +++ b/lib/towerops/api_tokens/api_token.ex @@ -12,6 +12,8 @@ defmodule Towerops.ApiTokens.ApiToken do import Ecto.Changeset + @type t :: %__MODULE__{} + @primary_key {:id, :binary_id, autogenerate: true} @foreign_key_type :binary_id diff --git a/lib/towerops/monitoring/check.ex b/lib/towerops/monitoring/check.ex index 3005e4f3..3943b996 100644 --- a/lib/towerops/monitoring/check.ex +++ b/lib/towerops/monitoring/check.ex @@ -20,6 +20,8 @@ defmodule Towerops.Monitoring.Check do alias Towerops.Devices.Device alias Towerops.Organizations.Organization + @type t :: %__MODULE__{} + @primary_key {:id, :binary_id, autogenerate: true} @foreign_key_type :binary_id diff --git a/lib/towerops/on_call/schedule.ex b/lib/towerops/on_call/schedule.ex index 92a77348..7623cbd0 100644 --- a/lib/towerops/on_call/schedule.ex +++ b/lib/towerops/on_call/schedule.ex @@ -10,6 +10,8 @@ defmodule Towerops.OnCall.Schedule do alias Towerops.OnCall.Override alias Towerops.Organizations.Organization + @type t :: %__MODULE__{} + @primary_key {:id, :binary_id, autogenerate: true} @foreign_key_type :binary_id schema "on_call_schedules" do diff --git a/lib/towerops/proto/agent.ex b/lib/towerops/proto/agent.ex index fcb6d8e1..dc66e9da 100644 --- a/lib/towerops/proto/agent.ex +++ b/lib/towerops/proto/agent.ex @@ -532,6 +532,8 @@ end defmodule Towerops.Agent.AgentJob do @moduledoc false + @type t :: %__MODULE__{} + defstruct job_id: "", job_type: :DISCOVER, device_id: "", @@ -692,6 +694,8 @@ defmodule Towerops.Agent.MikrotikResult do @moduledoc false alias Towerops.Agent.MikrotikSentence + @type t :: %__MODULE__{} + defstruct device_id: "", job_id: "", sentences: [], error: "", timestamp: 0 def encode(%__MODULE__{} = r) do diff --git a/lib/towerops/proto/types.ex b/lib/towerops/proto/types.ex index 49630b32..6610c8f2 100644 --- a/lib/towerops/proto/types.ex +++ b/lib/towerops/proto/types.ex @@ -118,8 +118,8 @@ defmodule Towerops.Proto.Types do @type t :: %__MODULE__{ version: String.t(), poll_interval_seconds: non_neg_integer(), - devices: [Device.t()], - checks: [Check.t()] + devices: [Types.Device.t()], + checks: [Types.Check.t()] } end @@ -152,10 +152,10 @@ defmodule Towerops.Proto.Types do id: String.t(), name: String.t(), ip_address: String.t(), - snmp: SnmpConfig.t() | nil, + snmp: Types.SnmpConfig.t() | nil, poll_interval_seconds: non_neg_integer(), - sensors: [Sensor.t()], - interfaces: [Interface.t()], + sensors: [Types.Sensor.t()], + interfaces: [Types.Interface.t()], monitoring_enabled: boolean(), check_interval_seconds: non_neg_integer() } @@ -207,15 +207,15 @@ defmodule Towerops.Proto.Types do @enforce_keys [:metrics] defstruct [:metrics] - @type t :: %__MODULE__{metrics: [Metric.t()]} + @type t :: %__MODULE__{metrics: [Types.metric()]} end @type metric :: - {:sensor_reading, SensorReading.t()} - | {:interface_stat, InterfaceStat.t()} - | {:neighbor_discovery, NeighborDiscovery.t()} - | {:monitoring_check, MonitoringCheck.t()} - | {:check_result, CheckResult.t()} + {:sensor_reading, Types.SensorReading.t()} + | {:interface_stat, Types.InterfaceStat.t()} + | {:neighbor_discovery, Types.NeighborDiscovery.t()} + | {:monitoring_check, Types.MonitoringCheck.t()} + | {:check_result, Types.CheckResult.t()} defmodule SensorReading do @moduledoc false @@ -323,10 +323,10 @@ defmodule Towerops.Proto.Types do end @type check_config :: - {:http, HttpCheckConfig.t()} - | {:tcp, TcpCheckConfig.t()} - | {:dns, DnsCheckConfig.t()} - | {:ssl, SslCheckConfig.t()} + {:http, Types.HttpCheckConfig.t()} + | {:tcp, Types.TcpCheckConfig.t()} + | {:dns, Types.DnsCheckConfig.t()} + | {:ssl, Types.SslCheckConfig.t()} | :no_config defmodule Check do @@ -435,7 +435,7 @@ defmodule Towerops.Proto.Types do @enforce_keys [:checks] defstruct [:checks] - @type t :: %__MODULE__{checks: [Check.t()]} + @type t :: %__MODULE__{checks: [Types.Check.t()]} end defmodule AgentJobList do @@ -443,7 +443,7 @@ defmodule Towerops.Proto.Types do @enforce_keys [:jobs] defstruct [:jobs] - @type t :: %__MODULE__{jobs: [AgentJob.t()]} + @type t :: %__MODULE__{jobs: [Types.AgentJob.t()]} end defmodule AgentJob do @@ -471,10 +471,10 @@ defmodule Towerops.Proto.Types do job_id: String.t(), job_type: Types.job_type(), device_id: String.t(), - snmp_device: SnmpDevice.t() | nil, - queries: [SnmpQuery.t()], - mikrotik_device: MikrotikDevice.t() | nil, - mikrotik_commands: [MikrotikCommand.t()] + snmp_device: Types.SnmpDevice.t() | nil, + queries: [Types.SnmpQuery.t()], + mikrotik_device: Types.MikrotikDevice.t() | nil, + mikrotik_commands: [Types.MikrotikCommand.t()] } end @@ -608,7 +608,7 @@ defmodule Towerops.Proto.Types do @type t :: %__MODULE__{ device_id: String.t(), job_id: String.t(), - sentences: [MikrotikSentence.t()], + sentences: [Types.MikrotikSentence.t()], error: String.t(), timestamp: non_neg_integer() } @@ -631,7 +631,7 @@ defmodule Towerops.Proto.Types do device_id: String.t(), job_id: String.t(), local_system_name: String.t(), - neighbors: [LldpNeighbor.t()], + neighbors: [Types.LldpNeighbor.t()], timestamp: non_neg_integer() } end diff --git a/lib/towerops/snmp/wireless_client.ex b/lib/towerops/snmp/wireless_client.ex index 3994e769..601086e5 100644 --- a/lib/towerops/snmp/wireless_client.ex +++ b/lib/towerops/snmp/wireless_client.ex @@ -9,6 +9,8 @@ defmodule Towerops.Snmp.WirelessClient do import Ecto.Changeset + @type t :: %__MODULE__{} + @primary_key {:id, :binary_id, autogenerate: true} @foreign_key_type :binary_id schema "wireless_clients" do diff --git a/lib/towerops/topology/device_link.ex b/lib/towerops/topology/device_link.ex index 8f3deb96..11535747 100644 --- a/lib/towerops/topology/device_link.ex +++ b/lib/towerops/topology/device_link.ex @@ -14,6 +14,8 @@ defmodule Towerops.Topology.DeviceLink do alias Towerops.Snmp.Interface alias Towerops.Topology.DeviceLinkEvidence + @type t :: %__MODULE__{} + @valid_link_types ~w(lldp cdp mac_match wireless_association arp_inference manual) @primary_key {:id, :binary_id, autogenerate: true} diff --git a/lib/towerops_web/live/device_live/helpers/chart_builders.ex b/lib/towerops_web/live/device_live/helpers/chart_builders.ex index abfa3045..f7b09c26 100644 --- a/lib/towerops_web/live/device_live/helpers/chart_builders.ex +++ b/lib/towerops_web/live/device_live/helpers/chart_builders.ex @@ -109,7 +109,7 @@ defmodule ToweropsWeb.DeviceLive.Helpers.ChartBuilders do Returns JSON-encoded chart data or nil if no matching sensors found. """ - @spec load_sensor_chart_data(Snmp.SNMPDevice.t() | nil, list(String.t())) :: + @spec load_sensor_chart_data(Snmp.Device.t() | nil, list(String.t())) :: String.t() | nil def load_sensor_chart_data(nil, _sensor_types), do: nil @@ -189,7 +189,7 @@ defmodule ToweropsWeb.DeviceLive.Helpers.ChartBuilders do Returns JSON-encoded chart data or nil if no traffic data available. """ - @spec load_overall_traffic_chart_data(Snmp.SNMPDevice.t() | nil) :: String.t() | nil + @spec load_overall_traffic_chart_data(Snmp.Device.t() | nil) :: String.t() | nil def load_overall_traffic_chart_data(nil), do: nil def load_overall_traffic_chart_data(snmp_device) do diff --git a/lib/towerops_web/live/device_live/helpers/data_loaders.ex b/lib/towerops_web/live/device_live/helpers/data_loaders.ex index ad4e8219..cbc28840 100644 --- a/lib/towerops_web/live/device_live/helpers/data_loaders.ex +++ b/lib/towerops_web/live/device_live/helpers/data_loaders.ex @@ -74,7 +74,7 @@ defmodule ToweropsWeb.DeviceLive.Helpers.DataLoaders do Enriches sensors and interfaces with their latest readings/stats. """ @spec load_snmp_data(binary()) :: %{ - device: Snmp.SNMPDevice.t() | nil, + device: Snmp.Device.t() | nil, interfaces: list(), sensors: list() } @@ -115,28 +115,28 @@ defmodule ToweropsWeb.DeviceLive.Helpers.DataLoaders do @doc """ Loads VLAN information for an SNMP device. """ - @spec load_vlans(Snmp.SNMPDevice.t() | nil) :: list() + @spec load_vlans(Snmp.Device.t() | nil) :: list() def load_vlans(nil), do: [] def load_vlans(snmp_device), do: Snmp.list_vlans(snmp_device.id) @doc """ Loads IP addresses for an SNMP device. """ - @spec load_ip_addresses(Snmp.SNMPDevice.t() | nil) :: list() + @spec load_ip_addresses(Snmp.Device.t() | nil) :: list() def load_ip_addresses(nil), do: [] def load_ip_addresses(snmp_device), do: Snmp.list_ip_addresses(snmp_device.id) @doc """ Loads processor information for an SNMP device. """ - @spec load_processors(Snmp.SNMPDevice.t() | nil) :: list() + @spec load_processors(Snmp.Device.t() | nil) :: list() def load_processors(nil), do: [] def load_processors(snmp_device), do: Snmp.list_processors(snmp_device.id) @doc """ Loads storage information for an SNMP device. """ - @spec load_storage(Snmp.SNMPDevice.t() | nil) :: list() + @spec load_storage(Snmp.Device.t() | nil) :: list() def load_storage(nil), do: [] def load_storage(snmp_device), do: Snmp.list_storage(snmp_device.id) @@ -162,7 +162,7 @@ defmodule ToweropsWeb.DeviceLive.Helpers.DataLoaders do Returns firmware release information if available, nil otherwise. Currently only supports MikroTik RouterOS. """ - @spec get_available_firmware(Snmp.SNMPDevice.t() | nil) :: map() | nil + @spec get_available_firmware(Snmp.Device.t() | nil) :: map() | nil def get_available_firmware(nil), do: nil def get_available_firmware(snmp_device) do @@ -394,7 +394,7 @@ defmodule ToweropsWeb.DeviceLive.Helpers.DataLoaders do @doc """ Loads transceiver data for a device. """ - @spec load_transceivers(Snmp.SNMPDevice.t() | nil) :: map() + @spec load_transceivers(Snmp.Device.t() | nil) :: map() def load_transceivers(nil) do %{ transceivers: [], @@ -414,7 +414,7 @@ defmodule ToweropsWeb.DeviceLive.Helpers.DataLoaders do @doc """ Loads printer supplies data for a device. """ - @spec load_printer_supplies(Snmp.SNMPDevice.t() | nil) :: map() + @spec load_printer_supplies(Snmp.Device.t() | nil) :: map() def load_printer_supplies(nil) do %{ printer_supplies: [], @@ -434,7 +434,7 @@ defmodule ToweropsWeb.DeviceLive.Helpers.DataLoaders do @doc """ Loads hardware inventory (entity physical) data for a device. """ - @spec load_hardware_inventory(Snmp.SNMPDevice.t() | nil) :: map() + @spec load_hardware_inventory(Snmp.Device.t() | nil) :: map() def load_hardware_inventory(nil) do %{ hardware_inventory: [],