isotope11-suitcase 1.7.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. data/.gitignore +5 -0
  2. data/CHANGELOG.md +17 -0
  3. data/Gemfile +3 -0
  4. data/README.md +83 -0
  5. data/Rakefile +13 -0
  6. data/examples/hash_adapter.rb +15 -0
  7. data/examples/hotel_image_db.rb +24 -0
  8. data/examples/redis_adapter.rb +29 -0
  9. data/isotope11-suitcase.gemspec +30 -0
  10. data/lib/suitcase.rb +16 -0
  11. data/lib/suitcase/car_rental.rb +57 -0
  12. data/lib/suitcase/codes.rb +5 -0
  13. data/lib/suitcase/configuration.rb +29 -0
  14. data/lib/suitcase/core_ext/string.rb +13 -0
  15. data/lib/suitcase/hotel.rb +366 -0
  16. data/lib/suitcase/hotel/amenity.rb +46 -0
  17. data/lib/suitcase/hotel/bed_type.rb +21 -0
  18. data/lib/suitcase/hotel/cache.rb +52 -0
  19. data/lib/suitcase/hotel/cancellation.rb +55 -0
  20. data/lib/suitcase/hotel/ean_exception.rb +35 -0
  21. data/lib/suitcase/hotel/helpers.rb +210 -0
  22. data/lib/suitcase/hotel/image.rb +19 -0
  23. data/lib/suitcase/hotel/location.rb +67 -0
  24. data/lib/suitcase/hotel/nightly_rate.rb +14 -0
  25. data/lib/suitcase/hotel/payment_option.rb +41 -0
  26. data/lib/suitcase/hotel/reservation.rb +15 -0
  27. data/lib/suitcase/hotel/room.rb +139 -0
  28. data/lib/suitcase/hotel/session.rb +7 -0
  29. data/lib/suitcase/hotel/surcharge.rb +23 -0
  30. data/lib/suitcase/version.rb +3 -0
  31. data/test/car_rentals/car_rental_test.rb +30 -0
  32. data/test/hotels/amenity_test.rb +23 -0
  33. data/test/hotels/caching_test.rb +42 -0
  34. data/test/hotels/ean_exception_test.rb +24 -0
  35. data/test/hotels/helpers_test.rb +60 -0
  36. data/test/hotels/hotel_location_test.rb +23 -0
  37. data/test/hotels/hotel_test.rb +122 -0
  38. data/test/hotels/image_test.rb +20 -0
  39. data/test/hotels/payment_option_test.rb +15 -0
  40. data/test/hotels/reservation_test.rb +15 -0
  41. data/test/hotels/room_test.rb +53 -0
  42. data/test/hotels/session_test.rb +14 -0
  43. data/test/keys.rb +43 -0
  44. data/test/minitest_helper.rb +29 -0
  45. data/test/support/fake_response.rb +13 -0
  46. metadata +187 -0
