mbta 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +1 -0
- data/lib/mbta.rb +8 -186
- data/lib/mbta/bus.rb +4 -0
- data/lib/mbta/commuter_rail.rb +4 -0
- data/lib/mbta/heavy_rail.rb +11 -0
- data/lib/mbta/heavy_rail/announcements.rb +0 -0
- data/lib/mbta/heavy_rail/announcements/arrival.rb +8 -0
- data/lib/mbta/heavy_rail/announcements/base.rb +19 -0
- data/lib/mbta/heavy_rail/announcements/prediction.rb +8 -0
- data/lib/mbta/heavy_rail/line.rb +56 -0
- data/lib/mbta/heavy_rail/platform.rb +23 -0
- data/lib/mbta/heavy_rail/station.rb +30 -0
- data/lib/mbta/heavy_rail/system.rb +55 -0
- data/lib/mbta/heavy_rail/trip.rb +14 -0
- data/lib/mbta/version.rb +1 -1
- data/mbta.gemspec +7 -5
- metadata +26 -5
- data/.DS_Store +0 -0
- data/data/.DS_Store +0 -0
data/.gitignore
CHANGED
data/lib/mbta.rb
CHANGED
@@ -1,191 +1,13 @@
|
|
1
|
-
require 'httparty'
|
2
|
-
require 'json'
|
3
1
|
require 'csv'
|
4
|
-
require 'pp'
|
5
2
|
|
6
|
-
require
|
3
|
+
require './mbta/version'
|
7
4
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
class Base
|
12
|
-
attr_reader :trip, :platform, :time
|
13
|
-
|
14
|
-
def initialize(trip, platform, time)
|
15
|
-
@trip = trip
|
16
|
-
@platform = platform
|
17
|
-
@time = time
|
18
|
-
end
|
19
|
-
|
20
|
-
def type
|
21
|
-
self.class.name.split('::').last.downcase.to_sym
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
class Prediction < Base
|
26
|
-
end
|
27
|
-
|
28
|
-
class Arrival < Base
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
class Line
|
33
|
-
attr_reader :name, :color
|
34
|
-
attr_writer :stations
|
35
|
-
attr_accessor :trips
|
36
|
-
|
37
|
-
def initialize(name, stations = {})
|
38
|
-
@name = name
|
39
|
-
@color = name.downcase.to_sym
|
40
|
-
@stations = stations
|
41
|
-
@trips = {}
|
42
|
-
end
|
43
|
-
|
44
|
-
def stations(name_or_direction = nil)
|
45
|
-
case name_or_direction
|
46
|
-
when String then self[name_or_direction]
|
47
|
-
when Symbol then nil
|
48
|
-
else @stations
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def [](name_or_key)
|
53
|
-
case name_or_key
|
54
|
-
when String then @stations.find { |station| station.name == name_or_key }
|
55
|
-
when Symbol then platforms.find { |platform| platform.key == name_or_key }
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def platforms
|
60
|
-
stations.inject(Array.new) { |memo, station| memo << station.platforms }.flatten
|
61
|
-
end
|
62
|
-
|
63
|
-
def parse_announcements(json)
|
64
|
-
data = JSON.parse(json)
|
65
|
-
_trips = data.inject(Array.new) { |memo, announcement| memo << announcement['Trip'].to_i }.uniq
|
66
|
-
_trips.each do |trip|
|
67
|
-
self.trips[trip] = MBTA::HeavyRail::Trip.new(self, trip)
|
68
|
-
end
|
69
|
-
|
70
|
-
data.each do |a|
|
71
|
-
trip = self.trips[a['Trip'].to_i]
|
72
|
-
time = Time.strptime(a['Time'], '%m/%d/%Y %H:%M:%S %p')
|
73
|
-
platform = self[a['PlatformKey'].downcase.to_sym]
|
74
|
-
|
75
|
-
announcement_type = case a['InformationType']
|
76
|
-
when 'Arrived' then MBTA::HeavyRail::Announcements::Arrival
|
77
|
-
when 'Predicted' then MBTA::HeavyRail::Announcements::Prediction
|
78
|
-
end
|
79
|
-
|
80
|
-
trip.announcements << announcement_type.new(trip, platform, time) if announcement_type
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
class Trip
|
86
|
-
attr_reader :line, :id
|
87
|
-
attr_accessor :announcements
|
88
|
-
|
89
|
-
def initialize(line, id)
|
90
|
-
@line = line
|
91
|
-
@id = id
|
92
|
-
@announcements = []
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
class Station
|
97
|
-
attr_reader :line, :name
|
98
|
-
attr_writer :platforms
|
5
|
+
require './mbta/commuter_rail'
|
6
|
+
require './mbta/heavy_rail'
|
7
|
+
require './mbta/bus'
|
99
8
|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
end
|
105
|
-
|
106
|
-
def platforms(direction = nil)
|
107
|
-
if (direction)
|
108
|
-
self[direction]
|
109
|
-
else
|
110
|
-
@platforms
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
def [](direction)
|
115
|
-
@platforms.find { |platform| platform.direction == direction }
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
class Platform
|
120
|
-
attr_reader :station, :direction, :key
|
121
|
-
|
122
|
-
def initialize(station, direction, order, key)
|
123
|
-
@station = station
|
124
|
-
@direction = direction
|
125
|
-
@order = order
|
126
|
-
@key = key
|
127
|
-
end
|
128
|
-
|
129
|
-
def predictions
|
130
|
-
station.line.trips.inject(Array.new) do |memo, trip|
|
131
|
-
memo << trip[1].announcements.inject(Array.new) do |m, a|
|
132
|
-
m << a if (self.key == a.platform.key && a.type == :prediction)
|
133
|
-
m
|
134
|
-
end
|
135
|
-
end.flatten.compact.sort {|x, y| x.time <=> y.time }
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
|
-
module System
|
140
|
-
class Map
|
141
|
-
attr_reader :lines
|
142
|
-
|
143
|
-
def initialize(lines = {})
|
144
|
-
@lines = lines
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
class Builder
|
149
|
-
def initialize
|
150
|
-
@data = CSV.read("../data/RealTimeHeavyRailKeys.csv", { headers: true })
|
151
|
-
end
|
152
|
-
|
153
|
-
def map
|
154
|
-
data = @data
|
155
|
-
line_names = data.inject(Array.new) {|memo, platform| memo.push(platform['Line']) }.uniq
|
156
|
-
lines = line_names.map{|name| MBTA::HeavyRail::Line.new(name) }
|
157
|
-
|
158
|
-
lines.each do |line|
|
159
|
-
platforms = data.select {|row| row['Line'] == line.name }
|
160
|
-
station_names = platforms.inject(Array.new) {|memo, platform| memo.push(platform['StationName']) }.uniq
|
161
|
-
line.stations = station_names.map {|name| MBTA::HeavyRail::Station.new(line, name.capitalize) }
|
162
|
-
|
163
|
-
line.stations.each do |station|
|
164
|
-
data.select{|row| row['StationName'].capitalize == station.name }.each do |row|
|
165
|
-
direction = case row['Direction']
|
166
|
-
when 'NB' then :northbound
|
167
|
-
when 'SB' then :southbound
|
168
|
-
when 'EB' then :eastbound
|
169
|
-
when 'WB' then :westbound
|
170
|
-
end
|
171
|
-
key = row['PlatformKey'].downcase.to_sym
|
172
|
-
station.platforms.push(MBTA::HeavyRail::Platform.new(station, direction, row['PlatformOrder'], key))
|
173
|
-
end
|
174
|
-
end
|
175
|
-
end
|
176
|
-
|
177
|
-
_lines = lines.inject(Hash.new){|lines, line| lines[line.name] = line; lines }
|
178
|
-
|
179
|
-
map = MBTA::HeavyRail::System::Map.new(_lines)
|
180
|
-
return map
|
181
|
-
end
|
182
|
-
end
|
183
|
-
|
184
|
-
MAP = Builder.new.map
|
185
|
-
end
|
186
|
-
end
|
187
|
-
|
188
|
-
BlueLine = MBTA::HeavyRail::System::MAP.lines['Blue']
|
189
|
-
GreenLine = MBTA::HeavyRail::System::MAP.lines['Green']
|
190
|
-
RedLine = MBTA::HeavyRail::System::MAP.lines['Red']
|
9
|
+
module MBTA
|
10
|
+
include MBTA::CommuterRail
|
11
|
+
include MBTA::HeavyRail
|
12
|
+
include MBTA::Bus
|
191
13
|
end
|
data/lib/mbta/bus.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
require './mbta/heavy_rail/system'
|
2
|
+
|
3
|
+
module MBTA
|
4
|
+
module HeavyRail
|
5
|
+
include MBTA::HeavyRail::System
|
6
|
+
|
7
|
+
BlueLine = MBTA::HeavyRail::System::MAP.lines['Blue']
|
8
|
+
OrangeLine = MBTA::HeavyRail::System::MAP.lines['Orange']
|
9
|
+
RedLine = MBTA::HeavyRail::System::MAP.lines['Red']
|
10
|
+
end
|
11
|
+
end
|
File without changes
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module MBTA
|
2
|
+
module HeavyRail
|
3
|
+
module Announcements
|
4
|
+
class Base
|
5
|
+
attr_reader :trip, :platform, :time
|
6
|
+
|
7
|
+
def initialize(trip, platform, time)
|
8
|
+
@trip = trip
|
9
|
+
@platform = platform
|
10
|
+
@time = time
|
11
|
+
end
|
12
|
+
|
13
|
+
def type
|
14
|
+
self.class.name.split('::').last.downcase.to_sym
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module MBTA
|
2
|
+
module HeavyRail
|
3
|
+
class Line
|
4
|
+
attr_reader :name, :color
|
5
|
+
attr_writer :stations
|
6
|
+
attr_accessor :trips
|
7
|
+
|
8
|
+
def initialize(name, stations = {})
|
9
|
+
@name = name
|
10
|
+
@color = name.downcase.to_sym
|
11
|
+
@stations = stations
|
12
|
+
@trips = {}
|
13
|
+
end
|
14
|
+
|
15
|
+
def stations(name_or_direction = nil)
|
16
|
+
case name_or_direction
|
17
|
+
when String then self[name_or_direction]
|
18
|
+
when Symbol then nil
|
19
|
+
else @stations
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def [](name_or_key)
|
24
|
+
case name_or_key
|
25
|
+
when String then @stations.find { |station| station.name == name_or_key }
|
26
|
+
when Symbol then platforms.find { |platform| platform.key == name_or_key }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def platforms
|
31
|
+
stations.inject(Array.new) { |memo, station| memo << station.platforms }.flatten
|
32
|
+
end
|
33
|
+
|
34
|
+
def parse_announcements(json)
|
35
|
+
data = JSON.parse(json)
|
36
|
+
_trips = data.inject(Array.new) { |memo, announcement| memo << announcement['Trip'].to_i }.uniq
|
37
|
+
_trips.each do |trip|
|
38
|
+
self.trips[trip] = MBTA::HeavyRail::Trip.new(self, trip)
|
39
|
+
end
|
40
|
+
|
41
|
+
data.each do |a|
|
42
|
+
trip = self.trips[a['Trip'].to_i]
|
43
|
+
time = Time.strptime(a['Time'], '%m/%d/%Y %H:%M:%S %p')
|
44
|
+
platform = self[a['PlatformKey'].downcase.to_sym]
|
45
|
+
|
46
|
+
announcement_type = case a['InformationType']
|
47
|
+
when 'Arrived' then MBTA::HeavyRail::Announcements::Arrival
|
48
|
+
when 'Predicted' then MBTA::HeavyRail::Announcements::Prediction
|
49
|
+
end
|
50
|
+
|
51
|
+
trip.announcements << announcement_type.new(trip, platform, time) if announcement_type
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module MBTA
|
2
|
+
module HeavyRail
|
3
|
+
class Platform
|
4
|
+
attr_reader :station, :direction, :key
|
5
|
+
|
6
|
+
def initialize(station, direction, order, key)
|
7
|
+
@station = station
|
8
|
+
@direction = direction
|
9
|
+
@order = order
|
10
|
+
@key = key
|
11
|
+
end
|
12
|
+
|
13
|
+
def predictions
|
14
|
+
station.line.trips.inject(Array.new) do |memo, trip|
|
15
|
+
memo << trip[1].announcements.inject(Array.new) do |m, a|
|
16
|
+
m << a if (self.key == a.platform.key && a.type == :prediction)
|
17
|
+
m
|
18
|
+
end
|
19
|
+
end.flatten.compact.sort {|x, y| x.time <=> y.time }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module MBTA
|
2
|
+
module HeavyRail
|
3
|
+
class Station
|
4
|
+
attr_reader :line, :name
|
5
|
+
attr_writer :platforms
|
6
|
+
|
7
|
+
def initialize(line, name, platforms = [])
|
8
|
+
@line = line
|
9
|
+
@name = name
|
10
|
+
@platforms = platforms
|
11
|
+
end
|
12
|
+
|
13
|
+
def inspect
|
14
|
+
%("#{@name}")
|
15
|
+
end
|
16
|
+
|
17
|
+
def platforms(direction = nil)
|
18
|
+
if (direction)
|
19
|
+
self[direction]
|
20
|
+
else
|
21
|
+
@platforms
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def [](direction)
|
26
|
+
@platforms.find { |platform| platform.direction == direction }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require './mbta/heavy_rail/line'
|
2
|
+
require './mbta/heavy_rail/station'
|
3
|
+
require './mbta/heavy_rail/platform'
|
4
|
+
|
5
|
+
module MBTA
|
6
|
+
module HeavyRail
|
7
|
+
module System
|
8
|
+
class Map
|
9
|
+
attr_reader :lines
|
10
|
+
|
11
|
+
def initialize(lines = {})
|
12
|
+
@lines = lines
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class Builder
|
17
|
+
def initialize
|
18
|
+
@data = ::CSV.read("../data/RealTimeHeavyRailKeys.csv", { headers: true })
|
19
|
+
end
|
20
|
+
|
21
|
+
def map
|
22
|
+
data = @data
|
23
|
+
line_names = data.inject(Array.new) {|memo, platform| memo.push(platform['Line']) }.uniq
|
24
|
+
lines = line_names.map{|name| MBTA::HeavyRail::Line.new(name) }
|
25
|
+
|
26
|
+
lines.each do |line|
|
27
|
+
platforms = data.select {|row| row['Line'] == line.name }
|
28
|
+
station_names = platforms.inject(Array.new) {|memo, platform| memo.push(platform['StationName']) }.uniq
|
29
|
+
line.stations = station_names.map {|name| MBTA::HeavyRail::Station.new(line, name.capitalize) }
|
30
|
+
|
31
|
+
line.stations.each do |station|
|
32
|
+
data.select{|row| row['StationName'].capitalize == station.name }.each do |row|
|
33
|
+
direction = case row['Direction']
|
34
|
+
when 'NB' then :northbound
|
35
|
+
when 'SB' then :southbound
|
36
|
+
when 'EB' then :eastbound
|
37
|
+
when 'WB' then :westbound
|
38
|
+
end
|
39
|
+
key = row['PlatformKey'].downcase.to_sym
|
40
|
+
station.platforms.push(MBTA::HeavyRail::Platform.new(station, direction, row['PlatformOrder'], key))
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
_lines = lines.inject(Hash.new){|lines, line| lines[line.name] = line; lines }
|
46
|
+
|
47
|
+
map = MBTA::HeavyRail::System::Map.new(_lines)
|
48
|
+
return map
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
MAP = Builder.new.map
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
data/lib/mbta/version.rb
CHANGED
data/mbta.gemspec
CHANGED
@@ -2,16 +2,18 @@
|
|
2
2
|
require File.expand_path('../lib/mbta/version', __FILE__)
|
3
3
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
|
-
gem.authors = [
|
6
|
-
gem.email = [
|
5
|
+
gem.authors = ['Chris Kalafarski']
|
6
|
+
gem.email = ['chris@farski.com']
|
7
7
|
gem.description = %q{Library for accessing real-time MBTA data}
|
8
8
|
gem.summary = %q{Not a product of the MBTA. See mbta.com/developers for more info about their API}
|
9
|
-
gem.homepage =
|
9
|
+
gem.homepage = 'https://github.com/farski/mbta'
|
10
10
|
|
11
11
|
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
12
12
|
gem.files = `git ls-files`.split("\n")
|
13
13
|
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
14
|
-
gem.name =
|
15
|
-
gem.require_paths = [
|
14
|
+
gem.name = 'mbta'
|
15
|
+
gem.require_paths = ['lib']
|
16
16
|
gem.version = MBTA::VERSION
|
17
|
+
|
18
|
+
gem.add_dependency('httparty', '>= 0.8.0')
|
17
19
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mbta
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,8 +9,19 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
13
|
-
dependencies:
|
12
|
+
date: 2012-02-18 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: httparty
|
16
|
+
requirement: &70218718288260 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 0.8.0
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70218718288260
|
14
25
|
description: Library for accessing real-time MBTA data
|
15
26
|
email:
|
16
27
|
- chris@farski.com
|
@@ -18,15 +29,25 @@ executables: []
|
|
18
29
|
extensions: []
|
19
30
|
extra_rdoc_files: []
|
20
31
|
files:
|
21
|
-
- .DS_Store
|
22
32
|
- .gitignore
|
23
33
|
- Gemfile
|
24
34
|
- LICENSE
|
25
35
|
- README.md
|
26
36
|
- Rakefile
|
27
|
-
- data/.DS_Store
|
28
37
|
- data/RealTimeHeavyRailKeys.csv
|
29
38
|
- lib/mbta.rb
|
39
|
+
- lib/mbta/bus.rb
|
40
|
+
- lib/mbta/commuter_rail.rb
|
41
|
+
- lib/mbta/heavy_rail.rb
|
42
|
+
- lib/mbta/heavy_rail/announcements.rb
|
43
|
+
- lib/mbta/heavy_rail/announcements/arrival.rb
|
44
|
+
- lib/mbta/heavy_rail/announcements/base.rb
|
45
|
+
- lib/mbta/heavy_rail/announcements/prediction.rb
|
46
|
+
- lib/mbta/heavy_rail/line.rb
|
47
|
+
- lib/mbta/heavy_rail/platform.rb
|
48
|
+
- lib/mbta/heavy_rail/station.rb
|
49
|
+
- lib/mbta/heavy_rail/system.rb
|
50
|
+
- lib/mbta/heavy_rail/trip.rb
|
30
51
|
- lib/mbta/version.rb
|
31
52
|
- mbta.gemspec
|
32
53
|
homepage: https://github.com/farski/mbta
|
data/.DS_Store
DELETED
Binary file
|
data/data/.DS_Store
DELETED
Binary file
|