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 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