From 78bea7adf26920455d6c371934189084de9700f0 Mon Sep 17 00:00:00 2001 From: Emily Crandall Fleischman Date: Tue, 21 Jul 2026 16:29:13 -0400 Subject: [PATCH 1/9] chore: upgrade erlang and elixir versions --- .tool-versions | 4 ++-- apps/api_web/lib/api_web/controllers/schedule_controller.ex | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.tool-versions b/.tool-versions index a6a99938a..31f984f00 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,4 +1,4 @@ -elixir 1.17.3-otp-27 -erlang 27.3.4.13 +elixir 1.19.5-otp-28 +erlang 28.5.0.3 python 3.9.16 poetry 1.7.0 diff --git a/apps/api_web/lib/api_web/controllers/schedule_controller.ex b/apps/api_web/lib/api_web/controllers/schedule_controller.ex index 56582a2cb..a641a0dd2 100644 --- a/apps/api_web/lib/api_web/controllers/schedule_controller.ex +++ b/apps/api_web/lib/api_web/controllers/schedule_controller.ex @@ -115,7 +115,7 @@ defmodule ApiWeb.ScheduleController do end def populate_extra_times(map, %{assigns: %{api_version: ver}}) when ver < "2019-07-01" do - for s <- map do + for %Model.Schedule{} = s <- map do s = if s.pickup_type == 1, do: %Model.Schedule{s | departure_time: s.arrival_time}, else: s if s.drop_off_type == 1, do: %Model.Schedule{s | arrival_time: s.departure_time}, else: s end From 907744c7da7b48c38de2b12a30e336458f56e2fd Mon Sep 17 00:00:00 2001 From: Emily Crandall Fleischman Date: Tue, 21 Jul 2026 17:11:26 -0400 Subject: [PATCH 2/9] chore: update versions in Dockerfile --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 8bbb1219c..baf95921c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ -ARG ELIXIR_VERSION=1.17.3 -ARG ERLANG_VERSION=27.3.4.13 +ARG ELIXIR_VERSION=1.19.5 +ARG ERLANG_VERSION=28.5.0.3 ARG ALPINE_VERSION=3.21.7 FROM hexpm/elixir:${ELIXIR_VERSION}-erlang-${ERLANG_VERSION}-alpine-${ALPINE_VERSION} as builder From d8d72b690e97fbf20df4cf34eabb2351eb63ab72 Mon Sep 17 00:00:00 2001 From: Emily Crandall Fleischman Date: Tue, 21 Jul 2026 17:17:06 -0400 Subject: [PATCH 3/9] chore: formatting --- .../test/api_web/controllers/stop_controller_test.exs | 5 ++++- apps/state/lib/state/route_pattern.ex | 2 +- apps/state/test/state/trip_test.exs | 5 ++++- .../test/state_mediator/integration/gtfs_test.exs | 6 +++++- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/apps/api_web/test/api_web/controllers/stop_controller_test.exs b/apps/api_web/test/api_web/controllers/stop_controller_test.exs index fdefc8d24..9ab316cd7 100644 --- a/apps/api_web/test/api_web/controllers/stop_controller_test.exs +++ b/apps/api_web/test/api_web/controllers/stop_controller_test.exs @@ -653,7 +653,10 @@ defmodule ApiWeb.StopControllerTest do stop2 = %Stop{id: "2"} State.Stop.new_state([stop, stop2]) - State.Route.new_state([%Model.Route{id: "route", type: 2}, %Model.Route{id: "other", type: 4}]) + State.Route.new_state([ + %Model.Route{id: "route", type: 2}, + %Model.Route{id: "other", type: 4} + ]) State.Trip.new_state([ %Model.Trip{id: "trip", route_id: "route", direction_id: 1}, diff --git a/apps/state/lib/state/route_pattern.ex b/apps/state/lib/state/route_pattern.ex index ed84b1af5..fdcad51cc 100644 --- a/apps/state/lib/state/route_pattern.ex +++ b/apps/state/lib/state/route_pattern.ex @@ -75,7 +75,7 @@ defmodule State.RoutePattern do def filter_by(%{route_ids: _route_ids, stop_ids: _stop_ids} = filters) do ids_from_stops = ids_from_stops(filters) ids_from_routes = ids_from_routes(filters) - ids = ids_from_routes -- ids_from_routes -- ids_from_stops + ids = ids_from_routes -- (ids_from_routes -- ids_from_stops) by_ids(ids) end diff --git a/apps/state/test/state/trip_test.exs b/apps/state/test/state/trip_test.exs index 7a1b6a355..eb9347c26 100644 --- a/apps/state/test/state/trip_test.exs +++ b/apps/state/test/state/trip_test.exs @@ -568,7 +568,10 @@ defmodule State.TripTest do "trip8" ] - assert mapped_and_sorted_filter_by(%{route_pattern_id: 1, revenue: [:NON_REVENUE, :REVENUE]}) == + assert mapped_and_sorted_filter_by(%{ + route_pattern_id: 1, + revenue: [:NON_REVENUE, :REVENUE] + }) == ["trip1", "trip2", "trip3", "trip4", "trip5", "trip6", "trip7", "trip8"] assert mapped_and_sorted_filter_by(%{routes: ["rev-route-9"], revenue: [:NON_REVENUE]}) == diff --git a/apps/state_mediator/test/state_mediator/integration/gtfs_test.exs b/apps/state_mediator/test/state_mediator/integration/gtfs_test.exs index eab228b6b..f1c3bab36 100644 --- a/apps/state_mediator/test/state_mediator/integration/gtfs_test.exs +++ b/apps/state_mediator/test/state_mediator/integration/gtfs_test.exs @@ -99,7 +99,11 @@ defmodule StateMediator.Integration.GtfsTest do core_stop_ids = for stop <- - State.Stop.filter_by(%{routes: [route_id], direction_id: direction_id, date: date}), + State.Stop.filter_by(%{ + routes: [route_id], + direction_id: direction_id, + date: date + }), stop.id in route_order, do: stop.id From c2f41d4cc324b9b7e8973f630c609f8917a1a353 Mon Sep 17 00:00:00 2001 From: Emily Crandall Fleischman Date: Wed, 22 Jul 2026 09:20:26 -0400 Subject: [PATCH 4/9] chore: mix format --migrate --- apps/api_accounts/lib/api_accounts.ex | 2 +- apps/api_accounts/lib/api_accounts/table.ex | 6 ++-- .../lib/api_web/api_controller_helpers.ex | 2 +- apps/api_web/lib/api_web/api_view_helpers.ex | 2 +- .../admin/accounts/key_controller.ex | 2 +- .../api_web/controllers/line_controller.ex | 2 +- .../controllers/live_facility_controller.ex | 2 +- .../api_web/plugs/modified_since_handler.ex | 4 +-- .../lib/api_web/plugs/validate_date.ex | 2 +- apps/api_web/lib/api_web/swagger_helpers.ex | 4 +-- .../lib/api_web/views/facility_view.ex | 2 +- apps/api_web/lib/date_helpers.ex | 2 +- .../portal/user_controller_test.exs | 4 +-- .../test/api_web/plugs/deadline_test.exs | 2 +- apps/health/lib/health/checker.ex | 4 +-- apps/parse/lib/parse/alerts.ex | 32 +++++++++---------- apps/parse/lib/parse/stop_times.ex | 4 +-- apps/parse/lib/parse/vehicle_positions.ex | 2 +- apps/parse/lib/simple_csv.ex | 2 +- apps/parse/test/parse/stop_times_test.exs | 6 ++-- apps/state/lib/state/alert/filter.ex | 4 +-- apps/state/lib/state/alert/informed_entity.ex | 2 +- apps/state/lib/state/prediction.ex | 2 +- apps/state/lib/state/route_pattern.ex | 2 +- apps/state/lib/state/schedule.ex | 2 +- apps/state/lib/state/service.ex | 2 +- apps/state/lib/state/service_by_date.ex | 2 +- apps/state/lib/state/shape.ex | 10 +++--- apps/state/lib/state/stop.ex | 4 +-- apps/state/lib/state/stops_on_route.ex | 4 +-- apps/state/lib/state/trip.ex | 4 +-- .../lib/state_mediator/mediator.ex | 8 ++--- .../test/gtfs_decompress_test.exs | 4 +-- 33 files changed, 69 insertions(+), 69 deletions(-) diff --git a/apps/api_accounts/lib/api_accounts.ex b/apps/api_accounts/lib/api_accounts.ex index 48ff74362..fbbd1da75 100644 --- a/apps/api_accounts/lib/api_accounts.ex +++ b/apps/api_accounts/lib/api_accounts.ex @@ -454,7 +454,7 @@ defmodule ApiAccounts do def auto_approve_key?(%User{} = user) do # if there are no other keys, approve this one user - |> list_keys_for_user + |> list_keys_for_user() |> Enum.empty?() end diff --git a/apps/api_accounts/lib/api_accounts/table.ex b/apps/api_accounts/lib/api_accounts/table.ex index 3fbc2e066..794fa055e 100644 --- a/apps/api_accounts/lib/api_accounts/table.ex +++ b/apps/api_accounts/lib/api_accounts/table.ex @@ -184,19 +184,19 @@ defmodule ApiAccounts.Table do @doc false def __before_compile__(env) do - unless Module.get_attribute(env.module, :struct_fields) do + if !Module.get_attribute(env.module, :struct_fields) do raise ArgumentError, "module #{inspect(env.module)} uses ApiAccounts.Table but it " <> "does not define a table." end - unless Module.get_attribute(env.module, :primary_key) do + if !Module.get_attribute(env.module, :primary_key) do raise ArgumentError, "module #{inspect(env.module)} uses ApiAccounts.Table but it " <> "does not define a primary key. Refer to ApiAccounts.Table.field/3." end - unless Module.get_attribute(env.module, :schema_version) do + if !Module.get_attribute(env.module, :schema_version) do raise ArgumentError, "module #{inspect(env.module)} uses ApiAccounts.Table but it " <> "does not define a schema version. Refer to " <> diff --git a/apps/api_web/lib/api_web/api_controller_helpers.ex b/apps/api_web/lib/api_web/api_controller_helpers.ex index 160e836e1..075be07d9 100644 --- a/apps/api_web/lib/api_web/api_controller_helpers.ex +++ b/apps/api_web/lib/api_web/api_controller_helpers.ex @@ -190,7 +190,7 @@ defmodule ApiWeb.ApiControllerHelpers do defp do_filter_valid_field_attributes(conn, {type, fields}) do view_module = view_module_for_type(type) - attr_filter = fn attr -> conn |> view_module.attribute_set |> MapSet.member?(attr) end + attr_filter = fn attr -> conn |> view_module.attribute_set() |> MapSet.member?(attr) end fields |> String.split(",") diff --git a/apps/api_web/lib/api_web/api_view_helpers.ex b/apps/api_web/lib/api_web/api_view_helpers.ex index 708e12b33..bb7206009 100644 --- a/apps/api_web/lib/api_web/api_view_helpers.ex +++ b/apps/api_web/lib/api_web/api_view_helpers.ex @@ -64,7 +64,7 @@ defmodule ApiWeb.ApiViewHelpers do builder |> JaSerializer.Formatter.format() - |> log_record_count + |> log_record_count() end defp log_record_count(%{"data" => list} = data) when is_list(list) do diff --git a/apps/api_web/lib/api_web/controllers/admin/accounts/key_controller.ex b/apps/api_web/lib/api_web/controllers/admin/accounts/key_controller.ex index d42b2a4e7..9da73b740 100644 --- a/apps/api_web/lib/api_web/controllers/admin/accounts/key_controller.ex +++ b/apps/api_web/lib/api_web/controllers/admin/accounts/key_controller.ex @@ -32,7 +32,7 @@ defmodule ApiWeb.Admin.Accounts.KeyController do key_params = key_params |> Map.put(:rate_request_pending, false) - |> handle_per_minute + |> handle_per_minute() key = ApiAccounts.get_key!(key_id) user = conn.assigns.user diff --git a/apps/api_web/lib/api_web/controllers/line_controller.ex b/apps/api_web/lib/api_web/controllers/line_controller.ex index f1dba3a2b..2ada66141 100644 --- a/apps/api_web/lib/api_web/controllers/line_controller.ex +++ b/apps/api_web/lib/api_web/controllers/line_controller.ex @@ -50,7 +50,7 @@ defmodule ApiWeb.LineController do case filtered do %{"id" => ids} -> ids - |> split_on_comma + |> split_on_comma() |> State.Line.by_ids() _ -> diff --git a/apps/api_web/lib/api_web/controllers/live_facility_controller.ex b/apps/api_web/lib/api_web/controllers/live_facility_controller.ex index 7a82c0d88..4862058a8 100644 --- a/apps/api_web/lib/api_web/controllers/live_facility_controller.ex +++ b/apps/api_web/lib/api_web/controllers/live_facility_controller.ex @@ -67,7 +67,7 @@ defmodule ApiWeb.LiveFacilityController do defp do_index_data(ids, conn, params) do ids - |> split_on_comma + |> split_on_comma() |> State.Facility.Parking.by_facility_ids() |> Enum.group_by(& &1.facility_id) |> Enum.map(fn {facilty_id, properties} -> diff --git a/apps/api_web/lib/api_web/plugs/modified_since_handler.ex b/apps/api_web/lib/api_web/plugs/modified_since_handler.ex index bdffab718..464403ae3 100644 --- a/apps/api_web/lib/api_web/plugs/modified_since_handler.ex +++ b/apps/api_web/lib/api_web/plugs/modified_since_handler.ex @@ -102,13 +102,13 @@ defmodule ApiWeb.Plugs.ModifiedSinceHandler do if Application.compile_env(:api_web, __MODULE__)[:check_caller] do defp ensure_caller_defined(opts) do - unless opts[:caller] do + if !opts[:caller] do raise ArgumentError, "expected `:caller` to be provided with module" end end defp ensure_state_module_implemented(opts) do - unless opts[:caller].module_info(:exports)[:state_module] == 0 do + if opts[:caller].module_info(:exports)[:state_module] != 0 do raise ArgumentError, "expected `:caller` to implement " <> "`state_module/0` and return a module from the " <> "`State` namespace" diff --git a/apps/api_web/lib/api_web/plugs/validate_date.ex b/apps/api_web/lib/api_web/plugs/validate_date.ex index f0c573e93..6dd4686b6 100644 --- a/apps/api_web/lib/api_web/plugs/validate_date.ex +++ b/apps/api_web/lib/api_web/plugs/validate_date.ex @@ -14,7 +14,7 @@ defmodule ApiWeb.Plugs.ValidateDate do def call(%Conn{query_params: query_params} = conn, []) do query_params - |> get_date + |> get_date() |> validate_date(conn) end diff --git a/apps/api_web/lib/api_web/swagger_helpers.ex b/apps/api_web/lib/api_web/swagger_helpers.ex index f92956f85..01e58e0f2 100644 --- a/apps/api_web/lib/api_web/swagger_helpers.ex +++ b/apps/api_web/lib/api_web/swagger_helpers.ex @@ -299,7 +299,7 @@ defmodule ApiWeb.SwaggerHelpers do """ def path(controller, action) do controller - |> path_fn + |> path_fn() |> call_path(action) end @@ -320,7 +320,7 @@ defmodule ApiWeb.SwaggerHelpers do short_name = module - |> to_string + |> to_string() |> String.split(".") |> List.last() |> String.replace_suffix("Controller", "") diff --git a/apps/api_web/lib/api_web/views/facility_view.ex b/apps/api_web/lib/api_web/views/facility_view.ex index 1e4f61f12..3a9e27fed 100644 --- a/apps/api_web/lib/api_web/views/facility_view.ex +++ b/apps/api_web/lib/api_web/views/facility_view.ex @@ -51,7 +51,7 @@ defmodule ApiWeb.FacilityView do properties = facility.id |> State.Facility.Property.by_facility_id() - |> encode_properties + |> encode_properties() Map.put(attrs, :properties, properties) else diff --git a/apps/api_web/lib/date_helpers.ex b/apps/api_web/lib/date_helpers.ex index e808e76a9..bf42a20be 100644 --- a/apps/api_web/lib/date_helpers.ex +++ b/apps/api_web/lib/date_helpers.ex @@ -51,7 +51,7 @@ defmodule DateHelpers do def add_seconds_to_date(%Date{} = date, seconds) do date - |> unix_midnight_seconds + |> unix_midnight_seconds() |> add_seconds_to_date(seconds) end diff --git a/apps/api_web/test/api_web/controllers/portal/user_controller_test.exs b/apps/api_web/test/api_web/controllers/portal/user_controller_test.exs index cd30c37fe..ef20662cc 100644 --- a/apps/api_web/test/api_web/controllers/portal/user_controller_test.exs +++ b/apps/api_web/test/api_web/controllers/portal/user_controller_test.exs @@ -313,7 +313,7 @@ defmodule ApiWeb.Portal.UserControllerTest do setup %{conn: conn} do {:ok, user_disabled} = ApiAccounts.create_user(%{email: "nofa@example.com"}) - {:ok, conn: conn |> conn_with_session |> conn_with_user(user_disabled)} + {:ok, conn: conn |> conn_with_session() |> conn_with_user(user_disabled)} end test "configure 2fa with user with no 2fa", %{conn: conn} do @@ -385,7 +385,7 @@ defmodule ApiWeb.Portal.UserControllerTest do time: time ) - {:ok, conn: conn |> conn_with_session |> conn_with_user(user_enabled)} + {:ok, conn: conn |> conn_with_session() |> conn_with_user(user_enabled)} end test "configure 2fa with user with 2fa", %{conn: conn} do diff --git a/apps/api_web/test/api_web/plugs/deadline_test.exs b/apps/api_web/test/api_web/plugs/deadline_test.exs index c3d310834..967686543 100644 --- a/apps/api_web/test/api_web/plugs/deadline_test.exs +++ b/apps/api_web/test/api_web/plugs/deadline_test.exs @@ -13,7 +13,7 @@ defmodule ApiWeb.Plugs.DeadlineTest do assert :ok = conn |> set(5_000) - |> check! + |> check!() end test "returns :ok if no deadline was set", %{conn: conn} do diff --git a/apps/health/lib/health/checker.ex b/apps/health/lib/health/checker.ex index b699d6d7b..938630447 100644 --- a/apps/health/lib/health/checker.ex +++ b/apps/health/lib/health/checker.ex @@ -9,13 +9,13 @@ defmodule Health.Checker do def current do :current - |> each_checker + |> each_checker() |> Enum.reduce([], &Keyword.merge/2) end def healthy? do :healthy? - |> each_checker + |> each_checker() |> Enum.all?() end diff --git a/apps/parse/lib/parse/alerts.ex b/apps/parse/lib/parse/alerts.ex index a843292f7..68dcd3c4a 100644 --- a/apps/parse/lib/parse/alerts.ex +++ b/apps/parse/lib/parse/alerts.ex @@ -27,7 +27,7 @@ defmodule Parse.Alerts do for alert <- alert_json(json_map), active?(alert) do alert |> parse_alert() - |> cleanup_description + |> cleanup_description() end end @@ -2712,13 +2712,13 @@ defmodule Parse.Alerts do id: Map.get(alert, "id"), effect: "PARKING_ISSUE", cause: cause(alert), - header: alert |> Map.get("header_text") |> translated_text, - short_header: alert |> Map.get("short_header_text") |> translated_text, - description: alert |> Map.get("description_text") |> translated_text, + header: alert |> Map.get("header_text") |> translated_text(), + short_header: alert |> Map.get("short_header_text") |> translated_text(), + description: alert |> Map.get("description_text") |> translated_text(), banner: alert |> Map.get("banner_text") |> translated_text(default: nil), severity: Map.get(alert, "severity"), - created_at: alert |> Map.get("created_timestamp") |> unix_timestamp, - updated_at: alert |> Map.get("last_modified_timestamp") |> unix_timestamp, + created_at: alert |> Map.get("created_timestamp") |> unix_timestamp(), + updated_at: alert |> Map.get("last_modified_timestamp") |> unix_timestamp(), active_period: alert |> Map.get("active_period", []) @@ -2726,10 +2726,10 @@ defmodule Parse.Alerts do |> Enum.map(&active_period/1), informed_entity: Enum.map(Map.get(alert, "informed_entity") ++ added_informed_entities, &informed_entity/1), - service_effect: alert |> Map.get("service_effect_text") |> translated_text, + service_effect: alert |> Map.get("service_effect_text") |> translated_text(), timeframe: alert |> Map.get("timeframe_text") |> translated_text(default: nil), duration_certainty: alert |> Map.get("duration_certainty"), - lifecycle: alert |> Map.get("alert_lifecycle") |> lifecycle, + lifecycle: alert |> Map.get("alert_lifecycle") |> lifecycle(), url: alert |> Map.get("url") |> translated_text(default: nil), image: alert |> Map.get("image") |> translated_image(default: nil), image_alternative_text: @@ -2746,25 +2746,25 @@ defmodule Parse.Alerts do id: Map.get(alert, "id"), # Backwards compatability-can change to `translated_text` after all instances of # alerts manager are returning a translated string - effect: alert |> Map.get("effect_detail") |> maybe_translated_text, + effect: alert |> Map.get("effect_detail") |> maybe_translated_text(), cause: cause(alert), - header: alert |> Map.get("header_text") |> translated_text, - short_header: alert |> Map.get("short_header_text") |> translated_text, - description: alert |> Map.get("description_text") |> translated_text, + header: alert |> Map.get("header_text") |> translated_text(), + short_header: alert |> Map.get("short_header_text") |> translated_text(), + description: alert |> Map.get("description_text") |> translated_text(), banner: alert |> Map.get("banner_text") |> translated_text(default: nil), severity: Map.get(alert, "severity"), - created_at: alert |> Map.get("created_timestamp") |> unix_timestamp, - updated_at: alert |> Map.get("last_modified_timestamp") |> unix_timestamp, + created_at: alert |> Map.get("created_timestamp") |> unix_timestamp(), + updated_at: alert |> Map.get("last_modified_timestamp") |> unix_timestamp(), active_period: alert |> Map.get("active_period", []) |> fallback_active_period() |> Enum.map(&active_period/1), informed_entity: alert |> Map.get("informed_entity") |> Enum.map(&informed_entity/1), - service_effect: alert |> Map.get("service_effect_text") |> translated_text, + service_effect: alert |> Map.get("service_effect_text") |> translated_text(), timeframe: alert |> Map.get("timeframe_text") |> translated_text(default: nil), duration_certainty: alert |> Map.get("duration_certainty"), - lifecycle: alert |> Map.get("alert_lifecycle") |> lifecycle, + lifecycle: alert |> Map.get("alert_lifecycle") |> lifecycle(), url: alert |> Map.get("url") |> translated_text(default: nil), image: alert |> Map.get("image") |> translated_image(default: nil), image_alternative_text: diff --git a/apps/parse/lib/parse/stop_times.ex b/apps/parse/lib/parse/stop_times.ex index 5b800cb2a..de35ddf66 100644 --- a/apps/parse/lib/parse/stop_times.ex +++ b/apps/parse/lib/parse/stop_times.ex @@ -57,8 +57,8 @@ defmodule Parse.StopTimes do defp parse_rows(rows, nil) do rows |> Enum.map(&parse_row/1) - |> position_first_row - |> position_last_row + |> position_first_row() + |> position_last_row() end defp parse_rows([%{"trip_id" => trip_id} | _] = rows, trip_fn) do diff --git a/apps/parse/lib/parse/vehicle_positions.ex b/apps/parse/lib/parse/vehicle_positions.ex index b7281a7f3..ccb8e68f5 100644 --- a/apps/parse/lib/parse/vehicle_positions.ex +++ b/apps/parse/lib/parse/vehicle_positions.ex @@ -10,7 +10,7 @@ defmodule Parse.VehiclePositions do # gzip encoded blob |> :zlib.gunzip() - |> parse + |> parse() end def parse("{" <> _ = blob) do diff --git a/apps/parse/lib/simple_csv.ex b/apps/parse/lib/simple_csv.ex index 107cb11cb..2c23494e4 100644 --- a/apps/parse/lib/simple_csv.ex +++ b/apps/parse/lib/simple_csv.ex @@ -10,7 +10,7 @@ defmodule SimpleCSV do """ def decode(lines) do lines - |> stream + |> stream() |> Enum.to_list() end diff --git a/apps/parse/test/parse/stop_times_test.exs b/apps/parse/test/parse/stop_times_test.exs index d57d4df4b..bed6c4db2 100644 --- a/apps/parse/test/parse/stop_times_test.exs +++ b/apps/parse/test/parse/stop_times_test.exs @@ -15,7 +15,7 @@ defmodule Parse.StopTimesTest do end test "parse: parses a CSV blob into a list of stops, tagging the first stop", %{blob: blob} do - assert blob |> parse |> Enum.sort() == [ + assert blob |> parse() |> Enum.sort() == [ %Schedule{ trip_id: "29063613", stop_id: "2300", @@ -61,7 +61,7 @@ defmodule Parse.StopTimesTest do "29063613","14:36:00","14:36:01","2300","6","","1","1","1"\r """ - assert blob |> parse |> Enum.to_list() == [ + assert blob |> parse() |> Enum.to_list() == [ %Schedule{ trip_id: "29063613", stop_id: "2300", @@ -79,7 +79,7 @@ defmodule Parse.StopTimesTest do test "if given a fn which returns a trip, only returns schedules which match and includes the route_id", %{blob: blob} do - all_schedules = blob |> parse |> Enum.sort() + all_schedules = blob |> parse() |> Enum.sort() assert blob |> parse(fn trip_id -> diff --git a/apps/state/lib/state/alert/filter.ex b/apps/state/lib/state/alert/filter.ex index fc7238c5f..bc980001f 100644 --- a/apps/state/lib/state/alert/filter.ex +++ b/apps/state/lib/state/alert/filter.ex @@ -9,7 +9,7 @@ defmodule State.Alert.Filter do @spec filter_by(Alert.filter_opts()) :: [Model.Alert.t()] def filter_by(filter_opts) do filter_opts - |> filter_to_list_of_ids + |> filter_to_list_of_ids() |> filter_by_ids(filter_opts) |> filter_by_informed_entity_activity(filter_opts) |> filter_by_active_period(filter_opts) @@ -32,7 +32,7 @@ defmodule State.Alert.Filter do defp build_matchers(filter_opts) do filter_opts |> Enum.reduce([%{}], &do_build_matcher/2) - |> reject_empty_matchers + |> reject_empty_matchers() |> Enum.uniq() end diff --git a/apps/state/lib/state/alert/informed_entity.ex b/apps/state/lib/state/alert/informed_entity.ex index 5fed215cb..57ce5ae98 100644 --- a/apps/state/lib/state/alert/informed_entity.ex +++ b/apps/state/lib/state/alert/informed_entity.ex @@ -62,7 +62,7 @@ defmodule State.Alert.InformedEntity do facility: facility } end - |> reject_empty_parts + |> reject_empty_parts() end defp part_values(map, key) do diff --git a/apps/state/lib/state/prediction.ex b/apps/state/lib/state/prediction.ex index 9558ad70c..f53d30435 100644 --- a/apps/state/lib/state/prediction.ex +++ b/apps/state/lib/state/prediction.ex @@ -98,7 +98,7 @@ defmodule State.Prediction do case Map.get(prediction, time_key) do %DateTime{} = dt -> dt - |> service_date + |> service_date() |> Kernel.==(date) nil -> diff --git a/apps/state/lib/state/route_pattern.ex b/apps/state/lib/state/route_pattern.ex index fdcad51cc..1c22fde5a 100644 --- a/apps/state/lib/state/route_pattern.ex +++ b/apps/state/lib/state/route_pattern.ex @@ -87,7 +87,7 @@ defmodule State.RoutePattern do def filter_by(%{stop_ids: _stop_ids} = filters) do filters - |> ids_from_stops + |> ids_from_stops() |> by_ids() end diff --git a/apps/state/lib/state/schedule.ex b/apps/state/lib/state/schedule.ex index 59fca793b..2a803b75a 100644 --- a/apps/state/lib/state/schedule.ex +++ b/apps/state/lib/state/schedule.ex @@ -116,7 +116,7 @@ defmodule State.Schedule do stops: stop_ids, stop_sequence: [stop_sequence] } - |> filter_by + |> filter_by() |> List.first() end diff --git a/apps/state/lib/state/service.ex b/apps/state/lib/state/service.ex index c5ff93a25..47babee70 100644 --- a/apps/state/lib/state/service.ex +++ b/apps/state/lib/state/service.ex @@ -26,7 +26,7 @@ defmodule State.Service do |> State.Trip.by_route_ids() |> MapSet.new(& &1.service_id) |> MapSet.to_list() - |> by_ids + |> by_ids() end def by_route_id(route_id) do diff --git a/apps/state/lib/state/service_by_date.ex b/apps/state/lib/state/service_by_date.ex index dded79c47..7479f57d1 100644 --- a/apps/state/lib/state/service_by_date.ex +++ b/apps/state/lib/state/service_by_date.ex @@ -64,7 +64,7 @@ defmodule State.ServiceByDate do def update_state(state) do items = State.Service.valid_in_future() - |> service_with_date + |> service_with_date() @table |> :ets.delete_all_objects() @table |> :ets.insert(items) diff --git a/apps/state/lib/state/shape.ex b/apps/state/lib/state/shape.ex index 0d46264e2..927017399 100644 --- a/apps/state/lib/state/shape.ex +++ b/apps/state/lib/state/shape.ex @@ -164,10 +164,10 @@ defmodule State.Shape do def arrange_by_priority(shapes) do shapes - |> sort_longer_shapes_first - |> increase_priority_of_first_shape - |> override_priorities_from_configuration - |> reduce_priority_of_subset_shapes + |> sort_longer_shapes_first() + |> increase_priority_of_first_shape() + |> override_priorities_from_configuration() + |> reduce_priority_of_subset_shapes() end defp sort_longer_shapes_first(shapes) do @@ -176,7 +176,7 @@ defmodule State.Shape do fn shape -> stop_count = shape - |> stop_id_set + |> stop_id_set() |> MapSet.size() {shape.priority, stop_count, optional_byte_size(shape.polyline)} diff --git a/apps/state/lib/state/stop.ex b/apps/state/lib/state/stop.ex index 62cf89f7a..7cd8aa189 100644 --- a/apps/state/lib/state/stop.ex +++ b/apps/state/lib/state/stop.ex @@ -64,7 +64,7 @@ defmodule State.Stop do def by_family_ids(ids) do ids - |> by_ids + |> by_ids() |> Enum.flat_map(&family/1) |> Enum.uniq() end @@ -129,7 +129,7 @@ defmodule State.Stop do def around(latitude, longitude, radius \\ 0.01) do random_worker() |> State.Stop.Worker.around(latitude, longitude, radius) - |> by_ids + |> by_ids() end defp random_worker do diff --git a/apps/state/lib/state/stops_on_route.ex b/apps/state/lib/state/stops_on_route.ex index d0530341a..fb902078f 100644 --- a/apps/state/lib/state/stops_on_route.ex +++ b/apps/state/lib/state/stops_on_route.ex @@ -207,7 +207,7 @@ defmodule State.StopsOnRoute do |> Schedule.by_trip_id() |> Enum.sort_by(& &1.stop_sequence) |> Enum.map(& &1.stop_id) - |> map_parent_stations + |> map_parent_stations() end) |> Enum.uniq() end @@ -527,7 +527,7 @@ defmodule State.StopsOnRoute do defp merge_two_lists(one, two) do one |> List.myers_difference(two) - |> merge_differences + |> merge_differences() end defp merge_differences(diff_list, side \\ :front) diff --git a/apps/state/lib/state/trip.ex b/apps/state/lib/state/trip.ex index 09f50898c..bed56dfa2 100644 --- a/apps/state/lib/state/trip.ex +++ b/apps/state/lib/state/trip.ex @@ -28,14 +28,14 @@ defmodule State.Trip do @spec by_primary_id(Trip.id()) :: Trip.t() | nil def by_primary_id(id) do [id] - |> by_ids + |> by_ids() |> Enum.find(&Trip.primary?/1) end @spec by_primary_ids([Trip.id()]) :: [Trip.t()] def by_primary_ids(ids) do ids - |> by_ids + |> by_ids() |> Enum.filter(&Trip.primary?/1) end diff --git a/apps/state_mediator/lib/state_mediator/mediator.ex b/apps/state_mediator/lib/state_mediator/mediator.ex index c521e6695..dafe77d48 100644 --- a/apps/state_mediator/lib/state_mediator/mediator.ex +++ b/apps/state_mediator/lib/state_mediator/mediator.ex @@ -110,16 +110,16 @@ defmodule StateMediator.Mediator do debug_time("#{state_module} new state", fn -> state_module.new_state(body, sync_timeout) end) state - |> reset_retries - |> schedule_update + |> reset_retries() + |> schedule_update() end def handle_response(:unmodified, %{module: state_module} = state) do _ = Logger.debug(fn -> "#{__MODULE__} #{state_module} received unmodified" end) state - |> reset_retries - |> schedule_update + |> reset_retries() + |> schedule_update() end def handle_response({:error, error}, %{module: state_module, retries: retries} = state) do diff --git a/apps/state_mediator/test/gtfs_decompress_test.exs b/apps/state_mediator/test/gtfs_decompress_test.exs index 4da72bd37..70a26630e 100644 --- a/apps/state_mediator/test/gtfs_decompress_test.exs +++ b/apps/state_mediator/test/gtfs_decompress_test.exs @@ -25,7 +25,7 @@ defmodule GtfsDecompressTest do test "triggers an event for each filename", %{expected_receives: expected_receives} do GtfsDecompress.filenames() - |> build_zip + |> build_zip() |> GtfsDecompress.new_state() for expected_receive <- expected_receives do @@ -39,7 +39,7 @@ defmodule GtfsDecompressTest do assert_raise MatchError, fn -> keeping - |> build_zip + |> build_zip() |> GtfsDecompress.new_state() end From 12874a62c74fe0baa3097230c526bee7a7ade43e Mon Sep 17 00:00:00 2001 From: Emily Crandall Fleischman Date: Wed, 22 Jul 2026 13:13:49 -0400 Subject: [PATCH 5/9] chore: fix test --- apps/state/test/state/server_test.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/state/test/state/server_test.exs b/apps/state/test/state/server_test.exs index 354f759b5..474b2545e 100644 --- a/apps/state/test/state/server_test.exs +++ b/apps/state/test/state/server_test.exs @@ -251,7 +251,7 @@ defmodule State.ServerTest do %Example{id: 2, data: :other} ]) - assert [%{data: 38}, %{data: 44}, %{data: :other}] = HooksServer.all() + assert [%{id: 2, data: :other}, %{id: 1, data: 38}, %{id: 1, data: 44}] = HooksServer.all() assert [%{data: 38}, %{data: 44}] = HooksServer.by_id(1) assert [%{data: 38}] = HooksServer.select([%{data: 37}]) end From 5e07200e2f86a09a85c9050444ac3e1015804679 Mon Sep 17 00:00:00 2001 From: Emily Crandall Fleischman Date: Wed, 22 Jul 2026 13:59:01 -0400 Subject: [PATCH 6/9] chore: upgrade deps with vulnerabilities --- mix.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mix.lock b/mix.lock index 139e04cba..7482fd64c 100644 --- a/mix.lock +++ b/mix.lock @@ -37,7 +37,7 @@ "gettext": {:hex, :gettext, "0.26.2", "5978aa7b21fada6deabf1f6341ddba50bc69c999e812211903b169799208f2a8", [:mix], [{:expo, "~> 0.5.1 or ~> 1.0", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "aa978504bcf76511efdc22d580ba08e2279caab1066b76bb9aa81c4a1e0a32a5"}, "goth": {:hex, :goth, "1.4.5", "ee37f96e3519bdecd603f20e7f10c758287088b6d77c0147cd5ee68cf224aade", [:mix], [{:finch, "~> 0.17", [hex: :finch, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:jose, "~> 1.11", [hex: :jose, repo: "hexpm", optional: false]}], "hexpm", "0fc2dce5bd710651ed179053d0300ce3a5d36afbdde11e500d57f05f398d5ed5"}, "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"}, - "hpax": {:hex, :hpax, "1.0.3", "ed67ef51ad4df91e75cc6a1494f851850c0bd98ebc0be6e81b026e765ee535aa", [:mix], [], "hexpm", "8eab6e1cfa8d5918c2ce4ba43588e894af35dbd8e91e6e55c817bca5847df34a"}, + "hpax": {:hex, :hpax, "1.0.4", "777de5d433b0fbdc7c418159c8055910faa8047ffdb3d6b31098d2a46cd7685c", [:mix], [], "hexpm", "afc7cb142ebcc2d01ce7816190b98ce5dd49e799111b24249f3443d730f377ca"}, "httpoison": {:hex, :httpoison, "2.3.0", "10eef046405bc44ba77dc5b48957944df8952cc4966364b3cf6aa71dce6de587", [:mix], [{:hackney, "~> 1.21", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "d388ee70be56d31a901e333dbcdab3682d356f651f93cf492ba9f06056436a2c"}, "idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"}, "inflex": {:hex, :inflex, "1.10.0", "8366a7696e70e1813aca102e61274addf85d99f4a072b2f9c7984054ea1b9d29", [:mix], [], "hexpm", "7b5ccb9b720c26516f5962dc4565fc26f083ca107b0f6c167048506a125d2df3"}, @@ -56,7 +56,7 @@ "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"}, "mime": {:hex, :mime, "1.6.0", "dabde576a497cef4bbdd60aceee8160e02a6c89250d6c0b29e56c0dfb00db3d2", [:mix], [], "hexpm", "31a1a8613f8321143dde1dafc36006a17d28d02bdfecb9e95a880fa7aabd19a7"}, "mimerl": {:hex, :mimerl, "1.4.0", "3882a5ca67fbbe7117ba8947f27643557adec38fa2307490c4c4207624cb213b", [:rebar3], [], "hexpm", "13af15f9f68c65884ecca3a3891d50a7b57d82152792f3e19d88650aa126b144"}, - "mint": {:hex, :mint, "1.7.1", "113fdb2b2f3b59e47c7955971854641c61f378549d73e829e1768de90fc1abf1", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1 or ~> 0.2.0 or ~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "fceba0a4d0f24301ddee3024ae116df1c3f4bb7a563a731f45fdfeb9d39a231b"}, + "mint": {:hex, :mint, "1.9.3", "3337184d69179695c7a9f1714d92c11e629d36c8c037a21cf490131d3d150554", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1 or ~> 0.2.0 or ~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "5f7c9342480c069dbbc4eeac3490303c9e01870ff01a7f1d29b6107054fc1e74"}, "mix_audit": {:hex, :mix_audit, "2.1.5", "c0f77cee6b4ef9d97e37772359a187a166c7a1e0e08b50edf5bf6959dfe5a016", [:make, :mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:yaml_elixir, "~> 2.11", [hex: :yaml_elixir, repo: "hexpm", optional: false]}], "hexpm", "87f9298e21da32f697af535475860dc1d3617a010e0b418d2ec6142bc8b42d69"}, "mox": {:hex, :mox, "1.0.2", "dc2057289ac478b35760ba74165b4b3f402f68803dd5aecd3bfd19c183815d64", [:mix], [], "hexpm", "f9864921b3aaf763c8741b5b8e6f908f44566f1e427b2630e89e9a73b981fef2"}, "nimble_csv": {:hex, :nimble_csv, "1.3.0", "b7f998dc62b222bce9596e46f028c7a5af04cb5dde6df2ea197c583227c54971", [:mix], [], "hexpm", "41ccdc18f7c8f8bb06e84164fc51635321e80d5a3b450761c4997d620925d619"}, @@ -66,7 +66,7 @@ "nimble_pool": {:hex, :nimble_pool, "1.1.0", "bf9c29fbdcba3564a8b800d1eeb5a3c58f36e1e11d7b7fb2e084a643f645f06b", [:mix], [], "hexpm", "af2e4e6b34197db81f7aad230c1118eac993acc0dae6bc83bac0126d4ae0813a"}, "nimble_totp": {:hex, :nimble_totp, "1.0.0", "79753bae6ce59fd7cacdb21501a1dbac249e53a51c4cd22b34fa8438ee067283", [:mix], [], "hexpm", "6ce5e4c068feecdb782e85b18237f86f66541523e6bad123e02ee1adbe48eda9"}, "parse_trans": {:hex, :parse_trans, "3.4.1", "6e6aa8167cb44cc8f39441d05193be6e6f4e7c2946cb2759f015f8c56b76e5ff", [:rebar3], [], "hexpm", "620a406ce75dada827b82e453c19cf06776be266f5a67cff34e1ef2cbb60e49a"}, - "phoenix": {:hex, :phoenix, "1.8.7", "d8d755b4ff4b449f610223dd706b4ae64155cb720d3dc09c706c079ecea189e4", [:mix], [{:bandit, "~> 1.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, 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.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.7", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.5.3", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "47352f72d6ab31009ef77516b1b3a14745be97b54061fd458031b9d8294869d5"}, + "phoenix": {:hex, :phoenix, "1.8.9", "a63ed0962ed5b903b146dab0ae8eb8387fe478f8171a5e26d56a165f35996fe1", [:mix], [{:bandit, "~> 1.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, 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.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.7", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.5", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "3477e2dd5a4f61820341169031bdfe21275f659923bea9c5c0ea2aa1c3fcc046"}, "phoenix_html": {:hex, :phoenix_html, "4.3.0", "d3577a5df4b6954cd7890c84d955c470b5310bb49647f0a114a6eeecc850f7ad", [:mix], [], "hexpm", "3eaa290a78bab0f075f791a46a981bbe769d94bc776869f4f3063a14f30497ad"}, "phoenix_html_helpers": {:hex, :phoenix_html_helpers, "1.0.1", "7eed85c52eff80a179391036931791ee5d2f713d76a81d0d2c6ebafe1e11e5ec", [:mix], [{:phoenix_html, "~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "cffd2385d1fa4f78b04432df69ab8da63dc5cf63e07b713a4dcf36a3740e3090"}, "phoenix_live_view": {:hex, :phoenix_live_view, "1.1.30", "a84af1610755dc208da35d4d45564485edbf18c3f3c77373c4a650dc994cdcdb", [: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", "a353c51ac1e3190910f01a6100c7d5cc02c5e22e7374fd817bd3aedd21149039"}, @@ -74,7 +74,7 @@ "phoenix_swagger": {:hex, :phoenix_swagger, "0.8.2", "cc49d9641d7e7c87766ba800110ff67d2fb55379f83982ee33d85d1e0b39d100", [:mix], [{:ex_json_schema, "~> 0.6", [hex: :ex_json_schema, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:plug, "~> 1.4", [hex: :plug, repo: "hexpm", optional: false]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: true]}], "hexpm", "e6d177764d75d388b199a863c5f7502ac8c202cd3fca61220807cbdcb31efef2"}, "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"}, "phoenix_view": {:hex, :phoenix_view, "2.0.4", "b45c9d9cf15b3a1af5fb555c674b525391b6a1fe975f040fb4d913397b31abf4", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}], "hexpm", "4e992022ce14f31fe57335db27a28154afcc94e9983266835bb3040243eb620b"}, - "plug": {:hex, :plug, "1.20.2", "adbee2441232412e37fbb357fd5e4cd533fdd253b29f2e1992262b0f1fb01462", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "b16baf55877d60891002ffc1ce0b3ff7d6f30a38a23e02e4d4293c4ac266f136"}, + "plug": {:hex, :plug, "1.20.3", "56c480c633ec2ce10140e236e15233bf576e1d323887d7c96711bd02ab5160db", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "be266aee1b8536ef6409d58cf39a3121319f0ec47cfa1b24024485aa0e76ad76"}, "plug_crypto": {:hex, :plug_crypto, "2.1.1", "19bda8184399cb24afa10be734f84a16ea0a2bc65054e23a62bb10f06bc89491", [:mix], [], "hexpm", "6470bce6ffe41c8bd497612ffde1a7e4af67f36a15eea5f921af71cf3e11247c"}, "pngex": {:hex, :pngex, "0.1.2", "824c2da291fda236397729f236b29f87b98a434d58124ea9f7fa03d3b3cf8587", [:mix], [], "hexpm", "9f9f2d9aa286d03f6c317017a09e1b548fa0aa6b901291e24dbf65d8212b22b0"}, "poison": {:hex, :poison, "3.1.0", "d9eb636610e096f86f25d9a46f35a9facac35609a7591b3be3326e99a0484665", [:mix], [], "hexpm", "fec8660eb7733ee4117b85f55799fd3833eb769a6df71ccf8903e8dc5447cfce"}, @@ -97,7 +97,7 @@ "uuid": {:hex, :uuid, "1.1.8", "e22fc04499de0de3ed1116b770c7737779f226ceefa0badb3592e64d5cfb4eb9", [:mix], [], "hexpm", "c790593b4c3b601f5dc2378baae7efaf5b3d73c4c6456ba85759905be792f2ac"}, "vector": {:hex, :vector, "1.1.0", "0789b5e00e9c551d8d5880acab9a8f44ed46690d083af397018bf0c7f30c1092", [:mix], [], "hexpm", "48b0a800ec88e55b12c689b09100e4c9ba41ea1befb459221c085a4e70040696"}, "websock": {:hex, :websock, "0.5.3", "2f69a6ebe810328555b6fe5c831a851f485e303a7c8ce6c5f675abeb20ebdadc", [:mix], [], "hexpm", "6105453d7fac22c712ad66fab1d45abdf049868f253cf719b625151460b8b453"}, - "websock_adapter": {:hex, :websock_adapter, "0.5.9", "43dc3ba6d89ef5dec5b1d0a39698436a1e856d000d84bf31a3149862b01a287f", [:mix], [{:bandit, ">= 0.6.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "5534d5c9adad3c18a0f58a9371220d75a803bf0b9a3d87e6fe072faaeed76a08"}, + "websock_adapter": {:hex, :websock_adapter, "0.6.0", "73db5ab8aaefd1a876a97ce3e6afc96562625de69ef17a4e04426e034849d0b8", [:mix], [{:bandit, ">= 0.6.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "50021a85bce8f203b086705d9e0c5415e2c7eb05d319111b0428fe71f9934617"}, "xml_builder": {:hex, :xml_builder, "2.4.0", "b20d23077266c81f593360dc037ea398461dddb6638a329743da6c73afa56725", [:mix], [], "hexpm", "833e325bb997f032b5a1b740d2fd6feed3c18ca74627f9f5f30513a9ae1a232d"}, "yamerl": {:hex, :yamerl, "0.10.0", "4ff81fee2f1f6a46f1700c0d880b24d193ddb74bd14ef42cb0bcf46e81ef2f8e", [:rebar3], [], "hexpm", "346adb2963f1051dc837a2364e4acf6eb7d80097c0f53cbdc3046ec8ec4b4e6e"}, "yaml_elixir": {:hex, :yaml_elixir, "2.12.0", "30343ff5018637a64b1b7de1ed2a3ca03bc641410c1f311a4dbdc1ffbbf449c7", [:mix], [{:yamerl, "~> 0.10", [hex: :yamerl, repo: "hexpm", optional: false]}], "hexpm", "ca6bacae7bac917a7155dca0ab6149088aa7bc800c94d0fe18c5238f53b313c6"}, From 08d8f17186983c0dc8458823f1de921dd2b31a91 Mon Sep 17 00:00:00 2001 From: Emily Crandall Fleischman Date: Wed, 22 Jul 2026 14:00:15 -0400 Subject: [PATCH 7/9] chore: ignore hackney vulnerabilities --- mix.exs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/mix.exs b/mix.exs index f8c5dd414..7734d9921 100644 --- a/mix.exs +++ b/mix.exs @@ -36,6 +36,15 @@ defmodule ApiUmbrella.Mixfile do ], version: "0.1.0" ] + ], + hex: [ + ignore_advisories: [ + # hackney 1.25.0 + "EEF-CVE-2026-47071", + "EEF-CVE-2026-47076", + "EEF-CVE-2026-47075", + "EEF-CVE-2026-47069" + ] ] ] end From 32c8422265b00b861d100ff512a57431b283a374 Mon Sep 17 00:00:00 2001 From: Emily Crandall Fleischman Date: Wed, 22 Jul 2026 14:39:05 -0400 Subject: [PATCH 8/9] chore: order-insensitive test --- apps/state/test/state/server_test.exs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/state/test/state/server_test.exs b/apps/state/test/state/server_test.exs index 474b2545e..c9b93b34e 100644 --- a/apps/state/test/state/server_test.exs +++ b/apps/state/test/state/server_test.exs @@ -251,7 +251,11 @@ defmodule State.ServerTest do %Example{id: 2, data: :other} ]) - assert [%{id: 2, data: :other}, %{id: 1, data: 38}, %{id: 1, data: 44}] = HooksServer.all() + all = HooksServer.all() + assert length(all) == 3 + assert %{id: 1, data: 38} in all + assert %{id: 1, data: 44} in all + assert %{id: 2, data: :other} in all assert [%{data: 38}, %{data: 44}] = HooksServer.by_id(1) assert [%{data: 38}] = HooksServer.select([%{data: 37}]) end From b8a2b2045f68e28ee8c24725ee3bc934cb3399d8 Mon Sep 17 00:00:00 2001 From: Emily Crandall Fleischman Date: Wed, 22 Jul 2026 14:50:48 -0400 Subject: [PATCH 9/9] chore: specify full struct --- apps/state/test/state/server_test.exs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/state/test/state/server_test.exs b/apps/state/test/state/server_test.exs index c9b93b34e..4fa25188c 100644 --- a/apps/state/test/state/server_test.exs +++ b/apps/state/test/state/server_test.exs @@ -253,9 +253,9 @@ defmodule State.ServerTest do all = HooksServer.all() assert length(all) == 3 - assert %{id: 1, data: 38} in all - assert %{id: 1, data: 44} in all - assert %{id: 2, data: :other} in all + assert %Example{id: 1, data: 38} in all + assert %Example{id: 1, data: 44} in all + assert %Example{id: 2, data: :other} in all assert [%{data: 38}, %{data: 44}] = HooksServer.by_id(1) assert [%{data: 38}] = HooksServer.select([%{data: 37}]) end