rail_feeds 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (87) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +23 -0
  3. data/.rspec +3 -0
  4. data/.rubocop.yml +31 -0
  5. data/.travis.yml +26 -0
  6. data/CHANGELOG.md +3 -0
  7. data/Gemfile +6 -0
  8. data/Guardfile +25 -0
  9. data/LICENSE.md +32 -0
  10. data/README.md +77 -0
  11. data/Rakefile +3 -0
  12. data/doc/guides/Logging.md +13 -0
  13. data/doc/guides/Network Rail/CORPUS.md +34 -0
  14. data/doc/guides/Network Rail/SMART.md +39 -0
  15. data/doc/guides/Network Rail/Schedule.md +138 -0
  16. data/file +0 -0
  17. data/lib/rail_feeds/credentials.rb +45 -0
  18. data/lib/rail_feeds/logging.rb +51 -0
  19. data/lib/rail_feeds/network_rail/corpus.rb +77 -0
  20. data/lib/rail_feeds/network_rail/credentials.rb +22 -0
  21. data/lib/rail_feeds/network_rail/http_client.rb +57 -0
  22. data/lib/rail_feeds/network_rail/schedule/association.rb +208 -0
  23. data/lib/rail_feeds/network_rail/schedule/data.rb +215 -0
  24. data/lib/rail_feeds/network_rail/schedule/days.rb +95 -0
  25. data/lib/rail_feeds/network_rail/schedule/fetcher.rb +193 -0
  26. data/lib/rail_feeds/network_rail/schedule/header/cif.rb +102 -0
  27. data/lib/rail_feeds/network_rail/schedule/header/json.rb +79 -0
  28. data/lib/rail_feeds/network_rail/schedule/header.rb +22 -0
  29. data/lib/rail_feeds/network_rail/schedule/parser/cif.rb +141 -0
  30. data/lib/rail_feeds/network_rail/schedule/parser/json.rb +87 -0
  31. data/lib/rail_feeds/network_rail/schedule/parser.rb +108 -0
  32. data/lib/rail_feeds/network_rail/schedule/stp_indicator.rb +72 -0
  33. data/lib/rail_feeds/network_rail/schedule/tiploc.rb +100 -0
  34. data/lib/rail_feeds/network_rail/schedule/train_schedule/change_en_route.rb +158 -0
  35. data/lib/rail_feeds/network_rail/schedule/train_schedule/location/intermediate.rb +119 -0
  36. data/lib/rail_feeds/network_rail/schedule/train_schedule/location/origin.rb +91 -0
  37. data/lib/rail_feeds/network_rail/schedule/train_schedule/location/terminating.rb +72 -0
  38. data/lib/rail_feeds/network_rail/schedule/train_schedule/location.rb +76 -0
  39. data/lib/rail_feeds/network_rail/schedule/train_schedule.rb +392 -0
  40. data/lib/rail_feeds/network_rail/schedule.rb +33 -0
  41. data/lib/rail_feeds/network_rail/smart.rb +186 -0
  42. data/lib/rail_feeds/network_rail/stomp_client.rb +77 -0
  43. data/lib/rail_feeds/network_rail.rb +16 -0
  44. data/lib/rail_feeds/version.rb +14 -0
  45. data/lib/rail_feeds.rb +10 -0
  46. data/rail_feeds.gemspec +32 -0
  47. data/spec/fixtures/network_rail/schedule/data/full.yaml +60 -0
  48. data/spec/fixtures/network_rail/schedule/data/starting.yaml +131 -0
  49. data/spec/fixtures/network_rail/schedule/data/update-gap.yaml +10 -0
  50. data/spec/fixtures/network_rail/schedule/data/update-next.yaml +13 -0
  51. data/spec/fixtures/network_rail/schedule/data/update-old.yaml +10 -0
  52. data/spec/fixtures/network_rail/schedule/data/update.yaml +112 -0
  53. data/spec/fixtures/network_rail/schedule/parser/train_create.json +1 -0
  54. data/spec/fixtures/network_rail/schedule/parser/train_delete.json +1 -0
  55. data/spec/fixtures/network_rail/schedule/train_schedule/json-data.yaml +67 -0
  56. data/spec/rail_feeds/credentials_spec.rb +46 -0
  57. data/spec/rail_feeds/logging_spec.rb +81 -0
  58. data/spec/rail_feeds/network_rail/corpus_spec.rb +92 -0
  59. data/spec/rail_feeds/network_rail/credentials_spec.rb +22 -0
  60. data/spec/rail_feeds/network_rail/http_client_spec.rb +88 -0
  61. data/spec/rail_feeds/network_rail/schedule/association_spec.rb +205 -0
  62. data/spec/rail_feeds/network_rail/schedule/data_spec.rb +219 -0
  63. data/spec/rail_feeds/network_rail/schedule/days_shared.rb +99 -0
  64. data/spec/rail_feeds/network_rail/schedule/days_spec.rb +4 -0
  65. data/spec/rail_feeds/network_rail/schedule/fetcher_spec.rb +228 -0
  66. data/spec/rail_feeds/network_rail/schedule/header/cif_spec.rb +72 -0
  67. data/spec/rail_feeds/network_rail/schedule/header/json_spec.rb +51 -0
  68. data/spec/rail_feeds/network_rail/schedule/header_spec.rb +19 -0
  69. data/spec/rail_feeds/network_rail/schedule/parser/cif_spec.rb +197 -0
  70. data/spec/rail_feeds/network_rail/schedule/parser/json_spec.rb +172 -0
  71. data/spec/rail_feeds/network_rail/schedule/parser_spec.rb +34 -0
  72. data/spec/rail_feeds/network_rail/schedule/stp_indicator_shared.rb +49 -0
  73. data/spec/rail_feeds/network_rail/schedule/stp_indicator_spec.rb +4 -0
  74. data/spec/rail_feeds/network_rail/schedule/tiploc_spec.rb +77 -0
  75. data/spec/rail_feeds/network_rail/schedule/train_schedule/change_en_route_spec.rb +121 -0
  76. data/spec/rail_feeds/network_rail/schedule/train_schedule/location/intermediate_spec.rb +95 -0
  77. data/spec/rail_feeds/network_rail/schedule/train_schedule/location/origin_spec.rb +87 -0
  78. data/spec/rail_feeds/network_rail/schedule/train_schedule/location/terminating_spec.rb +81 -0
  79. data/spec/rail_feeds/network_rail/schedule/train_schedule/location_spec.rb +35 -0
  80. data/spec/rail_feeds/network_rail/schedule/train_schedule_spec.rb +284 -0
  81. data/spec/rail_feeds/network_rail/schedule_spec.rb +41 -0
  82. data/spec/rail_feeds/network_rail/smart_spec.rb +194 -0
  83. data/spec/rail_feeds/network_rail/stomp_client_spec.rb +151 -0
  84. data/spec/rail_feeds/network_rail_spec.rb +7 -0
  85. data/spec/rail_feeds_spec.rb +11 -0
  86. data/spec/spec_helper.rb +47 -0
  87. metadata +282 -0
