amtrak 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.
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