flightstats 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -22,52 +22,5 @@ class FlightStats::DataFeed
22
22
  files
23
23
  end
24
24
  end
25
-
26
- # def self.get_gz_file(id)
27
- # id = id['id'] if id.class == Hash
28
- # FlightStats::raw_query({:file=>id}, '/development/feed')
29
- # end
30
- #
31
- # def self.get_file(id)
32
- # Zlib::GzipReader.new(FlightStats::DataFeed.get_gz_file(id))
33
- # end
34
- #
35
- # # passes each file to a block,
36
- # # each file is the raw gzipped file from flightstats, StringIO object
37
- # def each_gz_file(&block)
38
- # if block.arity == 1
39
- # @files.each{ |f| block.call(FlightStats::DataFeed.get_gz_file(f)) }
40
- # elsif block.arity == 2
41
- # @files.each { |f|
42
- # block.call(FlightStats::DataFeed.get_gz_file(f), f['timestamp'])
43
- # }
44
- # end
45
- # end
46
- #
47
- # # passes each file to a block, each file is a Zlib::GzipReader instance
48
- # def each_file(&block)
49
- # if block.arity == 1
50
- # @files.each{ |f| block.call(FlightStats::DataFeed.get_file(f)) }
51
- # elsif block.arity == 2
52
- # @files.each { |f|
53
- # block.call(FlightStats::DataFeed.get_file(f), f['timestamp'])
54
- # }
55
- # end
56
- # end
57
- #
58
- # # passes each update to a block, each update is an instance of FlightStats::Flight
59
- # def each(&block)
60
- # each_file { |file| FlightStats::DataFeed.process_file(file, &block) }
61
- # end
62
- #
63
- # def self.process_file(file, &block)
64
- # xml = LibXML::XML::Parser.string(file.read, PARSER_OPTIONS).parse.root
65
- # xml.children.each do |node|
66
- # flight = FlightStats::Flight.new(node.children[0])
67
- # time_updated = Time.parse(node.attributes['DateTimeRecorded'][0..18] + ' PT')
68
- # flight.attributes['updated_at'] = time_updated.utc
69
- # block.call(flight)
70
- # end
71
- # end
72
- #
25
+
73
26
  end
@@ -3,8 +3,9 @@ class FlightStats::DataFeed::File
3
3
  attr_accessor :id, :message_count, :bytes, :timestamp
4
4
  alias :size :bytes
5
5
 
6
- def initialize(content = nil)
6
+ def initialize(content = nil, timestamp = nil)
7
7
  @content = content if content.is_a?(StringIO) or content.is_a?(File)
8
+ @timestamp = timestamp
8
9
  end
9
10
 
10
11
  def content
@@ -18,11 +19,11 @@ class FlightStats::DataFeed::File
18
19
  parser = LibXML::XML::SaxParser.io(Zlib::GzipReader.new(content))
19
20
 
20
21
  if block_given?
21
- parser.callbacks = SaxParser.new(&block)
22
+ parser.callbacks = SaxParser.new(@timestamp, &block)
22
23
  parser.parse
23
24
  else
24
25
  updates = []
25
- parser.callbacks = SaxParser.new { |update| updates << update }
26
+ parser.callbacks = SaxParser.new(@timestamp) { |update| updates << update }
26
27
  parser.parse
27
28
  updates
28
29
  end
@@ -2,8 +2,9 @@ class FlightStats::DataFeed::File::SaxParser
2
2
 
3
3
  include LibXML::XML::SaxParser::Callbacks
4
4
 
5
- def initialize(&on_update_block)
5
+ def initialize(file_timestamp_utc, &on_update_block)
6
6
  @stack = []
7
+ @file_timestamp_utc = file_timestamp_utc
7
8
  @on_update_block = on_update_block
8
9
  end
9
10
 
@@ -24,7 +25,13 @@ class FlightStats::DataFeed::File::SaxParser
24
25
  @update.event = attributes['Event']
25
26
  @update.data_updated = attributes['DataUpdated']