@@ -0,0 +1,60 @@
1
+ require "minitest_helper"
2
+
3
+ describe Suitcase::Hotel::Helpers do
4
+ before :each do
5
+ class Dummy; extend Suitcase::Hotel::Helpers; end
6
+ end
7
+
8
+ describe "#url" do
9
+ it "returns a URI with the proper base URL" do
10
+ url = Dummy.url(method: "action", params: {})
11
+ url.must_be_kind_of(URI)
12
+ url.host.must_match(/api.ean.com/)
13
+ end
14
+
15
+ describe "when using digital signature authorization" do
16
+ it "adds a 'sig' parameter" do
17
+ Suitcase::Configuration.expects(:use_signature_auth?).returns(true)
18
+ Dummy.expects(:generate_signature).returns("test")
19
+
20
+ url = Dummy.url(method: "action", params: {})
21
+ url.query.must_match(/sig=test/)
22
+ end
23
+ end
24
+ end
25
+
26
+ describe "#parse_response" do
27
+ it "raises an exception when passed an invalid URI" do
28
+ proc do
29
+ Dummy.parse_response(URI.parse("http://google.com"))
30
+ end.must_raise JSON::ParserError
31
+ end
32
+
33
+ it "raises an error if a 403 code is received" do
34
+ proc do
35
+ response = FakeResponse.new(code: 403, body: "<h1>An error occurred.</h1>")
36
+ Net::HTTP.stubs(:get_response).returns(response)
37
+ Dummy.parse_response(URI.parse("http://fake.response.will.be.used"))
38
+ end.must_raise Suitcase::Hotel::EANException
39
+ end
40
+ end
41
+
42
+ describe "#generate_signature" do
43
+ it "returns the encrypted API key, shared secret, and timestamp" do
44
+ Suitcase::Configuration.expects(:hotel_api_key).returns("abc")
45
+ Suitcase::Configuration.expects(:hotel_shared_secret).returns("123")
46
+ Time.expects(:now).returns("10")
47
+
48
+ signature = Dummy.generate_signature
49
+ signature.must_equal(Digest::MD5.hexdigest("abc12310"))
50
+ end
51
+ end
52
+
53
+ describe "#parameterize_rooms" do
54
+ it "returns a hash of room parameters" do
55
+ rooms = [{adults: 1}, {adults: 2, children_ages: [3, 5]}]
56
+ params = Dummy.parameterize_rooms(rooms)
57
+ params.must_equal({ "room1" => "1", "room2" => "2,3,5" })
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,23 @@
1
+ require "minitest_helper"
2
+
3
+ describe Suitcase::Hotel::Location do
4
+ before :each do
5
+ @location = Suitcase::Hotel::Location.new({})
6
+ end
7
+
8
+ [:destination_id, :province, :country, :country_code, :city, :type,
9
+ :active].each do |accessor|
10
+ it "has an accessor for #{accessor}" do
11
+ @location.must_respond_to(accessor)
12
+ @location.must_respond_to((accessor.to_s + "=").to_sym)
13
+ end
14
+ end
15
+
16
+ describe ".find" do
17
+ it "returns an Array of Locations" do
18
+ locations = Suitcase::Hotel::Location.find(destination_string: "Lond")
19
+ locations.must_be_kind_of(Array)
20
+ locations.first.must_be_kind_of(Suitcase::Hotel::Location)
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,122 @@
1
+ require "minitest_helper"
2
+
3
+ describe Suitcase::Hotel do
4
+ before :each do
5
+ @hotel = Suitcase::Hotel.find(id: 123904)
6
+ end
7
+
8
+ [:id, :name, :address, :city, :amenities, :masked_amenities, :country_code,
9
+ :high_rate, :low_rate, :longitude, :latitude, :rating, :postal_code,
10
+ :images, :nightly_rate_total, :property_description, :number_of_floors,
11
+ :number_of_rooms, :deep_link, :tripadvisor_rating].each do |attribute|
12
+ it "has an attr_accessor for #{attribute}" do
13
+ @hotel.must_respond_to(attribute)
14
+ @hotel.must_respond_to((attribute.to_s + "=").to_sym)
15
+ end
16
+ end
17
+
18
+ describe ".find" do
19
+ it "returns a single Hotel if passed an ID" do
20
+ @hotel.must_be_kind_of(Suitcase::Hotel)
21
+ end
22
+
23
+ it "returns available hotels if arrival and departure are passed in" do
24
+ hotels = Suitcase::Hotel.find(location: "London, UK",
25
+ arrival: "10/13/2013",
26
+ departure: "10/15/2013",
27
+ results: 1)
28
+ hotels.must_be_kind_of(Array)
29
+ hotels.first.must_be_kind_of(Suitcase::Hotel)
30
+ hotels.first.raw["HotelListResponse"]["moreResultsAvailable"].must_equal(true)
31
+ end
32
+
33
+ it "returns multiple Hotels if a location is passed in" do
34
+ hotels = Suitcase::Hotel.find(location: "London, UK")
35
+ hotels.must_be_kind_of(Array)
36
+ hotels.first.must_be_kind_of(Suitcase::Hotel)
37
+ end
38
+
39
+ it "returns multiple Hotels if a destination ID is passed in" do
40
+ hotels = Suitcase::Hotel.find(destination_id: "58870F43-9215-4662-BAA1-CC9A20FEC4F1")
41
+ hotels.must_be_kind_of(Array)
42
+ hotels.first.must_be_kind_of(Suitcase::Hotel)
43
+ end
44
+
45
+ it "returns multiple Hotels if multiple ID's are passed in" do
46
+ hotels = Suitcase::Hotel.find(ids: [123904, 191937, 220166])
47
+ hotels.must_be_kind_of(Array)
48
+ hotels.first.must_be_kind_of(Suitcase::Hotel)
49
+ end
50
+
51
+ it "returns an Array with a single Hotel if an Array with a single ID is passed in" do
52
+ hotels = Suitcase::Hotel.find(ids: [123904])
53
+ hotels.count.must_equal(1)
54
+ hotels.first.must_be_kind_of(Suitcase::Hotel)
55
+ end
56
+
57
+ it "sets a recovery attribute on the raised error when the location is not specific enough" do
58
+ begin
59
+ Suitcase::Hotel.find(location: "Mexico")
60
+ rescue Suitcase::Hotel::EANException => e
61
+ e.recoverable?.must_equal(true) if e.type == :multiple_locations
62
+ end
63
+ end
64
+
65
+ it "sets the error type when the location is not specific enough" do
66
+ begin
67
+ Suitcase::Hotel.find(location: "Mexico")
68
+ rescue Suitcase::Hotel::EANException => e
69
+ e.type.must_equal(:multiple_locations)
70
+ e.recovery.must_be_kind_of(Hash)
71
+ e.recovery[:alternate_locations].must_be_kind_of(Array)
72
+ e.recovery[:alternate_locations].first.must_be_kind_of(Suitcase::Hotel::Location)
73
+ end
74
+ end
75
+ end
76
+
77
+ describe "#images" do
78
+ it "correctly gets the URLs of the images" do
79
+ images = @hotel.images
80
+ images.must_be_kind_of(Array)
81
+ images.map { |image| URI.parse(image.url) }
82
+ end
83
+ end
84
+
85
+ describe "#thumbnail_url" do
86
+ it "returns the first image's thumbnail URL" do
87
+ @hotel.thumbnail_url.must_equal @hotel.images.first.thumbnail_url
88
+ end
89
+ end
90
+
91
+ describe "#rooms" do
92
+ before do
93
+ @info = {
94
+ arrival: "1/1/2013",
95
+ departure: "1/8/2013"
96
+ }
97
+ @rooms = @hotel.rooms(@info)
98
+ end
99
+
100
+ it "returns an Array of available Rooms" do
101
+ @rooms.must_be_kind_of(Array)
102
+ end
103
+
104
+ it "each room must contain a cancellation policy" do
105
+ @rooms.each do |r|
106
+ r.cancellation_policy.wont_be_nil
107
+ end
108
+ end
109
+
110
+ it "each room must contain the non_refundable option" do
111
+ @rooms.each do |r|
112
+ r.non_refundable.wont_be_nil
113
+ end
114
+ end
115
+
116
+ it "each room must contain the deposit_required" do
117
+ @rooms.each do |r|
118
+ r.deposit_required.wont_be_nil
119
+ end
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,20 @@
1
+ require "minitest_helper"
2
+
3
+ describe Suitcase::Image do
4
+ before :each do
5
+ @image = Suitcase::Hotel.find(id: 123904).images.first
6
+ end
7
+
8
+ [:url, :id, :caption, :height, :width, :thumbnail_url, :name].each do |meth|
9
+ it "has an accessor for #{meth}" do
10
+ @image.must_respond_to(meth)
11
+ @image.must_respond_to((meth.to_s + "=").to_sym)
12
+ end
13
+ end
14
+
15
+ describe "#url" do
16
+ it "returns a valid URL" do
17
+ URI.parse(@image.url).must_be_kind_of(URI)
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,15 @@
1
+ require "minitest_helper"
2
+
3
+ describe Suitcase::Hotel::PaymentOption do
4
+ before :each do
5
+ @info = { currency_code: "USD" }
6
+ end
7
+
8
+ describe ".find" do
9
+ it "returns an Array of PaymentOption's" do
10
+ options = Suitcase::Hotel::PaymentOption.find(@info)
11
+ options.must_be_kind_of(Array)
12
+ options.first.must_be_kind_of(Suitcase::Hotel::PaymentOption)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ require "minitest_helper"
2
+
3
+ describe Suitcase::Hotel::Reservation do
4
+ before :each do
5
+ @reservation = Suitcase::Hotel::Reservation.new({})
6
+ end
7
+
8
+ it "has a reader for itinerary_id" do
9
+ @reservation.must_respond_to :itinerary_id
10
+ end
11
+
12
+ it "has a reader for confirmation_numbers" do
13
+ @reservation.must_respond_to :confirmation_numbers
14
+ end
15
+ end
@@ -0,0 +1,53 @@
1
+ require "minitest_helper"
2
+
3
+ describe Suitcase::Hotel::Room do
4
+ before :each do
5
+ @room = Suitcase::Hotel.find(id: 123904).rooms(arrival: Keys::RESERVATION_START_TIME, departure: Keys::RESERVATION_END_TIME).first
6
+ end
7
+
8
+ %w(arrival departure rate_code room_type_code supplier_type tax_rate
9
+ non_refundable occupancy quoted_occupancy min_guest_age total surcharge_total
10
+ average_base_rate average_base_rate average_rate max_nightly_rate
11
+ currency_code value_adds room_type_description price_breakdown total_price
12
+ average_nightly_rate promo promo_description rate_key hotel_id
13
+ supplier_type bed_types rooms).each do |attribute|
14
+ it "has an attr_accessor for #{attribute}" do
15
+ @room.must_respond_to attribute.to_sym
16
+ @room.must_respond_to (attribute + "=").to_sym
17
+ end
18
+ end
19
+
20
+ describe "#reserve!" do
21
+ before :each do
22
+ @info = { email: Keys::SENDING_EMAIL,
23
+ first_name: "Walter",
24
+ last_name: "Nelson",
25
+ home_phone: "3831039402",
26
+ payment_option: Keys::SUITCASE_PAYMENT_OPTION, # Visa
27
+ credit_card_number: Keys::CREDIT_CARD_NUMBER_TESTING,
28
+ credit_card_verification_code: Keys::CREDIT_CARD_CVV_TESTING, # CVV
29
+ credit_card_expiration_date: Keys::CREDIT_CARD_EXPIRATION_DATE_TESTING,
30
+ address1: "travelnow", # for testing
31
+ address2: "Apt. 4A",
32
+ city: "Boston",
33
+ province: "MA",
34
+ country: "US",
35
+ postal_code: "02111" }
36
+ @room.rooms = [{}]
37
+ @room.rooms[0][:adults] = 1
38
+ @room.rooms[0][:children_ages] = [5, 3]
39
+ # @room.rooms[0][:bed_type] = @room.bed_types[0]
40
+ @room.rooms[0][:smoking_preference] = "NS"
41
+ end
42
+
43
+ it "returns a Suitcase::Reservation" do
44
+ reservation = @room.reserve!(@info)
45
+ reservation.must_be_kind_of(Suitcase::Hotel::Reservation)
46
+ end
47
+
48
+ it "raises errors on invalid info" do
49
+ lambda { @room.reserve!(@info.merge(credit_card_number: "")) }.must_raise Suitcase::Hotel::EANException
50
+ end
51
+ end
52
+ end
53
+
@@ -0,0 +1,14 @@
1
+ require "minitest_helper"
2
+
3
+ describe Suitcase::Hotel::Session do
4
+ before :each do
5
+ @session = Suitcase::Hotel::Session.new
6
+ end
7
+
8
+ [:id, :ip_address, :user_agent, :locale, :currency_code].each do |accessor|
9
+ it "has an accessor for #{accessor}" do
10
+ @session.must_respond_to(accessor)
11
+ @session.must_respond_to((accessor.to_s + "=").to_sym)
12
+ end
13
+ end
14
+ end
data/test/keys.rb ADDED
@@ -0,0 +1,43 @@
1
+ # Suitcase::Configuration.hotel_api_key = "your_api_key_here"
2
+ # Suitcase::Configuration.hotel_cid = "your_cid_here"
3
+ # Suitcase::Configuration.hotel_shared_secret = "your_shared_secret_here"
4
+ # Suitcase::Configuration.use_signature_auth = true
5
+
6
+ # Or configure with a block:
7
+
8
+ Suitcase.configure do |config|
9
+ config.hotel_api_key = ENV['EAN_KEY']
10
+ config.hotel_cid = ENV['EAN_CID']
11
+
12
+ config.hotwire_api_key = ""
13
+ # config.hotel_shared_secret = "none"
14
+ # config.use_signature_auth = false
15
+ end
16
+
17
+ module Keys
18
+ RESERVATION_START_TIME = Chronic.parse("1 week from now").strftime("%m/%d/%Y")
19
+ RESERVATION_END_TIME = Chronic.parse("2 weeks from now").strftime("%m/%d/%Y")
20
+
21
+ SUITCASE_PAYMENT_OPTION = Suitcase::Hotel::PaymentOption.find(currency_code: "USD").find { |po| po.name =~ /Master/ }
22
+ CREDIT_CARD_NUMBER_TESTING = "5401999999999999"
23
+ CREDIT_CARD_CVV_TESTING = "123"
24
+ CREDIT_CARD_EXPIRATION_DATE_TESTING = "2014/03/01"
25
+
26
+ SENDING_EMAIL = "testemail@gmail.com"
27
+
28
+ VALID_RESERVATION_INFO = {
29
+ email: "testemail@gmail.com",
30
+ first_name: "Test Booking",
31
+ last_name: "Test Booking",
32
+ home_phone: "1231231234",
33
+ payment_option: SUITCASE_PAYMENT_OPTION,
34
+ credit_card_number: CREDIT_CARD_NUMBER_TESTING,
35
+ credit_card_verification_code: CREDIT_CARD_CVV_TESTING,
36
+ credit_card_expiration_date: CREDIT_CARD_EXPIRATION_DATE_TESTING,
37
+ address1: "travelnow",
38
+ city: "Boston",
39
+ province: "MA",
40
+ country: "US",
41
+ postal_code: "01234",
42
+ }
43
+ end
@@ -0,0 +1,29 @@
1
+ # Testing frameworks
2
+ require "turn"
3
+ require "minitest/spec"
4
+ require "minitest/autorun"
5
+ require "mocha"
6
+
7
+ # For making sure the dates will be valid
8
+ require "chronic"
9
+
10
+ # Debugger
11
+ require "pry"
12
+
13
+ # The gem
14
+ $: << File.dirname(__FILE__) + "/../lib"
15
+ $: << File.dirname(__FILE__)
16
+ require "suitcase"
17
+
18
+ # API keys
19
+ require "keys"
20
+
21
+ # Support files
22
+ require "support/fake_response"
23
+
24
+ # Turn configuration
25
+ Turn.config do |config|
26
+ config.format = :pretty
27
+ # config.trace = true
28
+ config.natural = true
29
+ end
@@ -0,0 +1,13 @@
1
+ class FakeResponse
2
+ def initialize(options = {})
3
+ options.each { |k, v| instance_variable_set("@#{k}", v) }
4
+ end
5
+
6
+ def method_missing(meth, *args, &blk)
7
+ if args.empty?
8
+ instance_variable_get("@#{meth}")
9
+ else
10
+ super
11
+ end
12
+ end
13
+ end
metadata ADDED
@@ -0,0 +1,187 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: isotope11-suitcase
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.7.6
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Walter Nelson
9
+ - Tad Hosford
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2012-09-10 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: minitest
17
+ requirement: &18584740 !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: *18584740
26
+ - !ruby/object:Gem::Dependency
27
+ name: mocha
28
+ requirement: &18584280 !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: *18584280
37
+ - !ruby/object:Gem::Dependency
38
+ name: turn
39
+ requirement: &18583800 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ type: :development
46
+ prerelease: false
47
+ version_requirements: *18583800
48
+ - !ruby/object:Gem::Dependency
49
+ name: chronic
50
+ requirement: &18583220 !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ! '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ type: :development
57
+ prerelease: false
58
+ version_requirements: *18583220
59
+ - !ruby/object:Gem::Dependency
60
+ name: rake
61
+ requirement: &18582720 !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ! '>='
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ type: :development
68
+ prerelease: false
69
+ version_requirements: *18582720
70
+ - !ruby/object:Gem::Dependency
71
+ name: pry
72
+ requirement: &18581580 !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ type: :development
79
+ prerelease: false
80
+ version_requirements: *18581580
81
+ - !ruby/object:Gem::Dependency
82
+ name: json
83
+ requirement: &18581080 !ruby/object:Gem::Requirement
84
+ none: false
85
+ requirements:
86
+ - - ! '>='
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ type: :runtime
90
+ prerelease: false
91
+ version_requirements: *18581080
92
+ - !ruby/object:Gem::Dependency
93
+ name: patron
94
+ requirement: &18580500 !ruby/object:Gem::Requirement
95
+ none: false
96
+ requirements:
97
+ - - ! '>='
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ type: :runtime
101
+ prerelease: false
102
+ version_requirements: *18580500
103
+ description: Ruby library that utilizes the EAN (Expedia.com) API for locating available
104
+ hotels and the Hotwire API for rental cars.
105
+ email:
106
+ - tad@isotope11.com
107
+ executables: []
108
+ extensions: []
109
+ extra_rdoc_files: []
110
+ files:
111
+ - .gitignore
112
+ - CHANGELOG.md
113
+ - Gemfile
114
+ - README.md
115
+ - Rakefile
116
+ - examples/hash_adapter.rb
117
+ - examples/hotel_image_db.rb
118
+ - examples/redis_adapter.rb
119
+ - isotope11-suitcase.gemspec
120
+ - lib/suitcase.rb
121
+ - lib/suitcase/car_rental.rb
122
+ - lib/suitcase/codes.rb
123
+ - lib/suitcase/configuration.rb
124
+ - lib/suitcase/core_ext/string.rb
125
+ - lib/suitcase/hotel.rb
126
+ - lib/suitcase/hotel/amenity.rb
127
+ - lib/suitcase/hotel/bed_type.rb
128
+ - lib/suitcase/hotel/cache.rb
129
+ - lib/suitcase/hotel/cancellation.rb
130
+ - lib/suitcase/hotel/ean_exception.rb
131
+ - lib/suitcase/hotel/helpers.rb
132
+ - lib/suitcase/hotel/image.rb
133
+ - lib/suitcase/hotel/location.rb
134
+ - lib/suitcase/hotel/nightly_rate.rb
135
+ - lib/suitcase/hotel/payment_option.rb
136
+ - lib/suitcase/hotel/reservation.rb
137
+ - lib/suitcase/hotel/room.rb
138
+ - lib/suitcase/hotel/session.rb
139
+ - lib/suitcase/hotel/surcharge.rb
140
+ - lib/suitcase/version.rb
141
+ - test/car_rentals/car_rental_test.rb
142
+ - test/hotels/amenity_test.rb
143
+ - test/hotels/caching_test.rb
144
+ - test/hotels/ean_exception_test.rb
145
+ - test/hotels/helpers_test.rb
146
+ - test/hotels/hotel_location_test.rb
147
+ - test/hotels/hotel_test.rb
148
+ - test/hotels/image_test.rb
149
+ - test/hotels/payment_option_test.rb
150
+ - test/hotels/reservation_test.rb
151
+ - test/hotels/room_test.rb
152
+ - test/hotels/session_test.rb
153
+ - test/keys.rb
154
+ - test/minitest_helper.rb
155
+ - test/support/fake_response.rb
156
+ homepage: http://github.com/isotope11/suitcase
157
+ licenses: []
158
+ post_install_message:
159
+ rdoc_options: []
160
+ require_paths:
161
+ - lib
162
+ required_ruby_version: !ruby/object:Gem::Requirement
163
+ none: false
164
+ requirements:
165
+ - - ! '>='
166
+ - !ruby/object:Gem::Version
167
+ version: '0'
168
+ segments:
169
+ - 0
170
+ hash: -1403295208779248586
171
+ required_rubygems_version: !ruby/object:Gem::Requirement
172
+ none: false
173
+ requirements:
174
+ - - ! '>='
175
+ - !ruby/object:Gem::Version
176
+ version: '0'
177
+ segments:
178
+ - 0
179
+ hash: -1403295208779248586
180
+ requirements: []
181
+ rubyforge_project:
182
+ rubygems_version: 1.8.17
183
+ signing_key:
184
+ specification_version: 3
185
+ summary: Locates available hotels and rental cars through Expedia and Hotwire. This
186
+ is a fork of Walter Nelson's gem - suitcase
187
+ test_files: []