suitcase 1.4.1 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -52,7 +52,7 @@
52
52
  # Public: A Class representing a single Hotel. It provides methods for
53
53
  # all Hotel EAN-related queries in the gem.
54
54
  class Hotel
55
- extend Suitcase::Helpers
55
+ extend Helpers
56
56
 
57
57
  # Public: The Amenities that can be passed in to searches, and are returned
58
58
  # from many queries.
@@ -1,9 +1,8 @@
1
1
  module Suitcase
2
2
  class Hotel
3
3
  class Location
4
- extend Suitcase::Helpers
5
-
6
- attr_accessor :destination_id, :type, :active, :city, :province, :country, :country_code
4
+ attr_accessor :destination_id, :type, :active, :city, :province,
5
+ :country, :country_code
7
6
 
8
7
  def initialize(info)
9
8
  info.each do |k, v|
@@ -12,12 +11,22 @@ module Suitcase
12
11
  end
13
12
 
14
13
  class << self
14
+ include Helpers
15
+
16
+ # Public: Find a Location.
17
+ #
18
+ # info - A Hash of information to search by, including city & address.
19
+ #
20
+ # Returns an Array of Location's.
15
21
  def find(info)
16
22
  params = {}
17
23
  [:city, :address].each do |dup|
18
24
  params[dup] = info[dup] if info[dup]
19
25
  end
20
- params[:destinationString] = info[:destination_string]
26
+ if info[:destination_string]
27
+ params[:destinationString] = info[:destination_string]
28
+ end
29
+
21
30
  if Configuration.cache? and Configuration.cache.cached?(:geoSearch, params)
22
31
  raw = Configuration.cache.get_query(:geoSearch, params)
23
32
  else
@@ -25,12 +34,22 @@ module Suitcase
25
34
  raw = parse_response(url)
26
35
  handle_errors(raw)
27
36
  end
37
+
28
38
  parse(raw)
29
39
  end
30
40
 
31
41
  def parse(raw)
32
42
  [raw["LocationInfoResponse"]["LocationInfos"]["LocationInfo"]].flatten.map do |raw|
33
- Location.new(:province => raw["stateProvinceCode"], :destination_id => raw["destinationId"], :type => raw["type"], :city => raw["city"], :active => raw["active"], :code => raw["code"], :country => raw["country"], :country_code => raw["countryCode"])
43
+ Location.new(
44
+ province: raw["stateProvinceCode"],
45
+ destination_id: raw["destinationId"],
46
+ type: raw["type"],
47
+ city: raw["city"],
48
+ active: raw["active"],
49
+ code: raw["code"],
50
+ country: raw["country"],
51
+ country_code: raw["countryCode"]
52
+ )
34
53
  end
35
54
  end
36
55
 
@@ -39,6 +58,7 @@ module Suitcase
39
58
  if info[key] && info[key]["EanWsError"]
40
59
  message = info[key]["EanWsError"]["presentationMessage"]
41
60
  end
61
+
42
62
  raise EANException.new(message) if message
43
63
  end
44
64
  end
@@ -2,10 +2,13 @@ module Suitcase
2
2
  class NightlyRate
3
3
  attr_accessor :promo, :rate, :base_rate
4
4
 
5
+ # Internal: Create a NightlyRate from the API response.
6
+ #
7
+ # info - A Hash from the API response containing nightly rate information.
5
8
  def initialize(info)
6
- promo = info["@promo"]
7
- promo = info["@rate"]
8
- promo = info["@baseRate"]
9
+ @promo = info["@promo"]
10
+ @rate = info["@rate"]
11
+ @base_rate = info["@baseRate"]
9
12
  end
10
13
  end
11
14
  end
@@ -1,30 +1,41 @@
1
1
  module Suitcase
2
- class PaymentOption
3
- attr_accessor :code, :name
4
- extend Suitcase::Helpers
2
+ class Hotel
3
+ class PaymentOption
4
+ attr_accessor :code, :name
5
5
 
6
- def initialize(code, name)
7
- @code = code
8
- @name = name
9
- end
6
+ extend Helpers
10
7
 