@@ -0,0 +1,194 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe RailFeeds::NetworkRail::SMART do
4
+ let :json do
5
+ '{"BERTHDATA":[{"ROUTE":"2","STANME":"NEWBRGH","BERTHOFFSET":"0","EVENT":"B","COMM' \
6
+ 'ENT":"17/02/2008","PLATFORM":"5","TD":"EA","FROMBERTH":"B674","TOBERTH":"B672","S' \
7
+ 'TANOX":"03211","STEPTYPE":"B","TOLINE":"F","FROMLINE":"S"},{"ROUTE":"","STANME":"' \
8
+ 'DMOORCTRL","BERTHOFFSET":"+60","EVENT":"C","COMMENT":"Migrated on 8/6/2005","PLAT' \
9
+ 'FORM":"","TD":"A2","FROMBERTH":"0759","TOBERTH":"0808","STANOX":"89748","STEPTYPE' \
10
+ '":"","TOLINE":"","FROMLINE":""},{"ROUTE":"","STANME":"","BERTHOFFSET":"","EVENT":' \
11
+ '"","COMMENT":"","PLATFORM":"","TD":"","FROMBERTH":"","TOBERTH":"","STANOX":"","ST' \
12
+ 'EPTYPE":"","TOLINE":"","FROMLINE":""}]}'
13
+ end
14
+ let(:http_client) { double RailFeeds::NetworkRail::HTTPClient }
15
+ let(:reader) { double Zlib::GzipReader }
16
+
17
+ describe '::download' do
18
+ let(:http_client) { double RailFeeds::NetworkRail::HTTPClient }
19
+ let(:temp_file) { double Tempfile }
20
+
21
+ it 'Using default credentials' do
22
+ expect(RailFeeds::NetworkRail::HTTPClient).to receive(:new)
23
+ .with(credentials: RailFeeds::NetworkRail::Credentials).and_return(http_client)
24
+ expect(http_client).to receive(:download)
25
+ .with('ntrod/SupportingFileAuthenticate?type=SMART', 'file')
26
+ described_class.download 'file'
27
+ end
28
+
29
+ it 'Using passed credentials' do
30
+ credentials = double RailFeeds::NetworkRail::Credentials
31
+ expect(RailFeeds::NetworkRail::HTTPClient).to receive(:new)
32
+ .with(credentials: credentials).and_return(http_client)
33
+ expect(http_client).to receive(:download)
34
+ described_class.download 'file', credentials: credentials
35
+ end
36
+ end
37
+
38
+ describe '::fetch' do
39
+ let(:http_client) { double RailFeeds::NetworkRail::HTTPClient }
40
+ let(:temp_file) { double Tempfile }
41
+
42
+ it 'Using default credentials' do
43
+ expect(RailFeeds::NetworkRail::HTTPClient).to receive(:new)
44
+ .with(credentials: RailFeeds::NetworkRail::Credentials).and_return(http_client)
45
+ expect(http_client).to receive(:fetch)
46
+ .with('ntrod/SupportingFileAuthenticate?type=SMART').and_return(temp_file)
47
+ expect(described_class.fetch).to eq temp_file
48
+ end
49
+
50
+ it 'Using passed credentials' do
51
+ credentials = double RailFeeds::NetworkRail::Credentials
52
+ expect(RailFeeds::NetworkRail::HTTPClient).to receive(:new)
53
+ .with(credentials: credentials).and_return(http_client)
54
+ expect(http_client).to receive(:fetch).and_return(temp_file)
55
+ expect(described_class.fetch(credentials: credentials)).to eq temp_file
56
+ end
57
+ end
58
+
59
+ describe '::load_file' do
60
+ it 'json file' do
61
+ expect(Zlib::GzipReader).to receive(:open).with('filename') { fail Zlib::GzipFile::Error }
62
+ expect(File).to receive(:read).with('filename').and_return(json)
63
+ data = described_class.load_file('filename')
64
+ expect(data[0].td_area).to eq 'EA'
65
+ expect(data[0].from_berth).to eq 'B674'
66
+ expect(data[0].to_berth).to eq 'B672'
67
+ expect(data[0].from_line).to eq 'S'
68
+ expect(data[0].to_line).to eq 'F'
69
+ expect(data[0].trust_offset).to eq 0
70
+ expect(data[0].platform).to eq '5'
71
+ expect(data[0].event_type).to eq :depart
72
+ expect(data[0].event_direction).to eq :up
73
+ expect(data[0].route).to eq '2'
74
+ expect(data[0].stanox).to eq 3211
75
+ expect(data[0].stanox_name).to eq 'NEWBRGH'
76
+ expect(data[0].step_type).to eq :between
77
+ expect(data[0].comment).to eq '17/02/2008'
78
+ expect(data[1].trust_offset).to eq 60
79
+ expect(data[2].td_area).to be_nil
80
+ expect(data[2].from_berth).to be_nil
81
+ expect(data[2].to_berth).to be_nil
82
+ expect(data[2].from_line).to be_nil
83
+ expect(data[2].to_line).to be_nil
84
+ expect(data[2].trust_offset).to eq 0
85
+ expect(data[2].platform).to be_nil
86
+ expect(data[2].event_type).to be_nil
87
+ expect(data[2].event_direction).to be_nil
88
+ expect(data[2].route).to be_nil
89
+ expect(data[2].stanox).to be_nil
90
+ expect(data[2].stanox_name).to be_nil
91
+ expect(data[2].step_type).to be_nil
92
+ expect(data[2].comment).to be_nil
93
+ end
94
+
95
+ it 'json.gz file' do
96
+ expect(Zlib::GzipReader).to receive(:open).with('filename')
97
+ .and_yield(StringIO.new(json))
98
+ expect(described_class.load_file('filename').count).to eq 3
99
+ end
100
+ end
101
+
102
+ it '::build_berths' do
103
+ # For the trackplan:
104
+ # Down ---> Up
105
+ # --A----B----C--
106
+ # \--D-->-E--
107
+ # \-F-<-/
108
+ # And therefore the steps:
109
+ steps = [
110
+ RailFeeds::NetworkRail::SMART::Step.new('area', 'A', 'B', :between, :up), # 0
111
+ RailFeeds::NetworkRail::SMART::Step.new('area', 'A', 'D', :between, :up), # 1
112
+ RailFeeds::NetworkRail::SMART::Step.new('area', 'A', 'F', :between, :up), # 2
113
+ RailFeeds::NetworkRail::SMART::Step.new('area', 'B', 'C', :between, :up), # 3
114
+ RailFeeds::NetworkRail::SMART::Step.new('area', 'D', 'E', :between, :up), # 4
115
+ RailFeeds::NetworkRail::SMART::Step.new('area', 'B', 'A', :between, :down), # 5
116
+ RailFeeds::NetworkRail::SMART::Step.new('area', 'D', 'A', :between, :down), # 6
117
+ RailFeeds::NetworkRail::SMART::Step.new('area', 'F', 'A', :between, :down), # 7
118
+ RailFeeds::NetworkRail::SMART::Step.new('area', 'C', 'B', :between, :down), # 8
119
+ RailFeeds::NetworkRail::SMART::Step.new('area', 'E', 'F', :between, :down) # 9
120
+ ]
121
+
122
+ berths = described_class.build_berths(steps)['area']
123
+ expect(berths['A'].id).to eq 'A'
124
+ expect(berths['A'].up_steps).to match_array steps.values_at(0, 1, 2, 5, 6, 7)
125
+ expect(berths['A'].down_steps).to match_array []
126
+ expect(berths['A'].up_berths).to match_array ['B', 'D', 'F']
127
+ expect(berths['A'].down_berths).to match_array []
128
+ expect(berths['B'].id).to eq 'B'
129
+ expect(berths['B'].up_steps).to match_array steps.values_at(3, 8)
130
+ expect(berths['B'].down_steps).to match_array steps.values_at(5, 0)
131
+ expect(berths['B'].up_berths).to match_array ['C']
132
+ expect(berths['B'].down_berths).to match_array ['A']
133
+ expect(berths['C'].id).to eq 'C'
134
+ expect(berths['C'].up_steps).to match_array []
135
+ expect(berths['C'].down_steps).to match_array steps.values_at(8, 3)
136
+ expect(berths['C'].up_berths).to match_array []
137
+ expect(berths['C'].down_berths).to match_array ['B']
138
+ expect(berths['D'].id).to eq 'D'
139
+ expect(berths['D'].up_steps).to match_array steps.values_at(4)
140
+ expect(berths['D'].down_steps).to match_array steps.values_at(6, 1)
141
+ expect(berths['D'].up_berths).to match_array ['E']
142
+ expect(berths['D'].down_berths).to match_array ['A']
143
+ expect(berths['E'].id).to eq 'E'
144
+ expect(berths['E'].up_steps).to match_array []
145
+ expect(berths['E'].down_steps).to match_array steps.values_at(4, 9)
146
+ expect(berths['E'].up_berths).to match_array []
147
+ expect(berths['E'].down_berths).to match_array ['F']
148
+ expect(berths['F'].id).to eq 'F'
149
+ expect(berths['F'].up_steps).to match_array steps.values_at(9)
150
+ expect(berths['F'].down_steps).to match_array steps.values_at(2, 7)
151
+ expect(berths['F'].up_berths).to match_array []
152
+ expect(berths['F'].down_berths).to match_array ['A']
153
+ end
154
+
155
+ it '::fetch_data' do
156
+ expect(RailFeeds::NetworkRail::HTTPClient)
157
+ .to receive(:new).with(credentials: RailFeeds::NetworkRail::Credentials)
158
+ .and_return(http_client)
159
+ expect(http_client).to receive(:fetch_unzipped)
160
+ .with('ntrod/SupportingFileAuthenticate?type=SMART')
161
+ .and_yield(reader)
162
+ expect(reader).to receive(:read).and_return(json)
163
+ expect(described_class.fetch_data.count).to eq 3
164
+ end
165
+
166
+ describe 'Helping methods' do
167
+ it '::event_type' do
168
+ expect(described_class.send(:event_type, 'A')).to eq :arrive
169
+ expect(described_class.send(:event_type, 'B')).to eq :depart
170
+ expect(described_class.send(:event_type, 'C')).to eq :arrive
171
+ expect(described_class.send(:event_type, 'D')).to eq :depart
172
+ expect(described_class.send(:event_type, 'Z')).to be_nil
173
+ end
174
+
175
+ it '::event_direction' do
176
+ expect(described_class.send(:event_direction, 'A')).to eq :up
177
+ expect(described_class.send(:event_direction, 'B')).to eq :up
178
+ expect(described_class.send(:event_direction, 'C')).to eq :down
179
+ expect(described_class.send(:event_direction, 'D')).to eq :down
180
+ expect(described_class.send(:event_direction, 'Z')).to be_nil
181
+ end
182
+
183
+ it '::step_type' do
184
+ expect(described_class.send(:step_type, 'B')).to eq :between
185
+ expect(described_class.send(:step_type, 'F')).to eq :from
186
+ expect(described_class.send(:step_type, 'T')).to eq :to
187
+ expect(described_class.send(:step_type, 'D')).to eq :intermediate_first
188
+ expect(described_class.send(:step_type, 'C')).to eq :clearout
189
+ expect(described_class.send(:step_type, 'I')).to eq :interpose
190
+ expect(described_class.send(:step_type, 'E')).to eq :intermediate
191
+ expect(described_class.send(:step_type, 'Z')).to be_nil
192
+ end
193
+ end
194
+ end
@@ -0,0 +1,151 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe RailFeeds::NetworkRail::StompClient do
4
+ before :each do
5
+ RailFeeds::NetworkRail::Credentials.configure(
6
+ username: 'a',
7
+ password: 'b'
8
+ )
9
+ end
10
+
11
+ describe 'Sets correct options when delegating #connect' do
12
+ let(:logger) { double Logger }
13
+
14
+ it 'With no credentials passed' do
15
+ stomp_client = double Stomp::Client
16
+ options = {
17
+ hosts: [{
18
+ host: 'datafeeds.networkrail.co.uk',
19
+ port: '61618',
20
+ login: 'a',
21
+ password: 'b'
22
+ }],
23
+ connect_headers: {
24
+ 'host' => 'datafeeds.networkrail.co.uk',
25
+ 'client-id' => 'a',
26
+ 'accept-version' => '1.1',
27
+ 'heart-beat' => '5000,10000'
28
+ },
29
+ logger: logger
30
+ }
31
+ subject = described_class.new logger: logger
32
+ expect(Stomp::Client).to receive(:new).with(options).and_return(stomp_client)
33
+ subject.connect
34
+ end
35
+
36
+ it 'With credentials passed' do
37
+ credentials = RailFeeds::NetworkRail::Credentials.new(
38
+ username: 'A',
39
+ password: 'B'
40
+ )
41
+ stomp_client = double Stomp::Client
42
+ options = {
43
+ hosts: [{
44
+ host: 'datafeeds.networkrail.co.uk',
45
+ port: '61618',
46
+ login: 'A',
47
+ password: 'B'
48
+ }],
49
+ connect_headers: {
50
+ 'host' => 'datafeeds.networkrail.co.uk',
51
+ 'client-id' => 'A',
52
+ 'accept-version' => '1.1',
53
+ 'heart-beat' => '5000,10000'
54
+ },
55
+ logger: logger
56
+ }
57
+ subject = described_class.new credentials: credentials, logger: logger
58
+ expect(Stomp::Client).to receive(:new).with(options).and_return(stomp_client)
59
+ subject.connect
60
+ end
61
+ end
62
+
63
+ describe 'Sets correct options when delegating #subscribe' do
64
+ let(:stomp_client) { double Stomp::Client }
65
+
66
+ before :each do
67
+ allow(Socket).to receive(:gethostname).and_return('hostname')
68
+ allow(stomp_client).to receive(:uuid).and_return('uuid')
69
+ expect(Stomp::Client).to receive(:new).and_return(stomp_client)
70
+ end
71
+
72
+ describe 'When connected' do
73
+ before :each do
74
+ subject.connect
75
+ allow(stomp_client).to receive(:closed?).and_return(false)
76
+ end
77
+
78
+ it 'No headers passes' do
79
+ headers = {
80
+ 'activemq.subscriptionName' => 'hostname+topic',
81
+ 'id' => 'uuid',
82
+ 'ack' => 'client'
83
+ }
84
+ expect(stomp_client).to receive(:subscribe).with('/topic/topic', headers)
85
+ subject.subscribe('topic') { |m| puts m }
86
+ end
87
+
88
+ it 'Appends to added headers' do
89
+ headers = {
90
+ 'activemq.subscriptionName' => 'hostname+topic',
91
+ 'id' => 'uuid',
92
+ 'ack' => 'client',
93
+ 'test' => 'TEST'
94
+ }
95
+ expect(stomp_client).to receive(:subscribe).with('/topic/topic', headers)
96
+ subject.subscribe('topic', 'test' => 'TEST') { |m| puts m }
97
+ end
98
+
99
+ it "Doesn't overwrite passed headers" do
100
+ headers = {
101
+ 'activemq.subscriptionName' => 'a',
102
+ 'id' => 'b',
103
+ 'ack' => 'c'
104
+ }
105
+ expect(stomp_client).to receive(:subscribe).with('/topic/topic', headers)
106
+ subject.subscribe('topic', headers) { |m| puts m }
107
+ end
108
+ end
109
+
110
+ it 'When not connected' do
111
+ headers = {
112
+ 'activemq.subscriptionName' => 'hostname+topic',
113
+ 'id' => 'uuid',
114
+ 'ack' => 'client'
115
+ }
116
+ expect(stomp_client).to receive(:subscribe).with('/topic/topic', headers)
117
+ expect { subject.subscribe('topic') { |m| puts m } }.to_not raise_error
118
+ end
119
+ end
120
+
121
+ describe '#disconnect delegates #close' do
122
+ it 'When connected' do
123
+ stomp_client = double Stomp::Client
124
+ expect(Stomp::Client).to receive(:new).and_return(stomp_client)
125
+ subject.connect
126
+ expect(stomp_client).to receive(:close)
127
+ subject.disconnect
128
+ end
129
+
130
+ it 'When not connected' do
131
+ expect { subject.disconnect }.to_not raise_error
132
+ end
133
+ end
134
+
135
+ describe 'Delegates methods to Stomp::Client' do
136
+ delegates = %i[
137
+ ack acknowledge nack unreceive create_error_handler open? closed? join
138
+ running? begin abort commit unsubscribe uuid poll hbsend_interval
139
+ hbrecv_interval hbsend_count hbrecv_count
140
+ ]
141
+ delegates.each do |method|
142
+ it method do
143
+ stomp_client = double Stomp::Client
144
+ expect(Stomp::Client).to receive(:new).and_return(stomp_client)
145
+ expect(stomp_client).to receive(method)
146
+ subject.connect
147
+ subject.send method
148
+ end
149
+ end
150
+ end
151
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe RailFeeds::NetworkRail do
4
+ it 'Has NetRailFeeds as an alias' do
5
+ expect(::NetRailFeeds).to be RailFeeds::NetworkRail
6
+ end
7
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe RailFeeds do
4
+ it 'Has a version' do
5
+ expect(RailFeeds::Version).to_not be_nil
6
+ expect(RailFeeds::Version::MAJOR).to_not be_nil
7
+ expect(RailFeeds::Version::MINOR).to_not be_nil
8
+ expect(RailFeeds::Version::PATCH).to_not be_nil
9
+ expect(RailFeeds::Version.to_s).to_not be_empty
10
+ end
11
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'timecop'
4
+ require 'yaml'
5
+
6
+ require 'simplecov'
7
+ SimpleCov.coverage_dir(File.join('tmp', 'coverage'))
8
+ SimpleCov.start do
9
+ add_filter 'spec/'
10
+ end
11
+
12
+ require 'coveralls'
13
+ Coveralls.wear! if ENV['TRAVIS']
14
+
15
+ RSPEC_ROOT = File.dirname __FILE__
16
+ RSPEC_FIXTURES = File.join RSPEC_ROOT, 'fixtures'
17
+ Dir[File.join(RSPEC_ROOT, '**', '*_shared.rb')].each { |f| require f }
18
+
19
+ RSpec.configure do |config|
20
+ # == Mock Framework
21
+ #
22
+ # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
23
+ #
24
+ # config.mock_with :mocha
25
+ # config.mock_with :flexmock
26
+ # config.mock_with :rr
27
+ config.mock_with :rspec do |configuration|
28
+ # Using the expect syntax is preferable to the should syntax in some cases.
29
+ # The problem here is that the :should syntax that RSpec uses can fail in
30
+ # the case of proxy objects, and objects that include the delegate module.
31
+ # Essentially it requires that we define methods on every object in the
32
+ # system. Not owning every object means that we cannot ensure this works in
33
+ # a consistent manner. The expect syntax gets around this problem by not
34
+ # relying on RSpec specific methods being defined on every object in the
35
+ # system.
36
+ # configuration.syntax = [:expect, :should]
37
+ configuration.syntax = :expect
38
+ end
39
+
40
+ config.before(:example) do
41
+ RailFeeds::Logging.logger = Logger.new(IO::NULL)
42
+ end
43
+
44
+ config.after(:each) { Timecop.return }
45
+ end
46
+
47
+ require 'rail_feeds'