cta-api 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +17 -17
- data/cta-api.gemspec +4 -2
- data/lib/cta-api.rb +191 -19
- metadata +22 -17
- data/lib/bus-tracker/bus-tracker.rb +0 -208
- data/lib/bus-tracker/pattern.rb +0 -13
- data/lib/bus-tracker/point.rb +0 -15
- data/lib/bus-tracker/prediction.rb +0 -13
- data/lib/bus-tracker/service-bulletin.rb +0 -13
- data/lib/bus-tracker/service.rb +0 -15
- data/lib/bus-tracker/stop.rb +0 -13
- data/lib/bus-tracker/vehicle.rb +0 -13
- data/lib/cta-api/version.rb +0 -3
- data/lib/train-tracker/estimate.rb +0 -13
- data/lib/train-tracker/train-tracker.rb +0 -56
data/README.md
CHANGED
@@ -10,8 +10,8 @@ $ gem install cta-api
|
|
10
10
|
|
11
11
|
This gem allows you to access the Chicago Transit Authority API via Ruby. You can track the real-time locations of all public transportation vehicles, including buses and trains. You can obtain API keys from the CTA website:
|
12
12
|
|
13
|
-
http://www.transitchicago.com/developers/bustracker.aspx
|
14
|
-
http://www.transitchicago.com/developers/traintracker.aspx
|
13
|
+
* http://www.transitchicago.com/developers/bustracker.aspx
|
14
|
+
* http://www.transitchicago.com/developers/traintracker.aspx
|
15
15
|
|
16
16
|
## Bus Tracker
|
17
17
|
|
@@ -21,30 +21,30 @@ http://www.transitchicago.com/developers/traintracker.aspx
|
|
21
21
|
require 'cta-api'
|
22
22
|
|
23
23
|
key = "XXXXXXXXXXXXXXXXXXXXXXXXX"
|
24
|
-
|
24
|
+
CTA::BusTracker.key = key
|
25
25
|
```
|
26
26
|
|
27
27
|
### Find Routes and Stops
|
28
28
|
|
29
29
|
``` ruby
|
30
30
|
# list all available routes
|
31
|
-
|
31
|
+
CTA::BusTracker.routes
|
32
32
|
|
33
33
|
# gets the available directions for the specified route (north, south, etc.)
|
34
|
-
|
34
|
+
CTA::BusTracker.directions :rt => 50
|
35
35
|
|
36
36
|
# list all stops that belong to a particular route
|
37
|
-
|
37
|
+
CTA::BusTracker.stops :rt => 50, :north
|
38
38
|
```
|
39
39
|
|
40
40
|
### Find Vehicles
|
41
41
|
|
42
42
|
``` ruby
|
43
43
|
# returns an array of vehicles that travel the given routes
|
44
|
-
|
44
|
+
CTA::BusTracker.vehicles :rt => 50
|
45
45
|
|
46
46
|
# returns an array of vehicles with the given vehicle ids
|
47
|
-
|
47
|
+
CTA::BusTracker.vehicles :vid => ["1782", "1419", "1773"]
|
48
48
|
```
|
49
49
|
|
50
50
|
### Get Predicted Arrival Times
|
@@ -52,15 +52,15 @@ key = "XXXXXXXXXXXXXXXXXXXXXXXXX"
|
|
52
52
|
``` ruby
|
53
53
|
# get arrival times for a list of stop ids
|
54
54
|
# note that the second argument is optional
|
55
|
-
|
55
|
+
CTA::BusTracker.predictions :rt => 50, :stpid => 8923
|
56
56
|
|
57
57
|
# get arrival times for a list of vehicle ids
|
58
|
-
|
58
|
+
CTA::BusTracker.predictions :vid => ["1782", "1419", "1773"]
|
59
59
|
```
|
60
60
|
|
61
61
|
### Get System Time
|
62
62
|
``` ruby
|
63
|
-
|
63
|
+
CTA::BusTracker.time
|
64
64
|
```
|
65
65
|
|
66
66
|
## Train Tracker
|
@@ -71,21 +71,21 @@ key = "XXXXXXXXXXXXXXXXXXXXXXXXX"
|
|
71
71
|
require 'cta-api'
|
72
72
|
|
73
73
|
key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
|
74
|
-
|
74
|
+
CTA::TrainTracker.key = key
|
75
75
|
```
|
76
76
|
|
77
|
-
|
77
|
+
### Get a List of Stops and Stations
|
78
78
|
|
79
79
|
``` ruby
|
80
80
|
# stops
|
81
|
-
|
81
|
+
CTA::TrainTracker.stops
|
82
82
|
|
83
83
|
# stations
|
84
|
-
|
84
|
+
CTA::TrainTracker.stations
|
85
85
|
```
|
86
86
|
|
87
|
-
|
87
|
+
### Get Predicted Arrival Times
|
88
88
|
|
89
89
|
``` ruby
|
90
|
-
|
90
|
+
CTA::TrainTracker.arrivals :stpid => "30106"
|
91
91
|
```
|
data/cta-api.gemspec
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'cta-api'
|
3
|
-
s.version = '1.0.
|
3
|
+
s.version = '1.0.1'
|
4
4
|
s.author = 'Frank Bonetti'
|
5
|
+
s.homepage = 'https://github.com/fbonetti/cta-api'
|
5
6
|
s.date = '2013-02-02'
|
6
7
|
|
7
8
|
s.license = 'MIT'
|
@@ -13,5 +14,6 @@ Gem::Specification.new do |s|
|
|
13
14
|
|
14
15
|
s.require_paths = ['lib']
|
15
16
|
s.files = Dir.glob("**/*").reject { |x| File.directory?(x) }
|
16
|
-
s.add_dependency('
|
17
|
+
s.add_dependency('httparty', '>= 0.10.2')
|
18
|
+
s.add_dependency('hashie', '>= 2.0.0')
|
17
19
|
end
|
data/lib/cta-api.rb
CHANGED
@@ -1,23 +1,195 @@
|
|
1
|
-
require '
|
2
|
-
require '
|
3
|
-
require '
|
1
|
+
require 'rubygems'
|
2
|
+
require 'httparty'
|
3
|
+
require 'hashie'
|
4
4
|
require 'csv'
|
5
|
+
require 'time'
|
6
|
+
|
7
|
+
class Array
|
8
|
+
def self.wrap(object)
|
9
|
+
if object.nil?
|
10
|
+
[]
|
11
|
+
elsif object.respond_to?(:to_ary)
|
12
|
+
object.to_ary || [object]
|
13
|
+
else
|
14
|
+
[object]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
module CTA
|
20
|
+
class BusTracker
|
21
|
+
include HTTParty
|
22
|
+
base_uri 'http://www.ctabustracker.com/bustime/api/v1'
|
23
|
+
format :xml
|
24
|
+
@@key = nil
|
25
|
+
|
26
|
+
def self.time(options={})
|
27
|
+
options.merge!({
|
28
|
+
:key => @@key
|
29
|
+
})
|
30
|
+
|
31
|
+
response = get("/gettime", :query => options)['bustime_response']
|
32
|
+
check_for_errors response['error']
|
33
|
+
|
34
|
+
Time.parse response['tm']
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.vehicles(options={})
|
38
|
+
options.merge!({
|
39
|
+
:key => @@key
|
40
|
+
})
|
41
|
+
options[:vid] = options[:vid].join(',') if options[:vid].kind_of?(Array)
|
42
|
+
options[:rt] = options[:rt].join(',') if options[:rt].kind_of?(Array)
|
43
|
+
|
44
|
+
response = get("/getvehicles", :query => options)['bustime_response']
|
45
|
+
check_for_errors response['error']
|
46
|
+
|
47
|
+
results = Array.wrap response['vehicle']
|
48
|
+
results.map { |result| Hashie::Mash.new result } unless results.nil?
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.routes(options={})
|
52
|
+
options.merge!({
|
53
|
+
:key => @@key
|
54
|
+
})
|
55
|
+
|
56
|
+
response = get("/getroutes", :query => options)['bustime_response']
|
57
|
+
check_for_errors response['error']
|
58
|
+
|
59
|
+
results = Array.wrap response['route']
|
60
|
+
Hash[ results.map { |result| [result['rt'], result['rtnm']] } ] unless results.nil?
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.directions(options={})
|
64
|
+
options.merge!({
|
65
|
+
:key => @@key
|
66
|
+
})
|
67
|
+
|
68
|
+
response = get("/getdirections", :query => options)['bustime_response']
|
69
|
+
check_for_errors response['error']
|
70
|
+
|
71
|
+
results = Array.wrap response['dir']
|
72
|
+
results.map { |direction| direction.split(/ /)[0].downcase.to_sym } unless results.nil?
|
73
|
+
end
|
74
|
+
|
75
|
+
def self.stops(options={})
|
76
|
+
options.merge!({
|
77
|
+
:key => @@key
|
78
|
+
})
|
79
|
+
options[:dir] = "#{options[:dir]} bound" if options[:dir].kind_of?(Symbol)
|
80
|
+
|
81
|
+
response = get("/getstops", :query => options)['bustime_response']
|
82
|
+
check_for_errors response['error']
|
83
|
+
|
84
|
+
results = Array.wrap response['stop']
|
85
|
+
results.map { |result| Hashie::Mash.new result } unless results.nil?
|
86
|
+
end
|
87
|
+
|
88
|
+
def self.patterns(options={})
|
89
|
+
options.merge!({
|
90
|
+
:key => @@key
|
91
|
+
})
|
92
|
+
options['pid'] = options['pid'].join(',') if options['pid'].kind_of?(Array)
|
93
|
+
|
94
|
+
response = get("/getpatterns", :query => options)['bustime_response']
|
95
|
+
check_for_errors response['error']
|
96
|
+
|
97
|
+
results = Array.wrap response['ptr']
|
98
|
+
results.map { |result| Hashie::Mash.new result } unless results.nil?
|
99
|
+
end
|
100
|
+
|
101
|
+
def self.predictions(options={})
|
102
|
+
options.merge!({
|
103
|
+
:key => @@key
|
104
|
+
})
|
105
|
+
options['stpid'] = options['stpid'].join(',') if options['stpid'].kind_of?(Array)
|
106
|
+
options['rt'] = options['rt'].join(',') if options['rt'].kind_of?(Array)
|
107
|
+
options['vid'] = options['vid'].join(',') if options['vid'].kind_of?(Array)
|
108
|
+
|
109
|
+
response = get("/getpredictions", :query => options)['bustime_response']
|
110
|
+
check_for_errors response['error']
|
111
|
+
|
112
|
+
results = Array.wrap response['prd']
|
113
|
+
results.map { |result| Hashie::Mash.new result } unless results.nil?
|
114
|
+
end
|
115
|
+
|
116
|
+
def self.bulletins(options={})
|
117
|
+
options.merge!({
|
118
|
+
:key => @@key
|
119
|
+
})
|
120
|
+
options['rt'] = options['rt'].join(',') if options['rt'].kind_of?(Array)
|
121
|
+
options['stpid'] = options['stpid'].join(',') if options['stpid'].kind_of?(Array)
|
122
|
+
|
123
|
+
response = get("/getservicebulletins", :query => options)['bustime_response']
|
124
|
+
check_for_errors response['error']
|
125
|
+
|
126
|
+
results = Array.wrap response['sb']
|
127
|
+
results.map { |result| Hashie::Mash.new result } unless results.nil?
|
128
|
+
end
|
129
|
+
|
130
|
+
def self.key
|
131
|
+
@@key
|
132
|
+
end
|
133
|
+
|
134
|
+
def self.key=(key)
|
135
|
+
@@key = key
|
136
|
+
end
|
137
|
+
|
138
|
+
private
|
139
|
+
|
140
|
+
def self.check_for_errors(error)
|
141
|
+
puts "API ERROR: #{error['msg']}" if error
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
class TrainTracker
|
146
|
+
include HTTParty
|
147
|
+
base_uri 'http://lapi.transitchicago.com/api/1.0'
|
148
|
+
format :xml
|
149
|
+
@@key = nil
|
150
|
+
|
151
|
+
def self.arrivals(options={})
|
152
|
+
options.merge!({
|
153
|
+
:key => @@key
|
154
|
+
})
|
155
|
+
|
156
|
+
response = get("/ttarrivals.aspx", :query => options)['ctatt']
|
157
|
+
check_for_errors response
|
158
|
+
|
159
|
+
results = Array.wrap response['eta']
|
160
|
+
results.map { |result| Hashie::Mash.new result } unless results.nil?
|
161
|
+
end
|
162
|
+
|
163
|
+
def self.stops
|
164
|
+
stops = stop_table.map { |stop| [stop['STOP_ID'], stop['STOP_NAME']] }.flatten
|
165
|
+
Hash[*stops]
|
166
|
+
end
|
167
|
+
|
168
|
+
def self.stations
|
169
|
+
stations = stop_table.map { |stop| [stop['PARENT_STOP_ID'], stop['STATION_DESCRIPTIVE_NAME']] }.flatten
|
170
|
+
Hash[*stations]
|
171
|
+
end
|
172
|
+
|
173
|
+
def self.stop_table
|
174
|
+
stop_data = []
|
175
|
+
CSV.read(File.dirname(__FILE__) + "/cta_L_stops.csv").each_with_index do |line, index|
|
176
|
+
index == 0 ? @headers = line : stop_data << Hash[ @headers.zip line ]
|
177
|
+
end
|
178
|
+
stop_data
|
179
|
+
end
|
180
|
+
|
181
|
+
def self.key
|
182
|
+
@@key
|
183
|
+
end
|
184
|
+
|
185
|
+
def self.key=(key)
|
186
|
+
@@key = key
|
187
|
+
end
|
188
|
+
|
189
|
+
private
|
5
190
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
require 'bus-tracker/vehicle'
|
10
|
-
require 'bus-tracker/point'
|
11
|
-
require 'bus-tracker/prediction'
|
12
|
-
require 'bus-tracker/service-bulletin'
|
13
|
-
require 'bus-tracker/service'
|
14
|
-
require 'train-tracker/train-tracker'
|
15
|
-
require 'train-tracker/estimate'
|
16
|
-
|
17
|
-
class String
|
18
|
-
def to_bool
|
19
|
-
return true if self == true || self =~ (/(true|t|yes|y|1)$/i)
|
20
|
-
return false if self == false || self =~ (/(false|f|no|n|0)$/i)
|
21
|
-
raise ArgumentError.new("invalid value for Boolean: \"#{self}\"")
|
191
|
+
def self.check_for_errors(error)
|
192
|
+
puts "API ERROR: #{error['errNm']}. Error code: #{error['errCd']}" if error['errCd'] != "0"
|
193
|
+
end
|
22
194
|
end
|
23
195
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cta-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -12,13 +12,13 @@ cert_chain: []
|
|
12
12
|
date: 2013-02-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
15
|
+
name: httparty
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
21
|
+
version: 0.10.2
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -26,7 +26,23 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - ! '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
29
|
+
version: 0.10.2
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: hashie
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 2.0.0
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 2.0.0
|
30
46
|
description: An easy way to access the Chicago Transit Authority API via the Ruby
|
31
47
|
programming language
|
32
48
|
email: frank.r.bonetti@gmail.com
|
@@ -34,27 +50,16 @@ executables: []
|
|
34
50
|
extensions: []
|
35
51
|
extra_rdoc_files: []
|
36
52
|
files:
|
37
|
-
- cta-api-1.0.
|
53
|
+
- cta-api-1.0.1.gem
|
38
54
|
- cta-api.gemspec
|
39
55
|
- Gemfile
|
40
|
-
- lib/bus-tracker/bus-tracker.rb
|
41
|
-
- lib/bus-tracker/pattern.rb
|
42
|
-
- lib/bus-tracker/point.rb
|
43
|
-
- lib/bus-tracker/prediction.rb
|
44
|
-
- lib/bus-tracker/service-bulletin.rb
|
45
|
-
- lib/bus-tracker/service.rb
|
46
|
-
- lib/bus-tracker/stop.rb
|
47
|
-
- lib/bus-tracker/vehicle.rb
|
48
|
-
- lib/cta-api/version.rb
|
49
56
|
- lib/cta-api.rb
|
50
57
|
- lib/cta_L_stops.csv
|
51
|
-
- lib/train-tracker/estimate.rb
|
52
|
-
- lib/train-tracker/train-tracker.rb
|
53
58
|
- LICENSE
|
54
59
|
- Rakefile
|
55
60
|
- README.md
|
56
61
|
- spec/spec_helper.rb
|
57
|
-
homepage:
|
62
|
+
homepage: https://github.com/fbonetti/cta-api
|
58
63
|
licenses:
|
59
64
|
- MIT
|
60
65
|
post_install_message:
|
@@ -1,208 +0,0 @@
|
|
1
|
-
module CTA
|
2
|
-
class BusTracker
|
3
|
-
|
4
|
-
def initialize(key)
|
5
|
-
@key = key
|
6
|
-
end
|
7
|
-
|
8
|
-
def time
|
9
|
-
base_url = "http://www.ctabustracker.com/bustime/api/v1/gettime?"
|
10
|
-
url = "#{ base_url}key=#{ @key }"
|
11
|
-
Time.parse(Nokogiri::XML(open(url)).at("//tm").text)
|
12
|
-
end
|
13
|
-
|
14
|
-
def vehicles_by_routes(routes)
|
15
|
-
if routes.kind_of?(Array)
|
16
|
-
full_array = []
|
17
|
-
until routes.size == 0
|
18
|
-
full_array << vehicles(route: routes.shift(10))
|
19
|
-
end
|
20
|
-
full_array.flatten!
|
21
|
-
else
|
22
|
-
raise ArgumentError.new "Argument must be an Array."
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def vehicles_by_ids(vids)
|
27
|
-
if vids.kind_of?(Array) && routes.size.between(1,10)
|
28
|
-
vehicles(vid: vids)
|
29
|
-
else
|
30
|
-
raise ArgumentError.new "must be an Array with 1 to 10 elements."
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def patterns_by_route(route)
|
35
|
-
if route.kind_of?(String) && route.length > 0
|
36
|
-
patterns(route: route)
|
37
|
-
else
|
38
|
-
raise ArgumentError.new "must be a String with a length greater than zero."
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def patterns_by_ids(pid)
|
43
|
-
if pid.kind_of?(Array) && pid.size.between?(1,10)
|
44
|
-
patterns(pid: pid)
|
45
|
-
else
|
46
|
-
raise ArgumentError.new "must be an Array with 1 to 10 elements."
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
def predictions_by_stop_ids(stop_id, route="")
|
51
|
-
if stop_id.kind_of?(Array) && stop_id.size.between?(1,10)
|
52
|
-
predictions(stop_id: stop_id, route: route)
|
53
|
-
else
|
54
|
-
raise ArgumentError.new "must be an Array with 1 to 10 elements."
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
def predictions_by_vehicle_ids(vid)
|
59
|
-
if vid.kind_of?(Array) && vid.size.between?(1,10)
|
60
|
-
predictions(vid: vid)
|
61
|
-
else
|
62
|
-
raise ArgumentError.new "must be an Array with 1 to 10 elements."
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
def routes
|
67
|
-
base_url = "http://www.ctabustracker.com/bustime/api/v1/getroutes?"
|
68
|
-
url = "#{ base_url }key=#{ @key }"
|
69
|
-
route_hash = {}
|
70
|
-
Nokogiri::XML(open(url)).xpath("//route").each do |route|
|
71
|
-
route_hash[route.at("rt").text] = route.at("rtnm").text
|
72
|
-
end
|
73
|
-
route_hash
|
74
|
-
end
|
75
|
-
|
76
|
-
def route_directions(route)
|
77
|
-
if route.kind_of?(String)
|
78
|
-
base_url = "http://www.ctabustracker.com/bustime/api/v1/getdirections?rt=#{ route }"
|
79
|
-
url = "#{ base_url }&key=#{ @key }"
|
80
|
-
Nokogiri::XML(open(url)).xpath("//dir").map { |x| x.text.split(/ /)[0].to_sym }
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
def stops(route, direction)
|
85
|
-
if (route.kind_of?(String) || route.kind_of?(Integer)) && direction.kind_of?(Symbol)
|
86
|
-
direction = direction.to_s + "+bound"
|
87
|
-
base_url = "http://www.ctabustracker.com/bustime/api/v1/getstops?"
|
88
|
-
url = "#{ base_url }key=#{ @key }&rt=#{ route }&dir=#{ direction }"
|
89
|
-
|
90
|
-
stop_array = Nokogiri::XML(open(url)).xpath("//stop").map do |item|
|
91
|
-
Stop.new({
|
92
|
-
:id => item.at("stpid").text,
|
93
|
-
:name => item.at("stpnm").text,
|
94
|
-
:latitude => item.at("lat").text,
|
95
|
-
:longitude => item.at("lon").text
|
96
|
-
})
|
97
|
-
end
|
98
|
-
stop_array
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
def service_bulletins(params)
|
103
|
-
route = params[:route] || []
|
104
|
-
route_direction = params[:route_direction]
|
105
|
-
stop_id = params[:stop_id] || []
|
106
|
-
|
107
|
-
base_url = "http://www.ctabustracker.com/bustime/api/v1/getservicebulletins?"
|
108
|
-
url = "#{ base_url }key=#{ @key }&rt=#{ route.join(',') }&rtdir=#{ route_direction }&stpid=#{ stop_id.join(',') }"
|
109
|
-
puts url
|
110
|
-
|
111
|
-
bulletin_array = Nokogiri::XML(open(url)).xpath("//sb").map do |item|
|
112
|
-
ServiceBulletin.new({
|
113
|
-
:name => item.at("nm") && item.at("nm").text,
|
114
|
-
:subject => item.at("sbj") && item.at("sbj").text,
|
115
|
-
:detail => item.at("dtl") && item.at("dtl").text.gsub("<br/>", "\n").strip,
|
116
|
-
:brief => item.at("brf") && item.at("brf").text,
|
117
|
-
:priority => item.at("prty") && item.at("prty").text,
|
118
|
-
:services => item.xpath("srvc") && item.xpath("srvc").map do |subitem|
|
119
|
-
ServiceBulletin::Service.new({
|
120
|
-
:route => subitem.at("rt") && subitem.at("rt").text,
|
121
|
-
:route_direction => subitem.at("rtdir") && subitem.at("rtdir").text,
|
122
|
-
:stop_id => subitem.at("stpid") && subitem.at("stpid").text,
|
123
|
-
:stop_name => subitem.at("stpnm") && subitem.at("stpnm").text
|
124
|
-
})
|
125
|
-
end
|
126
|
-
})
|
127
|
-
end
|
128
|
-
bulletin_array
|
129
|
-
end
|
130
|
-
|
131
|
-
private
|
132
|
-
|
133
|
-
def vehicles(params)
|
134
|
-
route = params[:route] || []
|
135
|
-
vid = params[:vid] || []
|
136
|
-
|
137
|
-
base_url = "http://www.ctabustracker.com/bustime/api/v1/getvehicles?"
|
138
|
-
url = "#{ base_url }key=#{ @key }&rt=#{ route.join(",") }&vid=#{ vid.join(",") }"
|
139
|
-
|
140
|
-
vehicle_array = Nokogiri::XML(open(url)).xpath("//vehicle").map do |item|
|
141
|
-
Vehicle.new({
|
142
|
-
:id => item.at("vid").text,
|
143
|
-
:timestamp => Time.parse(item.at("tmstmp").text),
|
144
|
-
:latitude => item.at("lat").text,
|
145
|
-
:longitude => item.at("lon").text,
|
146
|
-
:heading => item.at("hdg").text,
|
147
|
-
:pattern_id => item.at("pid").text,
|
148
|
-
:pattern_distance => item.at("pdist").text,
|
149
|
-
:destination => item.at("des").text,
|
150
|
-
:delay => item.at("dly") && item.at("dly").text.to_bool
|
151
|
-
})
|
152
|
-
end
|
153
|
-
vehicle_array
|
154
|
-
end
|
155
|
-
|
156
|
-
def patterns(params)
|
157
|
-
route = params[:route]
|
158
|
-
pid = params[:pid] || []
|
159
|
-
|
160
|
-
base_url = "http://www.ctabustracker.com/bustime/api/v1/getpatterns?"
|
161
|
-
url = "#{ base_url }key=#{ @key }&rt=#{ route }&pid=#{ pid.join(",") }"
|
162
|
-
|
163
|
-
pattern_array = Nokogiri::XML(open(url)).xpath("//ptr").map do |item|
|
164
|
-
Pattern.new({
|
165
|
-
:id => item.at("pid").text,
|
166
|
-
:length => item.at("ln").text.to_f,
|
167
|
-
:direction => item.at("rtdir").text,
|
168
|
-
:points => item.xpath("pt").map do |subitem|
|
169
|
-
Pattern::Point.new({
|
170
|
-
:sequence => subitem.at("seq").text,
|
171
|
-
:latitude => subitem.at("lat").text,
|
172
|
-
:longitude => subitem.at("lon").text,
|
173
|
-
:type => subitem.at("typ").text == "S" ? "stop" : "waypoint",
|
174
|
-
:id => subitem.at("stpid") && subitem.at("stpid").text,
|
175
|
-
:name => subitem.at("stpnm") && subitem.at("stpnm").text,
|
176
|
-
:distance => subitem.at("pdist") && subitem.at("pdist").text
|
177
|
-
})
|
178
|
-
end
|
179
|
-
})
|
180
|
-
end
|
181
|
-
pattern_array
|
182
|
-
end
|
183
|
-
|
184
|
-
def predictions(params)
|
185
|
-
stop_id = params[:stop_id] || []
|
186
|
-
route = params[:route] || []
|
187
|
-
vid = params[:vid] || []
|
188
|
-
|
189
|
-
base_url = "http://www.ctabustracker.com/bustime/api/v1/getpredictions?"
|
190
|
-
url = "#{ base_url }key=#{ @key }&stpid=#{ stop_id.join(',') }&rt=#{ route.join(',') }&vid=#{ vid.join(',') }"
|
191
|
-
|
192
|
-
prediction_array = Nokogiri::XML(open(url)).xpath("//prd").map do |item|
|
193
|
-
Prediction.new({
|
194
|
-
:timestamp => Time.parse(item.at("tmstmp").text),
|
195
|
-
:type => item.at("typ").text == "A" ? "arrival" : "departure",
|
196
|
-
:stop_name => item.at("stpnm").text,
|
197
|
-
:vehicle_id => item.at("vid").text,
|
198
|
-
:distance_from_stop => item.at("dstp").text.to_f,
|
199
|
-
:route => item.at("rt").text,
|
200
|
-
:route_direction => item.at("rtdir").text,
|
201
|
-
:destination => item.at("des").text,
|
202
|
-
:predicted_time => Time.parse(item.at("prdtm").text)
|
203
|
-
})
|
204
|
-
end
|
205
|
-
prediction_array
|
206
|
-
end
|
207
|
-
end
|
208
|
-
end
|
data/lib/bus-tracker/pattern.rb
DELETED
data/lib/bus-tracker/point.rb
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
module CTA
|
2
|
-
class BusTracker
|
3
|
-
class Pattern
|
4
|
-
class Point
|
5
|
-
attr_reader :sequence, :latitude, :longitude, :type, :id, :name, :distance
|
6
|
-
|
7
|
-
def initialize(params)
|
8
|
-
params.each do |key, value|
|
9
|
-
self.instance_variable_set("@#{ key }".to_sym, value)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
module CTA
|
2
|
-
class BusTracker
|
3
|
-
class Prediction
|
4
|
-
attr_reader :timestamp, :type, :stop_name, :stop_id, :vehicle_id, :distance_from_stop, :route, :route_direction, :destination, :predicted_time
|
5
|
-
|
6
|
-
def initialize(params)
|
7
|
-
params.each do |key, value|
|
8
|
-
self.instance_variable_set("@#{ key }".to_sym, value)
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
module CTA
|
2
|
-
class BusTracker
|
3
|
-
class ServiceBulletin
|
4
|
-
attr_reader :name, :subject, :detail, :brief, :priority, :services
|
5
|
-
|
6
|
-
def initialize(params)
|
7
|
-
params.each do |key, value|
|
8
|
-
self.instance_variable_set("@#{ key }".to_sym, value)
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
data/lib/bus-tracker/service.rb
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
module CTA
|
2
|
-
class BusTracker
|
3
|
-
class ServiceBulletin
|
4
|
-
class Service
|
5
|
-
attr_reader :route, :route_direction, :stop_id, :stop_name
|
6
|
-
|
7
|
-
def initialize(params)
|
8
|
-
params.each do |key, value|
|
9
|
-
self.instance_variable_set("@#{ key }".to_sym, value)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
data/lib/bus-tracker/stop.rb
DELETED
data/lib/bus-tracker/vehicle.rb
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
module CTA
|
2
|
-
class BusTracker
|
3
|
-
class Vehicle
|
4
|
-
attr_reader :id, :timestamp, :latitude, :longitude, :heading, :pattern_id, :pattern_distance, :destination, :delay
|
5
|
-
|
6
|
-
def initialize(params)
|
7
|
-
params.each do |key, value|
|
8
|
-
self.instance_variable_set("@#{ key }".to_sym, value)
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
data/lib/cta-api/version.rb
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
module CTA
|
2
|
-
class TrainTracker
|
3
|
-
class Estimate
|
4
|
-
attr_reader :station_id, :stop_id, :station_name, :stop_description, :run_number, :route, :destination_stop_id, :destination_name, :direction, :timestamp, :arrival_time, :approaching, :schedule, :fit, :delay
|
5
|
-
|
6
|
-
def initialize(params)
|
7
|
-
params.each do |key, value|
|
8
|
-
self.instance_variable_set("@#{ key }".to_sym, value)
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
@@ -1,56 +0,0 @@
|
|
1
|
-
module CTA
|
2
|
-
class TrainTracker
|
3
|
-
|
4
|
-
def initialize(key)
|
5
|
-
@key = key
|
6
|
-
@line_table = {
|
7
|
-
:red => "Red",
|
8
|
-
:blue => "Blue",
|
9
|
-
:brown => "Brn",
|
10
|
-
:orange => "Org",
|
11
|
-
:purple => "P",
|
12
|
-
:pink => "Pink",
|
13
|
-
:yellow => "Y"
|
14
|
-
}
|
15
|
-
end
|
16
|
-
|
17
|
-
def arrivals(params)
|
18
|
-
station_id = params[:station_id]
|
19
|
-
stop_id = params[:stop_id]
|
20
|
-
max = params[:max]
|
21
|
-
route = @line_table[params[:route]]
|
22
|
-
|
23
|
-
base_url = "http://lapi.transitchicago.com/api/1.0/ttarrivals.aspx?"
|
24
|
-
url = "#{ base_url }key=#{ @key }&mapid=#{ station_id }&stpid=#{ stop_id }&max=#{ max }&rt=#{ route }"
|
25
|
-
|
26
|
-
estimate_array = Nokogiri::XML(open(url)).xpath("//eta").map do |item|
|
27
|
-
Estimate.new({
|
28
|
-
:station_id => item.at("staId").text,
|
29
|
-
:stop_id => item.at("stpId").text,
|
30
|
-
:station_name => item.at("staNm").text,
|
31
|
-
:stop_description => item.at("stpDe").text,
|
32
|
-
:run_number => item.at("rn").text,
|
33
|
-
:route => @line_table.key(item.at("rt").text),
|
34
|
-
:destination_stop_id => item.at("destSt").text,
|
35
|
-
:destination_name => item.at("destNm").text,
|
36
|
-
:direction => item.at("trDr").text,
|
37
|
-
:timestamp => Time.parse(item.at("prdt").text),
|
38
|
-
:arrival_time => Time.parse(item.at("arrT").text),
|
39
|
-
:approaching => item.at("isApp").text.to_bool,
|
40
|
-
:schedule => item.at("isSch").text.to_bool,
|
41
|
-
:fit => item.at("isFlt").text.to_bool,
|
42
|
-
:delay => item.at("isDly").text.to_bool
|
43
|
-
})
|
44
|
-
end
|
45
|
-
estimate_array
|
46
|
-
end
|
47
|
-
|
48
|
-
def stops
|
49
|
-
CSV.read("lib/cta_L_stops.csv").map { |x| {x[0] => x[2]} }
|
50
|
-
end
|
51
|
-
|
52
|
-
def stations
|
53
|
-
CSV.read("lib/cta_L_stops.csv").map { |x| {x[7] => x[5]} }
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|