vatbook 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.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/CONTRIBUTING.md ADDED
@@ -0,0 +1,8 @@
1
+ # Contributing to vatbook
2
+
3
+ 1. Fork it
4
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
5
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
6
+ 4. Make sure all tests are passing!
7
+ 5. Push to the branch (`git push origin my-new-feature`)
8
+ 6. Create new Pull Request
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in vatbook.gemspec
4
+ gemspec
data/Guardfile ADDED
@@ -0,0 +1,5 @@
1
+ guard 'rspec', :version => 2 do
2
+ watch(%r{^spec/.+_spec\.rb$})
3
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
4
+ watch('spec/spec_helper.rb') { "spec" }
5
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Svilen Vassilev
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,143 @@
1
+ # Vatbook
2
+
3
+ Ruby API to the Vatbook service for reading and parsing Vatsim pilot and ATC bookings.
4
+ Booking query requests are made by FIR and individual bookings are returned as
5
+ objects, exposing a rich set of attributes. Supports excluding enroute pilot bookings.
6
+ Supports pulling pilot and atc bookings separately or as a combined hash.
7
+
8
+ [![Build Status](https://secure.travis-ci.org/tarakanbg/vatbook.png?branch=master)](http://travis-ci.org/tarakanbg/vatbook)
9
+ [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/tarakanbg/vatbook)
10
+ <!-- [![Gemnasium](https://gemnasium.com/tarakanbg/vatbook.png?travis)](https://gemnasium.com/tarakanbg/vatbook) -->
11
+
12
+
13
+ ## Installation
14
+
15
+ Add this line to your application's Gemfile:
16
+
17
+ gem 'vatbook'
18
+
19
+ And then execute:
20
+
21
+ $ bundle
22
+
23
+ Or install it yourself as:
24
+
25
+ $ gem install vatbook
26
+
27
+ ## Usage
28
+
29
+ This gem provides one public method: `vatbook`, which can be applied to
30
+ any string (or variable containing a string) representing a full or partial FIR
31
+ ICAO code.
32
+
33
+ For example if you want to retrieve all active stations (ATC positions and pilots)
34
+ for Bosnia-Herzegovina FIR (ICAO: LQSB), then you can use:
35
+
36
+ ```ruby
37
+ # Attaching the method directly to a string:
38
+ "LQSB".vatbook
39
+
40
+ # Attaching the method to a variable containing a string:
41
+ fir = "LQSB"
42
+ fir.vatbook
43
+ ```
44
+
45
+ ### Anatomy of method returns
46
+
47
+ The `vatbook` method returns a **hash** of 2 elements: 1) the matching *atc*
48
+ bookings, 2) all matching *pilots* bookings. Each of those is an **array**, cosnsisting of
49
+ station **objects**. Each of these objects includes a number of **attributes**:
50
+
51
+ ```ruby
52
+ fir.vatbook # => {:atc => [a1, a2, a3 ...], :pilots => [p1, p2, p3, p4 ...]}
53
+
54
+ fir.vatbook[:atc] #=> [a1, a2, a3 ...]
55
+ fir.vatbook[:pilots] #=> [p1, p2, p3 ...]
56
+
57
+ fir.vatbook[:atc].first #=> a1
58
+ fir.vatbook[:pilots].first #=> p1
59
+
60
+ a1.callsign #=> "LQSA_APP"
61
+ a1.name #=> "Svilen Vassilev"
62
+ a1.cid #=> "1175035"
63
+ a1.start #=> "2012-10-08 08:00:00"
64
+ a1.end #=> "2012-10-08 10:00:00"
65
+
66
+ ...
67
+
68
+ p1.callsign #=> "ACH217S"
69
+ p1.name #=> "Dragomir Andonovic"
70
+ p1.cid #=> "931960"
71
+ p1.dep #=> "LQSA"
72
+ p1.arr #=> "LDSP"
73
+ p1.route #=> "VRANA L5 KENEM"
74
+ p1.aircraft #=> "AT72"
75
+ ...
76
+ ```
77
+
78
+ ### Station attributes
79
+
80
+ Here's a complete list of the station object attributes that can be accessed:
81
+
82
+ #### Common attributes for atc and pilots:
83
+
84
+ * `cid` (VATSIM ID)
85
+ * `callsign`
86
+ * `name`
87
+ * `role` (atc or pilot)
88
+ * `fir` (the FIR ICAO used in the request)
89
+ * `start` (planned start time)
90
+ * `end` (planned end time)
91
+
92
+ #### Pilot specific attributes
93
+
94
+ * `dep` (planned departure airport)
95
+ * `arr` (planned destination airport)
96
+ * `route` (planned route)
97
+ * `aircraft` (planned aircraft type)
98
+ * `enroute` (boolean, whether or not the flight is enroute for the FIR)
99
+
100
+ ### Customizing the request
101
+
102
+ The `vatbook` method can be customized by passing in a hash-style collection
103
+ of arguments. The currently supported arguments and their defaults are:
104
+
105
+ ```ruby
106
+ :enroute => true # Possible values: true, false. Default: true
107
+ ```
108
+ The `:enroute => false` option can be used to exclude all booked flights that
109
+ are enroute for the selected FIR, i.e. don't originate or end on one of the FIR's
110
+ airports. Example:
111
+
112
+ ```ruby
113
+ # Lets exclude all enroute pilot bookings for LQSB FIR and only display bookings
114
+ # that are outbound/inbound one of Bosnia-Herzegovina airports:
115
+
116
+ "LQSB".vatbook(:enroute => false) #=> [pilot1, pilot2, pilot3...]
117
+ ```
118
+
119
+ ## Changelog
120
+
121
+ ### v. 0.1 - 22 October 2012
122
+
123
+ * Initial release
124
+
125
+ ## Contributing
126
+
127
+ 1. Fork it
128
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
129
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
130
+ 4. Push to the branch (`git push origin my-new-feature`)
131
+ 5. Make sure all tests pass
132
+ 6. Create new Pull Request
133
+
134
+ ## Credits
135
+
136
+ Copyright © 2012 [Svilen Vassilev](http://about.me/svilen)
137
+
138
+ *If you find my work useful or time-saving, you can endorse it or buy me a beer:*
139
+
140
+ [![endorse](http://api.coderwall.com/svilenv/endorse.png)](http://coderwall.com/svilenv)
141
+ [![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donate_SM.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=5FR7AQA4PLD8A)
142
+
143
+ Released under the [MIT LICENSE](https://github.com/tarakanbg/vatbook/blob/master/LICENSE.txt)
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
3
+ require 'rspec/core/rake_task'
4
+
5
+ RSpec::Core::RakeTask.new(:spec)
6
+
7
+ task default: :spec
data/lib/vatbook.rb ADDED
@@ -0,0 +1,119 @@
1
+ require "vatbook/version"
2
+
3
+ class String
4
+ def vatbook(args={})
5
+ Vatbook.bookings(self, args)
6
+ end
7
+ end
8
+
9
+ module Vatbook
10
+ def self.bookings(fir, args)
11
+ BookFetcher.new(fir, args).fetch
12
+ end
13
+
14
+ class BookFetcher
15
+ require 'nokogiri'
16
+ require 'open-uri'
17
+
18
+ attr_accessor :fir, :atc_bookings, :pilot_bookings, :enroute, :doc
19
+
20
+ def initialize(fir, args = nil)
21
+ @fir = fir.upcase
22
+ @enroute = true
23
+ process_arguments(args) if args.class == Hash
24
+ @atc_bookings = []; @pilot_bookings = [];
25
+ @doc = raw_list
26
+ atcs
27
+ pilots
28
+ end
29
+
30
+ def raw_list
31
+ Nokogiri::XML(open("http://vatbook.euroutepro.com/xml2.php?fir=#{@fir}"))
32
+ end
33
+
34
+ def fetch
35
+ {:atc => atc_bookings, :pilots => pilot_bookings}
36
+ end
37
+
38
+ def atc_bookings
39
+ @atc_bookings
40
+ end
41
+
42
+ def pilot_bookings
43
+ @pilot_bookings
44
+ end
45
+
46
+ def atcs_count
47
+ @doc.css("atcs booking").count
48
+ end
49
+
50
+ def pilots_count
51
+ @doc.css("pilots booking").count
52
+ end
53
+
54
+ private
55
+
56
+ def atcs
57
+ @doc.css("atcs booking").each do |booking|
58
+ @atc_bookings << Booking.new(booking, role = "atc", @fir)
59
+ end
60
+ end
61
+
62
+ def pilots
63
+ @doc.css("pilots booking").each do |booking|
64
+ if @enroute == false
65
+ bk = Booking.new(booking, role = "pilot", @fir)
66
+ if bk.enroute == false
67
+ @pilot_bookings << bk
68
+ end
69
+ else
70
+ @pilot_bookings << Booking.new(booking, role = "pilot", @fir)
71
+ end
72
+ end
73
+ end
74
+
75
+ def process_arguments(args)
76
+ args[:enroute] == false ? @enroute = false : @enroute = true
77
+ end
78
+
79
+ end
80
+
81
+ class Booking
82
+ require 'nokogiri'
83
+
84
+ attr_accessor :role, :callsign, :name, :cid, :start, :end, :dep, :arr
85
+ attr_accessor :aircraft, :route, :enroute, :fir
86
+
87
+
88
+ def initialize(booking, role, fir)
89
+ @fir = fir
90
+ @role = role
91
+ @callsign = booking.children.css("callsign").first.children.to_s
92
+ @name = booking.children.css("name").first.children.to_s
93
+ @role == "atc" ? @cid = booking.children.css("cid").first.children.to_s : @cid = booking.children.css("pid").first.children.to_s
94
+ if @role == "atc"
95
+ @start = booking.children.css("time_start").first.children.to_s
96
+ @end = booking.children.css("time_end").first.children.to_s
97
+ elsif @role == "pilot"
98
+ @dep = booking.children.css("dep").first.children.to_s
99
+ @arr = booking.children.css("arr").first.children.to_s
100
+ @route = booking.children.css("route").first.children.to_s.gsub(/[\n]/, ' ').strip
101
+ @start = booking.children.css("from").first.children.to_s
102
+ @end = booking.children.css("to").first.children.to_s
103
+ @aircraft = booking.children.css("actype").first.children.to_s
104
+ check_enroute
105
+ end
106
+ end
107
+
108
+ private
109
+ def check_enroute
110
+ if @fir[0..1] == @dep[0..1] or @fir[0..1] == @arr[0..1]
111
+ @enroute = false
112
+ else
113
+ @enroute = true
114
+ end
115
+ end
116
+
117
+ end
118
+
119
+ end
@@ -0,0 +1,3 @@
1
+ module Vatbook
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,9 @@
1
+ require 'vatbook'
2
+
3
+ module Vatbook
4
+ class BookFetcher
5
+ def raw_list
6
+ Nokogiri::XML(open("spec/xml2.xml"))
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,99 @@
1
+ require 'spec_helper.rb'
2
+
3
+ describe String do
4
+
5
+ describe "fir" do
6
+ it "should work :)" do
7
+ "LQSB".vatbook.count.should eq(2)
8
+ "LQSB".vatbook[:atc].count.should eq(207)
9
+ "LQSB".vatbook[:pilots].count.should eq(2)
10
+ "lqsb".vatbook[:atc].count.should eq(207)
11
+ "lqsb".vatbook[:pilots].count.should eq(2)
12
+ end
13
+
14
+ it "should contain attributes" do
15
+ "LQSB".vatbook[:atc].first.role.should eq("atc")
16
+ "LQSB".vatbook[:atc].first.callsign.should eq("LFMN_TWR")
17
+ "LQSB".vatbook[:atc].first.name.should eq("Tomba Quentin")
18
+ "LQSB".vatbook[:atc].first.cid.should eq("1227003")
19
+ "LQSB".vatbook[:atc].first.start.should eq("2012-10-08 08:00:00")
20
+ "LQSB".vatbook[:atc].first.end.should eq("2012-10-08 10:00:00")
21
+ "LQSB".vatbook[:pilots].first.role.should eq("pilot")
22
+ "LQSB".vatbook[:pilots].first.callsign.should eq("KLM112")
23
+ end
24
+ end
25
+
26
+ end
27
+
28
+ describe Vatbook do
29
+
30
+ describe "vatsim_online" do
31
+ it "should work :)" do
32
+ end
33
+ end
34
+
35
+ end
36
+
37
+
38
+ describe Vatbook::BookFetcher do
39
+ describe "atcs count" do
40
+ it "should return correct count" do
41
+ icao = "LQSB"
42
+ Vatbook::BookFetcher.new(icao).atcs_count.should eq(207)
43
+ Vatbook::BookFetcher.new(icao).pilots_count.should eq(2)
44
+ end
45
+ end
46
+
47
+ describe "pilot bookings" do
48
+ it "should parse pilot attributes" do
49
+ icao = "LQSB"
50
+ Vatbook::BookFetcher.new(icao).pilot_bookings.first.role.should eq("pilot")
51
+ Vatbook::BookFetcher.new(icao).pilot_bookings.first.callsign.should eq("KLM112")
52
+ Vatbook::BookFetcher.new(icao).pilot_bookings.first.name.should eq("Edwin Middelaar EHAM")
53
+ Vatbook::BookFetcher.new(icao).pilot_bookings.first.cid.should eq("931960")
54
+ Vatbook::BookFetcher.new(icao).pilot_bookings.first.route.should eq("OTREX UM872 PLH UB1 DDM UM619 YNN UL604 BIGGE T281 NORKU")
55
+ Vatbook::BookFetcher.new(icao).pilot_bookings.first.dep.should eq("LGIR")
56
+ Vatbook::BookFetcher.new(icao).pilot_bookings.first.arr.should eq("EHAM")
57
+ Vatbook::BookFetcher.new(icao).pilot_bookings.first.aircraft.should eq("B738")
58
+ Vatbook::BookFetcher.new(icao).pilot_bookings.first.fir.should eq("LQSB")
59
+ Vatbook::BookFetcher.new(icao).pilot_bookings.first.enroute.should eq(true)
60
+ end
61
+
62
+ it "should identify enroutes" do
63
+ icao = "LQSB"
64
+ Vatbook::BookFetcher.new(icao).pilot_bookings.last.role.should eq("pilot")
65
+ Vatbook::BookFetcher.new(icao).pilot_bookings.last.callsign.should eq("KLM113")
66
+ Vatbook::BookFetcher.new(icao).pilot_bookings.last.name.should eq("Edwin Middelaar EHAM")
67
+ Vatbook::BookFetcher.new(icao).pilot_bookings.last.cid.should eq("931960")
68
+ Vatbook::BookFetcher.new(icao).pilot_bookings.last.route.should eq("OTREX UM872 PLH UB1 DDM UM619 YNN UL604 BIGGE T281 NORKU")
69
+ Vatbook::BookFetcher.new(icao).pilot_bookings.last.dep.should eq("LGIR")
70
+ Vatbook::BookFetcher.new(icao).pilot_bookings.last.arr.should eq("LQSA")
71
+ Vatbook::BookFetcher.new(icao).pilot_bookings.last.aircraft.should eq("B738")
72
+ Vatbook::BookFetcher.new(icao).pilot_bookings.last.fir.should eq("LQSB")
73
+ Vatbook::BookFetcher.new(icao).pilot_bookings.last.enroute.should eq(false)
74
+ end
75
+
76
+ it "should handle enroute hash options" do
77
+ icao = "LQSB"
78
+ args = {:enroute => true}
79
+ Vatbook::BookFetcher.new(icao, args).pilot_bookings.count.should eq(2)
80
+ Vatbook::BookFetcher.new(icao, args).pilot_bookings.first.arr.should eq("EHAM")
81
+ args = {:enroute => false}
82
+ Vatbook::BookFetcher.new(icao, args).pilot_bookings.count.should eq(1)
83
+ Vatbook::BookFetcher.new(icao, args).pilot_bookings.first.arr.should eq("LQSA")
84
+ end
85
+ end
86
+
87
+ describe "atc bookings" do
88
+ it "should parse atc attributes" do
89
+ icao = "LQSB"
90
+ Vatbook::BookFetcher.new(icao).atc_bookings.first.role.should eq("atc")
91
+ Vatbook::BookFetcher.new(icao).atc_bookings.first.fir.should eq("LQSB")
92
+ Vatbook::BookFetcher.new(icao).atc_bookings.first.callsign.should eq("LFMN_TWR")
93
+ Vatbook::BookFetcher.new(icao).atc_bookings.first.name.should eq("Tomba Quentin")
94
+ Vatbook::BookFetcher.new(icao).atc_bookings.first.cid.should eq("1227003")
95
+ Vatbook::BookFetcher.new(icao).atc_bookings.first.start.should eq("2012-10-08 08:00:00")
96
+ Vatbook::BookFetcher.new(icao).atc_bookings.first.end.should eq("2012-10-08 10:00:00")
97
+ end
98
+ end
99
+ end