Skip to content

Commit

Permalink
Merge branch 'master' into gbfs_store_system_information
Browse files Browse the repository at this point in the history
  • Loading branch information
AntoineAugusti authored Oct 23, 2024
2 parents 63d3260 + f21648e commit b97ede9
Show file tree
Hide file tree
Showing 4 changed files with 124 additions and 13 deletions.
21 changes: 10 additions & 11 deletions apps/shared/lib/gbfs_metadata.ex
Original file line number Diff line number Diff line change
Expand Up @@ -196,12 +196,10 @@ defmodule Transport.Shared.GBFSMetadata do

defp localized_string?(_), do: false

def first_feed(%{"data" => data, "version" => version} = payload) do
# From GBFS 1.1 until GBFS 2.3
if before_v3?(version) do
def first_feed(%{"data" => data} = payload) do
if before_v3?(payload) do
first_language = payload |> languages() |> Enum.at(0)
(data["en"] || data["fr"] || data[first_language])["feeds"]
# From GBFS 3.0 onwards
else
data["feeds"]
end
Expand All @@ -224,11 +222,9 @@ defmodule Transport.Shared.GBFSMetadata do
end
end

def languages(%{"data" => data, "version" => version} = payload) do
# From GBFS 1.1 until GBFS 2.3
if before_v3?(version) do
def languages(%{"data" => data} = payload) do
if before_v3?(payload) do
Map.keys(data)
# From GBFS 3.0 onwards
else
feed_url = payload |> first_feed() |> feed_url_by_name("system_information")

Expand All @@ -242,15 +238,15 @@ defmodule Transport.Shared.GBFSMetadata do
end

@spec versions(map()) :: [binary()] | nil
defp versions(%{"data" => _data} = payload) do
def versions(%{"data" => _data} = payload) do
versions_url = payload |> first_feed() |> feed_url_by_name("gbfs_versions")

if is_nil(versions_url) do
[Map.get(payload, "version", "1.0")]
else
with {:ok, %{status_code: 200, body: body}} <- http_client().get(versions_url),
{:ok, json} <- Jason.decode(body) do
json["data"]["versions"] |> Enum.map(fn json -> json["version"] end) |> Enum.sort(:desc)
json["data"]["versions"] |> Enum.map(& &1["version"]) |> Enum.sort(:desc)
else
_ -> nil
end
Expand Down Expand Up @@ -280,7 +276,10 @@ defmodule Transport.Shared.GBFSMetadata do
payload |> first_feed() |> Enum.map(fn feed -> String.replace(feed["name"], ".json", "") end)
end

defp before_v3?(version), do: String.starts_with?(version, ["1.", "2."])
defp before_v3?(%{"version" => version}), do: String.starts_with?(version, ["1.", "2."])
# No `version` key: GBFS 1.0
# https://github.com/MobilityData/gbfs/blob/v1.1/gbfs.md#output-format
defp before_v3?(%{}), do: true

defp http_client, do: Transport.Shared.Wrapper.HTTPoison.impl()
end
112 changes: 112 additions & 0 deletions apps/shared/test/gbfs_metadata_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,118 @@ defmodule Transport.Shared.GBFSMetadataTest do
end
end

describe "versions" do
test "1.0 feed" do
json =
Jason.decode!("""
{
"last_updated":1729501544,
"ttl":0,
"data":{
"en":{
"feeds":[
{
"name":"system_information",
"url":"https://example.com/gbfs/system_information.json"
},
{
"name":"station_information",
"url":"https://example.com/gbfs/station_information.json"
},
{
"name":"station_status",
"url":"https://example.com/gbfs/station_status.json"
}
]
}
}
}
""")

assert ["1.0"] == versions(json)
end

test "2.3 feed, no gbfs_versions feed" do
json =
Jason.decode!("""
{
"last_updated":1729501544,
"ttl":0,
"version": "2.3",
"data":{
"en":{
"feeds":[
{
"name":"system_information",
"url":"https://example.com/gbfs/system_information.json"
},
{
"name":"station_information",
"url":"https://example.com/gbfs/station_information.json"
},
{
"name":"station_status",
"url":"https://example.com/gbfs/station_status.json"
}
]
}
}
}
""")

assert ["2.3"] == versions(json)
end

test "2.3 feed, gbfs_versions feed" do
gbfs_versions_url = "https://example.com/gbfs/gbfs_versions"

setup_response(
gbfs_versions_url,
Jason.encode!(%{
data: %{
versions: [
%{version: "2.3"},
%{version: "3.0"}
]
}
})
)

json =
Jason.decode!("""
{
"last_updated":1729501544,
"ttl":0,
"version": "2.3",
"data":{
"en":{
"feeds":[
{
"name":"system_information",
"url":"https://example.com/gbfs/system_information.json"
},
{
"name":"station_information",
"url":"https://example.com/gbfs/station_information.json"
},
{
"name":"station_status",
"url":"https://example.com/gbfs/station_status.json"
},
{
"name":"gbfs_versions",
"url":"#{gbfs_versions_url}"
}
]
}
}
}
""")

assert ["3.0", "2.3"] == versions(json)
end
end

describe "feeds" do
test "3.0 feed" do
json =
Expand Down
2 changes: 1 addition & 1 deletion apps/transport/lib/transport/gbfs_to_geojson.ex
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ defmodule Transport.GbfsToGeojson do

# From GBFS 3.0 onwards
defp station_name(%{"name" => names}) do
names |> hd() |> Map.get("name")
names |> hd() |> Map.get("text")
end

@spec add_station_status(map(), map()) :: map()
Expand Down
2 changes: 1 addition & 1 deletion apps/transport/test/transport/gbfs_to_geojson_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,7 @@ defmodule Transport.GbfsToGeojsonTest do
|> Jason.decode!()
|> get_in(["data", "stations"])
|> Enum.map(fn %{"name" => name} = payload ->
Map.put(payload, "name", [%{"language" => "fr", "name" => name}])
Map.put(payload, "name", [%{"language" => "fr", "text" => name}])
end)

%{"data" => %{"stations" => stations}} |> Jason.encode!()
Expand Down

0 comments on commit b97ede9

Please sign in to comment.