26
27
  tz = TZInfo::Timezone.get('America/Los_Angeles')
27
- @update.timestamp = tz.local_to_utc(to_time(attributes['DateTimeRecorded']))
28
+ @update.timestamp = tz.local_to_utc(to_time(attributes['DateTimeRecorded'])) do |periods|
29
+ if @file_timestamp_utc
30
+ periods.select{ |period|
31
+ period.to_utc(to_time(attributes['DateTimeRecorded'])).hour == @file_timestamp_utc.utc.hour
32
+ }
33
+ end
34
+ end
28
35
  when 'FlightHistory'
29
36
  @flight = FlightStats::Flight.new
30
37
  @flight.id = attributes['FlightHistoryId']
@@ -20,6 +20,7 @@ class FlightStats::DataFeed::SaxParser
20
20
  attributes['DateTimeUTC'][14..15],
21
21
  attributes['DateTimeUTC'][17..18],
22
22
  attributes['DateTimeUTC'][20..22])
23
+
23
24
  @on_file_block.call(file)
24
25
  end
25
26
  end
@@ -11,10 +11,14 @@ class FlightStats::DataFeed::FileTest < Test::Unit::TestCase
11
11
  :body => File.read("#{File.dirname(__FILE__)}/../../responses/test2.gz"))
12
12
 
13
13
  count = 0
14
- FlightStats::DataFeed.new.files do |file|
15
- file.updates do |update|
16
- count += 1
14
+ begin
15
+ FlightStats::DataFeed.new.files do |file|
16
+ file.updates do |update|
17
+ count += 1
18
+ end
17
19
  end
20
+ rescue
21
+ GC.start
18
22
  end
19
23
  assert_equal 11, count
20
24
  end
@@ -43,6 +47,7 @@ class FlightStats::DataFeed::FileTest < Test::Unit::TestCase
43
47
  changes << update
44
48
  end
45
49
  end
50
+
46
51
  update = changes[0]
47
52
  assert_equal(Time.utc(2009,6,8,20,30,0,43), update.timestamp)
48
53
  assert_equal('ASDI', update.source)
@@ -143,4 +148,120 @@ class FlightStats::DataFeed::FileTest < Test::Unit::TestCase
143
148
  assert_equal('CM', update.flight.codeshares.first.airline.code)
144
149
  assert_equal('CM', update.flight.codeshares.first.airline.iata_code)
145
150
  end
