next_train 0.0.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.
- checksums.yaml +7 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +74 -0
- data/LICENSE.txt +22 -0
- data/README.md +321 -0
- data/Rakefile +2 -0
- data/lib/next_train.rb +76 -0
- data/next_train.gemspec +29 -0
- data/spec/next_train_spec.rb +66 -0
- data/spec/spec_helper.rb +43 -0
- metadata +167 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e71f149f31604f0703404e2c752639c909be585a
|
4
|
+
data.tar.gz: 19ed2d88a0ba7bcd6cf3ed5869b5b730dfabb4cf
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 945b48ec270b02d314450ad3955622e614e56b89ae92c9f1325bd8265946211853f0529d315cdd98f1112ab0ec9418183b714fec64add5013f48ecef2f1d7d78
|
7
|
+
data.tar.gz: 49edf79f746b583972565796e0f9cfa000bca4eac3e28d82633a56768e646ea66ae0081446018dbefff7db5e08d4e1cdaa821e17a01a82327a9417763a85f649
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
next_train (0.0.1)
|
5
|
+
cta-api
|
6
|
+
time_diff
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: https://rubygems.org/
|
10
|
+
specs:
|
11
|
+
activesupport (4.2.0)
|
12
|
+
i18n (~> 0.7)
|
13
|
+
json (~> 1.7, >= 1.7.7)
|
14
|
+
minitest (~> 5.1)
|
15
|
+
thread_safe (~> 0.3, >= 0.3.4)
|
16
|
+
tzinfo (~> 1.1)
|
17
|
+
addressable (2.3.6)
|
18
|
+
coderay (1.1.0)
|
19
|
+
crack (0.4.2)
|
20
|
+
safe_yaml (~> 1.0.0)
|
21
|
+
cta-api (1.0.1)
|
22
|
+
hashie (>= 2.0.0)
|
23
|
+
httparty (>= 0.10.2)
|
24
|
+
diff-lcs (1.2.5)
|
25
|
+
hashie (3.3.2)
|
26
|
+
httparty (0.13.3)
|
27
|
+
json (~> 1.8)
|
28
|
+
multi_xml (>= 0.5.2)
|
29
|
+
i18n (0.7.0)
|
30
|
+
json (1.8.2)
|
31
|
+
method_source (0.8.2)
|
32
|
+
minitest (5.5.1)
|
33
|
+
multi_xml (0.5.5)
|
34
|
+
pry (0.10.0)
|
35
|
+
coderay (~> 1.1.0)
|
36
|
+
method_source (~> 0.8.1)
|
37
|
+
slop (~> 3.4)
|
38
|
+
rake (10.4.2)
|
39
|
+
rspec (3.1.0)
|
40
|
+
rspec-core (~> 3.1.0)
|
41
|
+
rspec-expectations (~> 3.1.0)
|
42
|
+
rspec-mocks (~> 3.1.0)
|
43
|
+
rspec-core (3.1.7)
|
44
|
+
rspec-support (~> 3.1.0)
|
45
|
+
rspec-expectations (3.1.2)
|
46
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
47
|
+
rspec-support (~> 3.1.0)
|
48
|
+
rspec-mocks (3.1.3)
|
49
|
+
rspec-support (~> 3.1.0)
|
50
|
+
rspec-support (3.1.2)
|
51
|
+
safe_yaml (1.0.4)
|
52
|
+
slop (3.6.0)
|
53
|
+
thread_safe (0.3.4)
|
54
|
+
time_diff (0.3.0)
|
55
|
+
activesupport
|
56
|
+
i18n
|
57
|
+
timecop (0.7.1)
|
58
|
+
tzinfo (1.2.2)
|
59
|
+
thread_safe (~> 0.1)
|
60
|
+
webmock (1.20.4)
|
61
|
+
addressable (>= 2.3.6)
|
62
|
+
crack (>= 0.3.2)
|
63
|
+
|
64
|
+
PLATFORMS
|
65
|
+
ruby
|
66
|
+
|
67
|
+
DEPENDENCIES
|
68
|
+
bundler
|
69
|
+
next_train!
|
70
|
+
pry
|
71
|
+
rake
|
72
|
+
rspec
|
73
|
+
timecop
|
74
|
+
webmock
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2015 Sandro Padin
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,321 @@
|
|
1
|
+
# Next Train
|
2
|
+
|
3
|
+
Find out when the next CTA train arrives.
|
4
|
+
|
5
|
+
### Example:
|
6
|
+
|
7
|
+
require "next_train"
|
8
|
+
|
9
|
+
api_key = "key-here" # Check resources below to sign up
|
10
|
+
stpid = 90032 # Racine Blue Line towards O'Hare
|
11
|
+
|
12
|
+
NextTrain.api_key = api_key
|
13
|
+
NextTrain[stpid] # => "2 minutes"
|
14
|
+
|
15
|
+
### Stops:
|
16
|
+
|
17
|
+
STPID STOP_NAME
|
18
|
+
30162 18th (54th/Cermak-bound)
|
19
|
+
30161 18th (Loop-bound)
|
20
|
+
30022 35th/Archer (Loop-bound)
|
21
|
+
30023 35th/Archer (Midway-bound)
|
22
|
+
30214 35-Bronzeville-IIT (63rd-bound)
|
23
|
+
30213 35-Bronzeville-IIT (Harlem-bound)
|
24
|
+
30246 43rd (63rd-bound)
|
25
|
+
30245 43rd (Harlem-bound)
|
26
|
+
30210 47th (63rd-bound) Elevated (63rd-bound)
|
27
|
+
30209 47th (SB) Elevated (Harlem-bound)
|
28
|
+
30238 47th-Dan Ryan (95th-bound)
|
29
|
+
30237 47th-Dan Ryan (Howard-bound)
|
30
|
+
30025 51st (63rd-bound)
|
31
|
+
30024 51st (Harlem-bound)
|
32
|
+
30113 54th/Cermak (Loop-bound)
|
33
|
+
30114 54th/Cermak (Terminal arrival)
|
34
|
+
30178 63rd-Dan Ryan (95th-bound)
|
35
|
+
30177 63rd-Dan Ryan (Howard-bound)
|
36
|
+
30192 69th (95th-bound)
|
37
|
+
30191 69th (Howard-bound)
|
38
|
+
30047 79th (95th-bound)
|
39
|
+
30046 79th (Howard-bound)
|
40
|
+
30276 87th (95th-bound)
|
41
|
+
30275 87th (Howard-bound)
|
42
|
+
30089 95th/Dan Ryan (95th-bound)
|
43
|
+
30088 95th/Dan Ryan (Howard-bound)
|
44
|
+
30132 Adams/Wabash (Inner Loop)
|
45
|
+
30131 Adams/Wabash (Outer Loop)
|
46
|
+
30240 Addison (O'Hare Branch) (Forest Pk-bound)
|
47
|
+
30239 Addison (O'Hare Branch) (O'Hare-bound)
|
48
|
+
30277 Addison (Kimball-bound)
|
49
|
+
30278 Addison (Loop-bound)
|
50
|
+
30274 Addison (95th-bound)
|
51
|
+
30273 Addison (Howard-bound)
|
52
|
+
30230 Argyle (95th-bound)
|
53
|
+
30229 Argyle (Howard-bound)
|
54
|
+
30127 Armitage (Kimball-Linden-bound)
|
55
|
+
30128 Armitage (Loop-bound)
|
56
|
+
30205 Ashland (Loop-bound)
|
57
|
+
30206 Ashland (Midway-bound)
|
58
|
+
30032 Ashland (Harlem-54th/Cermak-bound)
|
59
|
+
30033 Ashland (Loop-63rd-bound)
|
60
|
+
30056 Ashland/63rd (Harlem-bound)
|
61
|
+
30057 Ashland/63rd (Terminal arrival)
|
62
|
+
30002 Austin (Forest Pk-bound)
|
63
|
+
30001 Austin (O'Hare-bound)
|
64
|
+
30243 Austin (63rd-bound)
|
65
|
+
30244 Austin (Harlem-bound)
|
66
|
+
30013 Belmont (O'Hare Branch) (Forest Pk-bound)
|
67
|
+
30012 Belmont (O'Hare Branch) (O'Hare-bound)
|
68
|
+
30256 Belmont (95th-bound)
|
69
|
+
30255 Belmont (Howard-bound)
|
70
|
+
30257 Belmont (Kimball-Linden-bound)
|
71
|
+
30258 Belmont (Loop-bound)
|
72
|
+
30067 Berwyn (95th-bound)
|
73
|
+
30066 Berwyn (Howard-bound)
|
74
|
+
30268 Bryn Mawr (95th-bound)
|
75
|
+
30267 Bryn Mawr (Howard-bound)
|
76
|
+
30087 California (54th/Cermak-bound)
|
77
|
+
30086 California (Loop-bound)
|
78
|
+
30112 California/Milwaukee (Forest Pk-bound)
|
79
|
+
30265 California (63rd-bound)
|
80
|
+
30266 California (Harlem-bound)
|
81
|
+
30111 California/Milwaukee (O'Hare-bound)
|
82
|
+
30242 Central-Evanston (Howard-Loop-bound)
|
83
|
+
30241 Central-Evanston (Linden-bound)
|
84
|
+
30054 Central (63rd-bound)
|
85
|
+
30055 Central (Harlem-bound)
|
86
|
+
30152 Central Park (54th/Cermak-bound)
|
87
|
+
30151 Central Park (Loop-bound)
|
88
|
+
30194 Cermak-Chinatown (95th-bound)
|
89
|
+
30193 Cermak-Chinatown (Howard-bound)
|
90
|
+
30272 Chicago/Milwaukee (Forest Pk-bound)
|
91
|
+
30271 Chicago/Milwaukee (O'Hare-bound)
|
92
|
+
30137 Chicago/Franklin (Kimball-Linden-bound)
|
93
|
+
30138 Chicago/Franklin (Loop-bound)
|
94
|
+
30280 Chicago/State (95th-bound)
|
95
|
+
30279 Chicago/State (Howard-bound)
|
96
|
+
30083 Cicero (54th/Cermak-bound)
|
97
|
+
30082 Cicero (Loop-bound)
|
98
|
+
30188 Cicero (Forest Pk-bound)
|
99
|
+
30187 Cicero (O'Hare-bound)
|
100
|
+
30094 Cicero (63rd-bound)
|
101
|
+
30009 Cicero (Harlem-bound)
|
102
|
+
30122 Clark/Division (95th-bound)
|
103
|
+
30121 Clark/Division (Howard-bound)
|
104
|
+
30074 Clark/Lake (Inner Loop)
|
105
|
+
30075 Clark/Lake (Outer Loop)
|
106
|
+
30374 Clark/Lake (Forest Pk-bound)
|
107
|
+
30375 Clark/Lake (O'Hare-bound)
|
108
|
+
30085 Clinton (Forest Pk-bound)
|
109
|
+
30084 Clinton (O'Hare-bound)
|
110
|
+
30222 Clinton (Harlem-54th/Cermak-bound)
|
111
|
+
30221 Clinton (Loop-63rd-bound)
|
112
|
+
30291 Conservatory (63rd-bound)
|
113
|
+
30292 Conservatory (Harlem-bound)
|
114
|
+
30139 Cottage Grove (Terminal arrival)
|
115
|
+
30140 East 63rd-Cottage Grove (Harlem-bound)
|
116
|
+
30045 Cumberland (Forest Pk-bound)
|
117
|
+
30044 Cumberland (O'Hare-bound)
|
118
|
+
30041 Damen (54th/Cermak-bound)
|
119
|
+
30040 Damen (Loop-bound)
|
120
|
+
30116 Damen/Milwaukee (Forest Pk-bound)
|
121
|
+
30115 Damen/Milwaukee (O'Hare-bound)
|
122
|
+
30018 Damen (Kimball-bound)
|
123
|
+
30019 Damen (Loop-bound)
|
124
|
+
30011 Davis (Howard-Loop-bound)
|
125
|
+
30010 Davis (Linden-bound)
|
126
|
+
30134 Dempster (Howard-Loop-bound)
|
127
|
+
30133 Dempster (Linden-bound)
|
128
|
+
30103 Diversey (Kimball-Linden-bound)
|
129
|
+
30104 Diversey (Loop-bound)
|
130
|
+
30063 Division/Milwaukee (Forest Pk-bound)
|
131
|
+
30062 Division/Milwaukee (O'Hare-bound)
|
132
|
+
30076 Forest Park (O'Hare-bound)
|
133
|
+
30077 Forest Park (Terminal Arrival)
|
134
|
+
30102 Foster (Howard-Loop-bound)
|
135
|
+
30101 Foster (Linden-bound)
|
136
|
+
30167 Francisco (Kimball-bound)
|
137
|
+
30168 Francisco (Loop-bound)
|
138
|
+
30234 Fullerton (95th-bound)
|
139
|
+
30233 Fullerton (Howard-bound)
|
140
|
+
30235 Fullerton (Kimball-Linden-bound)
|
141
|
+
30236 Fullerton (Loop-bound)
|
142
|
+
30100 Garfield (63rd-bound)
|
143
|
+
30099 Garfield (Harlem-bound)
|
144
|
+
30224 Garfield-Dan Ryan (95th-bound)
|
145
|
+
30223 Garfield-Dan Ryan (Howard-bound)
|
146
|
+
30096 Grand/Milwaukee (Forest Pk-bound)
|
147
|
+
30095 Grand/Milwaukee (O'Hare-bound)
|
148
|
+
30065 Grand/State (95th-bound)
|
149
|
+
30064 Grand/State (Howard-bound)
|
150
|
+
30148 Granville (95th-bound)
|
151
|
+
30147 Granville (Howard-bound)
|
152
|
+
30215 Halsted (Loop-bound)
|
153
|
+
30216 Halsted (Midway-bound)
|
154
|
+
30184 Halsted/63rd (Ashland-bound)
|
155
|
+
30183 Halsted/63rd (Harlem-bound)
|
156
|
+
30190 Harlem (Forest Pk-bound)
|
157
|
+
30189 Harlem (O'Hare-bound)
|
158
|
+
30146 Harlem (O'Hare Branch) (Forest Pk-bound)
|
159
|
+
30145 Harlem (O'Hare Branch) (O'Hare-bound)
|
160
|
+
30004 Harlem (Terminal arrival)
|
161
|
+
30003 Harlem (63rd-bound)
|
162
|
+
30166 Library (Inner Loop)
|
163
|
+
30165 Library (Outer Loop)
|
164
|
+
30286 Harrison (95th-bound)
|
165
|
+
30285 Harrison (Howard-bound)
|
166
|
+
30175 Howard (NB) (Linden, Skokie-bound)
|
167
|
+
30176 Howard (Terminal arrival)
|
168
|
+
30173 Howard (Terminal arrival)
|
169
|
+
30174 Howard (95th-Bound)
|
170
|
+
30158 Illinois Medical District (Forest Pk-bound)
|
171
|
+
30157 Illinois Medical District (O'Hare-bound)
|
172
|
+
30059 Indiana (63rd-bound)
|
173
|
+
30058 Indiana (Harlem-bound)
|
174
|
+
30108 Irving Park (O'Hare Branch) (Forest Pk-bound)
|
175
|
+
30107 Irving Park (O'Hare Branch) (O'Hare-bound)
|
176
|
+
30281 Irving Park (Kimball-bound)
|
177
|
+
30282 Irving Park (Loop-bound)
|
178
|
+
30015 Jackson/Dearborn (Forest Pk-bound)
|
179
|
+
30014 Jackson/Dearborn (O'Hare-bound)
|
180
|
+
30110 Jackson/State (95th-bound)
|
181
|
+
30109 Jackson/State (Howard-bound)
|
182
|
+
30228 Jarvis (95th-bound)
|
183
|
+
30227 Jarvis (Howard-bound)
|
184
|
+
30248 Jefferson Park (Forest Pk-bound)
|
185
|
+
30247 Jefferson Park (O'Hare-bound)
|
186
|
+
30219 Kedzie (Loop-bound)
|
187
|
+
30220 Kedzie (Midway-bound)
|
188
|
+
30202 Kedzie (54th/Cermak-bound)
|
189
|
+
30201 Kedzie (Loop-bound)
|
190
|
+
30225 Kedzie (Kimball-bound)
|
191
|
+
30226 Kedzie (Loop-bound)
|
192
|
+
30207 Kedzie (63rd-bound)
|
193
|
+
30208 Kedzie (Harlem-bound)
|
194
|
+
30049 Kedzie-Homan (Forest Pk-bound)
|
195
|
+
30048 Kedzie-Homan (O'Hare-bound)
|
196
|
+
30250 Kimball (Loop-bound)
|
197
|
+
30249 Kimball (Terminal arrival)
|
198
|
+
30217 King Drive (Cottage Grove-bound)
|
199
|
+
30218 King Drive (Harlem-bound)
|
200
|
+
30118 Kostner (54th/Cermak-bound)
|
201
|
+
30117 Kostner (Loop-bound)
|
202
|
+
30290 Lake/State (95th-bound)
|
203
|
+
30289 Lake/State (Howard-bound)
|
204
|
+
30135 Laramie (63rd-bound)
|
205
|
+
30136 Laramie (Harlem-bound)
|
206
|
+
30262 LaSalle (Forest Pk-bound)
|
207
|
+
30261 LaSalle (O'Hare-bound)
|
208
|
+
30031 LaSalle/Van Buren (Inner Loop)
|
209
|
+
30030 LaSalle/Van Buren (Outer Loop)
|
210
|
+
30150 Lawrence (95th-bound)
|
211
|
+
30149 Lawrence (Howard-bound)
|
212
|
+
30204 Linden (Howard-Loop-bound)
|
213
|
+
30203 Linden (Linden-bound)
|
214
|
+
30198 Logan Square (Forest Pk-bound)
|
215
|
+
30197 Logan Square (O'Hare-bound)
|
216
|
+
30252 Loyola (95th-bound)
|
217
|
+
30251 Loyola (Howard-bound)
|
218
|
+
30124 Madison/Wabash (Inner Loop)
|
219
|
+
30123 Madison/Wabash (Outer Loop)
|
220
|
+
30053 Main (Howard-Loop-bound)
|
221
|
+
30052 Main (Linden-bound)
|
222
|
+
30090 Merchandise Mart (Kimball-Linden-bound)
|
223
|
+
30091 Merchandise Mart (Loop-bound)
|
224
|
+
30182 Midway (Arrival)
|
225
|
+
30181 Midway (Loop-bound)
|
226
|
+
30154 Monroe/Dearborn (Forest Pk-bound)
|
227
|
+
30153 Monroe/Dearborn (O'Hare-bound)
|
228
|
+
30212 Monroe/State (95th-bound)
|
229
|
+
30211 Monroe/State (Howard-bound)
|
230
|
+
30260 Montrose (Forest Pk-bound)
|
231
|
+
30259 Montrose (O'Hare-bound)
|
232
|
+
30287 Montrose (Kimball-bound)
|
233
|
+
30288 Montrose (Loop-bound)
|
234
|
+
30296 Morgan (Harlem-54th/Cermak-bound)
|
235
|
+
30295 Morgan (Loop-63rd-bound)
|
236
|
+
30021 Morse (95th-bound)
|
237
|
+
30020 Morse (Howard-bound)
|
238
|
+
30126 North/Clybourn (95th-bound)
|
239
|
+
30125 North/Clybourn (Howard-bound)
|
240
|
+
30079 Noyes (Howard-Loop-bound)
|
241
|
+
30078 Noyes (Linden-bound)
|
242
|
+
30035 Oak Park (Forest Pk-bound)
|
243
|
+
30034 Oak Park (O'Hare-bound)
|
244
|
+
30263 Oak Park (63rd-bound)
|
245
|
+
30264 Oak Park (Harlem-bound)
|
246
|
+
30297 Oakton (Dempster-Skokie-bound)
|
247
|
+
30298 Oakton (Howard-bound)
|
248
|
+
30172 O'Hare Airport (Forest Pk-bound)
|
249
|
+
30171 O'Hare Airport (Terminal Arrival)
|
250
|
+
30253 Paulina (Kimball-bound)
|
251
|
+
30254 Paulina (Loop-bound)
|
252
|
+
30200 Polk (54th/Cermak-bound)
|
253
|
+
30199 Polk (Loop-bound)
|
254
|
+
30185 Pulaski (Loop-bound)
|
255
|
+
30186 Pulaski (Midway-bound)
|
256
|
+
30029 Pulaski (54th/Cermak-bound)
|
257
|
+
30028 Pulaski (Loop-bound)
|
258
|
+
30180 Pulaski (Forest Pk-bound)
|
259
|
+
30179 Pulaski (O'Hare-bound)
|
260
|
+
30005 Pulaski (63rd-bound)
|
261
|
+
30006 Pulaski (Harlem-bound)
|
262
|
+
30007 Quincy/Wells (Inner Loop)
|
263
|
+
30008 Quincy/Wells (Outer Loop)
|
264
|
+
30093 Racine (Forest Pk-bound)
|
265
|
+
30092 Racine (O'Hare-bound)
|
266
|
+
30039 Randolph/Wabash (Inner Loop)
|
267
|
+
30038 Randolph/Wabash (Outer Loop)
|
268
|
+
30119 Ridgeland (63rd-bound)
|
269
|
+
30120 Ridgeland (Harlem-bound)
|
270
|
+
30195 Rockwell (Kimball-bound)
|
271
|
+
30196 Rockwell (Loop-bound)
|
272
|
+
30080 Roosevelt/Wabash (Loop-Harlem-bound)
|
273
|
+
30081 Roosevelt/Wabash (Midway-63rd-bound)
|
274
|
+
30269 Roosevelt/State (Howard-bound)
|
275
|
+
30270 Roosevelt/State (Howard-bound)
|
276
|
+
30160 Rosemont (Forest Pk-bound)
|
277
|
+
30159 Rosemont (O'Hare-bound)
|
278
|
+
30155 Sedgwick (Kimball-Linden-bound)
|
279
|
+
30156 Sedgwick (Loop-bound)
|
280
|
+
30017 Sheridan (95th-bound)
|
281
|
+
30016 Sheridan (Howard-bound)
|
282
|
+
30293 Sheridan (Howard-Linden-bound)
|
283
|
+
30294 Sheridan (Loop-bound)
|
284
|
+
30026 Skokie (Arrival)
|
285
|
+
30027 Skokie (Howard-bound)
|
286
|
+
30164 South Blvd (Howard-Loop-bound)
|
287
|
+
30163 South Blvd (Linden-bound)
|
288
|
+
30070 Southport (Kimball-bound)
|
289
|
+
30071 Southport (Loop-bound)
|
290
|
+
30037 Sox-35th (95th-bound)
|
291
|
+
30036 Sox-35th (Howard-bound)
|
292
|
+
30050 State/Lake (Inner Loop)
|
293
|
+
30051 State/Lake (Outer Loop)
|
294
|
+
30170 Thorndale (95th-bound)
|
295
|
+
30169 Thorndale (Howard-bound)
|
296
|
+
30069 UIC-Halsted (Forest Pk-bound)
|
297
|
+
30068 UIC-Halsted (O'Hare-bound)
|
298
|
+
30073 Washington/Dearborn (Forest Pk-bound)
|
299
|
+
30072 Washington/Dearborn (O'Hare-bound)
|
300
|
+
30141 Washington/Wells (Inner Loop)
|
301
|
+
30142 Washington/Wells (Outer Loop)
|
302
|
+
30231 Wellington (Kimball-Linden-bound)
|
303
|
+
30232 Wellington (Loop-bound)
|
304
|
+
30060 Western (Loop-bound)
|
305
|
+
30061 Western (Midway-bound)
|
306
|
+
30144 Western (54th/Cermak-bound)
|
307
|
+
30143 Western (Loop-bound)
|
308
|
+
30043 Western (Forest Pk-bound)
|
309
|
+
30042 Western (O'Hare-bound)
|
310
|
+
30130 Western/Milwaukee (Forest Pk-bound)
|
311
|
+
30129 Western/Milwaukee (O'Hare-bound)
|
312
|
+
30283 Western (Kimball-bound)
|
313
|
+
30284 Western (Loop-bound)
|
314
|
+
30106 Wilson (95th-bound)
|
315
|
+
30105 Wilson (Howard-bound)
|
316
|
+
|
317
|
+
### Resources:
|
318
|
+
|
319
|
+
* [CTA Train Tracker API Key Application](http://www.transitchicago.com/developers/traintrackerapply.aspx)
|
320
|
+
|
321
|
+
|
data/Rakefile
ADDED
data/lib/next_train.rb
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
require "cta-api"
|
2
|
+
require "time_diff"
|
3
|
+
|
4
|
+
class NextTrain
|
5
|
+
def self.[](stpid)
|
6
|
+
new(stpid).execute
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.api_key= (api_key)
|
10
|
+
CTA::TrainTracker.key = api_key
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize(stpid)
|
14
|
+
@stpid = stpid
|
15
|
+
end
|
16
|
+
|
17
|
+
def execute
|
18
|
+
if minutes_until_next_arrival == 0
|
19
|
+
"arriving"
|
20
|
+
else
|
21
|
+
arrival_time_in_minutes
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
attr_reader :stpid
|
28
|
+
|
29
|
+
def arrival_time_in_minutes
|
30
|
+
time_until_next_arrival_diff[:diff]
|
31
|
+
end
|
32
|
+
|
33
|
+
def minutes_until_next_arrival
|
34
|
+
time_until_next_arrival_diff[:minute]
|
35
|
+
end
|
36
|
+
|
37
|
+
def time_until_next_arrival_diff
|
38
|
+
Time.diff(next_arrival_time, Time.now, "%N")
|
39
|
+
end
|
40
|
+
|
41
|
+
def next_arrival_time
|
42
|
+
Time.parse(next_arrival[arrival_time_key])
|
43
|
+
end
|
44
|
+
|
45
|
+
def arrival_time_key
|
46
|
+
"arrT"
|
47
|
+
end
|
48
|
+
|
49
|
+
def next_arrival
|
50
|
+
arrivals[0]
|
51
|
+
end
|
52
|
+
|
53
|
+
def arrivals
|
54
|
+
ensure_no_puts do
|
55
|
+
data = CTA::TrainTracker.arrivals(stpid: stpid)
|
56
|
+
|
57
|
+
if data.empty?
|
58
|
+
raise "No data returned, please check your API key"
|
59
|
+
else
|
60
|
+
data
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def error?(data)
|
66
|
+
data["errCd"] && data["errCd"] != "0"
|
67
|
+
end
|
68
|
+
|
69
|
+
def ensure_no_puts(&block)
|
70
|
+
tmp = $stdout
|
71
|
+
$stdout = StringIO.new
|
72
|
+
block.call
|
73
|
+
ensure
|
74
|
+
$stdout = tmp
|
75
|
+
end
|
76
|
+
end
|
data/next_train.gemspec
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "next_train"
|
7
|
+
spec.version = "0.0.1"
|
8
|
+
spec.authors = ["Sandro Padin"]
|
9
|
+
spec.email = ["sandropadin@gmail.com"]
|
10
|
+
spec.summary = %q{Find out when the next CTA train arrives.}
|
11
|
+
spec.description = %q{Find out when the next CTA train arrives.}
|
12
|
+
spec.homepage = "https://github.com/spadin/next-train"
|
13
|
+
spec.license = "MIT"
|
14
|
+
|
15
|
+
spec.files = `git ls-files -z`.split("\x0")
|
16
|
+
# spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
|
+
spec.require_paths = ["lib"]
|
19
|
+
|
20
|
+
spec.add_dependency "cta-api"
|
21
|
+
spec.add_dependency "time_diff"
|
22
|
+
|
23
|
+
spec.add_development_dependency "bundler"
|
24
|
+
spec.add_development_dependency "rake"
|
25
|
+
spec.add_development_dependency "rspec"
|
26
|
+
spec.add_development_dependency "pry"
|
27
|
+
spec.add_development_dependency "timecop"
|
28
|
+
spec.add_development_dependency "webmock"
|
29
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "next_train"
|
3
|
+
|
4
|
+
describe NextTrain do
|
5
|
+
let(:api_key) { 'test-api-key' }
|
6
|
+
let(:stpid) { 30092 }
|
7
|
+
let(:base_time) { "20150201 21:00:00" }
|
8
|
+
let(:two_minutes_from_base_time) { "20150201 21:02:00" }
|
9
|
+
|
10
|
+
it "returns 2 minutes when train is two minutes away" do
|
11
|
+
stub_cta_train_request(
|
12
|
+
api_key: api_key,
|
13
|
+
stpid: stpid,
|
14
|
+
response: arrival_response(two_minutes_from_base_time)
|
15
|
+
)
|
16
|
+
|
17
|
+
with_time(base_time) do
|
18
|
+
described_class.api_key = api_key
|
19
|
+
expect(described_class[stpid]).to eq("2 minutes")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
it "returns arriving when train is 0 minutes away" do
|
24
|
+
stub_cta_train_request(
|
25
|
+
api_key: api_key,
|
26
|
+
stpid: stpid,
|
27
|
+
response: arrival_response(base_time)
|
28
|
+
)
|
29
|
+
|
30
|
+
with_time(base_time) do
|
31
|
+
described_class.api_key = api_key
|
32
|
+
expect(described_class[stpid]).to eq("arriving")
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
it "returns invalid api_key message when api_key is nil" do
|
37
|
+
stub_cta_train_request(
|
38
|
+
api_key: nil,
|
39
|
+
stpid: stpid,
|
40
|
+
response: error_response
|
41
|
+
)
|
42
|
+
|
43
|
+
with_time(base_time) do
|
44
|
+
described_class.api_key = nil
|
45
|
+
expect { described_class[stpid]}.to raise_error("No data returned, please check your API key")
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
it "supresses output from CTA::TrainTracker gem" do
|
50
|
+
stub_cta_train_request(
|
51
|
+
api_key: nil,
|
52
|
+
stpid: stpid,
|
53
|
+
response: error_response
|
54
|
+
)
|
55
|
+
|
56
|
+
with_time(base_time) do
|
57
|
+
described_class.api_key = nil
|
58
|
+
|
59
|
+
out = capture_output do
|
60
|
+
expect { described_class[stpid]}.to raise_error
|
61
|
+
end
|
62
|
+
|
63
|
+
expect(out.string).to be_blank
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
require "timecop"
|
2
|
+
require "rspec"
|
3
|
+
require 'webmock/rspec'
|
4
|
+
|
5
|
+
def with_time(time , &block)
|
6
|
+
Timecop.freeze(time) do
|
7
|
+
block.call
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def arrival_response(arrival_time)
|
12
|
+
<<-RESPONSE
|
13
|
+
<ctatt>
|
14
|
+
<errCd>0</errCd>
|
15
|
+
<eta>
|
16
|
+
<arrT>#{arrival_time}</arrT>
|
17
|
+
</eta>
|
18
|
+
</ctatt>
|
19
|
+
RESPONSE
|
20
|
+
end
|
21
|
+
|
22
|
+
def error_response
|
23
|
+
<<-RESPONSE
|
24
|
+
<ctatt>
|
25
|
+
<errCd>101</errCd>
|
26
|
+
<errNm>Invalid API key</errNm>
|
27
|
+
</ctatt>
|
28
|
+
RESPONSE
|
29
|
+
end
|
30
|
+
|
31
|
+
def stub_cta_train_request(api_key:, stpid:, response:)
|
32
|
+
request_url = "http://lapi.transitchicago.com/api/1.0/ttarrivals.aspx?key=#{api_key}&stpid=#{stpid}"
|
33
|
+
stub_request(:get, request_url).to_return(body: response)
|
34
|
+
end
|
35
|
+
|
36
|
+
def capture_output
|
37
|
+
out = StringIO.new
|
38
|
+
$stdout = out
|
39
|
+
yield
|
40
|
+
return out
|
41
|
+
ensure
|
42
|
+
$stdout = STDOUT
|
43
|
+
end
|
metadata
ADDED
@@ -0,0 +1,167 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: next_train
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Sandro Padin
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-02-02 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: cta-api
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: time_diff
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bundler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: pry
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: timecop
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: webmock
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
description: Find out when the next CTA train arrives.
|
126
|
+
email:
|
127
|
+
- sandropadin@gmail.com
|
128
|
+
executables: []
|
129
|
+
extensions: []
|
130
|
+
extra_rdoc_files: []
|
131
|
+
files:
|
132
|
+
- Gemfile
|
133
|
+
- Gemfile.lock
|
134
|
+
- LICENSE.txt
|
135
|
+
- README.md
|
136
|
+
- Rakefile
|
137
|
+
- lib/next_train.rb
|
138
|
+
- next_train.gemspec
|
139
|
+
- spec/next_train_spec.rb
|
140
|
+
- spec/spec_helper.rb
|
141
|
+
homepage: https://github.com/spadin/next-train
|
142
|
+
licenses:
|
143
|
+
- MIT
|
144
|
+
metadata: {}
|
145
|
+
post_install_message:
|
146
|
+
rdoc_options: []
|
147
|
+
require_paths:
|
148
|
+
- lib
|
149
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
150
|
+
requirements:
|
151
|
+
- - ">="
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
version: '0'
|
154
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
155
|
+
requirements:
|
156
|
+
- - ">="
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
version: '0'
|
159
|
+
requirements: []
|
160
|
+
rubyforge_project:
|
161
|
+
rubygems_version: 2.4.5
|
162
|
+
signing_key:
|
163
|
+
specification_version: 4
|
164
|
+
summary: Find out when the next CTA train arrives.
|
165
|
+
test_files:
|
166
|
+
- spec/next_train_spec.rb
|
167
|
+
- spec/spec_helper.rb
|