suitcase 1.1.9 → 1.2.0.pre

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -2,4 +2,4 @@
2
2
  .bundle
3
3
  Gemfile.lock
4
4
  pkg/*
5
- spec/api_key.rb
5
+ spec/keys.rb
@@ -1,3 +1,4 @@
1
+ require 'patron'
1
2
  require 'json'
2
3
  require 'net/http'
3
4
  require 'date/format'
@@ -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 = "http#{secure ? "s" : ""}://api.ean.com/ean-services/rs/hotel/v3/#{method.to_s}#{as_form ? "" : "?"}"
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
@@ -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"])] if 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
@@ -1,5 +1,9 @@
1
1
  module Suitcase
2
2
  class Reservation
3
+ attr_accessor :itinerary_id, :confirmation_numbers
3
4
 
5
+ def initialize(info)
6
+ @itinerary_id, @confirmation_numbers = info[:itinerary_id], [info[:confirmation_numbers]].flatten
7
+ end
4
8
  end
5
9
  end
@@ -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[:payment_type].code
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.strftime("%m")
36
- params["creditCardExpirationYear"] = expiration_date.strftime("%Y")
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
- p url(:getReservation, params)
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
- @total
50
- else false
63
+ @total_price
64
+ else
51
65
  @max_nightly_rate
52
66
  end
53
67
  end
@@ -1,3 +1,3 @@
1
1
  module Suitcase
2
- VERSION = "1.1.9"
2
+ VERSION = "1.2.0.pre"
3
3
  end
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe Suitcase::Reservation do
4
+ before :all do
5
+ @reservation = Suitcase::Reservation.new({})
6
+ end
7
+
8
+ subject { @reservation }
9
+ it { should respond_to :itinerary_id }
10
+ it { should respond_to :confirmation_numbers }
11
+ end
@@ -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", rooms: [{ adults: 1, children: 0, children_ages: []}, { adults: 1, children: 0, children_ages: []}]).first
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
- credit_card_type: "AX", # American Express
44
- credit_card_number: "2384975019283750293874", # not even sure if the length is right
45
- credit_card_identifier: "341", # CVV
46
- credit_card_expiration_date: "11/2012" }
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
@@ -1,2 +1,2 @@
1
1
  require File.dirname(__FILE__) + '/../lib/suitcase'
2
- require 'api_key'
2
+ require 'keys'
@@ -22,4 +22,5 @@ Gem::Specification.new do |s|
22
22
  s.add_development_dependency "rake"
23
23
  s.add_development_dependency "factory_girl"
24
24
  s.add_runtime_dependency "json"
25
+ s.add_runtime_dependency "patron"
25
26
  end
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.1.9
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-02 00:00:00.000000000 Z
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: &19048700 !ruby/object:Gem::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: *19048700
24
+ version_requirements: *16614460
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rake
27
- requirement: &19047520 !ruby/object:Gem::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: *19047520
35
+ version_requirements: *16613580
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: factory_girl
38
- requirement: &19063900 !ruby/object:Gem::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: *19063900
46
+ version_requirements: *16612360
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: json
49
- requirement: &19061720 !ruby/object:Gem::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: *19061720
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: 548987978234078689
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: '0'
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.13
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