flightcaster 0.1.0

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 (41) hide show
  1. data/.document +5 -0
  2. data/.gitignore +21 -0
  3. data/LICENSE +20 -0
  4. data/README.rdoc +24 -0
  5. data/Rakefile +54 -0
  6. data/VERSION +1 -0
  7. data/lib/flightcaster.rb +28 -0
  8. data/lib/flightcaster/base.rb +120 -0
  9. data/lib/flightcaster/request.rb +55 -0
  10. data/test/fixtures/airline.xml +9 -0
  11. data/test/fixtures/airline_flight.xml +421 -0
  12. data/test/fixtures/airline_flights.xml +2421 -0
  13. data/test/fixtures/airlines.xml +246 -0
  14. data/test/fixtures/airlines_page.xml +260 -0
  15. data/test/fixtures/airlines_per_page.xml +421 -0
  16. data/test/fixtures/airport.xml +30 -0
  17. data/test/fixtures/airports.xml +440 -0
  18. data/test/fixtures/arrivals.xml +1221 -0
  19. data/test/fixtures/departures.xml +1301 -0
  20. data/test/fixtures/flight.xml +99 -0
  21. data/test/fixtures/flight_date.xml +101 -0
  22. data/test/fixtures/flight_path.xml +43 -0
  23. data/test/fixtures/flight_path_date.xml +1786 -0
  24. data/test/fixtures/flights.xml +2420 -0
  25. data/test/fixtures/general_delay.xml +11 -0
  26. data/test/fixtures/general_delays.xml +22 -0
  27. data/test/fixtures/ground_delay.xml +9 -0
  28. data/test/fixtures/ground_delays.xml +25 -0
  29. data/test/fixtures/ground_stop.xml +8 -0
  30. data/test/fixtures/ground_stops.xml +16 -0
  31. data/test/fixtures/metar.xml +21 -0
  32. data/test/fixtures/metars.xml +201 -0
  33. data/test/fixtures/notfound.xml +56 -0
  34. data/test/fixtures/oldapi.xml +13 -0
  35. data/test/fixtures/taf.xml +25 -0
  36. data/test/fixtures/tafs.xml +288 -0
  37. data/test/helper.rb +31 -0
  38. data/test/test_base.rb +0 -0
  39. data/test/test_flightcaster.rb +219 -0
  40. data/test/test_request.rb +10 -0
  41. metadata +118 -0
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
@@ -0,0 +1,21 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## PROJECT::GENERAL
17
+ coverage
18
+ rdoc
19
+ pkg
20
+
21
+ ## PROJECT::SPECIFIC
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Jarod Luebbert
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,24 @@
1
+ = flightcaster
2
+
3
+ The flightcaster ruby gem. Get started by going to http://docs.flightcaster.com/
4
+ and getting an API key.
5
+
6
+ == examples
7
+
8
+ See the examples directory.
9
+
10
+ == docs
11
+
12
+ == Note on Patches/Pull Requests
13
+
14
+ * Fork the project.
15
+ * Make your feature addition or bug fix.
16
+ * Add tests for it. This is important so I don't break it in a
17
+ future version unintentionally.
18
+ * Commit, do not mess with rakefile, version, or history.
19
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
20
+ * Send me a pull request. Bonus points for topic branches.
21
+
22
+ == Copyright
23
+
24
+ Copyright (c) 2010 Jarod Luebbert. See LICENSE for details.
@@ -0,0 +1,54 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "flightcaster"
8
+ gem.summary = %Q{Simple interaction with the flightcaster API}
9
+ gem.description = %Q{Simple interaction with the flightcaster API. Look up
10
+ flight predictions and information.}
11
+ gem.email = "jarod.luebbert@gmail.com"
12
+ gem.homepage = "http://github.com/jarodluebbert/flightcaster"
13
+ gem.authors = ["Jarod Luebbert"]
14
+ gem.add_development_dependency "thoughtbot-shoulda", ">= 0"
15
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
16
+ end
17
+ Jeweler::GemcutterTasks.new
18
+ rescue LoadError
19
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
20
+ end
21
+
22
+ require 'rake/testtask'
23
+ Rake::TestTask.new(:test) do |test|
24
+ test.libs << 'lib' << 'test'
25
+ test.pattern = 'test/**/test_*.rb'
26
+ test.verbose = true
27
+ end
28
+
29
+ begin
30
+ require 'rcov/rcovtask'
31
+ Rcov::RcovTask.new do |test|
32
+ test.libs << 'test'
33
+ test.pattern = 'test/**/test_*.rb'
34
+ test.verbose = true
35
+ end
36
+ rescue LoadError
37
+ task :rcov do
38
+ abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
39
+ end
40
+ end
41
+
42
+ task :test => :check_dependencies
43
+
44
+ task :default => :test
45
+
46
+ require 'rake/rdoctask'
47
+ Rake::RDocTask.new do |rdoc|
48
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
49
+
50
+ rdoc.rdoc_dir = 'rdoc'
51
+ rdoc.title = "flightcaster #{version}"
52
+ rdoc.rdoc_files.include('README*')
53
+ rdoc.rdoc_files.include('lib/**/*.rb')
54
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,28 @@
1
+ require 'rubygems'
2
+ gem 'httparty', '~> 0.5.2'
3
+ require 'httparty'
4
+ gem 'hashie', '~> 0.1.8'
5
+ require 'hashie'
6
+
7
+ [ "base",
8
+ "request" ].each do |file|
9
+ require File.join(File.dirname(__FILE__), 'flightcaster', file)
10
+ end
11
+
12
+ module FlightCaster
13
+ def self.new(*params)
14
+ FlightCaster::Base.new(*params)
15
+ end
16
+
17
+ class FlightCasterError < StandardError
18
+ attr_reader :data
19
+
20
+ def initialize(data)
21
+ @data = data
22
+ super
23
+ end
24
+ end
25
+
26
+ class NotFound < StandardError; end
27
+ class OldAPI < FlightCasterError; end
28
+ end
@@ -0,0 +1,120 @@
1
+ module FlightCaster
2
+ class Base
3
+ attr_reader :api_key
4
+
5
+ def initialize(api_key)
6
+ @api_key = api_key
7
+ FlightCaster::Request.set_api_key(@api_key)
8
+ end
9
+
10
+ def airlines(params={})
11
+ perform_get('/airlines.xml', params)
12
+ end
13
+
14
+ def airline(id)
15
+ perform_get("/airlines/#{id}.xml")
16
+ end
17
+
18
+ def airports(params={})
19
+ perform_get('/airports.xml', params)
20
+ end
21
+
22
+ def airport(id)
23
+ perform_get("/airports/#{id}.xml")
24
+ end
25
+
26
+ def airport_arrivals(id, params={})
27
+ perform_get("/airports/#{id}/arrivals.xml", params)
28
+ end
29
+
30
+ def airport_departures(id, params={})
31
+ perform_get("/airports/#{id}/departures.xml", params)
32
+ end
33
+
34
+ def flight(id)
35
+ perform_get("/flights/#{id}.xml")
36
+ end
37
+
38
+ # TODO: rename this method to something more obvious
39
+ def flights_by_airline_on(airline_id, flight_number, date, params={})
40
+ t = convert_date(date)
41
+ perform_get("/airlines/#{airline_id}/flights/#{flight_number}/#{t}.xml", params)
42
+ end
43
+
44
+ def flight_path(from, to, params={})
45
+ perform_get("/airports/#{from}/departures/#{to}.xml", params)
46
+ end
47
+
48
+ def flight_path_on(from, to, date, params={})
49
+ t = convert_date(date)
50
+ perform_get("/airports/#{from}/departures/#{to}/#{t}.xml", params)
51
+ end
52
+
53
+ def flights(params={})
54
+ perform_get('/flights.xml', params)
55
+ end
56
+
57
+ def flights_by_airline(id, params={})
58
+ perform_get("/airlines/#{id}/flights.xml", params)
59
+ end
60
+
61
+ def flight_by_airline(airline_id, flight_number, params={})
62
+ perform_get("/airlines/#{airline_id}/flights/#{flight_number}.xml", params)
63
+ end
64
+
65
+ def metars(params={})
66
+ perform_get('/metars.xml', params)
67
+ end
68
+
69
+ def metar(id)
70
+ perform_get("/metars/#{id}.xml")
71
+ end
72
+
73
+ def tafs(params={})
74
+ perform_get('/tafs.xml', params)
75
+ end
76
+
77
+ def taf(id)
78
+ perform_get("/tafs/#{id}.xml")
79
+ end
80
+
81
+ def ground_delays(params={})
82
+ perform_get('/ground_delays.xml', params)
83
+ end
84
+
85
+ def ground_delay(id)
86
+ perform_get("/ground_delays/#{id}.xml")
87
+ end
88
+
89
+ def ground_stops(params={})
90
+ perform_get('/ground_stops.xml', params)
91
+ end
92
+
93
+ def ground_stop(id)
94
+ perform_get("/ground_stops/#{id}.xml")
95
+ end
96
+
97
+ def delays(params={})
98
+ perform_get('/delays.xml', params)
99
+ end
100
+
101
+ def delay(id)
102
+ perform_get("/delays/#{id}.xml")
103
+ end
104
+
105
+ private
106
+
107
+ def perform_get(path, params={})
108
+ FlightCaster::Request.get(path, params)
109
+ end
110
+
111
+ def convert_date(date)
112
+ if date.class == Time
113
+ date.strftime("%Y%m%d")
114
+ else
115
+ date
116
+ end
117
+ end
118
+
119
+ end
120
+ end
@@ -0,0 +1,55 @@
1
+ module FlightCaster
2
+ class Request
3
+
4
+ API_ROOT = "http://api.flightcaster.com"
5
+
6
+ def self.set_api_key(api_key)
7
+ @api_key = api_key
8
+ end
9
+
10
+ def self.get(path, params={})
11
+ uri = full_uri(path, params)
12
+ response = HTTParty.get(uri)
13
+ make_friendly(response)
14
+ end
15
+
16
+ def self.full_uri(path, params={})
17
+ options = expand(params)
18
+ "#{API_ROOT}#{path}?api_key=#{@api_key}#{options}"
19
+ end
20
+
21
+ def self.make_friendly(response)
22
+ begin
23
+ raise_errors(response)
24
+ data = parse(response)
25
+ h = Hashie::Mash.new(data)
26
+ # since the hash looks like { :airlines => { stuff we want } },
27
+ # we just grab the value from the first key
28
+ h[h.keys[0]]
29
+ rescue
30
+ end
31
+ end
32
+
33
+ def self.raise_errors(response)
34
+ case response.code.to_i
35
+ when 404
36
+ raise NotFound, "(#{response.code}): #{response.message}"
37
+ when 422
38
+ raise OldAPI, "The API version you are using is no longer supported. (#{response.code}): #{response.message}"
39
+ end
40
+ end
41
+
42
+ def self.parse(response)
43
+ Crack::XML.parse(response.body)
44
+ end
45
+
46
+ def self.expand(params)
47
+ final = ''
48
+ params.each do |k, v|
49
+ final << "&#{k}=#{v}"
50
+ end
51
+ final
52
+ end
53
+
54
+ end
55
+ end
@@ -0,0 +1,9 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <airline>
3
+ <callsign>UNITED</callsign>
4
+ <country>US</country>
5
+ <iata-id>UA</iata-id>
6
+ <icao-id>UAL</icao-id>
7
+ <id>221</id>
8
+ <name>United Airlines</name>
9
+ </airline>
@@ -0,0 +1,421 @@
1
+ HTTP/1.1 200 OK
2
+ Server: nginx/0.6.39
3
+ Date: Fri, 26 Feb 2010 06:52:18 GMT
4
+ Content-Type: application/xml; charset=utf-8
5
+ Connec
6
+
7
+
8
+ tion: keep-alive
9
+ X-FlightCaster-API-Version-Deprecated: 0.1.0
10
+ X-Runtime: 58
11
+ ETag: "99a6032cfea10d4781409c6d61acb78d"
12
+ Cache-Control: private, max-age=0, must-revalidate
13
+ Content-Length: 16991
14
+ X-Varnish: 681128431
15
+ Age: 0
16
+ Via: 1.1 varnish
17
+
18
+ <?xml version="1.0" encoding="utf-8"?>
19
+ <flights current-page="1" total-entries="5" total-pages="1">
20
+ <flight>
21
+ <actual-air-time nil="true" type="integer"/>
22
+ <actual-aircraft-type nil="true"/>
23
+ <actual-block-time nil="true" type="integer"/>
24
+ <actual-gate-arrival-time nil="true" type="datetime"/>
25
+ <actual-gate-departure-time nil="true" type="datetime"/>
26
+ <actual-runway-arrival-time nil="true" type="datetime"/>
27
+ <actual-runway-departure-time nil="true" type="datetime"/>
28
+ <airline-icao-id>VRD</airline-icao-id>
29
+ <arrival-gate nil="true"/>
30
+ <arrival-terminal>4</arrival-terminal>
31
+ <arrival-time type="datetime">2010-03-01T12:45:00Z</arrival-time>
32
+ <baggage-claim nil="true"/>
33
+ <codeshares/>
34
+ <created-at type="datetime">2010-02-25 08:25:56 UTC</created-at>
35
+ <departure-gate nil="true"/>
36
+ <departure-terminal>I</departure-terminal>
37
+ <departure-time type="datetime">2010-03-01T07:15:00Z</departure-time>
38
+ <destination-icao-id>KJFK</destination-icao-id>
39
+ <diverted-icao-id nil="true"/>
40
+ <estimated-gate-arrival-time nil="true" type="datetime"/>
41
+ <estimated-gate-departure-time nil="true" type="datetime"/>
42
+ <estimated-runway-arrival-time nil="true" type="datetime"/>
43
+ <estimated-runway-departure-time nil="true" type="datetime"/>
44
+ <flightstats-id>184973348</flightstats-id>
45
+ <id type="integer">2858549</id>
46
+ <local-departure-time type="datetime">2010-02-28 23:15:00 UTC</local-departure-time>
47
+ <number type="integer">28</number>
48
+ <origin-icao-id>KSFO</origin-icao-id>
49
+ <published-arrival-time type="datetime">2010-03-01T12:45:00Z</published-arrival-time>
50
+ <published-departure-time type="datetime">2010-03-01T07:15:00Z</published-departure-time>
51
+ <scheduled-air-time nil="true" type="integer"/>
52
+ <scheduled-aircraft-type>319</scheduled-aircraft-type>
53
+ <scheduled-block-time type="integer">330</scheduled-block-time>
54
+ <scheduled-gate-arrival-time type="datetime">2010-03-01T12:45:00Z</scheduled-gate-arrival-time>
55
+ <scheduled-gate-departure-time type="datetime">2010-03-01T07:15:00Z</scheduled-gate-departure-time>
56
+ <scheduled-runway-arrival-time nil="true" type="datetime"/>
57
+ <scheduled-runway-departure-time nil="true" type="datetime"/>
58
+ <status>Scheduled</status>
59
+ <status-code>S</status-code>
60
+ <tail-number nil="true"/>
61
+ <updated-at type="datetime">2010-02-25 08:25:56 UTC</updated-at>
62
+ <predictions>
63
+ <prediction>
64
+ <state>delayed</state>
65
+ <chance>0.005966128</chance>
66
+ <minutes>50</minutes>
67
+ </prediction>
68
+ <prediction>
69
+ <state>delayed</state>
70
+ <chance>0.86425453</chance>
71
+ <minutes>0</minutes>
72
+ </prediction>
73
+ <prediction>
74
+ <state>delayed</state>
75
+ <chance>0.016551193</chance>
76
+ <minutes>60</minutes>
77
+ </prediction>
78
+ <prediction>
79
+ <state>delayed</state>
80
+ <chance>0.06607647</chance>
81
+ <minutes>10</minutes>
82
+ </prediction>
83
+ <prediction>
84
+ <state>delayed</state>
85
+ <chance>0.029638182</chance>
86
+ <minutes>20</minutes>
87
+ </prediction>
88
+ <prediction>
89
+ <state>delayed</state>
90
+ <chance>0.0093020275</chance>
91
+ <minutes>30</minutes>
92
+ </prediction>
93
+ <prediction>
94
+ <state>delayed</state>
95
+ <chance>0.008211445</chance>
96
+ <minutes>40</minutes>
97
+ </prediction>
98
+ </predictions>
99
+ </flight>
100
+ <flight>
101
+ <actual-air-time nil="true" type="integer"/>
102
+ <actual-aircraft-type nil="true"/>
103
+ <actual-block-time nil="true" type="integer"/>
104
+ <actual-gate-arrival-time nil="true" type="datetime"/>
105
+ <actual-gate-departure-time nil="true" type="datetime"/>
106
+ <actual-runway-arrival-time nil="true" type="datetime"/>
107
+ <actual-runway-departure-time nil="true" type="datetime"/>
108
+ <airline-icao-id>VRD</airline-icao-id>
109
+ <arrival-gate nil="true"/>
110
+ <arrival-terminal>4</arrival-terminal>
111
+ <arrival-time type="datetime">2010-02-28T12:45:00Z</arrival-time>
112
+ <baggage-claim nil="true"/>
113
+ <codeshares/>
114
+ <created-at type="datetime">2010-02-24 08:10:47 UTC</created-at>
115
+ <departure-gate nil="true"/>
116
+ <departure-terminal>I</departure-terminal>
117
+ <departure-time type="datetime">2010-02-28T07:15:00Z</departure-time>
118
+ <destination-icao-id>KJFK</destination-icao-id>
119
+ <diverted-icao-id nil="true"/>
120
+ <estimated-gate-arrival-time nil="true" type="datetime"/>
121
+ <estimated-gate-departure-time nil="true" type="datetime"/>
122
+ <estimated-runway-arrival-time nil="true" type="datetime"/>
123
+ <estimated-runway-departure-time nil="true" type="datetime"/>
124
+ <flightstats-id>184891391</flightstats-id>
125
+ <id type="integer">2833710</id>
126
+ <local-departure-time type="datetime">2010-02-27 23:15:00 UTC</local-departure-time>
127
+ <number type="integer">28</number>
128
+ <origin-icao-id>KSFO</origin-icao-id>
129
+ <published-arrival-time type="datetime">2010-02-28T12:45:00Z</published-arrival-time>
130
+ <published-departure-time type="datetime">2010-02-28T07:15:00Z</published-departure-time>
131
+ <scheduled-air-time nil="true" type="integer"/>
132
+ <scheduled-aircraft-type>319</scheduled-aircraft-type>
133
+ <scheduled-block-time type="integer">330</scheduled-block-time>
134
+ <scheduled-gate-arrival-time type="datetime">2010-02-28T12:45:00Z</scheduled-gate-arrival-time>
135
+ <scheduled-gate-departure-time type="datetime">2010-02-28T07:15:00Z</scheduled-gate-departure-time>
136
+ <scheduled-runway-arrival-time nil="true" type="datetime"/>
137
+ <scheduled-runway-departure-time nil="true" type="datetime"/>
138
+ <status>Scheduled</status>
139
+ <status-code>S</status-code>
140
+ <tail-number nil="true"/>
141
+ <updated-at type="datetime">2010-02-24 08:10:47 UTC</updated-at>
142
+ <predictions>
143
+ <prediction>
144
+ <state>delayed</state>
145
+ <chance>0.005966128</chance>
146
+ <minutes>50</minutes>
147
+ </prediction>
148
+ <prediction>
149
+ <state>delayed</state>
150
+ <chance>0.86425453</chance>
151
+ <minutes>0</minutes>
152
+ </prediction>
153
+ <prediction>
154
+ <state>delayed</state>
155
+ <chance>0.016551193</chance>
156
+ <minutes>60</minutes>
157
+ </prediction>
158
+ <prediction>
159
+ <state>delayed</state>
160
+ <chance>0.06607647</chance>
161
+ <minutes>10</minutes>
162
+ </prediction>
163
+ <prediction>
164
+ <state>delayed</state>
165
+ <chance>0.029638182</chance>
166
+ <minutes>20</minutes>
167
+ </prediction>
168
+ <prediction>
169
+ <state>delayed</state>
170
+ <chance>0.0093020275</chance>
171
+ <minutes>30</minutes>
172
+ </prediction>
173
+ <prediction>
174
+ <state>delayed</state>
175
+ <chance>0.008211445</chance>
176
+ <minutes>40</minutes>
177
+ </prediction>
178
+ </predictions>
179
+ </flight>
180
+ <flight>
181
+ <actual-air-time nil="true" type="integer"/>
182
+ <actual-aircraft-type nil="true"/>
183
+ <actual-block-time nil="true" type="integer"/>
184
+ <actual-gate-arrival-time nil="true" type="datetime"/>
185
+ <actual-gate-departure-time nil="true" type="datetime"/>
186
+ <actual-runway-arrival-time nil="true" type="datetime"/>
187
+ <actual-runway-departure-time nil="true" type="datetime"/>
188
+ <airline-icao-id>VRD</airline-icao-id>
189
+ <arrival-gate nil="true"/>
190
+ <arrival-terminal>4</arrival-terminal>
191
+ <arrival-time type="datetime">2010-02-27T12:45:00Z</arrival-time>
192
+ <baggage-claim nil="true"/>
193
+ <codeshares/>
194
+ <created-at type="datetime">2010-02-23 08:25:42 UTC</created-at>
195
+ <departure-gate nil="true"/>
196
+ <departure-terminal>I</departure-terminal>
197
+ <departure-time type="datetime">2010-02-27T07:15:00Z</departure-time>
198
+ <destination-icao-id>KJFK</destination-icao-id>
199
+ <diverted-icao-id nil="true"/>
200
+ <estimated-gate-arrival-time nil="true" type="datetime"/>
201
+ <estimated-gate-departure-time nil="true" type="datetime"/>
202
+ <estimated-runway-arrival-time nil="true" type="datetime"/>
203
+ <estimated-runway-departure-time nil="true" type="datetime"/>
204
+ <flightstats-id>184805746</flightstats-id>
205
+ <id type="integer">2806165</id>
206
+ <local-departure-time type="datetime">2010-02-26 23:15:00 UTC</local-departure-time>
207
+ <number type="integer">28</number>
208
+ <origin-icao-id>KSFO</origin-icao-id>
209
+ <published-arrival-time type="datetime">2010-02-27T12:45:00Z</published-arrival-time>
210
+ <published-departure-time type="datetime">2010-02-27T07:15:00Z</published-departure-time>
211
+ <scheduled-air-time nil="true" type="integer"/>
212
+ <scheduled-aircraft-type>319</scheduled-aircraft-type>
213
+ <scheduled-block-time type="integer">330</scheduled-block-time>
214
+ <scheduled-gate-arrival-time type="datetime">2010-02-27T12:45:00Z</scheduled-gate-arrival-time>
215
+ <scheduled-gate-departure-time type="datetime">2010-02-27T07:15:00Z</scheduled-gate-departure-time>
216
+ <scheduled-runway-arrival-time nil="true" type="datetime"/>
217
+ <scheduled-runway-departure-time nil="true" type="datetime"/>
218
+ <status>Scheduled</status>
219
+ <status-code>S</status-code>
220
+ <tail-number nil="true"/>
221
+ <updated-at type="datetime">2010-02-23 08:25:42 UTC</updated-at>
222
+ <predictions>
223
+ <prediction>
224
+ <state>delayed</state>
225
+ <chance>0.005966128</chance>
226
+ <minutes>50</minutes>
227
+ </prediction>
228
+ <prediction>
229
+ <state>delayed</state>
230
+ <chance>0.86425453</chance>
231
+ <minutes>0</minutes>
232
+ </prediction>
233
+ <prediction>
234
+ <state>delayed</state>
235
+ <chance>0.016551193</chance>
236
+ <minutes>60</minutes>
237
+ </prediction>
238
+ <prediction>
239
+ <state>delayed</state>
240
+ <chance>0.06607647</chance>
241
+ <minutes>10</minutes>
242
+ </prediction>
243
+ <prediction>
244
+ <state>delayed</state>
245
+ <chance>0.029638182</chance>
246
+ <minutes>20</minutes>
247
+ </prediction>
248
+ <prediction>
249
+ <state>delayed</state>
250
+ <chance>0.0093020275</chance>
251
+ <minutes>30</minutes>
252
+ </prediction>
253
+ <prediction>
254
+ <state>delayed</state>
255
+ <chance>0.008211445</chance>
256
+ <minutes>40</minutes>
257
+ </prediction>
258
+ </predictions>
259
+ </flight>
260
+ <flight>
261
+ <actual-air-time nil="true" type="integer"/>
262
+ <actual-aircraft-type nil="true"/>
263
+ <actual-block-time nil="true" type="integer"/>
264
+ <actual-gate-arrival-time nil="true" type="datetime"/>
265
+ <actual-gate-departure-time nil="true" type="datetime"/>
266
+ <actual-runway-arrival-time nil="true" type="datetime"/>
267
+ <actual-runway-departure-time nil="true" type="datetime"/>
268
+ <airline-icao-id>VRD</airline-icao-id>
269
+ <arrival-gate nil="true"/>
270
+ <arrival-terminal>4</arrival-terminal>
271
+ <arrival-time type="datetime">2010-02-26T12:45:00Z</arrival-time>
272
+ <baggage-claim nil="true"/>
273
+ <codeshares/>
274
+ <created-at type="datetime">2010-02-22 08:12:02 UTC</created-at>
275
+ <departure-gate nil="true"/>
276
+ <departure-terminal>I</departure-terminal>
277
+ <departure-time type="datetime">2010-02-26T07:15:00Z</departure-time>
278
+ <destination-icao-id>KJFK</destination-icao-id>
279
+ <diverted-icao-id nil="true"/>
280
+ <estimated-gate-arrival-time type="datetime">2010-02-26T12:45:00Z</estimated-gate-arrival-time>
281
+ <estimated-gate-departure-time type="datetime">2010-02-26T07:15:00Z</estimated-gate-departure-time>
282
+ <estimated-runway-arrival-time type="datetime">2010-02-26T12:47:00Z</estimated-runway-arrival-time>
283
+ <estimated-runway-departure-time type="datetime">2010-02-26T07:23:00Z</estimated-runway-departure-time>
284
+ <flightstats-id>184712623</flightstats-id>
285
+ <id type="integer">2777384</id>
286
+ <local-departure-time type="datetime">2010-02-25 23:15:00 UTC</local-departure-time>
287
+ <number type="integer">28</number>
288
+ <origin-icao-id>KSFO</origin-icao-id>
289
+ <published-arrival-time type="datetime">2010-02-26T12:45:00Z</published-arrival-time>
290
+ <published-departure-time type="datetime">2010-02-26T07:15:00Z</published-departure-time>
291
+ <scheduled-air-time type="integer">311</scheduled-air-time>
292
+ <scheduled-aircraft-type>319</scheduled-aircraft-type>
293
+ <scheduled-block-time type="integer">330</scheduled-block-time>
294
+ <scheduled-gate-arrival-time type="datetime">2010-02-26T12:45:00Z</scheduled-gate-arrival-time>
295
+ <scheduled-gate-departure-time type="datetime">2010-02-26T07:15:00Z</scheduled-gate-departure-time>
296
+ <scheduled-runway-arrival-time type="datetime">2010-02-26T12:34:00Z</scheduled-runway-arrival-time>
297
+ <scheduled-runway-departure-time type="datetime">2010-02-26T07:23:00Z</scheduled-runway-departure-time>
298
+ <status>Scheduled</status>
299
+ <status-code>S</status-code>
300
+ <tail-number nil="true"/>
301
+ <updated-at type="datetime">2010-02-26 06:32:46 UTC</updated-at>
302
+ <predictions>
303
+ <prediction>
304
+ <state>delayed</state>
305
+ <chance>0.009502263</chance>
306
+ <minutes>50</minutes>
307
+ </prediction>
308
+ <prediction>
309
+ <state>delayed</state>
310
+ <chance>0.75927603</chance>
311
+ <minutes>0</minutes>
312
+ </prediction>
313
+ <prediction>
314
+ <state>delayed</state>
315
+ <chance>0.028506787</chance>
316
+ <minutes>60</minutes>
317
+ </prediction>
318
+ <prediction>
319
+ <state>delayed</state>
320
+ <chance>0.10723982</chance>
321
+ <minutes>10</minutes>
322
+ </prediction>
323
+ <prediction>
324
+ <state>delayed</state>
325
+ <chance>0.053393666</chance>
326
+ <minutes>20</minutes>
327
+ </prediction>
328
+ <prediction>
329
+ <state>delayed</state>
330
+ <chance>0.028054299</chance>
331
+ <minutes>30</minutes>
332
+ </prediction>
333
+ <prediction>
334
+ <state>delayed</state>
335
+ <chance>0.014027149</chance>
336
+ <minutes>40</minutes>
337
+ </prediction>
338
+ </predictions>
339
+ </flight>
340
+ <flight>
341
+ <actual-air-time type="integer">313</actual-air-time>
342
+ <actual-aircraft-type nil="true"/>
343
+ <actual-block-time nil="true" type="integer"/>
344
+ <actual-gate-arrival-time type="datetime">2010-02-25T12:46:00Z</actual-gate-arrival-time>
345
+ <actual-gate-departure-time type="datetime">2010-02-25T07:13:00Z</actual-gate-departure-time>
346
+ <actual-runway-arrival-time type="datetime">2010-02-25T12:39:59Z</actual-runway-arrival-time>
347
+ <actual-runway-departure-time type="datetime">2010-02-25T07:26:04Z</actual-runway-departure-time>
348
+ <airline-icao-id>VRD</airline-icao-id>
349
+ <arrival-gate nil="true"/>
350
+ <arrival-terminal>4</arrival-terminal>
351
+ <arrival-time type="datetime">2010-02-25T12:45:00Z</arrival-time>
352
+ <baggage-claim nil="true"/>
353
+ <codeshares/>
354
+ <created-at type="datetime">2010-02-21 08:11:34 UTC</created-at>
355
+ <departure-gate>A3</departure-gate>
356
+ <departure-terminal>I</departure-terminal>
357
+ <departure-time type="datetime">2010-02-25T07:15:00Z</departure-time>
358
+ <destination-icao-id>KJFK</destination-icao-id>
359
+ <diverted-icao-id nil="true"/>
360
+ <estimated-gate-arrival-time type="datetime">2010-02-25T12:40:00Z</estimated-gate-arrival-time>
361
+ <estimated-gate-departure-time type="datetime">2010-02-25T07:15:00Z</estimated-gate-departure-time>
362
+ <estimated-runway-arrival-time type="datetime">2010-02-25T12:37:00Z</estimated-runway-arrival-time>
363
+ <estimated-runway-departure-time type="datetime">2010-02-25T07:26:00Z</estimated-runway-departure-time>
364
+ <flightstats-id>184622510</flightstats-id>
365
+ <id type="integer">2749039</id>
366
+ <local-departure-time type="datetime">2010-02-24 23:15:00 UTC</local-departure-time>
367
+ <number type="integer">28</number>
368
+ <origin-icao-id>KSFO</origin-icao-id>
369
+ <published-arrival-time type="datetime">2010-02-25T12:45:00Z</published-arrival-time>
370
+ <published-departure-time type="datetime">2010-02-25T07:15:00Z</published-departure-time>
371
+ <scheduled-air-time type="integer">318</scheduled-air-time>
372
+ <scheduled-aircraft-type>319</scheduled-aircraft-type>
373
+ <scheduled-block-time type="integer">333</scheduled-block-time>
374
+ <scheduled-gate-arrival-time type="datetime">2010-02-25T12:45:00Z</scheduled-gate-arrival-time>
375
+ <scheduled-gate-departure-time type="datetime">2010-02-25T07:15:00Z</scheduled-gate-departure-time>
376
+ <scheduled-runway-arrival-time type="datetime">2010-02-25T12:44:00Z</scheduled-runway-arrival-time>
377
+ <scheduled-runway-departure-time type="datetime">2010-02-25T07:26:00Z</scheduled-runway-departure-time>
378
+ <status>Landed</status>
379
+ <status-code>L</status-code>
380
+ <tail-number nil="true"/>
381
+ <updated-at type="datetime">2010-02-25 13:02:03 UTC</updated-at>
382
+ <predictions>
383
+ <prediction>
384
+ <state>delayed</state>
385
+ <chance>0.005966128</chance>
386
+ <minutes>50</minutes>
387
+ </prediction>
388
+ <prediction>
389
+ <state>delayed</state>
390
+ <chance>0.86425453</chance>
391
+ <minutes>0</minutes>
392
+ </prediction>
393
+ <prediction>
394
+ <state>delayed</state>
395
+ <chance>0.016551193</chance>
396
+ <minutes>60</minutes>
397
+ </prediction>
398
+ <prediction>
399
+ <state>delayed</state>
400
+ <chance>0.06607647</chance>
401
+ <minutes>10</minutes>
402
+ </prediction>
403
+ <prediction>
404
+ <state>delayed</state>
405
+ <chance>0.029638182</chance>
406
+ <minutes>20</minutes>
407
+ </prediction>
408
+ <prediction>
409
+ <state>delayed</state>
410
+ <chance>0.0093020275</chance>
411
+ <minutes>30</minutes>
412
+ </prediction>
413
+ <prediction>
414
+ <state>delayed</state>
415
+ <chance>0.008211445</chance>
416
+ <minutes>40</minutes>
417
+ </prediction>
418
+ </predictions>
419
+ </flight>
420
+ </flights>
421
+