11
- def self.find(info)
12
- params = { "currencyCode" => info[:currency_code] }
13
- if Configuration.cache? and Configuration.cache.cached?(:paymentInfo, params)
14
- types_raw = Configuration.cache.get_query(:paymentInfo, params)
15
- else
16
- types_raw = parse_response(url(:method => "paymentInfo", :params => params, :session => info[:session]))
17
- Configuration.cache.save_query(:paymentInfo, params, types_raw) if Configuration.cache?
8
+ # Internal: Create a PaymentOption.
9
+ #
10
+ # code - The String code from the API response (e.g. "VI").
11
+ # name - The String name of the PaymentOption.
12
+ def initialize(code, name)
13
+ @code, @name = code, name
18
14
  end
19
- options = []
20
- types_raw["HotelPaymentResponse"].each do |raw|
21
- types = raw[0] != "PaymentType" ? [] : raw[1]
22
- types.each do |type|
23
- options.push PaymentOption.new(type["code"], type["name"])
15
+
16
+ # Public: Find PaymentOptions for a specific currency.
17
+ #
18
+ # info - A Hash of information with one key: :currency_code.
19
+ #
20
+ # Returns an Array of PaymentOption's.
21
+ def self.find(info)
22
+ params = { "currencyCode" => info[:currency_code] }
23
+
24
+ if Configuration.cache? and Configuration.cache.cached?(:paymentInfo, params)
25
+ types_raw = Configuration.cache.get_query(:paymentInfo, params)
26
+ else
27
+ types_raw = parse_response(url(:method => "paymentInfo", :params => params, :session => info[:session]))
28
+ Configuration.cache.save_query(:paymentInfo, params, types_raw) if Configuration.cache?
24
29
  end
30
+ update_session(types_raw, info[:session])
31
+
32
+ types_raw["HotelPaymentResponse"].map do |raw|
33
+ types = raw[0] != "PaymentType" ? [] : raw[1]
34
+ types.map do |type|
35
+ PaymentOption.new(type["code"], type["name"])
36
+ end
37
+ end.flatten
25
38
  end
26
- update_session(types_raw, info[:session])
27
- options
28
39
  end
29
40
  end
30
- end
41
+ end
@@ -1,9 +1,14 @@
1
1
  module Suitcase
2
- class Reservation
3
- attr_accessor :itinerary_id, :confirmation_numbers
2
+ class Hotel
3
+ class Reservation
4
+ attr_accessor :itinerary_id, :confirmation_numbers
4
5
 
5
- def initialize(info)
6
- @itinerary_id, @confirmation_numbers = info[:itinerary_id], [info[:confirmation_numbers]].flatten
6
+ # Internal: Create a new Reservation from the API response.
7
+ #
8
+ # info - The Hash of information returned from the API.
9
+ def initialize(info)
10
+ @itinerary_id, @confirmation_numbers = info[:itinerary_id], [info[:confirmation_numbers]].flatten
11
+ end
7
12
  end
8
13
  end
9
14
  end
@@ -1,77 +1,94 @@
1
1
  module Suitcase
2
- class Room
3
- attr_accessor :rate_key, :hotel_id, :supplier_type, :rate_code,
4
- :room_type_code, :supplier_type, :tax_rate, :non_refundable,
5
- :occupancy, :quoted_occupancy, :min_guest_age, :total,
6
- :surcharge_total, :nightly_rate_total, :average_base_rate,
7
- :average_rate, :max_nightly_rate, :currency_code, :value_adds,
8
- :room_type_description, :price_breakdown, :total_price,
9
- :average_nightly_rate, :promo, :arrival, :departure, :rooms,
10
- :bed_types
2
+ class Hotel
3
+ class Room
4
+ attr_accessor :rate_key, :hotel_id, :supplier_type, :rate_code,
5
+ :room_type_code, :supplier_type, :tax_rate, :non_refundable,
6
+ :occupancy, :quoted_occupancy, :min_guest_age, :total,
7
+ :surcharge_total, :nightly_rate_total, :average_base_rate,
8
+ :average_rate, :max_nightly_rate, :currency_code, :value_adds,
9
+ :room_type_description, :price_breakdown, :total_price,
10
+ :average_nightly_rate, :promo, :arrival, :departure, :rooms,
11
+ :bed_types
11
12
 
