flightcaster 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
+