suitcase 1.1.7 → 1.1.8

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -2,5 +2,4 @@
2
2
  .bundle
3
3
  Gemfile.lock
4
4
  pkg/*
5
- lib/suitcase/hotel/api_key.rb
6
- lib/suitcase/air/api_key.rb
5
+ spec/api_key.rb
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --fail-fast -c --format d
data/README.md CHANGED
@@ -21,8 +21,8 @@ First, include the module in your code:
21
21
  Find nearby hotels:
22
22
 
23
23
  Hotel::API_KEY = "your_api_key_here"
24
- hotel = Hotel.find(:location => 'Boston, MA', :results => 10) # Returns 10 closest hotels to Boston, MA
25
- room = hotel.rooms(arrival: "2/19/2012", departure: "2/26/2012", rooms: [{ children: 1, ages: [8] }, { children: 1, ages: [12] }] # Check the availability of two rooms at that hotel with 1 child in each room of ages 8 and 9
24
+ hotels = Hotel.find(:location => 'Boston, MA', :results => 10) # Returns 10 closest hotels to Boston, MA
25
+ room = hotels.first.rooms(arrival: "2/19/2012", departure: "2/26/2012", rooms: [{ children: 1, ages: [8] }, { children: 1, ages: [12] }] # Check the availability of two rooms at that hotel with 1 child in each room of ages 8 and 9
26
26
  room.reserve!(info) # Not yet implemented
27
27
  Contributing
28
28
  ------------
data/Rakefile CHANGED
@@ -1,5 +1,9 @@
1
1
  require "bundler/gem_tasks"
2
- # require 'suitcase'
2
+ require "rspec/core/rake_task"
3
+
4
+ task :spec do
5
+ system "rspec spec/"
6
+ end
3
7
 
4
8
  task :install_nodoc => [:build] do
5
9
  system "gem install pkg/suitcase-#{Suitcase::VERSION}.gem --no-ri --no-rdoc"
data/lib/suitcase.rb CHANGED
@@ -1,7 +1,10 @@
1
1
  require 'json'
2
2
  require 'net/http'
3
+ require 'suitcase/core_ext/string'
3
4
  require 'suitcase/version'
4
5
  require 'suitcase/helpers'
6
+ require 'suitcase/hotel/nightly_rate'
5
7
  require 'suitcase/hotel/room'
6
8
  require 'suitcase/hotel/payment_option'
7
9
  require 'suitcase/hotel/hotel'
10
+ require 'suitcase/hotel/image'
@@ -0,0 +1,13 @@
1
+ class String
2
+ def underscore
3
+ self.gsub(/::/, '/').
4
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
5
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
6
+ tr("-", "_").
7
+ downcase
8
+ end
9
+
10
+ def to_b
11
+ self == "true"
12
+ end
13
+ end
@@ -18,7 +18,7 @@ module Suitcase
18
18
  wheelchair_accessible: 8,
19
19
  kitchen: 9 }
20
20
 
21
- attr_accessor :id, :name, :address, :city, :min_rate, :max_rate, :amenities, :country_code, :high_rate, :low_rate, :longitude, :latitude, :rating, :postal_code, :supplier_type, :image_urls
21
+ attr_accessor :id, :name, :address, :city, :min_rate, :max_rate, :amenities, :country_code, :high_rate, :low_rate, :longitude, :latitude, :rating, :postal_code, :supplier_type, :images
22
22
 
23
23
  def initialize(info)
24
24
  info.each do |k, v|
@@ -68,14 +68,13 @@ module Suitcase
68
68
  handle_errors(parsed)
69
69
  summary = parsed["hotelId"] ? parsed : parsed["HotelInformationResponse"]["HotelSummary"]
70
70
  parsed_info = { id: summary["hotelId"], name: summary["name"], address: summary["address1"], city: summary["city"], postal_code: summary["postalCode"], country_code: summary["countryCode"], rating: summary["hotelRating"], high_rate: summary["highRate"], low_rate: summary["lowRate"], latitude: summary["latitude"].to_f, longitude: summary["longitude"].to_f }
71
- if images(parsed)
72
- parsed_info[:image_urls] = images(parsed)
73
- end
71
+ parsed_info[:images] = images(parsed) if images(parsed)
74
72
  parsed_info
75
73
  end
76
74
 
77
75
  def self.images(parsed)
78
- return nil
76
+ return parsed["HotelInformationResponse"]["HotelImages"]["HotelImage"].map { |image_data| Suitcase::Image.new(image_data) } if parsed["HotelInformationResponse"]
77
+ return Suitcase::Image.new(url: parsed["thumbNailUrl"]) if parsed["thumbNailUrl"]
79
78
  end
80
79
 
81
80
  # Bleghh. so ugly. #needsfixing
@@ -110,7 +109,19 @@ module Suitcase
110
109
  hotel_id = parsed["HotelRoomAvailabilityResponse"]["hotelId"]
111
110
  rate_key = parsed["HotelRoomAvailabilityResponse"]["rateKey"]
112
111
  supplier_type = parsed["HotelRoomAvailabilityResponse"]["HotelRoomResponse"][0]["supplierType"]
113
- Room.new(rate_key, hotel_id, supplier_type)
112
+ rooms = parsed["HotelRoomAvailabilityResponse"]["HotelRoomResponse"].map do |raw_data|
113
+ room_data = {}
114
+ room_data[:rate_code] = raw_data["rateCode"]
115
+ room_data[:room_type_code] = raw_data["roomTypeCode"]
116
+ room_data[:room_type_description] = raw_data["roomTypeDescription"]
117
+ room_data[:promo] = raw_data["RateInfo"]["@promo"].to_b
118
+ room_data[:price_breakdown] = raw_data["RateInfo"]["ChargeableRateInfo"]["NightlyRatesPerRoom"]["NightlyRate"].map { |raw| NightlyRate.new(raw) }
119
+ room_data[:total_price] = raw_data["RateInfo"]["ChargeableRateInfo"]["@total"]
120
+ room_data[:nightly_rate_total] = raw_data["RateInfo"]["ChargeableRateInfo"]["@nightlyRateTotal"]
121
+ room_data[:average_nightly_rate] = raw_data["RateInfo"]["ChargeableRateInfo"]["@averageRate"]
122
+ Room.new(room_data)
123
+ end
124
+ RoomGroup.new(rate_key, hotel_id, supplier_type, rooms)
114
125
  end
115
126
 
116
127
  def payment_options
@@ -0,0 +1,19 @@
1
+ module Suitcase
2
+ class Image
3
+ attr_accessor :id, :url, :caption, :width, :height, :thumbnail_url, :name
4
+
5
+ def initialize(data)
6
+ @id = data["hotelImageId"]
7
+ @name = data["name"]
8
+ @caption = data["caption"]
9
+ @url = data["url"]
10
+ @thumbnail_url = data["thumbnailURL"]
11
+ @width = data["width"]
12
+ @height = data["height"]
13
+ end
14
+
15
+ def size
16
+ width.to_s + "x" + height.to_s
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,11 @@
1
+ module Suitcase
2
+ class NightlyRate
3
+ attr_accessor :promo, :rate, :base_rate
4
+
5
+ def initialize(info)
6
+ promo = info["@promo"]
7
+ promo = info["@rate"]
8
+ promo = info["@baseRate"]
9
+ end
10
+ end
11
+ end
@@ -1,11 +1,12 @@
1
1
  module Suitcase
2
- class Room
3
- attr_accessor :rate_key, :hotel_id, :supplier_type
2
+ class RoomGroup
3
+ attr_accessor :rate_key, :hotel_id, :supplier_type, :rooms
4
4
 
5
- def initialize(rate_key, hotel_id, supplier_type)
5
+ def initialize(rate_key, hotel_id, supplier_type, rooms)
6
6
  @rate_key = rate_key
7
7
  @hotel_id = hotel_id
8
8
  @supplier_type = supplier_type
9
+ @rooms = rooms
9
10
  end
10
11
 
11
12
  def reserve!(info)
@@ -23,4 +24,14 @@ module Suitcase
23
24
  p Hotel.shove(Hotel.url(:res, true, true, {}, :post, true), params)
24
25
  end
25
26
  end
27
+
28
+ class Room
29
+ attr_accessor :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
30
+
31
+ def initialize(info)
32
+ info.each do |k, v|
33
+ instance_variable_set("@" + k.to_s, v)
34
+ end
35
+ end
36
+ end
26
37
  end
@@ -1,3 +1,3 @@
1
1
  module Suitcase
2
- VERSION = "1.1.7"
2
+ VERSION = "1.1.8"
3
3
  end
data/spec/api_key.rb CHANGED
@@ -1 +1 @@
1
- HOTEL_API_KEY = "88m3ugkarmfzcq3z4syayymt"
1
+ Suitcase::Hotel::API_KEY = "t3d74e8t58k2nh55gyph3cje"
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe Suitcase::Helpers do
4
+ before :each do
5
+ class Dummy; extend Suitcase::Helpers; end
6
+ end
7
+
8
+ it "#url should return a URI with the correct base URL" do
9
+ returned = Dummy.url(:action, {})
10
+ returned.should be_a(URI)
11
+ returned.host.should match(/api.ean.com/)
12
+ end
13
+
14
+ it "#parse_response should raise an exception when passed an invalid URI" do
15
+ lambda do
16
+ Dummy.parse_response(URI.parse "http://google.com")
17
+ end.should raise_error
18
+ end
19
+ end
data/spec/hotels_spec.rb CHANGED
@@ -1,7 +1,55 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Suitcase::Hotel do
4
- it "::find should return an Array if no ID is passed" do
5
- Suitcase::Hotel.find(destination: "Boston, US").should be_a(Array)
4
+ it "::find should locate a single Hotel if an id argument is passed" do
5
+ @hotel.should be_a(Suitcase::Hotel)
6
+ end
7
+
8
+ it "::find should locate an Array of Hotels if an id argument is not passed" do
9
+ hotels = Suitcase::Hotel.find(location: "London, UK")
10
+ hotels.should be_an(Array)
11
+ hotels.first.should be_a(Suitcase::Hotel)
12
+ end
13
+
14
+ before :all do
15
+ @hotel = Suitcase::Hotel.find(id: 123904)
16
+ end
17
+
18
+ subject { @hotel }
19
+
20
+ it { should respond_to :id }
21
+ it { should respond_to :name }
22
+ it { should respond_to :address }
23
+ it { should respond_to :city }
24
+ it { should respond_to :min_rate }
25
+ it { should respond_to :max_rate }
26
+ it { should respond_to :amenities }
27
+ it { should respond_to :country_code }
28
+ it { should respond_to :high_rate }
29
+ it { should respond_to :low_rate }
30
+ it { should respond_to :longitude }
31
+ it { should respond_to :latitude }
32
+ it { should respond_to :rating }
33
+ it { should respond_to :postal_code }
34
+ it { should respond_to :images }
35
+
36
+ it "#images should return an Array of Suitcase::Image's" do
37
+ images = @hotel.images
38
+ images.should be_an(Array)
39
+ lambda do
40
+ images.map { |image| URI.parse image.url }
41
+ end.should_not raise_error
42
+ end
43
+
44
+ describe "#rooms" do
45
+ before :all do
46
+ @info = { arrival: "6/23/2012", departure: "6/30/2012" }
47
+ end
48
+
49
+ subject do
50
+ @hotel.rooms(@info)
51
+ end
52
+
53
+ it { should be_an(Suitcase::RoomGroup) }
6
54
  end
7
55
  end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe Suitcase::Image do
4
+ before :all do
5
+ @image = Suitcase::Hotel.find(id: 123904).images.first
6
+ end
7
+
8
+ subject { @image }
9
+
10
+ it { should respond_to :url }
11
+ it { should respond_to :id }
12
+ it { should respond_to :caption }
13
+ it { should respond_to :height }
14
+ it { should respond_to :width }
15
+ it { should respond_to :thumbnail_url }
16
+ it { should respond_to :name }
17
+
18
+ it "#url should return a valid URL" do
19
+ lambda do
20
+ URI.parse @image.url
21
+ end.should_not raise_error
22
+ end
23
+ end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ describe Suitcase::Room do
4
+ before :all do
5
+ @room = Suitcase::Hotel.find(id: 123904).rooms(arrival: "6/23/2012", departure: "6/30/2012")
6
+ end
7
+
8
+ subject { @room }
9
+ it { should respond_to :reserve! }
10
+ it "#reserve! should take a Hash of options" do
11
+
12
+ end
13
+ end
14
+
15
+ describe Suitcase::RoomGroup do
16
+ before :all do
17
+ @room_group = Suitcase::Hotel.find(id: 123904).rooms(arrival: "6/23/2012", departure: "6/30/2012")
18
+ end
19
+
20
+ subject { @room_group }
21
+
22
+ it { should respond_to :rooms }
23
+ it "#rooms should return an Array" do
24
+ @room_group.rooms.should be_an(Array)
25
+ end
26
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: suitcase
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.7
4
+ version: 1.1.8
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-12-27 00:00:00.000000000 Z
12
+ date: 2011-12-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &13140540 !ruby/object:Gem::Requirement
16
+ requirement: &20405620 !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: *13140540
24
+ version_requirements: *20405620
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: cucumber
27
- requirement: &13140060 !ruby/object:Gem::Requirement
27
+ requirement: &20419480 !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: *13140060
35
+ version_requirements: *20419480
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rake
38
- requirement: &13139260 !ruby/object:Gem::Requirement
38
+ requirement: &19989440 !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: *13139260
46
+ version_requirements: *19989440
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: json
49
- requirement: &13138520 !ruby/object:Gem::Requirement
49
+ requirement: &19987780 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,7 +54,7 @@ dependencies:
54
54
  version: '0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *13138520
57
+ version_requirements: *19987780
58
58
  description: Suitcase utilizes the EAN (Expedia.com) API for locating info about hotels,
59
59
  rental cars, and flights.
60
60
  email:
@@ -64,6 +64,7 @@ extensions: []
64
64
  extra_rdoc_files: []
65
65
  files:
66
66
  - .gitignore
67
+ - .rspec
67
68
  - Gemfile
68
69
  - README.md
69
70
  - Rakefile
@@ -71,15 +72,20 @@ files:
71
72
  - features/step_definitions/hotels_steps.rb
72
73
  - lib/suitcase.rb
73
74
  - lib/suitcase/airport_codes.rb
75
+ - lib/suitcase/core_ext/string.rb
74
76
  - lib/suitcase/country_codes.rb
75
77
  - lib/suitcase/helpers.rb
76
78
  - lib/suitcase/hotel/hotel.rb
79
+ - lib/suitcase/hotel/image.rb
80
+ - lib/suitcase/hotel/nightly_rate.rb
77
81
  - lib/suitcase/hotel/payment_option.rb
78
82
  - lib/suitcase/hotel/room.rb
79
83
  - lib/suitcase/version.rb
80
84
  - spec/api_key.rb
81
- - spec/data_helpers_spec.rb
85
+ - spec/helpers_spec.rb
82
86
  - spec/hotels_spec.rb
87
+ - spec/images_spec.rb
88
+ - spec/rooms_spec.rb
83
89
  - spec/spec_helper.rb
84
90
  - suitcase.gemspec
85
91
  homepage: http://github.com/thoughtfusion/suitcase
@@ -96,7 +102,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
96
102
  version: '0'
97
103
  segments:
98
104
  - 0
99
- hash: -3208530258623277301
105
+ hash: 3790949770335453178
100
106
  required_rubygems_version: !ruby/object:Gem::Requirement
101
107
  none: false
102
108
  requirements:
@@ -105,10 +111,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
105
111
  version: '0'
106
112
  segments:
107
113
  - 0
108
- hash: -3208530258623277301
114
+ hash: 3790949770335453178
109
115
  requirements: []
110
116
  rubyforge_project: suitcase
111
- rubygems_version: 1.8.10
117
+ rubygems_version: 1.8.13
112
118
  signing_key:
113
119
  specification_version: 3
114
120
  summary: Locates available hotels, rental cars, and flights
@@ -116,6 +122,8 @@ test_files:
116
122
  - features/hotels.feature
117
123
  - features/step_definitions/hotels_steps.rb
118
124
  - spec/api_key.rb
119
- - spec/data_helpers_spec.rb
125
+ - spec/helpers_spec.rb
120
126
  - spec/hotels_spec.rb
127
+ - spec/images_spec.rb
128
+ - spec/rooms_spec.rb
121
129
  - spec/spec_helper.rb
@@ -1,14 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Suitcase::DataHelpers do
4
- before :each do
5
- class Hotel
6
- API_KEY = HOTEL_API_KEY
7
- extend Suitcase::DataHelpers
8
- end
9
- end
10
-
11
- it "#url should return a valid url" do
12
- URI.parse(Hotel.url(:hotel, :list, true, { location: "London, UK" })).should be_a(URI)
13
- end
14
- end