12
- extend Suitcase::Helpers
13
+ extend Helpers
13
14
 
14
- def initialize(info)
15
- info.each do |k, v|
16
- instance_variable_set("@" + k.to_s, v)
15
+ # Internal: Create a new Room from within a Room search query.
16
+ #
17
+ # info - A Hash of parsed information from the API, with any of the keys
18
+ # from the attr_accessor's list.
19
+ def initialize(info)
20
+ info.each do |k, v|
21
+ instance_variable_set("@" + k.to_s, v)
22
+ end
17
23
  end
18
- end
19
24
 
20
- def reserve!(info)
21
- params = {}
22
- params["hotelId"] = @hotel_id
23
- params["arrivalDate"] = @arrival
24
- params["departureDate"] = @departure
25
- params["supplierType"] = @supplier_type
26
- params["rateKey"] = @rate_key
27
- params["rateTypeCode"] = @room_type_code
28
- params["rateCode"] = @rate_code
29
- params["roomTypeCode"] = @room_type_code
30
- params["chargeableRate"] = chargeable_rate
31
- params["email"] = info[:email]
32
- params["firstName"] = info[:first_name]
33
- params["lastName"] = info[:last_name]
34
- params["homePhone"] = info[:home_phone]
35
- params["workPhone"] = info[:work_phone] if info[:work_phone]
36
- params["extension"] = info[:work_phone_extension] if info[:work_phone_extension]
37
- params["faxPhone"] = info[:fax_phone] if info[:fax_phone]
38
- params["companyName"] = info[:company_name] if info[:company_name]
39
- params["emailIntineraryList"] = info[:additional_emails].join(",") if info[:additional_emails]
40
- params["creditCardType"] = info[:payment_option].code
41
- params["creditCardNumber"] = info[:credit_card_number]
42
- params["creditCardIdentifier"] = info[:credit_card_verification_code]
43
- expiration_date = Date._parse(info[:credit_card_expiration_date])
44
- params["creditCardExpirationMonth"] = (expiration_date[:mon].to_s.length == 1 ? "0" + expiration_date[:mon].to_s : expiration_date[:mon].to_s)
45
- params["creditCardExpirationYear"] = expiration_date[:year].to_s
46
- params["address1"] = info[:address1]
47
- params["address2"] = info[:address2] if info[:address2]
48
- params["address3"] = info[:address3] if info[:address3]
49
- params["city"] = info[:city]
50
- @rooms.each_with_index do |room, index|
51
- index += 1
52
- params["room#{index}"] = "#{room[:adults].to_s},#{room[:children_ages].join(",")}"
53
- params["room#{index}FirstName"] = room[:first_name] || params["firstName"] # defaults to the billing
54
- params["room#{index}LastName"] = room[:last_name] || params["lastName"] # person's name
55
- params["room#{index}BedTypeId"] = room[:bed_type].id
56
- params["room#{index}SmokingPreference"] = room[:smoking_preference] or "E"
25
+ # Public: Reserve a room.
26
+ #
27
+ # info - A Hash of the information described on the Suitcase
28
+ # [wiki](http://github.com/thoughtfusion/suitcase/wiki/User-flow).
29
+ #
30
+ # Returns a Suitcase::Reservation.
31
+ def reserve!(info)
32
+ params = {}
33
+ params["hotelId"] = @hotel_id
34
+ params["arrivalDate"] = @arrival
35
+ params["departureDate"] = @departure
36
+ params["supplierType"] = @supplier_type
37
+ params["rateKey"] = @rate_key
38
+ params["rateTypeCode"] = @room_type_code
39
+ params["rateCode"] = @rate_code
40
+ params["roomTypeCode"] = @room_type_code
41
+ params["chargeableRate"] = chargeable_rate
42
+ params["email"] = info[:email]
43
+ params["firstName"] = info[:first_name]
44
+ params["lastName"] = info[:last_name]
45
+ params["homePhone"] = info[:home_phone]
46
+ params["workPhone"] = info[:work_phone] if info[:work_phone]
47
+ params["extension"] = info[:work_phone_extension] if info[:work_phone_extension]
48
+ params["faxPhone"] = info[:fax_phone] if info[:fax_phone]
49
+ params["companyName"] = info[:company_name] if info[:company_name]
50
+ params["emailIntineraryList"] = info[:additional_emails].join(",") if info[:additional_emails]
51
+ params["creditCardType"] = info[:payment_option].code
52
+ params["creditCardNumber"] = info[:credit_card_number]
53
+ params["creditCardIdentifier"] = info[:credit_card_verification_code]
54
+ expiration_date = Date._parse(info[:credit_card_expiration_date])
55
+ params["creditCardExpirationMonth"] = (expiration_date[:mon].to_s.length == 1 ? "0" + expiration_date[:mon].to_s : expiration_date[:mon].to_s)
56
+ params["creditCardExpirationYear"] = expiration_date[:year].to_s
57
+ params["address1"] = info[:address1]
58
+ params["address2"] = info[:address2] if info[:address2]
59
+ params["address3"] = info[:address3] if info[:address3]
60
+ params["city"] = info[:city]
61
+ @rooms.each_with_index do |room, index|
62
+ index += 1
63
+ params["room#{index}"] = "#{room[:adults].to_s},#{room[:children_ages].join(",")}"
64
+ params["room#{index}FirstName"] = room[:first_name] || params["firstName"] # defaults to the billing
65
+ params["room#{index}LastName"] = room[:last_name] || params["lastName"] # person's name
66
+ params["room#{index}BedTypeId"] = room[:bed_type].id
67
+ params["room#{index}SmokingPreference"] = room[:smoking_preference] or "E"
68
+ end
69
+ params["stateProvinceCode"] = info[:province]
70
+ params["countryCode"] = info[:country]
71
+ params["postalCode"] = info[:postal_code]
72
+
73
+ uri = Room.url :method => "res", :params => params, :include_key => true, :include_cid => true, :secure => true
74
+ session = Patron::Session.new
75
+ session.timeout = 30000
76
+ session.base_url = "https://" + uri.host
77
+ res = session.post uri.request_uri, {}
78
+ parsed = JSON.parse res.body
79
+
80
+ Reservation.new(itinerary_id: parsed["HotelRoomReservationResponse"]["itineraryId"], confirmation_numbers: parsed["HotelRoomReservationResponse"]["confirmationNumbers"])
57
81
  end
