hotels_pro 0.2
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.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.rspec +2 -0
- data/.travis.yml +7 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +91 -0
- data/Rakefile +2 -0
- data/hotels_pro.gemspec +24 -0
- data/lib/hotels_pro.rb +69 -0
- data/lib/hotels_pro/api/api_method.rb +29 -0
- data/lib/hotels_pro/api/api_params.rb +29 -0
- data/lib/hotels_pro/api/elements/book_info.rb +27 -0
- data/lib/hotels_pro/api/elements/daily_rate.rb +12 -0
- data/lib/hotels_pro/api/elements/filter.rb +13 -0
- data/lib/hotels_pro/api/elements/hotel.rb +22 -0
- data/lib/hotels_pro/api/elements/lead_traveller.rb +15 -0
- data/lib/hotels_pro/api/elements/pax.rb +16 -0
- data/lib/hotels_pro/api/elements/pax_array.rb +17 -0
- data/lib/hotels_pro/api/elements/policy.rb +15 -0
- data/lib/hotels_pro/api/elements/room_response.rb +16 -0
- data/lib/hotels_pro/api/methods/allocate_hotel_code.rb +21 -0
- data/lib/hotels_pro/api/methods/amend_hotel_booking.rb +27 -0
- data/lib/hotels_pro/api/methods/cancel_hotel_booking.rb +20 -0
- data/lib/hotels_pro/api/methods/get_available_hotel.rb +28 -0
- data/lib/hotels_pro/api/methods/get_balance.rb +18 -0
- data/lib/hotels_pro/api/methods/get_hotel_booking_status.rb +21 -0
- data/lib/hotels_pro/api/methods/get_hotel_cancellation_policy.rb +19 -0
- data/lib/hotels_pro/api/methods/make_hotel_booking.rb +24 -0
- data/lib/hotels_pro/configuration.rb +14 -0
- data/lib/hotels_pro/query.rb +34 -0
- data/lib/hotels_pro/request.rb +43 -0
- data/lib/hotels_pro/response.rb +33 -0
- data/lib/hotels_pro/stubs.rb +66 -0
- data/lib/hotels_pro/stubs/stub.rb +23 -0
- data/lib/hotels_pro/underscorer.rb +21 -0
- data/lib/hotels_pro/version.rb +3 -0
- data/spec/api_params_helper.rb +8 -0
- data/spec/fixtures/allocate_hotel_code.json +1 -0
- data/spec/fixtures/amend_hotel_booking.json +1 -0
- data/spec/fixtures/cancel_hotel_booking.json +1 -0
- data/spec/fixtures/get_available_hotel.json +1 -0
- data/spec/fixtures/get_balance.json +1 -0
- data/spec/fixtures/get_hotel_booking_status.json +1 -0
- data/spec/fixtures/get_hotel_cancellation_policy.json +1 -0
- data/spec/fixtures/make_hotel_booking.json +1 -0
- data/spec/hotels_pro/api/.gitkeep +0 -0
- data/spec/hotels_pro/api/api_method_spec.rb +14 -0
- data/spec/hotels_pro/api/api_params_spec.rb +36 -0
- data/spec/hotels_pro/api/elements/pax_array_spec.rb +14 -0
- data/spec/hotels_pro/api/methods/allocate_hotel_code_spec.rb +34 -0
- data/spec/hotels_pro/api/methods/amend_hotel_booking_spec.rb +79 -0
- data/spec/hotels_pro/api/methods/cancel_hotel_booking_spec.rb +32 -0
- data/spec/hotels_pro/api/methods/get_available_hotel_spec.rb +83 -0
- data/spec/hotels_pro/api/methods/get_balance_spec.rb +26 -0
- data/spec/hotels_pro/api/methods/get_hotel_booking_status_spec.rb +31 -0
- data/spec/hotels_pro/api/methods/get_hotel_cancellation_policy_spec.rb +31 -0
- data/spec/hotels_pro/api/methods/make_hotel_booking_spec.rb +66 -0
- data/spec/hotels_pro/query_spec.rb +52 -0
- data/spec/hotels_pro/request_spec.rb +73 -0
- data/spec/hotels_pro/response_spec.rb +24 -0
- data/spec/hotels_pro/stubs/stub_spec.rb +41 -0
- data/spec/hotels_pro/stubs_spec.rb +37 -0
- data/spec/hotels_pro/underscorer_spec.rb +33 -0
- data/spec/request_helper.rb +6 -0
- data/spec/spec_helper.rb +15 -0
- metadata +222 -0
@@ -0,0 +1,15 @@
|
|
1
|
+
module HotelsPro
|
2
|
+
module Api
|
3
|
+
module Elements
|
4
|
+
class Policy
|
5
|
+
include Virtus
|
6
|
+
|
7
|
+
attribute :cancellation_day, Integer
|
8
|
+
attribute :fee_type, String
|
9
|
+
attribute :fee_amount, Float
|
10
|
+
attribute :currency, String
|
11
|
+
attribute :remarks, String
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'hotels_pro/api/elements/pax'
|
2
|
+
|
3
|
+
module HotelsPro
|
4
|
+
module Api
|
5
|
+
module Elements
|
6
|
+
class RoomResponse
|
7
|
+
include Virtus
|
8
|
+
|
9
|
+
attribute :room_category, String
|
10
|
+
attribute :paxes, Array[Pax]
|
11
|
+
attribute :total_room_rate, Float
|
12
|
+
attribute :rates_per_night, Array[DailyRate]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'hotels_pro/api/elements/hotel'
|
2
|
+
|
3
|
+
module HotelsPro
|
4
|
+
module Api
|
5
|
+
module Methods
|
6
|
+
class AllocateHotelCode < ApiMethod
|
7
|
+
|
8
|
+
attribute :search_id, String
|
9
|
+
attribute :hotel_code, String
|
10
|
+
|
11
|
+
class Result < ApiMethod::Result
|
12
|
+
attribute :response_id, Integer
|
13
|
+
attribute :search_id, String
|
14
|
+
attribute :hotel_code, String
|
15
|
+
attribute :available_hotels, Array[Api::Elements::Hotel]
|
16
|
+
attribute :total_found, Integer
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'hotels_pro/api/elements/book_info'
|
2
|
+
require 'hotels_pro/api/elements/lead_traveller'
|
3
|
+
require 'hotels_pro/api/elements/pax_array'
|
4
|
+
|
5
|
+
module HotelsPro
|
6
|
+
module Api
|
7
|
+
module Methods
|
8
|
+
class AmendHotelBooking < ApiMethod
|
9
|
+
attribute :tracking_id, String
|
10
|
+
attribute :check_in, Date
|
11
|
+
attribute :check_out, Date
|
12
|
+
attribute :lead_traveller_info, Api::Elements::LeadTraveller
|
13
|
+
attribute :rooms, Array[Api::Elements::PaxArray], :default => []
|
14
|
+
attribute :preferences, String
|
15
|
+
attribute :note, String
|
16
|
+
|
17
|
+
class Result < ApiMethod::Result
|
18
|
+
attribute :response_id, Integer
|
19
|
+
attribute :tracking_id, Integer
|
20
|
+
attribute :agency_reference_number, String
|
21
|
+
attribute :amend_status, String
|
22
|
+
attribute :note, String
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module HotelsPro
|
2
|
+
module Api
|
3
|
+
module Methods
|
4
|
+
class CancelHotelBooking < ApiMethod
|
5
|
+
include ApiParams
|
6
|
+
include Virtus
|
7
|
+
|
8
|
+
attribute :tracking_id, String
|
9
|
+
|
10
|
+
class Result < ApiMethod::Result
|
11
|
+
attribute :response_id, Integer
|
12
|
+
attribute :tracking_id, String
|
13
|
+
attribute :agency_reference_number, String
|
14
|
+
attribute :booking_status, String
|
15
|
+
attribute :note, String
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'hotels_pro/api/elements/filter'
|
2
|
+
require 'hotels_pro/api/elements/hotel'
|
3
|
+
require 'hotels_pro/api/elements/pax_array'
|
4
|
+
|
5
|
+
module HotelsPro
|
6
|
+
module Api
|
7
|
+
module Methods
|
8
|
+
class GetAvailableHotel < ApiMethod
|
9
|
+
|
10
|
+
attribute :destination_id, String
|
11
|
+
attribute :check_in, Date
|
12
|
+
attribute :check_out, Date
|
13
|
+
attribute :currency, String, :default => "EUR"
|
14
|
+
attribute :client_nationality, String
|
15
|
+
attribute :on_request, Boolean, :default => true
|
16
|
+
attribute :rooms, Array[Api::Elements::PaxArray], :default => []
|
17
|
+
attribute :filters, Array[Api::Elements::Filter], :default => []
|
18
|
+
|
19
|
+
class Result < ApiMethod::Result
|
20
|
+
attribute :response_id, Integer
|
21
|
+
attribute :search_id, String
|
22
|
+
attribute :total_found, Integer
|
23
|
+
attribute :available_hotels, Array[Api::Elements::Hotel]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module HotelsPro
|
2
|
+
module Api
|
3
|
+
module Methods
|
4
|
+
class GetBalance < ApiMethod
|
5
|
+
include ApiParams
|
6
|
+
include Virtus
|
7
|
+
|
8
|
+
class Result < ApiMethod::Result
|
9
|
+
attribute :response_id, Integer
|
10
|
+
attribute :currency, String
|
11
|
+
attribute :total_deposit, Float
|
12
|
+
attribute :total_booking_amount, Float
|
13
|
+
attribute :current_balance, Float
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'hotels_pro/api/elements/book_info'
|
2
|
+
|
3
|
+
module HotelsPro
|
4
|
+
module Api
|
5
|
+
module Methods
|
6
|
+
class GetHotelBookingStatus < ApiMethod
|
7
|
+
include ApiParams
|
8
|
+
include Virtus
|
9
|
+
|
10
|
+
attribute :tracking_id, String
|
11
|
+
|
12
|
+
class Result < ApiMethod::Result
|
13
|
+
attribute :response_id, Integer
|
14
|
+
attribute :tracking_id, String
|
15
|
+
attribute :agency_reference_number, String
|
16
|
+
attribute :hotel_booking_info, HotelsPro::Api::Elements::BookInfo
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module HotelsPro
|
2
|
+
module Api
|
3
|
+
module Methods
|
4
|
+
class GetHotelCancellationPolicy < ApiMethod
|
5
|
+
include ApiParams
|
6
|
+
include Virtus
|
7
|
+
|
8
|
+
attribute :tracking_id, String
|
9
|
+
|
10
|
+
class Result < ApiMethod::Result
|
11
|
+
attribute :response_id, Integer
|
12
|
+
attribute :tracking_id, String
|
13
|
+
attribute :agency_reference_number, String
|
14
|
+
attribute :cancellation_policy, Array[HotelsPro::Api::Elements::Policy], :default => []
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'hotels_pro/api/elements/book_info'
|
2
|
+
require 'hotels_pro/api/elements/lead_traveller'
|
3
|
+
require 'hotels_pro/api/elements/pax_array'
|
4
|
+
|
5
|
+
module HotelsPro
|
6
|
+
module Api
|
7
|
+
module Methods
|
8
|
+
class MakeHotelBooking < ApiMethod
|
9
|
+
attribute :process_id, String
|
10
|
+
attribute :agency_reference_number, String
|
11
|
+
attribute :lead_traveller_info, HotelsPro::Api::Elements::LeadTraveller
|
12
|
+
attribute :other_traveller_info, Array[Api::Elements::Pax], :default => []
|
13
|
+
attribute :preferences, String
|
14
|
+
attribute :note, String
|
15
|
+
|
16
|
+
class Result < ApiMethod::Result
|
17
|
+
attribute :response_id, Integer
|
18
|
+
attribute :tracking_id, Integer
|
19
|
+
attribute :hotel_booking_info, HotelsPro::Api::Elements::BookInfo
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module HotelsPro
|
2
|
+
class Configuration
|
3
|
+
attr_accessor :environment, :api_key, :logger, :only_stubs
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@environment = "test"
|
7
|
+
end
|
8
|
+
|
9
|
+
def api_url
|
10
|
+
env = ("" if environment == "live") || "_test"
|
11
|
+
"http://api.hotelspro.com/4.1#{env}/hotel/b2bHotelJSON.php"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
|
3
|
+
module HotelsPro
|
4
|
+
class Query
|
5
|
+
def initialize(api_params)
|
6
|
+
chunks = api_params.inject([]) do |arr, (k, v)|
|
7
|
+
arr << encode(k, v)
|
8
|
+
arr
|
9
|
+
end
|
10
|
+
@query = "?" << chunks.join("&")
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_s
|
14
|
+
@query
|
15
|
+
end
|
16
|
+
|
17
|
+
def encode(key, value)
|
18
|
+
case value
|
19
|
+
when Hash
|
20
|
+
chunks = value.map do |k, v|
|
21
|
+
encode("#{key}[#{k}]", v)
|
22
|
+
end
|
23
|
+
chunks.join("&")
|
24
|
+
when Array
|
25
|
+
chunks = value.each_with_index.map do |v, i|
|
26
|
+
encode("#{key}[#{i}]", v)
|
27
|
+
end
|
28
|
+
chunks.join("&")
|
29
|
+
else
|
30
|
+
"#{key}=#{URI::encode(value)}"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module HotelsPro
|
2
|
+
class Request
|
3
|
+
attr_accessor :api_method, :params
|
4
|
+
|
5
|
+
def initialize(api_method, params={})
|
6
|
+
@api_method = api_method.camelize(:lower)
|
7
|
+
@params = params
|
8
|
+
end
|
9
|
+
|
10
|
+
def query
|
11
|
+
params = @params.dup
|
12
|
+
params["method"] = api_method
|
13
|
+
params["apiKey"] = HotelsPro.configuration.api_key
|
14
|
+
|
15
|
+
Query.new(params).to_s
|
16
|
+
end
|
17
|
+
|
18
|
+
def uri
|
19
|
+
"#{HotelsPro.configuration.api_url}#{query}"
|
20
|
+
end
|
21
|
+
|
22
|
+
def perform
|
23
|
+
HotelsPro.log("Request URL: #{uri}")
|
24
|
+
|
25
|
+
raw_response = stubbed_response || real_response
|
26
|
+
HotelsPro.log("Response: #{raw_response}")
|
27
|
+
|
28
|
+
Response.new(raw_response)
|
29
|
+
end
|
30
|
+
|
31
|
+
def stubbed_response
|
32
|
+
response = HotelsPro::Stubs.match(self)
|
33
|
+
if !response && HotelsPro.configuration.only_stubs
|
34
|
+
raise HotelsPro::UnstubbedRequest.new("Unstubbed request to URL: #{uri}")
|
35
|
+
end
|
36
|
+
response
|
37
|
+
end
|
38
|
+
|
39
|
+
def real_response
|
40
|
+
Typhoeus::Request.get(uri).body
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require "hotels_pro/underscorer"
|
2
|
+
|
3
|
+
module HotelsPro
|
4
|
+
class Response
|
5
|
+
include Underscorer
|
6
|
+
|
7
|
+
attr_reader :error_message, :data, :error
|
8
|
+
|
9
|
+
def initialize(json)
|
10
|
+
@data = underscore(body(json))
|
11
|
+
detect_error(data)
|
12
|
+
end
|
13
|
+
|
14
|
+
# HotelsPro API returns status 200 OK for errors and includes error message in body as:
|
15
|
+
# [0, "error message"]
|
16
|
+
def detect_error(data)
|
17
|
+
if data.is_a?(Array) && data.size == 2 && data[0] == 0
|
18
|
+
@error = ErrorResponse.new(data[1])
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def error?
|
23
|
+
!error.nil?
|
24
|
+
end
|
25
|
+
|
26
|
+
def body(json)
|
27
|
+
JSON.parse(json)
|
28
|
+
rescue JSON::ParserError
|
29
|
+
@error = RemoteError.new("Remote API down.")
|
30
|
+
nil
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module HotelsPro
|
2
|
+
module Stubs
|
3
|
+
class << self
|
4
|
+
def stubs
|
5
|
+
@stubs ||= []
|
6
|
+
end
|
7
|
+
|
8
|
+
def clear
|
9
|
+
@stubs = []
|
10
|
+
end
|
11
|
+
|
12
|
+
def get_available_hotel(matcher=nil)
|
13
|
+
stub = Stub.new('getAvailableHotel', matcher)
|
14
|
+
stubs << stub
|
15
|
+
stub
|
16
|
+
end
|
17
|
+
|
18
|
+
def allocate_hotel_code(matcher=nil)
|
19
|
+
stub = Stub.new('allocateHotelCode', matcher)
|
20
|
+
stubs << stub
|
21
|
+
stub
|
22
|
+
end
|
23
|
+
|
24
|
+
def make_hotel_booking(matcher=nil)
|
25
|
+
stub = Stub.new('makeHotelBooking', matcher)
|
26
|
+
stubs << stub
|
27
|
+
stub
|
28
|
+
end
|
29
|
+
|
30
|
+
def get_hotel_booking_status(matcher=nil)
|
31
|
+
stub = Stub.new('getHotelBookingStatus', matcher)
|
32
|
+
stubs << stub
|
33
|
+
stub
|
34
|
+
end
|
35
|
+
|
36
|
+
def cancel_hotel_booking(matcher=nil)
|
37
|
+
stub = Stub.new('cancelHotelBooking', matcher)
|
38
|
+
stubs << stub
|
39
|
+
stub
|
40
|
+
end
|
41
|
+
|
42
|
+
def get_hotel_cancellation_policy(matcher=nil)
|
43
|
+
stub = Stub.new('getHotelCancellationPolicy', matcher)
|
44
|
+
stubs << stub
|
45
|
+
stub
|
46
|
+
end
|
47
|
+
|
48
|
+
def amend_hotel_booking(matcher=nil)
|
49
|
+
stub = Stub.new('amendHotelBooking', matcher)
|
50
|
+
stubs << stub
|
51
|
+
stub
|
52
|
+
end
|
53
|
+
|
54
|
+
def get_balance(matcher=nil)
|
55
|
+
stub = Stub.new('getBalance', matcher)
|
56
|
+
stubs << stub
|
57
|
+
stub
|
58
|
+
end
|
59
|
+
|
60
|
+
def match(request)
|
61
|
+
stub = stubs.find { |s| s.matches?(request) }
|
62
|
+
stub.response if stub
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module HotelsPro
|
2
|
+
module Stubs
|
3
|
+
class Stub
|
4
|
+
def initialize(api_method, matcher=nil)
|
5
|
+
@api_method = api_method
|
6
|
+
@matcher = matcher
|
7
|
+
end
|
8
|
+
|
9
|
+
def response(resp=nil)
|
10
|
+
if resp
|
11
|
+
@response = resp
|
12
|
+
self
|
13
|
+
else
|
14
|
+
@response
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def matches?(request)
|
19
|
+
request.api_method == @api_method && (@matcher.nil? || @matcher.call(request))
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|