szczanieckiej.git

commit 604ffb0182c69ffed571aba25311a986d427c3ca

Author: Adam Evyčędo <git@apiote.xyz>

add STIB-MIVB Brussels (static schedule only)

 CHANGELOG.adoc | 11 ++-
 go.mod | 1 
 go.sum | 1 
 traffic/brussels_stib_mivb.go | 108 +++++++++++++++++++++++++++++++++++++
 traffic/feeds.go | 7 +-
 transformers/fr.go | 1 


diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc
index b88b1c10648d5ecf472df7546e9e75570b2936b6..84a7cef0e6662da9f0553b57d17ee84206045ae0 100644
--- a/CHANGELOG.adoc
+++ b/CHANGELOG.adoc
@@ -52,7 +52,6 @@ == v0.3
 
 === todo
 
-* brussels (schedule and rt, rt in go)
 * REUSE, credits, feeds providers
 * [bug] sort nearby stops
 * go1.21 refactor (e.g. https://www.sethvargo.com/things-im-excited-for-in-go-1-21/#slies-and-maps-packages)
@@ -61,16 +60,18 @@ * [w/czwek] gtfs-rt feed with bimba anouncements in all feeds
 
 === in progress
 
-* remove prevNodes from traffic::LineGraph,
-* add -1:i to LineGraph.nextNodes (where i is starting node)
-* make traffic::Line.headsigns [][]string
-* make traffic::Line.graphs []LineGraph
+* brussels (schedule and rt, rt in go)
 
 === testing
 
 * BAF25: single latest feed – get its validity from calendar/calendar_dates; move to /var/lib based on validity
 
 === done
+
+* remove prevNodes from traffic::LineGraph,
+* add -1:i to LineGraph.nextNodes (where i is starting node)
+* make traffic::Line.headsigns [][]string
+* make traffic::Line.graphs []LineGraph
 
 
 == v0.2




diff --git a/go.mod b/go.mod
index 3426c98b6aaa810bb84857fd8ab1fccc6d9ebdaf..a99a65fb076ba60a94b001b3b96889f582444eb2 100644
--- a/go.mod
+++ b/go.mod
@@ -11,6 +11,7 @@ 	github.com/golang/protobuf v1.5.2
 	github.com/sahilm/fuzzy v0.1.0
 	github.com/ulikunitz/xz v0.5.10
 	golang.org/x/text v0.3.6
+	golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e
 	google.golang.org/protobuf v1.26.0
 	notabug.org/apiote/gott v1.1.2
 )




diff --git a/go.sum b/go.sum
index 4a85ee2f654ba45ff3e8438a4bf86e887b100079..8b15fc35a5b914735ada513311b7d2a03eff529c 100644
--- a/go.sum
+++ b/go.sum
@@ -32,6 +32,7 @@ github.com/ulikunitz/xz v0.5.10 h1:t92gobL9l3HE202wg3rlk19F6X+JOxl9BBrCCMYEYd8=
 github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
 golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e h1:FDhOuMEY4JVRztM/gsbk+IKUQ8kj74bxZrgw87eMMVc=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=




