amtrak 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +2 -0
  3. data/.rubocop.yml +6 -0
  4. data/.travis.yml +5 -0
  5. data/Gemfile +3 -0
  6. data/README.markdown +3 -0
  7. data/Rakefile +23 -0
  8. data/amtrak.gemspec +29 -0
  9. data/lib/amtrak.rb +14 -0
  10. data/lib/amtrak/train_fetcher.rb +39 -0
  11. data/lib/amtrak/train_fetcher/main_page.rb +70 -0
  12. data/lib/amtrak/train_fetcher/train_page.rb +41 -0
  13. data/lib/amtrak/train_parser.rb +90 -0
  14. data/lib/amtrak/version.rb +6 -0
  15. data/spec/amtrak/train_fetcher/main_page_spec.rb +75 -0
  16. data/spec/amtrak/train_fetcher/train_page_spec.rb +37 -0
  17. data/spec/amtrak/train_fetcher_spec.rb +59 -0
  18. data/spec/amtrak/train_parser_spec.rb +230 -0
  19. data/spec/amtrak_spec.rb +243 -0
  20. data/spec/fixtures/html/pvd_to_bby.html +2401 -0
  21. data/spec/fixtures/vcr/Amtrak/_get/returns_a_list_of_train_times.yml +1469 -0
  22. data/spec/fixtures/vcr/Amtrak_TrainFetcher/_get/does_the_same_as_get.yml +1467 -0
  23. data/spec/fixtures/vcr/Amtrak_TrainFetcher/_get/given_a_valid_date_and_invalid_train_stations/does_not_include_various_classes_and_includes_an_error.yml +843 -0
  24. data/spec/fixtures/vcr/Amtrak_TrainFetcher/_get/given_a_valid_date_and_train_stations/includes_various_classes.yml +1467 -0
  25. data/spec/fixtures/vcr/Amtrak_TrainFetcher/_get/given_an_invalid_date_and_valid_train_stations/does_not_include_various_classes_and_includes_an_error.yml +838 -0
  26. data/spec/fixtures/vcr/Amtrak_TrainFetcher_MainPage/_session_id/pulls_the_session_id_from_the_cookies.yml +1082 -0
  27. data/spec/fixtures/vcr/Amtrak_TrainFetcher_MainPage/_total_pages/when_more_than_one_page_exists_on_the_website/returns_1.yml +1076 -0
  28. data/spec/fixtures/vcr/Amtrak_TrainFetcher_MainPage/_total_pages/when_more_than_one_page_exists_on_the_website/returns_2.yml +1074 -0
  29. data/spec/fixtures/vcr/Amtrak_TrainFetcher_MainPage/_total_pages/when_only_one_page_exists_on_the_website/returns_1.yml +1082 -0
  30. data/spec/fixtures/vcr/Amtrak_TrainFetcher_TrainPage/_get/when_it_works/includes_various_classes.yml +247 -0
  31. data/spec/spec_helper.rb +18 -0
  32. data/spec/support/vcr.rb +10 -0
  33. metadata +206 -0
