From 88d510477a67ecc3f1868edb31b614352f2b2754 Mon Sep 17 00:00:00 2001 From: Eddie Maldonado Date: Wed, 29 Jan 2025 13:04:55 -0500 Subject: [PATCH] feat: cancel trips with a boarding status of Canceled (#364) * feat: cancel trips with a boarding status of Canceled * Revert "feat: cancel trips with a boarding status of Canceled" This reverts commit fb1c3e4d03f3d07d68f77a5bb929c132452d7efb. * feat: update schedule relationship of Cancelled STUs * fix: skip STU in the same way we do for other modes --- .../parser/gtfs_realtime_enhanced.ex | 36 ++++++++++++------- lib/concentrate/stop_time_update.ex | 2 +- .../parser/gtfs_realtime_enhanced_test.exs | 18 ++++++++++ 3 files changed, 42 insertions(+), 14 deletions(-) diff --git a/lib/concentrate/parser/gtfs_realtime_enhanced.ex b/lib/concentrate/parser/gtfs_realtime_enhanced.ex index c34d6a47..67c31498 100644 --- a/lib/concentrate/parser/gtfs_realtime_enhanced.ex +++ b/lib/concentrate/parser/gtfs_realtime_enhanced.ex @@ -150,19 +150,29 @@ defmodule Concentrate.Parser.GTFSRealtimeEnhanced do boarding_status = decode_boarding_status(Map.get(stu, "boarding_status")) - StopTimeUpdate.new( - trip_id: - if(descriptor = Map.get(trip_update, "trip"), do: Map.get(descriptor, "trip_id")), - stop_id: Map.get(stu, "stop_id"), - stop_sequence: Map.get(stu, "stop_sequence"), - schedule_relationship: schedule_relationship(Map.get(stu, "schedule_relationship")), - arrival_time: arrival_time, - departure_time: departure_time, - passthrough_time: Map.get(stu, "passthrough_time"), - uncertainty: arrival_uncertainty || departure_uncertainty, - status: boarding_status, - platform_id: Map.get(stu, "platform_id") - ) + stop_time_update = + StopTimeUpdate.new( + trip_id: + if(descriptor = Map.get(trip_update, "trip"), + do: Map.get(descriptor, "trip_id") + ), + stop_id: Map.get(stu, "stop_id"), + stop_sequence: Map.get(stu, "stop_sequence"), + schedule_relationship: + schedule_relationship(Map.get(stu, "schedule_relationship")), + arrival_time: arrival_time, + departure_time: departure_time, + passthrough_time: Map.get(stu, "passthrough_time"), + uncertainty: arrival_uncertainty || departure_uncertainty, + status: boarding_status, + platform_id: Map.get(stu, "platform_id") + ) + + if boarding_status == "Cancelled" do + StopTimeUpdate.skip(stop_time_update) + else + stop_time_update + end end td ++ stop_updates diff --git a/lib/concentrate/stop_time_update.ex b/lib/concentrate/stop_time_update.ex index 42a58257..d27b2538 100644 --- a/lib/concentrate/stop_time_update.ex +++ b/lib/concentrate/stop_time_update.ex @@ -30,7 +30,7 @@ defmodule Concentrate.StopTimeUpdate do @doc """ Marks the update as skipped (when the stop is closed, for example). """ - @spec skip(%__MODULE__{}) :: t + @spec skip(%__MODULE__{} | t) :: t def skip(%__MODULE__{} = stu) do %{stu | schedule_relationship: :SKIPPED, arrival_time: nil, departure_time: nil, status: nil} end diff --git a/test/concentrate/parser/gtfs_realtime_enhanced_test.exs b/test/concentrate/parser/gtfs_realtime_enhanced_test.exs index e4b787ac..48008c1f 100644 --- a/test/concentrate/parser/gtfs_realtime_enhanced_test.exs +++ b/test/concentrate/parser/gtfs_realtime_enhanced_test.exs @@ -221,6 +221,24 @@ defmodule Concentrate.Parser.GTFSRealtimeEnhancedTest do assert StopTimeUpdate.status(stop_update) == "UNIQUE STATUS" end + test "handles cancelled status" do + update = %{ + "trip" => %{}, + "stop_time_update" => [ + %{ + "boarding_status" => "CANCELLED", + "arrival" => nil, + "departure" => %{"time" => 1234} + } + ] + } + + [_td, stop_update] = decode_trip_update(update, %Options{}) + assert StopTimeUpdate.schedule_relationship(stop_update) == :SKIPPED + assert stop_update |> StopTimeUpdate.arrival_time() |> is_nil() + assert stop_update |> StopTimeUpdate.departure_time() |> is_nil() + end + test "can handle platform id information" do update = %{ "trip" => %{},