diff --git a/traffic/brussels_stib_mivb.go b/traffic/brussels_stib_mivb.go
new file mode 100644
index 0000000000000000000000000000000000000000..57ac89ac5446d129a9872f29f0051301d45304d9
--- /dev/null
+++ b/traffic/brussels_stib_mivb.go
@@ -0,0 +1,108 @@
+package traffic
+
+import (
+	"encoding/xml"
+
+	"apiote.xyz/p/szczanieckiej/transformers"
+
+	"fmt"
+	"net/http"
+	"os"
+	"path/filepath"
+	"time"
+
+	"golang.org/x/text/language"
+	"golang.org/x/text/transform"
+	"golang.org/x/tools/blog/atom"
+)
+
+type StibMivbBrussels struct {
+	client http.Client
+}
+
+func (z StibMivbBrussels) ConvertVehicles(path string) error {
+	result, err := os.Create(filepath.Join(path, "vehicles.bare"))
+	if err != nil {
+		return fmt.Errorf("ConvertVehicles: cannot create bare file: %w", err)
+	}
+	defer result.Close()
+	return nil
+}
+
+func (z StibMivbBrussels) GetVersions(date time.Time) ([]Version, error) {
+	url := "https://stibmivb.opendatasoft.com/explore/dataset/gtfs-files-production/atom/"
+	response, err := z.client.Get(url)
+	if err != nil {
+		return []Version{}, fmt.Errorf("GetVersions: cannot GET ‘%s’: %w", url, err)
+	}
+
+	decoder := xml.NewDecoder(response.Body)
+	versionsFeed := atom.Feed{}
+	decoder.Decode(&versionsFeed)
+	updated, _ := time.Parse(string(versionsFeed.Entry[0].Updated), "2006-01-02T15:04:05-07:00")
+	validityString := updated.Format("20060102") + "_99991231"
+
+	version, err := MakeVersion(validityString, z.GetLocation())
+	if err != nil {
+		return nil, err
+	}
+	version.Link = "https://stibmivb.opendatasoft.com/api/explore/v2.1/catalog/datasets/gtfs-files-production/alternative_exports/gtfszip/"
+	versions := []Version{version}
+	return versions, nil
+}
+
+func (z StibMivbBrussels) GetLocation() *time.Location {
+	l, _ := time.LoadLocation("Europe/Brussels")
+	return l
+}
+
+func (z StibMivbBrussels) String() string {
+	return "brussels_stib_mivb"
+}
+
+func (z StibMivbBrussels) RealtimeFeeds() []string {
+	return []string{}
+}
+
+func (z StibMivbBrussels) Transformer() transform.Transformer {
+	return transform.Chain(transformers.TransformerFR) // TODO add transformerNL
+}
+
+func (z StibMivbBrussels) Name() string {
+	return "STIB-MIVB Brussels"
+}
+
+func (z StibMivbBrussels) Attribution() map[language.Tag]string {
+	return map[language.Tag]string{
+		language.Und:     "GTFS files downloaded from https://stibmivb.opendatasoft.com and converted to TRAFFIC",
+		language.English: "GTFS files downloaded from https://stibmivb.opendatasoft.com and converted to TRAFFIC",
+		language.Polish:  "Pliki GTFS pobrane z https://stibmivb.opendatasoft.com i przekonwertowane do formatu TRAFFIC",
+	}
+}
+
+func (z StibMivbBrussels) Description() map[language.Tag]string {
+	return map[language.Tag]string{
+		language.Und:             "Timetable for Brussels public transport organised by STIB-MIVB",
+		language.English:         "Timetable for Brussels public transport organised by STIB-MIVB",
+		language.BritishEnglish:  "Timetable for Brussels public transport organised by STIB-MIVB",
+		language.AmericanEnglish: "Timetable for Brussels public transport organised by STIB-MIVB",
+		language.Polish:          "Rozkład jazdy brukselskiego transportu publicznego organizowanego przez STIB-MIVB",
+	}
+}
+
+func (z StibMivbBrussels) Flags() FeedFlags {
+	return FeedFlags{
+		Headsign:     HeadsignTripHeadsing,
+		StopIdFormat: "{{stop_id}}",
+		StopName:     "{{stop_name}} [{{stop_id}}]",
+		LineName:     "{{route_short_name}}",
+	}
+}
+
+func (z StibMivbBrussels) FeedPrepareZip(path string) error {
+	return nil
+}
+
+func (z StibMivbBrussels) QRInfo() (string, QRLocation, string) {
+	return "", QRLocationNone, ""
+}




diff --git a/traffic/feeds.go b/traffic/feeds.go
index 2a7381f6e91aa3557cb1156d8828262b3de9f34d..1d47fe2f6aabbf6c3f542427f091ea1a6a38e3fe 100644
--- a/traffic/feeds.go
+++ b/traffic/feeds.go
@@ -54,9 +54,10 @@ 			client: http.Client{
 				Timeout: 30 * time.Second,
 			},
 		},
-		"krakow_ztp": ZtpKrakow{},
-		"gzm_ztm":    GzmZtm{},
-		"berlin_vbb": VbbBerlin{},
+		"krakow_ztp":         ZtpKrakow{},
+		"gzm_ztm":            GzmZtm{},
+		"berlin_vbb":         VbbBerlin{},
+		"brussels_stib_mivb": StibMivbBrussels{},
 	}
 }
 




diff --git a/transformers/fr.go b/transformers/fr.go
index abfad31a9abd6c132b9d6dbbfb421c16732d2b05..47277dccde0e5497dc0818cf2a37f99712cfc188 100644
--- a/transformers/fr.go
+++ b/transformers/fr.go
@@ -15,6 +15,7 @@ 	case 'é':
 		return []rune{'e'}
 	case 'É':
 		return []rune{'E'}
+	// TODO add runes from STIB-MIVB
 	default:
 		return []rune{r}
 	}