58
- params["stateProvinceCode"] = info[:province]
59
- params["countryCode"] = info[:country]
60
- params["postalCode"] = info[:postal_code]
61
- uri = Room.url :method => "res", :params => params, :include_key => true, :include_cid => true, :secure => true
62
- session = Patron::Session.new
63
- session.timeout = 30000
64
- session.base_url = "https://" + uri.host
65
- res = session.post uri.request_uri, {}
66
- parsed = JSON.parse res.body
67
- Reservation.new(itinerary_id: parsed["HotelRoomReservationResponse"]["itineraryId"], confirmation_numbers: parsed["HotelRoomReservationResponse"]["confirmationNumbers"])
68
- end
69
82
 
70
- def chargeable_rate
71
- if @supplier_type == "E"
72
- @total_price
73
- else
74
- @max_nightly_rate
83
+ # Public: The chargeable rate for the Hotel room.
84
+ #
85
+ # Returns the chargeable rate for the Room.
86
+ def chargeable_rate
87
+ if @supplier_type == "E"
88
+ @total_price
89
+ else
90
+ @max_nightly_rate
91
+ end
75
92
  end
76
93
  end
77
94
  end
@@ -0,0 +1,7 @@
1
+ module Suitcase
2
+ class Hotel
3
+ # Public: Hold user session data. A simple Struct provided to be passed in
4
+ # to some of the EAN methods.
5
+ Session = Struct.new(:id, :user_agent, :ip_address, :locale, :currency_code)
6
+ end
7
+ end
@@ -1,3 +1,3 @@
1
1
  module Suitcase
2
- VERSION = "1.4.1"
2
+ VERSION = "1.5.0"
3
3
  end
@@ -1,23 +1,23 @@
1
1
  require "minitest_helper"