151
+
152
+ def test_convert_local_time_to_correct_utc_time_when_is_an_ambiguous_local_time
153
+ FakeWeb.register_uri(:get, "https://www.pathfinder-xml.com/development/feed?login.guid=test&useUTC=true&lastAccessed=#{Time.now.utc.strftime("%Y-%m-%dT%H:%M")}",
154
+ :body => File.read("#{File.dirname(__FILE__)}/../../responses/feed_file_list_tz_fallback.xml"))
155
+ FakeWeb.register_uri(:get, "https://www.pathfinder-xml.com/development/feed?login.guid=test&file=4551477",
156
+ :body => File.read("#{File.dirname(__FILE__)}/../../responses/test_tz_fallback1.gz"))
157
+ FakeWeb.register_uri(:get, "https://www.pathfinder-xml.com/development/feed?login.guid=test&file=4551480",
158
+ :body => File.read("#{File.dirname(__FILE__)}/../../responses/test_tz_fallback2.gz"))
159
+
160
+ changes = Array.new
161
+ FlightStats::DataFeed.new.files do |file|
162
+ file.updates do |update|
163
+ changes << update
164
+ end
165
+ end
166
+
167
+ update = changes[0]
168
+ assert_equal(Time.utc(2009,11,1,8,37,0,43), update.timestamp)
169
+ assert_equal('ASDI', update.source)
170
+ assert_equal('STATUS-Active', update.event)
171
+ assert_equal('ARD- New=06/08/09 16:24, ERD- Old=06/08/09 16:26 New=06/08/09 16:24, ERA- Old=06/08/09 17:45 New=06/08/09 17:42, STATUS- Old=S New=A', update.data_updated)
172
+
173
+ assert_equal('162197049', update.flight.id)
174
+ assert_equal('753', update.flight.number)
175
+ assert_equal(Time.utc(2009,6,8,16,26), update.flight.scheduled_local_runway_departure_time)
176
+ assert_equal(Time.utc(2009,6,8,16,24), update.flight.estimated_local_runway_departure_time)
177
+ assert_equal(Time.utc(2009,6,8,16,24,52), update.flight.actual_local_runway_departure_time)
178
+ assert_equal(Time.utc(2009,6,8,17,45), update.flight.scheduled_local_runway_arrival_time)
179
+ assert_equal(Time.utc(2009,6,8,17,42), update.flight.estimated_local_runway_arrival_time)
180
+ assert_equal('A', update.flight.creator_code)
181
+ assert_equal('A', update.flight.status_code)
182
+ assert_equal(79, update.flight.scheduled_air_time)
183
+ assert_equal(-4, update.flight.departure_airport_timezone_offset)
184
+ assert_equal(-4, update.flight.arrival_airport_timezone_offset)
185
+ assert_equal(Time.utc(2009,6,8,16,26), update.flight.local_departure_time)
186
+ assert_equal(Time.utc(2009,6,8,17,45), update.flight.local_arrival_time)
187
+
188
+ assert_equal('G4', update.flight.airline.code)
189
+ assert_equal('AAY', update.flight.airline.icao_code)
190
+ assert_nil(update.flight.airline.iata_code)
191
+ assert_nil(update.flight.airline.faa_code)
192
+ assert_nil(update.flight.airline.name)
193
+
194
+ assert_equal('SFB', update.flight.origin.code)
195
+ assert_equal('KSFB', update.flight.origin.icao_code)
196
+ assert_nil(update.flight.origin.iata_code)
197
+ assert_nil(update.flight.origin.faa_code)
198
+ assert_nil(update.flight.origin.name)
199
+
200
+ assert_equal('GSO', update.flight.destination.code)
201
+ assert_equal('KGSO', update.flight.destination.icao_code)
202
+ assert_nil(update.flight.destination.iata_code)
203
+ assert_nil(update.flight.destination.faa_code)
204
+ assert_nil(update.flight.destination.name)
205
+
206
+ assert_equal([], update.flight.codeshares)
207
+
208
+ update = changes[6]
209
+ assert_equal(Time.utc(2009,11,1,9,37,1,110), update.timestamp)
210
+ assert_equal('Airline (CO)', update.source)
211
+ assert_equal('Time Adjustment', update.event)
212
+ assert_equal('EGD- New=06/08/09 19:35, EGA- New=06/08/09 23:35, DGATE- New=C-30', update.data_updated)
213
+
214
+ assert_equal('161861862', update.flight.id)
215
+ assert_equal('1417', update.flight.number)
216
+ assert_equal(Time.utc(2009,6,8,19,35), update.flight.published_local_departure_time)
217
+ assert_equal(Time.utc(2009,6,8,23,35), update.flight.published_local_arrival_time)
218
+ assert_equal(Time.utc(2009,6,8,19,35), update.flight.scheduled_local_gate_departure_time)
219
+ assert_equal(Time.utc(2009,6,8,19,35), update.flight.estimated_local_gate_departure_time)
220
+ assert_equal(Time.utc(2009,6,8,23,35), update.flight.scheduled_local_gate_arrival_time)
221
+ assert_equal(Time.utc(2009,6,8,23,35), update.flight.estimated_local_gate_arrival_time)
222
+ assert_equal(Time.utc(2009,6,8,19,56), update.flight.scheduled_local_runway_departure_time)
223
+ assert_equal(Time.utc(2009,6,8,19,56), update.flight.estimated_local_runway_departure_time)
224
+ assert_equal(Time.utc(2009,6,8,23,21), update.flight.scheduled_local_runway_arrival_time)
225
+ assert_equal(Time.utc(2009,6,8,23,21), update.flight.estimated_local_runway_arrival_time)
226
+ assert_nil(update.flight.actual_local_runway_departure_time)
227
+ assert_equal('O', update.flight.creator_code)
228
+ assert_equal('S', update.flight.status_code)
229
+ assert_equal(145, update.flight.scheduled_air_time)
230
+ assert_equal(180, update.flight.scheduled_block_time)
231
+ assert_equal(-5, update.flight.departure_airport_timezone_offset)
232
+ assert_equal(-4, update.flight.arrival_airport_timezone_offset)
233
+ assert_equal(Time.utc(2009,6,8,19,35), update.flight.local_departure_time)
234
+ assert_equal(Time.utc(2009,6,8,23,35), update.flight.local_arrival_time)
235
+ assert_equal('735', update.flight.scheduled_aircraft_type)
236
+ assert_equal('C-30', update.flight.departure_gate)
237
+ assert_equal('C', update.flight.departure_terminal)
238
+ assert_nil(update.flight.arrival_terminal)
239
+
240
+ assert_equal('CO', update.flight.airline.code)
241
+ assert_equal('COA', update.flight.airline.icao_code)
242
+ assert_nil(update.flight.airline.iata_code)
243
+ assert_nil(update.flight.airline.faa_code)
244
+ assert_nil(update.flight.airline.name)
245
+
246
+ assert_equal('IAH', update.flight.origin.code)
247
+ assert_equal('KIAH', update.flight.origin.icao_code)
248
+ assert_nil(update.flight.origin.iata_code)
249
+ assert_nil(update.flight.origin.faa_code)
250
+ assert_nil(update.flight.origin.name)
251
+
252
+ assert_equal('PIT', update.flight.destination.code)
253
+ assert_equal('KPIT', update.flight.destination.icao_code)
254
+ assert_nil(update.flight.destination.iata_code)
255
+ assert_nil(update.flight.destination.faa_code)
256
+ assert_nil(update.flight.destination.name)
257
+
258
+ assert_equal(1, update.flight.codeshares.size)
259
+ assert_equal('109977276', update.flight.codeshares.first.id)
260
+ assert_equal('2317', update.flight.codeshares.first.number)
261
+ assert_equal('L', update.flight.codeshares.first.designator)
262
+ assert_equal(Time.utc(2009,6,8,19,35), update.flight.codeshares.first.published_local_departure_time)
263
+ assert_equal(Time.utc(2009,6,8,23,35), update.flight.codeshares.first.published_local_arrival_time)
264
+ assert_equal('CM', update.flight.codeshares.first.airline.code)
265
+ assert_equal('CM', update.flight.codeshares.first.airline.iata_code)
266
+ end
146
267
  end
@@ -0,0 +1,2 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <FlightHistoryEventFeedResponse xmlns="http://pathfinder-xml/FlightHistoryEventFeedService.xsd"><File Bytes="265293" DateTime="2009-11-01T01:37:00.000" DateTimeUTC="2009-11-01T08:37:00.000" ID="4551477" Messages="1760"/><File Bytes="231618" DateTime="2009-11-01T01:37:00.000" DateTimeUTC="2009-11-01T09:37:00.000" ID="4551480" Messages="1505"/></FlightHistoryEventFeedResponse>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flightstats
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - FlightCaster
@@ -60,8 +60,11 @@ files:
60
60
  - test/test_helper.rb
61
61
  - test/responses/test1.gz
62
62
  - test/responses/test2.gz
63
+ - test/responses/test_tz_fallback1.gz
64
+ - test/responses/test_tz_fallback2.gz
63
65
  - test/responses/error.xml
64
66
  - test/responses/feed_file_list.xml
67
+ - test/responses/feed_file_list_tz_fallback.xml
65
68
  has_rdoc: true
66
69
  homepage: http://flightcaster.com/
67
70
  licenses: []