suitcase 1.1.9 → 1.2.0.pre
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 +1 -1
- data/lib/suitcase.rb +1 -0
- data/lib/suitcase/helpers.rb +13 -1
- data/lib/suitcase/hotel/hotel.rb +15 -3
- data/lib/suitcase/hotel/reservation.rb +4 -0
- data/lib/suitcase/hotel/room.rb +23 -9
- data/lib/suitcase/version.rb +1 -1
- data/spec/reservation_spec.rb +11 -0
- data/spec/rooms_spec.rb +14 -5
- data/spec/spec_helper.rb +1 -1
- data/suitcase.gemspec +1 -0
- metadata +28 -20
data/.gitignore
CHANGED
data/lib/suitcase.rb
CHANGED
data/lib/suitcase/helpers.rb
CHANGED
@@ -3,13 +3,25 @@ module Suitcase
|
|
3
3
|
def url(method, params, include_key=true, include_cid=true, secure=false, as_form=false)
|
4
4
|
params["apiKey"] = Configuration.hotel_api_key if include_key
|
5
5
|
params["cid"] = (Configuration.hotel_cid ||= 55505) if include_cid
|
6
|
-
url =
|
6
|
+
url = main_url(secure) + method.to_s + (as_form ? "" : "?")
|
7
7
|
url += params.map { |key, value| "#{key}=#{value}"}.join("&")
|
8
8
|
URI.parse(URI.escape(url))
|
9
9
|
end
|
10
10
|
|
11
|
+
def main_url(secure)
|
12
|
+
"http#{secure ? "s" : ""}://#{secure ? "book." : ""}api.ean.com/ean-services/rs/hotel/v3/"
|
13
|
+
end
|
14
|
+
|
11
15
|
def parse_response(uri)
|
12
16
|
JSON.parse(Net::HTTP.get_response(uri).body)
|
13
17
|
end
|
18
|
+
|
19
|
+
def base_url(info)
|
20
|
+
if info[:booking]
|
21
|
+
URI.parse main_url(true)
|
22
|
+
else
|
23
|
+
URI.parse main_url(false)
|
24
|
+
end
|
25
|
+
end
|
14
26
|
end
|
15
27
|
end
|
data/lib/suitcase/hotel/hotel.rb
CHANGED
@@ -5,6 +5,14 @@ module Suitcase
|
|
5
5
|
end
|
6
6
|
end
|
7
7
|
|
8
|
+
class BedType
|
9
|
+
attr_accessor :id, :description
|
10
|
+
|
11
|
+
def initialize(info)
|
12
|
+
@id, @description = info[:id], info[:description]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
8
16
|
class Hotel
|
9
17
|
extend Suitcase::Helpers
|
10
18
|
|
@@ -79,8 +87,9 @@ module Suitcase
|
|
79
87
|
end
|
80
88
|
|
81
89
|
def self.images(parsed)
|
82
|
-
return parsed["HotelInformationResponse"]["HotelImages"]["HotelImage"].map { |image_data| Suitcase::Image.new(image_data) } if parsed["HotelInformationResponse"]
|
83
|
-
return [Suitcase::Image.new("thumbnailURL" => "http://images.travelnow.com" + parsed["thumbNailUrl"])]
|
90
|
+
return parsed["HotelInformationResponse"]["HotelImages"]["HotelImage"].map { |image_data| Suitcase::Image.new(image_data) } if parsed["HotelInformationResponse"] && parsed["HotelInformationResponse"]["HotelImages"] && parsed["HotelInformationResponse"]["HotelImages"]["HotelImage"]
|
91
|
+
return [Suitcase::Image.new("thumbnailURL" => "http://images.travelnow.com" + parsed["thumbNailUrl"])] unless parsed["thumbnailUrl"].nil? or parsed["thumbNailUrl"].empty?
|
92
|
+
return []
|
84
93
|
end
|
85
94
|
|
86
95
|
# Bleghh. so ugly. #needsfixing
|
@@ -112,6 +121,7 @@ module Suitcase
|
|
112
121
|
end
|
113
122
|
params["arrivalDate"] = info[:arrival]
|
114
123
|
params["departureDate"] = info[:departure]
|
124
|
+
params["includeDetails"] = true
|
115
125
|
params.delete(:arrival)
|
116
126
|
params.delete(:departure)
|
117
127
|
params["hotelId"] = @id
|
@@ -126,7 +136,7 @@ module Suitcase
|
|
126
136
|
room_data[:room_type_code] = raw_data["roomTypeCode"]
|
127
137
|
room_data[:room_type_description] = raw_data["roomTypeDescription"]
|
128
138
|
room_data[:promo] = raw_data["RateInfo"]["@promo"].to_b
|
129
|
-
room_data[:price_breakdown] = raw_data["RateInfo"]["ChargeableRateInfo"]["NightlyRatesPerRoom"]["NightlyRate"].map { |raw| NightlyRate.new(raw) }
|
139
|
+
room_data[:price_breakdown] = raw_data["RateInfo"]["ChargeableRateInfo"]["NightlyRatesPerRoom"]["NightlyRate"].map { |raw| NightlyRate.new(raw) } if raw_data["RateInfo"]["ChargeableRateInfo"] && raw_data["RateInfo"]["ChargeableRateInfo"]["NightlyRatesPerRoom"] && raw_data["RateInfo"]["ChargeableRateInfo"]["NightlyRatesPerRoom"]["NightlyRate"].is_a?(Array)
|
130
140
|
room_data[:total_price] = raw_data["RateInfo"]["ChargeableRateInfo"]["@total"]
|
131
141
|
room_data[:nightly_rate_total] = raw_data["RateInfo"]["ChargeableRateInfo"]["@nightlyRateTotal"]
|
132
142
|
room_data[:average_nightly_rate] = raw_data["RateInfo"]["ChargeableRateInfo"]["@averageRate"]
|
@@ -135,6 +145,8 @@ module Suitcase
|
|
135
145
|
room_data[:rate_key] = rate_key
|
136
146
|
room_data[:hotel_id] = hotel_id
|
137
147
|
room_data[:supplier_type] = supplier_type
|
148
|
+
room_data[:rooms] = params[:rooms]
|
149
|
+
room_data[:bed_types] = [raw_data["BedTypes"]["BedType"]].flatten.map { |x| BedType.new(id: x["@id"], description: x["description"]) }
|
138
150
|
Room.new(room_data)
|
139
151
|
end
|
140
152
|
end
|
data/lib/suitcase/hotel/room.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Suitcase
|
2
2
|
class Room
|
3
|
-
attr_accessor :rate_key, :hotel_id, :supplier_type, :rate_code, :room_type_code, :supplier_type, :tax_rate, :non_refundable, :occupancy, :quoted_occupancy, :min_guest_age, :total, :surcharge_total, :nightly_rate_total, :average_base_rate, :average_rate, :max_nightly_rate, :currency_code, :value_adds, :room_type_description, :price_breakdown, :total_price, :average_nightly_rate, :promo, :arrival, :departure
|
3
|
+
attr_accessor :rate_key, :hotel_id, :supplier_type, :rate_code, :room_type_code, :supplier_type, :tax_rate, :non_refundable, :occupancy, :quoted_occupancy, :min_guest_age, :total, :surcharge_total, :nightly_rate_total, :average_base_rate, :average_rate, :max_nightly_rate, :currency_code, :value_adds, :room_type_description, :price_breakdown, :total_price, :average_nightly_rate, :promo, :arrival, :departure, :rooms, :bed_types
|
4
4
|
extend Suitcase::Helpers
|
5
5
|
|
6
6
|
def initialize(info)
|
@@ -18,6 +18,7 @@ module Suitcase
|
|
18
18
|
params["rateKey"] = @rate_key
|
19
19
|
params["rateTypeCode"] = @room_type_code
|
20
20
|
params["rateCode"] = @rate_code
|
21
|
+
params["roomTypeCode"] = @room_type_code
|
21
22
|
params["chargeableRate"] = chargeable_rate
|
22
23
|
params["email"] = info[:email]
|
23
24
|
params["firstName"] = info[:first_name]
|
@@ -28,26 +29,39 @@ module Suitcase
|
|
28
29
|
params["faxPhone"] = info[:fax_phone] if info[:fax_phone]
|
29
30
|
params["companyName"] = info[:company_name] if info[:company_name]
|
30
31
|
params["emailIntineraryList"] = info[:additional_emails].join(",") if info[:additional_emails]
|
31
|
-
params["creditCardType"] = info[:
|
32
|
+
params["creditCardType"] = info[:payment_option].code
|
32
33
|
params["creditCardNumber"] = info[:credit_card_number]
|
33
34
|
params["creditCardIdentifier"] = info[:credit_card_verification_code]
|
34
35
|
expiration_date = Date._parse(info[:credit_card_expiration_date])
|
35
|
-
params["creditCardExpirationMonth"] = expiration_date.
|
36
|
-
params["creditCardExpirationYear"] = expiration_date.
|
36
|
+
params["creditCardExpirationMonth"] = (expiration_date[:mon].to_s.length == 1 ? "0" + expiration_date[:mon].to_s : expiration_date[:mon].to_s)
|
37
|
+
params["creditCardExpirationYear"] = expiration_date[:year].to_s
|
37
38
|
params["address1"] = info[:address1]
|
38
|
-
params["address2"] = info[:address2]
|
39
|
-
params["address3"] = info[:address3]
|
39
|
+
params["address2"] = info[:address2] if info[:address2]
|
40
|
+
params["address3"] = info[:address3] if info[:address3]
|
40
41
|
params["city"] = info[:city]
|
42
|
+
@rooms.each_with_index do |room, index|
|
43
|
+
index += 1
|
44
|
+
params["room#{index}"] = "#{room[:adults].to_s},#{room[:children_ages].join(",")}"
|
45
|
+
params["room#{index}FirstName"] = room[:first_name] || params["firstName"] # defaults to the billing
|
46
|
+
params["room#{index}LastName"] = room[:last_name] || params["lastName"] # person's name
|
47
|
+
params["room#{index}BedTypeId"] = room[:bed_type].id
|
48
|
+
params["room#{index}SmokingPreference"] = room[:smoking_preference] or "E"
|
49
|
+
end
|
41
50
|
params["stateProvinceCode"] = info[:province]
|
42
51
|
params["countryCode"] = info[:country]
|
43
52
|
params["postalCode"] = info[:postal_code]
|
44
|
-
|
53
|
+
uri = Room.url :res, params, true, true, true
|
54
|
+
session = Patron::Session.new
|
55
|
+
session.base_url = "https://" + uri.host
|
56
|
+
res = session.post uri.request_uri, {}
|
57
|
+
parsed = JSON.parse res.body
|
58
|
+
Reservation.new(itinerary_id: parsed["HotelRoomReservationResponse"]["itineraryId"], confirmation_numbers: parsed["HotelRoomReservationResponse"]["confirmationNumbers"])
|
45
59
|
end
|
46
60
|
|
47
61
|
def chargeable_rate
|
48
62
|
if @supplier_type == "E"
|
49
|
-
@
|
50
|
-
else
|
63
|
+
@total_price
|
64
|
+
else
|
51
65
|
@max_nightly_rate
|
52
66
|
end
|
53
67
|
end
|
data/lib/suitcase/version.rb
CHANGED
data/spec/rooms_spec.rb
CHANGED
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Suitcase::Room do
|
4
4
|
before :all do
|
5
|
-
@room = Suitcase::Hotel.find(id: 123904).rooms(arrival: "6/23/2012", departure: "6/30/2012"
|
5
|
+
@room = Suitcase::Hotel.find(id: 123904).rooms(arrival: "6/23/2012", departure: "6/30/2012").first
|
6
6
|
end
|
7
7
|
|
8
8
|
subject { @room }
|
@@ -33,6 +33,7 @@ describe Suitcase::Room do
|
|
33
33
|
it { should respond_to :rate_key }
|
34
34
|
it { should respond_to :hotel_id }
|
35
35
|
it { should respond_to :supplier_type }
|
36
|
+
it { should respond_to :bed_types }
|
36
37
|
|
37
38
|
describe "#reserve!" do
|
38
39
|
before :all do
|
@@ -40,10 +41,18 @@ describe Suitcase::Room do
|
|
40
41
|
first_name: "Walter",
|
41
42
|
last_name: "Nelson",
|
42
43
|
home_phone: "3831039402",
|
43
|
-
|
44
|
-
credit_card_number:
|
45
|
-
|
46
|
-
credit_card_expiration_date:
|
44
|
+
payment_option: Keys::SUITCASE_PAYMENT_OPTION, # Visa
|
45
|
+
credit_card_number: Keys::CREDIT_CARD_NUMBER_TESTING,
|
46
|
+
credit_card_verification_code: Keys::CREDIT_CARD_CVV_TESTING, # CVV
|
47
|
+
credit_card_expiration_date: Keys::CREDIT_CARD_EXPIRATION_DATE_TESTING,
|
48
|
+
address1: "travelnow", # for testing
|
49
|
+
address2: "Apt. 4A",
|
50
|
+
city: "Boston",
|
51
|
+
province: "MA",
|
52
|
+
country: "US",
|
53
|
+
postal_code: "02111" }
|
54
|
+
@room.rooms[0][:bed_type] = @room.bed_types[0]
|
55
|
+
@room.rooms[0][:smoking_preference] = "NS"
|
47
56
|
end
|
48
57
|
|
49
58
|
it "should respond to a Hash of arguments" do
|
data/spec/spec_helper.rb
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../lib/suitcase'
|
2
|
-
require '
|
2
|
+
require 'keys'
|
data/suitcase.gemspec
CHANGED
metadata
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: suitcase
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
5
|
-
prerelease:
|
4
|
+
version: 1.2.0.pre
|
5
|
+
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Walter Nelson
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-01-
|
12
|
+
date: 2012-01-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: &
|
16
|
+
requirement: &16614460 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *16614460
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rake
|
27
|
-
requirement: &
|
27
|
+
requirement: &16613580 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *16613580
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: factory_girl
|
38
|
-
requirement: &
|
38
|
+
requirement: &16612360 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *16612360
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: json
|
49
|
-
requirement: &
|
49
|
+
requirement: &16611740 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,7 +54,18 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *16611740
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: patron
|
60
|
+
requirement: &16611300 !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
type: :runtime
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *16611300
|
58
69
|
description: Suitcase utilizes the EAN (Expedia.com) API for locating info about hotels,
|
59
70
|
rental cars, and flights.
|
60
71
|
email:
|
@@ -83,12 +94,12 @@ files:
|
|
83
94
|
- lib/suitcase/hotel/reservation.rb
|
84
95
|
- lib/suitcase/hotel/room.rb
|
85
96
|
- lib/suitcase/version.rb
|
86
|
-
- spec/api_key.rb
|
87
97
|
- spec/caching_spec.rb
|
88
98
|
- spec/helpers_spec.rb
|
89
99
|
- spec/hotels_spec.rb
|
90
100
|
- spec/images_spec.rb
|
91
101
|
- spec/payment_options_spec.rb
|
102
|
+
- spec/reservation_spec.rb
|
92
103
|
- spec/rooms_spec.rb
|
93
104
|
- spec/spec_helper.rb
|
94
105
|
- suitcase.gemspec
|
@@ -106,28 +117,25 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
106
117
|
version: '0'
|
107
118
|
segments:
|
108
119
|
- 0
|
109
|
-
hash:
|
120
|
+
hash: 3770284806370543423
|
110
121
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
111
122
|
none: false
|
112
123
|
requirements:
|
113
|
-
- - ! '
|
124
|
+
- - ! '>'
|
114
125
|
- !ruby/object:Gem::Version
|
115
|
-
version:
|
116
|
-
segments:
|
117
|
-
- 0
|
118
|
-
hash: 548987978234078689
|
126
|
+
version: 1.3.1
|
119
127
|
requirements: []
|
120
128
|
rubyforge_project: suitcase
|
121
|
-
rubygems_version: 1.8.
|
129
|
+
rubygems_version: 1.8.10
|
122
130
|
signing_key:
|
123
131
|
specification_version: 3
|
124
132
|
summary: Locates available hotels, rental cars, and flights
|
125
133
|
test_files:
|
126
|
-
- spec/api_key.rb
|
127
134
|
- spec/caching_spec.rb
|
128
135
|
- spec/helpers_spec.rb
|
129
136
|
- spec/hotels_spec.rb
|
130
137
|
- spec/images_spec.rb
|
131
138
|
- spec/payment_options_spec.rb
|
139
|
+
- spec/reservation_spec.rb
|
132
140
|
- spec/rooms_spec.rb
|
133
141
|
- spec/spec_helper.rb
|