2
2
 
3
- describe Suitcase::Amenity do
3
+ describe Suitcase::Hotel::Amenity do
4
4
  describe ".parse_mask" do
5
5
  describe "when provided bitmask is not nil or 0" do
6
6
  it "returns an Array of Symbols representing given Amenities" do
7
- Suitcase::Amenity.parse_mask(5).must_equal [:business_services, :hot_tub]
7
+ Suitcase::Hotel::Amenity.parse_mask(5).must_equal [:business_services, :hot_tub]
8
8
  end
9
9
  end
10
10
 
11
11
  describe "when bitmask is 0" do
12
12
  it "returns an empty Array" do
13
- Suitcase::Amenity.parse_mask(0).must_equal []
13
+ Suitcase::Hotel::Amenity.parse_mask(0).must_equal []
14
14
  end
15
15
  end
16
16
 
17
17
  describe "when provided bitmask is nil" do
18
18
  it "returns nil" do
19
- Suitcase::Amenity.parse_mask(nil).must_equal nil
19
+ Suitcase::Hotel::Amenity.parse_mask(nil).must_equal nil
20
20
  end
21
21
  end
22
22
  end
23
- end
23
+ end
@@ -16,7 +16,7 @@ describe Suitcase do
16
16
  room = hotel.rooms(arrival: "6/23/2012", departure: "6/30/2012").first
17
17
 
18
18
  # Query 4
19
- Suitcase::PaymentOption.find currency_code: "USD"
19
+ Suitcase::Hotel::PaymentOption.find currency_code: "USD"
20
20
 
21
21
  # Query 5, don't cache though
22
22
  room.rooms[0][:bed_type] = room.bed_types[0]
@@ -30,13 +30,13 @@ describe Suitcase do
30
30
  hotel = Suitcase::Hotel.find(id: 123904)
31
31
  Suitcase::Hotel.find(location: "Boston, US")
32
32
  hotel.rooms(arrival: "6/23/2012", departure: "6/30/2012")
33
- Suitcase::PaymentOption.find currency_code: "USD"
33
+ Suitcase::Hotel::PaymentOption.find currency_code: "USD"
34
34
 
35
35
  # Disable API access
36
36
  Net::HTTP.expects(:get_response).never
37
37
  hotel = Suitcase::Hotel.find(id: 123904)
38
38
  Suitcase::Hotel.find(location: "Boston, US")
39
39
  hotel.rooms(arrival: "6/23/2012", departure: "6/30/2012")
40
- Suitcase::PaymentOption.find currency_code: "USD"
40
+ Suitcase::Hotel::PaymentOption.find currency_code: "USD"
41
41
  end
42
- end
42
+ end
@@ -1,8 +1,8 @@
1
1
  require "minitest_helper"
2
2
 
3
- describe Suitcase::Helpers do
3
+ describe Suitcase::Hotel::Helpers do
4
4
  before :each do
5
- class Dummy; extend Suitcase::Helpers; end
5
+ class Dummy; extend Suitcase::Hotel::Helpers; end
6
6
  end
7
7
 
8
8
  describe "#url" do
@@ -41,4 +41,4 @@ describe Suitcase::Helpers do
41
41
  signature.must_equal(Digest::MD5.hexdigest("abc12310"))
42
42
  end
43
43
  end
44
- end
44
+ end
@@ -1,15 +1,15 @@
1
1
  require "minitest_helper"
2
2
 
3
- describe Suitcase::PaymentOption do
3
+ describe Suitcase::Hotel::PaymentOption do
4
4
  before :each do
5
5
  @info = { currency_code: "USD" }
6
6
  end
7
7
 
8
8
  describe ".find" do
9
9
  it "returns an Array of PaymentOption's" do
10
- options = Suitcase::PaymentOption.find(@info)
10
+ options = Suitcase::Hotel::PaymentOption.find(@info)
11
11
  options.must_be_kind_of(Array)
12
- options.first.must_be_kind_of(Suitcase::PaymentOption)
12
+ options.first.must_be_kind_of(Suitcase::Hotel::PaymentOption)
13
13
  end
14
14
  end
15
15
  end