From 8e1b6877f09905ca9376c30871d08bca11e58ff9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Wed, 8 Apr 2026 16:01:01 -0400 Subject: [PATCH 1/4] JSON config > + `original_route_type_id` & `route_long_name` route def --- .../mtransit/parser/DefaultAgencyTools.java | 5 +++- .../parser/config/gtfs/data/AgencyConfig.kt | 2 ++ .../parser/config/gtfs/data/RouteConfig.kt | 28 +++++++++++++------ 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/mtransit/parser/DefaultAgencyTools.java b/src/main/java/org/mtransit/parser/DefaultAgencyTools.java index 804f2975..f52cdb46 100644 --- a/src/main/java/org/mtransit/parser/DefaultAgencyTools.java +++ b/src/main/java/org/mtransit/parser/DefaultAgencyTools.java @@ -344,6 +344,9 @@ public Integer getAgencyExtendedRouteType() { @NotNull @Override public Integer getOriginalAgencyRouteType() { + if (Configs.getAgencyConfig() != null) { + return Configs.getAgencyConfig().getOriginalRouteTypeId(); + } return getAgencyRouteType(); } @@ -575,7 +578,7 @@ public String cleanRouteShortName(@NotNull String routeShortName) { @Override public String provideMissingRouteShortName(@NotNull GRoute gRoute) { //noinspection DiscouragedApi - final String routeShortNameFromRouteId = Configs.getRouteConfig().getRouteShortNameFromRouteId(gRoute.getRouteId()); + final String routeShortNameFromRouteId = Configs.getRouteConfig().getRouteShortNameForRoute(gRoute); if (routeShortNameFromRouteId != null) { return routeShortNameFromRouteId; } diff --git a/src/main/java/org/mtransit/parser/config/gtfs/data/AgencyConfig.kt b/src/main/java/org/mtransit/parser/config/gtfs/data/AgencyConfig.kt index d0e62fd2..a3423d9c 100644 --- a/src/main/java/org/mtransit/parser/config/gtfs/data/AgencyConfig.kt +++ b/src/main/java/org/mtransit/parser/config/gtfs/data/AgencyConfig.kt @@ -22,6 +22,8 @@ data class AgencyConfig( */ @SerialName("target_route_type_id") val targetRouteTypeId: Int, // REQUIRED + @SerialName("original_route_type_id") + val originalRouteTypeId: Int = targetRouteTypeId, // REQUIRED (default to target route type ID) @SerialName("extended_target_route_type_id") val extendedTargetRouteTypeId: Int? = null, // OPTIONAL // STRINGS diff --git a/src/main/java/org/mtransit/parser/config/gtfs/data/RouteConfig.kt b/src/main/java/org/mtransit/parser/config/gtfs/data/RouteConfig.kt index 69de1848..984a1d99 100644 --- a/src/main/java/org/mtransit/parser/config/gtfs/data/RouteConfig.kt +++ b/src/main/java/org/mtransit/parser/config/gtfs/data/RouteConfig.kt @@ -40,8 +40,11 @@ data class RouteConfig( val useRouteLongNameForRouteShortName: Boolean = false, // OPT-IN feature @SerialName("use_route_long_name_for_missing_route_short_name") val useRouteLongNameForMissingRouteShortName: Boolean = false, // OPT-IN feature + @Deprecated("use routeToRouteShortNameConfigs instead") @SerialName("route_id_to_route_short_name_configs") - val routeIdToRouteShortNameConfigs: List = emptyList(), + val routeIdToRouteShortNameConfigs: List = emptyList(), + @SerialName("route_to_short_name_configs") + val routeToRouteShortNameConfigs: List = routeIdToRouteShortNameConfigs, @SerialName("route_short_name_cleaners") val routeShortNameCleaners: List = emptyList(), // long-name @@ -162,9 +165,11 @@ data class RouteConfig( ) @Serializable - data class RouteIdToRouteShortNameConfig( + data class RouteDefToShortNameConfig( @SerialName("route_id") val routeId: String, + @SerialName("route_long_name") + val routeLongName: String? = null, @SerialName("route_short_name") val routeShortName: String, ) @@ -175,6 +180,8 @@ data class RouteConfig( val routeId: String? = null, @SerialName("route_short_name") val routeShortName: String?, + @SerialName("route_long_name") + val routeLongName: String? = null, @SerialName("color") val color: String, @SerialName("override") @@ -251,19 +258,22 @@ data class RouteConfig( this.routeIdPreviousCharConfigs .singleOrNull { it.char == previousChars }?.idPart - fun getRouteShortNameFromRouteId(routeId: String) = - this.routeIdToRouteShortNameConfigs - .singleOrNull { it.routeId == routeId }?.routeShortName + fun getRouteShortNameForRoute(gRoute: GRoute) = + //noinspection DiscouragedApi + (this.routeToRouteShortNameConfigs.singleOrNull { gRoute.routeId == it.routeId } + ?: this.routeToRouteShortNameConfigs.singleOrNull { gRoute.routeShortName == it.routeShortName } + ?: this.routeToRouteShortNameConfigs.singleOrNull { gRoute.routeLongNameOrDefault == it.routeLongName }) + ?.routeShortName @JvmOverloads - fun getRouteColor(gRoute: GRoute, defaultColor: String? = gRoute.routeColor, override: Boolean = false): String? { + fun getRouteColor(gRoute: GRoute, defaultColor: String? = gRoute.routeColor, override: Boolean = false) = //noinspection DiscouragedApi - return (this.routeColors.singleOrNull { gRoute.routeId == it.routeId } - ?: this.routeColors.singleOrNull { gRoute.routeShortName == it.routeShortName }) + (this.routeColors.singleOrNull { gRoute.routeId == it.routeId } + ?: this.routeColors.singleOrNull { gRoute.routeShortName == it.routeShortName } + ?: this.routeColors.singleOrNull { gRoute.routeLongNameOrDefault == it.routeLongName }) ?.takeIf { it.override || !override } ?.color ?: defaultColor - } fun isRouteColorIgnored(routeColor: String) = this.routeColorsIgnored.any { it.equals(routeColor, ignoreCase = true) } From 3e4afc9f686921ac6d1699f585976a45e68da887 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Wed, 8 Apr 2026 16:26:33 -0400 Subject: [PATCH 2/4] PR comments --- .../java/org/mtransit/parser/config/gtfs/data/RouteConfig.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/org/mtransit/parser/config/gtfs/data/RouteConfig.kt b/src/main/java/org/mtransit/parser/config/gtfs/data/RouteConfig.kt index 984a1d99..f86811de 100644 --- a/src/main/java/org/mtransit/parser/config/gtfs/data/RouteConfig.kt +++ b/src/main/java/org/mtransit/parser/config/gtfs/data/RouteConfig.kt @@ -167,7 +167,7 @@ data class RouteConfig( @Serializable data class RouteDefToShortNameConfig( @SerialName("route_id") - val routeId: String, + val routeId: String? = null, @SerialName("route_long_name") val routeLongName: String? = null, @SerialName("route_short_name") @@ -261,7 +261,6 @@ data class RouteConfig( fun getRouteShortNameForRoute(gRoute: GRoute) = //noinspection DiscouragedApi (this.routeToRouteShortNameConfigs.singleOrNull { gRoute.routeId == it.routeId } - ?: this.routeToRouteShortNameConfigs.singleOrNull { gRoute.routeShortName == it.routeShortName } ?: this.routeToRouteShortNameConfigs.singleOrNull { gRoute.routeLongNameOrDefault == it.routeLongName }) ?.routeShortName From a9384fb4ce250129091aba655ad44a824f598fbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Wed, 8 Apr 2026 16:37:02 -0400 Subject: [PATCH 3/4] PR comments --- src/main/java/org/mtransit/parser/DefaultAgencyTools.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/mtransit/parser/DefaultAgencyTools.java b/src/main/java/org/mtransit/parser/DefaultAgencyTools.java index f52cdb46..3cde21e6 100644 --- a/src/main/java/org/mtransit/parser/DefaultAgencyTools.java +++ b/src/main/java/org/mtransit/parser/DefaultAgencyTools.java @@ -578,9 +578,9 @@ public String cleanRouteShortName(@NotNull String routeShortName) { @Override public String provideMissingRouteShortName(@NotNull GRoute gRoute) { //noinspection DiscouragedApi - final String routeShortNameFromRouteId = Configs.getRouteConfig().getRouteShortNameForRoute(gRoute); - if (routeShortNameFromRouteId != null) { - return routeShortNameFromRouteId; + final String routeShortNameFromRout = Configs.getRouteConfig().getRouteShortNameForRoute(gRoute); + if (routeShortNameFromRout != null) { + return routeShortNameFromRout; } if (Configs.getRouteConfig().getUseRouteLongNameForMissingRouteShortName()) { return gRoute.getRouteLongNameOrDefault(); From bbb3403fb51ac6c510a40d5a63b6a722a1638fbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Wed, 8 Apr 2026 16:44:38 -0400 Subject: [PATCH 4/4] PR comments --- src/main/java/org/mtransit/parser/DefaultAgencyTools.java | 6 +++--- .../org/mtransit/parser/config/gtfs/data/RouteConfig.kt | 8 +++++++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/mtransit/parser/DefaultAgencyTools.java b/src/main/java/org/mtransit/parser/DefaultAgencyTools.java index 3cde21e6..58390e86 100644 --- a/src/main/java/org/mtransit/parser/DefaultAgencyTools.java +++ b/src/main/java/org/mtransit/parser/DefaultAgencyTools.java @@ -578,9 +578,9 @@ public String cleanRouteShortName(@NotNull String routeShortName) { @Override public String provideMissingRouteShortName(@NotNull GRoute gRoute) { //noinspection DiscouragedApi - final String routeShortNameFromRout = Configs.getRouteConfig().getRouteShortNameForRoute(gRoute); - if (routeShortNameFromRout != null) { - return routeShortNameFromRout; + final String routeShortNameFromRoute = Configs.getRouteConfig().getRouteShortNameForRoute(gRoute); + if (routeShortNameFromRoute != null) { + return routeShortNameFromRoute; } if (Configs.getRouteConfig().getUseRouteLongNameForMissingRouteShortName()) { return gRoute.getRouteLongNameOrDefault(); diff --git a/src/main/java/org/mtransit/parser/config/gtfs/data/RouteConfig.kt b/src/main/java/org/mtransit/parser/config/gtfs/data/RouteConfig.kt index f86811de..8f7dbd34 100644 --- a/src/main/java/org/mtransit/parser/config/gtfs/data/RouteConfig.kt +++ b/src/main/java/org/mtransit/parser/config/gtfs/data/RouteConfig.kt @@ -172,7 +172,13 @@ data class RouteConfig( val routeLongName: String? = null, @SerialName("route_short_name") val routeShortName: String, - ) + ) { + init { + require(routeId != null || routeLongName != null) { + "Either 'route_id' or 'route_long_name' must be provided in RouteDefToShortNameConfig." + } + } + } @Serializable data class RouteColor(