@@ -0,0 +1,59 @@
1
+ require 'spec_helper'
2
+
3
+ describe Amtrak::TrainFetcher do
4
+ describe '.get', :vcr do
5
+ let(:output) do
6
+ described_class.get('pvd', 'bby', date: Date.parse('2014-11-27'))
7
+ end
8
+
9
+ it 'does the same as #get' do
10
+ expect(output.join).to include('route_num')
11
+ expect(output.join).to include('scheduled')
12
+ expect(output.join).to include('act_est')
13
+ end
14
+ end
15
+
16
+ describe '#get', :vcr do
17
+ describe 'given a valid date and train stations' do
18
+ subject do
19
+ described_class.new('pvd', 'bby', date: Date.parse('2014-11-27'))
20
+ end
21
+
22
+ let(:output) { subject.get }
23
+
24
+ it 'includes various classes' do
25
+ expect(output.join).to include('route_num')
26
+ expect(output.join).to include('scheduled')
27
+ expect(output.join).to include('act_est')
28
+ end
29
+ end
30
+
31
+ describe 'given an invalid date and valid train stations' do
32
+ subject do
33
+ described_class.new('pvd', 'bby', date: Date.parse('2014-11-6'))
34
+ end
35
+
36
+ let(:output) { subject.get }
37
+
38
+ it 'does not include various classes and includes an error' do
39
+ expect(output.join).to_not include('route_num')
40
+ expect(output.join).to_not include('scheduled')
41
+ expect(output.join).to_not include('act_est')
42
+ end
43
+ end
44
+
45
+ describe 'given a valid date and invalid train stations' do
46
+ subject do
47
+ described_class.new('askdf', 'bby', date: Date.parse('2014-11-27'))
48
+ end
49
+
50
+ let(:output) { subject.get }
51
+
52
+ it 'does not include various classes and includes an error' do
53
+ expect(output.join).to_not include('route_num')
54
+ expect(output.join).to_not include('scheduled')
55
+ expect(output.join).to_not include('act_est')
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,230 @@
1
+ require 'spec_helper'
2
+
3
+ describe Amtrak::TrainParser do
4
+ describe '#remove_parentheses' do
5
+ subject { described_class.new('') }
6
+ let(:output) { subject.remove_parentheses(message) }
7
+
8
+ context 'on a string with no surrounding parentheses' do
9
+ let(:message) { '3:30 pm' }
10
+ let(:expected) { '3:30 pm' }
11
+
12
+ it 'returns the statement' do
13
+ expect(output).to eq(expected)
14
+ end
15
+ end
16
+
17
+ context 'on a string with a leading parentheses' do
18
+ let(:message) { '(3:30 pm' }
19
+ let(:expected) { '(3:30 pm' }
20
+
21
+ it 'returns the statement' do
22
+ expect(output).to eq(expected)
23
+ end
24
+ end
25
+
26
+ context 'on a string with a trailing parentheses' do
27
+ let(:message) { '3:30 pm)' }
28
+ let(:expected) { '3:30 pm)' }
29
+
30
+ it 'returns the statement' do
31
+ expect(output).to eq(expected)
32
+ end
33
+ end
34
+
35
+ context 'on a string with surrounding parentheses' do
36
+ let(:message) { '(3:30 pm)' }
37
+ let(:expected) { '3:30 pm' }
38
+
39
+ it 'returns the statement without parentheses' do
40
+ expect(output).to eq(expected)
41
+ end
42
+ end
43
+ end
44
+
45
+ describe '#make_datetime' do
46
+ subject { described_class.new('') }
47
+ let(:output) { subject.make_datetime(date, time) }
48
+
49
+ context 'given no date' do
50
+ let(:date) { nil }
51
+ let(:time) { '3:30 pm' }
52
+
53
+ it 'returns nil' do
54
+ expect(output).to be_nil
55
+ end
56
+ end
57
+
58
+ context 'given no time' do
59
+ let(:date) { 'Wed Nov 19, 2014' }
60
+ let(:time) { nil }
61
+
62
+ it 'returns nil' do
63
+ expect(output).to be_nil
64
+ end
65
+ end
66
+
67
+ context 'given a string date and time' do
68
+ let(:date) { 'Wed Nov 19, 2014' }
69
+ let(:time) { '3:30 pm' }
70
+ let(:expected) { DateTime.new(2014, 11, 19, 15, 30) }
71
+
72
+ it 'returns a datetime' do
73
+ expect(output).to eq(expected)
74
+ end
75
+ end
76
+ end
77
+
78
+ describe '.parse' do
79
+ let(:parser) { double(Amtrak::TrainParser) }
80
+ it 'calls new and parse' do
81
+ expect(described_class).to receive(:new).with('') { parser }
82
+ expect(parser).to receive(:parse)
83
+ described_class.parse('')
84
+ end
85
+ end
86
+
87
+ describe '#parse' do
88
+ subject { described_class.new(document) }
89
+ let(:output) { subject.parse }
90
+ let(:document) do
91
+ File.read(File.join('spec', 'fixtures', 'html', 'pvd_to_bby.html'))
92
+ end
93
+
94
+ context 'without an error' do
95
+ it 'returns a list of train times' do
96
+ expect(output).to eq([
97
+ {
98
+ number: 174,
99
+ departure: {
100
+ scheduled_date: 'Wed Nov 19, 2014',
101
+ estimated_date: '',
102
+ scheduled_time: '5:30 pm',
103
+ estimated_time: '5:52 pm'
104
+ },
105
+ arrival: {
106
+ scheduled_date: 'Wed Nov 19, 2014',
107
+ estimated_date: 'Wed Nov 19, 2014',
108
+ scheduled_time: '6:25 pm',
109
+ estimated_time: '6:27 pm'
110
+ }
111
+ },
112
+ {
113
+ number: 2164,
114
+ departure: {
115
+ scheduled_date: 'Wed Nov 19, 2014',
116
+ estimated_date: '',
117
+ scheduled_time: '5:50 pm',
118
+ estimated_time: '6:45 pm'
119
+ },
120
+ arrival: {
121
+ scheduled_date: 'Wed Nov 19, 2014',
122
+ estimated_date: 'Wed Nov 19, 2014',
123
+ scheduled_time: '6:34 pm',
124
+ estimated_time: '7:14 pm'
125
+ }
126
+ },
127
+ {
128
+ number: 2166,
129
+ departure: {
130
+ scheduled_date: 'Wed Nov 19, 2014',
131
+ estimated_date: '',
132
+ scheduled_time: '6:54 pm',
133
+ estimated_time: ''
134
+ },
135
+ arrival: {
136
+ scheduled_date: 'Wed Nov 19, 2014',
137
+ estimated_date: 'Wed Nov 19, 2014',
138
+ scheduled_time: '7:35 pm',
139
+ estimated_time: '7:28 pm'
140
+ }
141
+ },
142
+ {
143
+ number: 176,
144
+ departure: {
145
+ scheduled_date: 'Wed Nov 19, 2014',
146
+ estimated_date: 'Wed Nov 19, 2014',
147
+ scheduled_time: '7:19 pm',
148
+ estimated_time: '7:22 pm'
149
+ },
150
+ arrival: {
151
+ scheduled_date: 'Wed Nov 19, 2014',
152
+ estimated_date: 'Wed Nov 19, 2014',
153
+ scheduled_time: '8:06 pm',
154
+ estimated_time: '7:51 pm'
155
+ }
156
+ },
157
+ {
158
+ number: 2168,
159
+ departure: {
160
+ scheduled_date: 'Wed Nov 19, 2014',
161
+ estimated_date: 'Wed Nov 19, 2014',
162
+ scheduled_time: '7:56 pm',
163
+ estimated_time: '7:57 pm'
164
+ },
165
+ arrival: {
166
+ scheduled_date: 'Wed Nov 19, 2014',
167
+ estimated_date: 'Wed Nov 19, 2014',
168
+ scheduled_time: '8:38 pm',
169
+ estimated_time: '8:34 pm'
170
+ }
171
+ },
172
+ {
173
+ number: 2170,
174
+ departure: {
175
+ scheduled_date: 'Wed Nov 19, 2014',
176
+ estimated_date: 'Wed Nov 19, 2014',
177
+ scheduled_time: '8:54 pm',
178
+ estimated_time: '8:55 pm'
179
+ },
180
+ arrival: {
181
+ scheduled_date: 'Wed Nov 19, 2014',
182
+ estimated_date: 'Wed Nov 19, 2014',
183
+ scheduled_time: '9:34 pm',
184
+ estimated_time: '9:32 pm'
185
+ }
186
+ },
187
+ {
188
+ number: 94,
189
+ departure: {
190
+ scheduled_date: 'Wed Nov 19, 2014',
191
+ estimated_date: 'Wed Nov 19, 2014',
192
+ scheduled_time: '9:16 pm',
193
+ estimated_time: '9:22 pm'
194
+ },
195
+ arrival: {
196
+ scheduled_date: 'Wed Nov 19, 2014',
197
+ estimated_date: 'Wed Nov 19, 2014',
198
+ scheduled_time: '10:02 pm',
199
+ estimated_time: '9:51 pm'
200
+ }
201
+ },
202
+ {
203
+ number: 2172,
204
+ departure: {
205
+ scheduled_date: 'Wed Nov 19, 2014',
206
+ estimated_date: 'Wed Nov 19, 2014',
207
+ scheduled_time: '9:54 pm',
208
+ estimated_time: '9:55 pm'
209
+ },
210
+ arrival: {
211
+ scheduled_date: 'Wed Nov 19, 2014',
212
+ estimated_date: 'Wed Nov 19, 2014',
213
+ scheduled_time: '10:35 pm',
214
+ estimated_time: '10:32 pm'
215
+ }
216
+ }
217
+ ])
218
+ end
219
+
220
+ context 'with an error' do
221
+ it 'raises a TrainParser::Error' do
222
+ expect(subject.document).to receive(:search) {
223
+ fail Nokogiri::SyntaxError
224
+ }
225
+ expect { output }.to raise_error(Amtrak::TrainParser::Error)
226
+ end
227
+ end
228
+ end
229
+ end
230
+ end
@@ -0,0 +1,243 @@
1
+ require 'spec_helper'
2
+
3
+ describe Amtrak do
4
+ context '.get' do
5
+ let(:from) { 'pvd' }
6
+ let(:to) { 'bby' }
7
+ let(:date) { Date.parse('Fri, Nov 28, 2014') }
8
+ let(:output) { described_class.get(from, to, date: date) }
9
+ let(:expected) do
10
+ [
11
+ {
12
+ number: 66,
13
+ departure: {
14
+ scheduled_date: 'Fri Nov 28, 2014',
15
+ estimated_date: 'Fri Nov 28, 2014',
16
+ scheduled_time: '6:56 am',
17
+ estimated_time: '6:57 am'
18
+ },
19
+ arrival: {
20
+ scheduled_date: 'Fri Nov 28, 2014',
21
+ estimated_date: 'Fri Nov 28, 2014',
22
+ scheduled_time: '7:53 am',
23
+ estimated_time: '8:25 am'
24
+ }
25
+ },
26
+ {
27
+ number: 2190,
28
+ departure: {
29
+ scheduled_date: 'Fri Nov 28, 2014',
30
+ estimated_date: 'Fri Nov 28, 2014',
31
+ scheduled_time: '9:18 am',
32
+ estimated_time: '9:28 am'
33
+ },
34
+ arrival: {
35
+ scheduled_date: 'Fri Nov 28, 2014',
36
+ estimated_date: 'Fri Nov 28, 2014',
37
+ scheduled_time: '9:59 am',
38
+ estimated_time: '10:00 am'
39
+ }
40
+ },
41
+ {
42
+ number: 190,
43
+ departure: {
44
+ scheduled_date: 'Fri Nov 28, 2014',
45
+ estimated_date: 'Fri Nov 28, 2014',
46
+ scheduled_time: '10:17 am',
47
+ estimated_time: '10:25 am'
48
+ },
49
+ arrival: {
50
+ scheduled_date: 'Fri Nov 28, 2014',
51
+ estimated_date: 'Fri Nov 28, 2014',
52
+ scheduled_time: '10:59 am',
53
+ estimated_time: '11:07 am'
54
+ }
55
+ },
56
+ {
57
+ number: 2192,
58
+ departure: {
59
+ scheduled_date: 'Fri Nov 28, 2014',
60
+ estimated_date: '',
61
+ scheduled_time: '10:56 am',
62
+ estimated_time: ''
63
+ },
64
+ arrival: {
65
+ scheduled_date: 'Fri Nov 28, 2014',
66
+ estimated_date: '',
67
+ scheduled_time: '11:34 am',
68
+ estimated_time: ''
69
+ }
70
+ },
71
+ {
72
+ number: 170,
73
+ departure: {
74
+ scheduled_date: 'Fri Nov 28, 2014',
75
+ estimated_date: 'Fri Nov 28, 2014',
76
+ scheduled_time: '11:58 am',
77
+ estimated_time: '12:44 pm'
78
+ },
79
+ arrival: {
80
+ scheduled_date: 'Fri Nov 28, 2014',
81
+ estimated_date: 'Fri Nov 28, 2014',
82
+ scheduled_time: '12:39 pm',
83
+ estimated_time: '1:14 pm'
84
+ }
85
+ },
86
+ {
87
+ number: 2154,
88
+ departure: {
89
+ scheduled_date: 'Fri Nov 28, 2014',
90
+ estimated_date: 'Fri Nov 28, 2014',
91
+ scheduled_time: '12:55 pm',
92
+ estimated_time: '1:03 pm'
93
+ },
94
+ arrival: {
95
+ scheduled_date: 'Fri Nov 28, 2014',
96
+ estimated_date: 'Fri Nov 28, 2014',
97
+ scheduled_time: '1:34 pm',
98
+ estimated_time: '1:34 pm'
99
+ }
100
+ },
101
+ {
102
+ number: 172,
103
+ departure: {
104
+ scheduled_date: 'Fri Nov 28, 2014',
105
+ estimated_date: 'Fri Nov 28, 2014',
106
+ scheduled_time: '2:23 pm',
107
+ estimated_time: '2:36 pm'
108
+ },
109
+ arrival: {
110
+ scheduled_date: 'Fri Nov 28, 2014',
111
+ estimated_date: 'Fri Nov 28, 2014',
112
+ scheduled_time: '3:09 pm',
113
+ estimated_time: '3:12 pm'
114
+ }
115
+ },
116
+ {
117
+ number: 2158,
118
+ departure: {
119
+ scheduled_date: 'Fri Nov 28, 2014',
120
+ estimated_date: 'Fri Nov 28, 2014',
121
+ scheduled_time: '2:54 pm',
122
+ estimated_time: '3:03 pm'
123
+ },
124
+ arrival: {
125
+ scheduled_date: 'Fri Nov 28, 2014',
126
+ estimated_date: 'Fri Nov 28, 2014',
127
+ scheduled_time: '3:36 pm',
128
+ estimated_time: '3:32 pm'
129
+ }
130
+ },
131
+ {
132
+ number: 86,
133
+ departure: {
134
+ scheduled_date: 'Fri Nov 28, 2014',
135
+ estimated_date: 'Fri Nov 28, 2014',
136
+ scheduled_time: '3:47 pm',
137
+ estimated_time: '3:47 pm'
138
+ },
139
+ arrival: {
140
+ scheduled_date: 'Fri Nov 28, 2014',
141
+ estimated_date: 'Fri Nov 28, 2014',
142
+ scheduled_time: '4:28 pm',
143
+ estimated_time: '4:20 pm'
144
+ }
145
+ },
146
+ {
147
+ number: 174,
148
+ departure: {
149
+ scheduled_date: 'Fri Nov 28, 2014',
150
+ estimated_date: 'Fri Nov 28, 2014',
151
+ scheduled_time: '5:30 pm',
152
+ estimated_time: '5:35 pm'
153
+ },
154
+ arrival: {
155
+ scheduled_date: 'Fri Nov 28, 2014',
156
+ estimated_date: 'Fri Nov 28, 2014',
157
+ scheduled_time: '6:25 pm',
158
+ estimated_time: '6:26 pm'
159
+ }
160
+ },
161
+ {
162
+ number: 2164,
163
+ departure: {
164
+ scheduled_date: 'Fri Nov 28, 2014',
165
+ estimated_date: 'Fri Nov 28, 2014',
166
+ scheduled_time: '5:50 pm',
167
+ estimated_time: '6:01 pm'
168
+ },
169
+ arrival: {
170
+ scheduled_date: 'Fri Nov 28, 2014',
171
+ estimated_date: 'Fri Nov 28, 2014',
172
+ scheduled_time: '6:34 pm',
173
+ estimated_time: '6:34 pm'
174
+ }
175
+ },
176
+ {
177
+ number: 176,
178
+ departure: {
179
+ scheduled_date: 'Fri Nov 28, 2014',
180
+ estimated_date: 'Fri Nov 28, 2014',
181
+ scheduled_time: '7:19 pm',
182
+ estimated_time: '7:20 pm'
183
+ },
184
+ arrival: {
185
+ scheduled_date: 'Fri Nov 28, 2014',
186
+ estimated_date: 'Fri Nov 28, 2014',
187
+ scheduled_time: '8:06 pm',
188
+ estimated_time: '7:52 pm'
189
+ }
190
+ },
191
+ {
192
+ number: 2168,
193
+ departure: {
194
+ scheduled_date: 'Fri Nov 28, 2014',
195
+ estimated_date: 'Fri Nov 28, 2014',
196
+ scheduled_time: '7:56 pm',
197
+ estimated_time: '8:00 pm'
198
+ },
199
+ arrival: {
200
+ scheduled_date: 'Fri Nov 28, 2014',
201
+ estimated_date: 'Fri Nov 28, 2014',
202
+ scheduled_time: '8:38 pm',
203
+ estimated_time: '8:44 pm'
204
+ }
205
+ },
206
+ {
207
+ number: 94,
208
+ departure: {
209
+ scheduled_date: 'Fri Nov 28, 2014',
210
+ estimated_date: 'Fri Nov 28, 2014',
211
+ scheduled_time: '9:16 pm',
212
+ estimated_time: '9:47 pm'
213
+ },
214
+ arrival: {
215
+ scheduled_date: 'Fri Nov 28, 2014',
216
+ estimated_date: 'Fri Nov 28, 2014',
217
+ scheduled_time: '10:02 pm',
218
+ estimated_time: '10:19 pm'
219
+ }
220
+ },
221
+ {
222
+ number: 2172,
223
+ departure: {
224
+ scheduled_date: 'Fri Nov 28, 2014',
225
+ estimated_date: 'Fri Nov 28, 2014',
226
+ scheduled_time: '9:54 pm',
227
+ estimated_time: '9:59 pm'
228
+ },
229
+ arrival: {
230
+ scheduled_date: 'Fri Nov 28, 2014',
231
+ estimated_date: 'Fri Nov 28, 2014',
232
+ scheduled_time: '10:35 pm',
233
+ estimated_time: '10:39 pm'
234
+ }
235
+ }
236
+ ]
237
+ end
238
+
239
+ it 'returns a list of train times', :vcr do
240
+ expect(output).to eq(expected)
241
+ end
242
+ end
243
+ end