hotel_beds 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/lib/hotel_beds/action/envelope.rb +11 -0
  3. data/lib/hotel_beds/action/operation.rb +57 -0
  4. data/lib/hotel_beds/action/request.rb +15 -0
  5. data/lib/hotel_beds/action/response.rb +27 -0
  6. data/lib/hotel_beds/basket_remove/envelope.rb +2 -2
  7. data/lib/hotel_beds/basket_remove/operation.rb +8 -28
  8. data/lib/hotel_beds/basket_remove/request.rb +2 -7
  9. data/lib/hotel_beds/basket_remove/response.rb +2 -21
  10. data/lib/hotel_beds/builder/hotel_occupancy.rb +46 -0
  11. data/lib/hotel_beds/core_ext/array.rb +15 -0
  12. data/lib/hotel_beds/hotel_basket_add/envelope.rb +4 -19
  13. data/lib/hotel_beds/hotel_basket_add/operation.rb +8 -28
  14. data/lib/hotel_beds/hotel_basket_add/request.rb +2 -5
  15. data/lib/hotel_beds/hotel_basket_add/response.rb +2 -21
  16. data/lib/hotel_beds/hotel_search/envelope.rb +4 -19
  17. data/lib/hotel_beds/hotel_search/operation.rb +8 -28
  18. data/lib/hotel_beds/hotel_search/request.rb +3 -8
  19. data/lib/hotel_beds/hotel_search/response.rb +2 -17
  20. data/lib/hotel_beds/model.rb +10 -0
  21. data/lib/hotel_beds/purchase_confirm/envelope.rb +2 -2
  22. data/lib/hotel_beds/purchase_confirm/operation.rb +8 -28
  23. data/lib/hotel_beds/purchase_confirm/request.rb +2 -5
  24. data/lib/hotel_beds/purchase_confirm/response.rb +2 -21
  25. data/lib/hotel_beds/purchase_flush/envelope.rb +2 -2
  26. data/lib/hotel_beds/purchase_flush/operation.rb +8 -28
  27. data/lib/hotel_beds/purchase_flush/request.rb +2 -6
  28. data/lib/hotel_beds/purchase_flush/response.rb +3 -18
  29. data/lib/hotel_beds/version.rb +1 -1
  30. data/spec/lib/hotel_beds/model_spec.rb +22 -0
  31. metadata +10 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7c3bea539610e13aca6d457ae561d8c62c5b52d0
4
- data.tar.gz: 3b8365b3312998149cfa8bb1ede6a90aa5360525
3
+ metadata.gz: 5048cf0a8d957dca8fe68b51795053d73fb6b710
4
+ data.tar.gz: 2179c960f5ac433275cea5f79b948555edbec331
5
5
  SHA512:
6
- metadata.gz: 756489f73cc0a066d6771508404a01c01710a75fd32f73664d44e8a9f0d73f87d48db06fa626a64a0c6e3eb5c74ac74bf0b6bda0944f1b1b5f03058cb72117b7
7
- data.tar.gz: 0fda52e2b50755e68809154ae0094239c94ae2c63c488686acfa550fd2c39920fb45187ad05e2e9018c49a7418bf1e95b2b9ae81eccab2fb8836f725bb644d85
6
+ metadata.gz: 8ee7a4b8ea7890aaf4bd1c0421c2170828ae72e04babd58f55d4ef7fb43e059c782da9968acba6481070be532368c0b850c28caaaf163923cb8e44a85b76259f
7
+ data.tar.gz: fb550b1d74573d78ef0a7a8fcf412deeafa6f58928e7fbb370415e446516df558d8ec88b8d291f408194345a46aff329e8ca98e09483ca04bfd98585526363b1
@@ -0,0 +1,11 @@
1
+ require "delegate"
2
+
3
+ module HotelBeds
4
+ module Action
5
+ class Envelope < SimpleDelegator
6
+ def attributes
7
+ raise NotImplementedError
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,57 @@
1
+ module HotelBeds
2
+ module Action
3
+ class Operation
4
+ def self.remote_method(value = nil)
5
+ @remote_method = value if value
6
+ @remote_method
7
+ end
8
+
9
+ def self.remote_namespace(value = nil)
10
+ @remote_namespace = value if value
11
+ @remote_namespace
12
+ end
13
+
14
+ def self.request_class(value = nil)
15
+ @request_class = value if value
16
+ @request_class
17
+ end
18
+
19
+ def self.response_class(value = nil)
20
+ @response_class = value if value
21
+ @response_class
22
+ end
23
+
24
+ def self.envelope_class(value = nil)
25
+ @envelope_class = value if value
26
+ @envelope_class
27
+ end
28
+
29
+ attr_accessor :request, :response, :errors, :action_module
30
+ private :request=, :response=, :errors=, :action_module, :action_module=
31
+
32
+ def initialize(*args)
33
+ self.request = self.class.request_class.new(*args)
34
+ end
35
+
36
+ def perform(connection:)
37
+ if request.valid?
38
+ self.response = self.class.response_class.new(request, retrieve(connection))
39
+ self.errors = response.errors
40
+ else
41
+ self.errors = request.errors
42
+ end
43
+ freeze
44
+ self
45
+ end
46
+
47
+ private
48
+ def retrieve(connection)
49
+ connection.call({
50
+ method: self.class.remote_method,
51
+ namespace: self.class.remote_namespace,
52
+ data: self.class.envelope_class.new(request).attributes
53
+ })
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,15 @@
1
+ require "hotel_beds/model"
2
+
3
+ module HotelBeds
4
+ module Action
5
+ class Request
6
+ include HotelBeds::Model
7
+
8
+ # attributes
9
+ attribute :language, String, default: "ENG"
10
+
11
+ # validation
12
+ validates :language, length: { is: 3 }
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,27 @@
1
+ require "nokogiri"
2
+ require "hotel_beds/parser/errors"
3
+
4
+ module HotelBeds
5
+ module Action
6
+ class Response
7
+ attr_accessor :request, :headers, :body, :errors
8
+ private :request=, :headers=, :body=, :errors=
9
+
10
+ def initialize(request, response)
11
+ self.request = request
12
+ self.headers = response.header
13
+ self.body = Nokogiri::XML(response.body.values.first)
14
+ self.errors = HotelBeds::Parser::Errors.new(response).to_model(self)
15
+ freeze
16
+ end
17
+
18
+ def inspect
19
+ "<#{self.class.name} errors=#{errors.inspect} headers=#{headers.inspect} body=#{body.to_s}>"
20
+ end
21
+
22
+ def success?
23
+ errors.empty?
24
+ end
25
+ end
26
+ end
27
+ end
@@ -1,8 +1,8 @@
1
- require "delegate"
1
+ require "hotel_beds/action/envelope"
2
2
 
3
3
  module HotelBeds
4
4
  module BasketRemove
5
- class Envelope < SimpleDelegator
5
+ class Envelope < HotelBeds::Action::Envelope
6
6
  def attributes
7
7
  {
8
8
  :Language => language,
@@ -1,36 +1,16 @@
1
+ require "hotel_beds/action/operation"
2
+ require_relative "envelope"
1
3
  require_relative "request"
2
4
  require_relative "response"
3
- require_relative "envelope"
4
5
 
5
6
  module HotelBeds
6
7
  module BasketRemove
7
- class Operation
8
- attr_accessor :request, :response, :errors
9
- private :request=, :response=, :errors=
10
-
11
- def initialize(*args)
12
- self.request = Request.new(*args)
13
- end
14
-
15
- def perform(connection:)
16
- if request.valid?
17
- self.response = Response.new(request, retrieve(connection))
18
- self.errors = response.errors
19
- else
20
- self.errors = request.errors
21
- end
22
- freeze
23
- self
24
- end
25
-
26
- private
27
- def retrieve(connection)
28
- connection.call({
29
- method: :serviceRemove,
30
- namespace: :ServiceRemoveRQ,
31
- data: Envelope.new(request).attributes
32
- })
33
- end
8
+ class Operation < HotelBeds::Action::Operation
9
+ remote_method :serviceRemove
10
+ remote_namespace :ServiceRemoveRQ
11
+ envelope_class Envelope
12
+ request_class Request
13
+ response_class Response
34
14
  end
35
15
  end
36
16
  end
@@ -1,18 +1,13 @@
1
- require "hotel_beds/model"
1
+ require "hotel_beds/action/request"
2
2
 
3
3
  module HotelBeds
4
4
  module BasketRemove
5
- class Request
6
- include HotelBeds::Model
7
-
5
+ class Request < HotelBeds::Action::Request
8
6
  # attributes
9
- attribute :language, String, default: "ENG"
10
7
  attribute :purchase_token, String
11
8
  attribute :service_id, String
12
9
 
13
-
14
10
  # validation
15
- validates :language, length: { is: 3 }
16
11
  validates :service_id, :purchase_token, presence: true
17
12
  end
18
13
  end
@@ -1,28 +1,9 @@
1
- require "hotel_beds/parser/errors"
1
+ require "hotel_beds/action/response"
2
2
  require "hotel_beds/parser/purchase"
3
3
 
4
4
  module HotelBeds
5
5
  module BasketRemove
6
- class Response
7
- attr_accessor :request, :headers, :body, :errors
8
- private :request=, :headers=, :body=, :errors=
9
-
10
- def initialize(request, response)
11
- self.request = request
12
- self.headers = response.header
13
- self.body = Nokogiri::XML(response.body.fetch(:service_remove))
14
- self.errors = HotelBeds::Parser::Errors.new(response).to_model(self)
15
- freeze
16
- end
17
-
18
- def inspect
19
- "<#{self.class.name} errors=#{errors.inspect} headers=#{headers.inspect} body=#{body.to_s}>"
20
- end
21
-
22
- def success?
23
- errors.empty?
24
- end
25
-
6
+ class Response < HotelBeds::Action::Response
26
7
  def purchase
27
8
  HotelBeds::Parser::Purchase.new(body.at_css("Purchase")).to_model
28
9
  end
@@ -0,0 +1,46 @@
1
+ require "hotel_beds/core_ext/array"
2
+
3
+ using HotelBeds::CoreExt::Array
4
+
5
+ module HotelBeds
6
+ module Builder
7
+ class HotelOccupancy
8
+ attr_accessor :rooms
9
+ private :rooms=
10
+
11
+ def initialize(rooms)
12
+ self.rooms = rooms
13
+ freeze
14
+ end
15
+
16
+ def child_ages
17
+ rooms.map(&:child_ages).flatten_children
18
+ end
19
+
20
+ def adult_count
21
+ rooms.map(&:adult_count).sum
22
+ end
23
+
24
+ def child_count
25
+ rooms.map(&:child_count).sum
26
+ end
27
+
28
+ def to_h
29
+ {
30
+ RoomCount: rooms.size,
31
+ Occupancy: {
32
+ AdultCount: adult_count,
33
+ ChildCount: child_count,
34
+ GuestList: {
35
+ Customer: 1.upto(adult_count).map {
36
+ { :@type => "AD" }
37
+ } + 1.upto(child_count).map { |i|
38
+ { :@type => "CH", :Age => Integer(child_ages.fetch(i - 1)) }
39
+ }
40
+ }
41
+ }
42
+ }
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,15 @@
1
+ module HotelBeds
2
+ module CoreExt
3
+ module Array
4
+ refine ::Array do
5
+ def sum
6
+ inject(0, :+)
7
+ end
8
+
9
+ def flatten_children
10
+ inject(self.class.new, :+)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,8 +1,9 @@
1
- require "delegate"
1
+ require "hotel_beds/action/envelope"
2
+ require "hotel_beds/builder/hotel_occupancy"
2
3
 
3
4
  module HotelBeds
4
5
  module HotelBasketAdd
5
- class Envelope < SimpleDelegator
6
+ class Envelope < HotelBeds::Action::Envelope
6
7
  def attributes
7
8
  {
8
9
  Language: language,
@@ -48,23 +49,7 @@ module HotelBeds
48
49
  end
49
50
 
50
51
  def build_room(rooms)
51
- child_ages = rooms.map(&:child_ages).inject(Array.new, :+)
52
- adult_count = rooms.map(&:adult_count).inject(0, :+)
53
- child_count = rooms.map(&:child_count).inject(0, :+)
54
- {
55
- RoomCount: rooms.size,
56
- Occupancy: {
57
- AdultCount: adult_count,
58
- ChildCount: child_count,
59
- GuestList: {
60
- Customer: (1..adult_count).map {
61
- { :@type => "AD" }
62
- } + (1..child_count).map { |i|
63
- { :@type => "CH", :Age => Integer(child_ages[i - 1]) }
64
- }
65
- }
66
- }
67
- }
52
+ HotelBeds::Builder::HotelOccupancy.new(rooms).to_h
68
53
  end
69
54
  end
70
55
  end
@@ -1,36 +1,16 @@
1
+ require "hotel_beds/action/operation"
2
+ require_relative "envelope"
1
3
  require_relative "request"
2
4
  require_relative "response"
3
- require_relative "envelope"
4
5
 
5
6
  module HotelBeds
6
7
  module HotelBasketAdd
7
- class Operation
8
- attr_accessor :request, :response, :errors
9
- private :request=, :response=, :errors=
10
-
11
- def initialize(*args)
12
- self.request = Request.new(*args)
13
- end
14
-
15
- def perform(connection:)
16
- if request.valid?
17
- self.response = Response.new(request, retrieve(connection))
18
- self.errors = response.errors
19
- else
20
- self.errors = request.errors
21
- end
22
- freeze
23
- self
24
- end
25
-
26
- private
27
- def retrieve(connection)
28
- connection.call({
29
- method: :serviceAdd,
30
- namespace: :ServiceAddRQ,
31
- data: Envelope.new(request).attributes
32
- })
33
- end
8
+ class Operation < HotelBeds::Action::Operation
9
+ remote_method :serviceAdd
10
+ remote_namespace :ServiceAddRQ
11
+ envelope_class Envelope
12
+ request_class Request
13
+ response_class Response
34
14
  end
35
15
  end
36
16
  end
@@ -1,10 +1,11 @@
1
1
  require "securerandom"
2
+ require "hotel_beds/action/request"
2
3
  require "hotel_beds/model"
3
4
  require "hotel_beds/model/available_room"
4
5
 
5
6
  module HotelBeds
6
7
  module HotelBasketAdd
7
- class Request
8
+ class Request < HotelBeds::Action::Request
8
9
  class HotelService
9
10
  include HotelBeds::Model
10
11
 
@@ -34,15 +35,11 @@ module HotelBeds
34
35
  end
35
36
  end
36
37
 
37
- include HotelBeds::Model
38
-
39
38
  # attributes
40
39
  attribute :session_id, String, default: SecureRandom.hex[0..15]
41
- attribute :language, String, default: "ENG"
42
40
  attribute :service, HotelService
43
41
 
44
42
  # validation
45
- validates :language, length: { is: 3 }
46
43
  validates :session_id, :service, presence: true
47
44
  end
48
45
  end
@@ -1,32 +1,13 @@
1
- require "hotel_beds/parser/errors"
1
+ require "hotel_beds/action/response"
2
2
  require "hotel_beds/parser/purchase"
3
3
 
4
4
  module HotelBeds
5
5
  module HotelBasketAdd
6
- class Response
7
- attr_accessor :request, :headers, :body, :errors
8
- private :request=, :headers=, :body=, :errors=
9
-
10
- def initialize(request, response)
11
- self.request = request
12
- self.headers = response.header
13
- self.body = Nokogiri::XML(response.body.fetch(:service_add))
14
- self.errors = HotelBeds::Parser::Errors.new(response).to_model(self)
15
- freeze
16
- end
17
-
18
- def inspect
19
- "<#{self.class.name} errors=#{errors.inspect} headers=#{headers.inspect} body=#{body.to_s}>"
20
- end
21
-
6
+ class Response < HotelBeds::Action::Response
22
7
  def session_id
23
8
  request.session_id
24
9
  end
25
10
 
26
- def success?
27
- errors.empty?
28
- end
29
-
30
11
  def purchase
31
12
  HotelBeds::Parser::Purchase.new(body.at_css("Purchase")).to_model
32
13
  end
@@ -1,8 +1,9 @@
1
- require "delegate"
1
+ require "hotel_beds/action/envelope"
2
+ require "hotel_beds/builder/hotel_occupancy"
2
3
 
3
4
  module HotelBeds
4
5
  module HotelSearch
5
- class Envelope < SimpleDelegator
6
+ class Envelope < HotelBeds::Action::Envelope
6
7
  def attributes
7
8
  {
8
9
  :@sessionId => session_id,
@@ -70,23 +71,7 @@ module HotelBeds
70
71
  end
71
72
 
72
73
  def build_room(rooms)
73
- child_ages = rooms.map(&:child_ages).inject(Array.new, :+)
74
- adult_count = rooms.map(&:adult_count).inject(0, :+)
75
- child_count = rooms.map(&:child_count).inject(0, :+)
76
- {
77
- RoomCount: rooms.size,
78
- Occupancy: {
79
- AdultCount: adult_count,
80
- ChildCount: child_count,
81
- GuestList: {
82
- Customer: (1..adult_count).map {
83
- { :@type => "AD" }
84
- } + (1..child_count).map { |i|
85
- { :@type => "CH", :Age => Integer(child_ages[i - 1]) }
86
- }
87
- }
88
- }
89
- }
74
+ HotelBeds::Builder::HotelOccupancy.new(rooms).to_h
90
75
  end
91
76
  end
92
77
  end
@@ -1,36 +1,16 @@
1
+ require "hotel_beds/action/operation"
2
+ require_relative "envelope"
1
3
  require_relative "request"
2
4
  require_relative "response"
3
- require_relative "envelope"
4
5
 
5
6
  module HotelBeds
6
7
  module HotelSearch
7
- class Operation
8
- attr_accessor :request, :response, :errors
9
- private :request=, :response=, :errors=
10
-
11
- def initialize(*args)
12
- self.request = Request.new(*args)
13
- end
14
-
15
- def perform(connection:)
16
- if request.valid?
17
- self.response = Response.new(request, retrieve(connection))
18
- self.errors = response.errors
19
- else
20
- self.errors = request.errors
21
- end
22
- freeze
23
- self
24
- end
25
-
26
- private
27
- def retrieve(connection)
28
- connection.call({
29
- method: :getHotelValuedAvail,
30
- namespace: :HotelValuedAvailRQ,
31
- data: Envelope.new(request).attributes
32
- })
33
- end
8
+ class Operation < HotelBeds::Action::Operation
9
+ remote_method :getHotelValuedAvail
10
+ remote_namespace :HotelValuedAvailRQ
11
+ envelope_class Envelope
12
+ request_class Request
13
+ response_class Response
34
14
  end
35
15
  end
36
16
  end
@@ -1,17 +1,14 @@
1
1
  require "securerandom"
2
- require "hotel_beds/model"
2
+ require "hotel_beds/action/request"
3
3
  require "hotel_beds/model/requested_room"
4
4
 
5
5
  module HotelBeds
6
6
  module HotelSearch
7
- class Request
8
- include HotelBeds::Model
9
-
7
+ class Request < HotelBeds::Action::Request
10
8
  # attributes
11
9
  attribute :session_id, String, default: SecureRandom.hex[0..15]
12
10
  attribute :page_number, Integer, default: 1
13
11
  attribute :items_per_page, Integer, default: 50
14
- attribute :language, String, default: "ENG"
15
12
  attribute :check_in_date, Date
16
13
  attribute :check_out_date, Date
17
14
  attribute :destination_code, String
@@ -19,9 +16,7 @@ module HotelBeds
19
16
  attribute :rooms, Array[HotelBeds::Model::RequestedRoom]
20
17
 
21
18
  # validation
22
- validates :language, :destination_code, length: {
23
- is: 3, allow_blank: false
24
- }
19
+ validates :destination_code, length: { is: 3, allow_blank: false }
25
20
  validates :session_id, :check_in_date, :check_out_date, presence: true
26
21
  validates :rooms, length: { minimum: 1, maximum: 5 }
27
22
  validates :page_number, numericality: {
@@ -1,24 +1,9 @@
1
- require "hotel_beds/parser/errors"
1
+ require "hotel_beds/action/response"
2
2
  require "hotel_beds/parser/hotel"
3
3
 
4
4
  module HotelBeds
5
5
  module HotelSearch
6
- class Response
7
- attr_accessor :request, :headers, :body, :errors
8
- private :request=, :headers=, :body=, :errors=
9
-
10
- def initialize(request, response)
11
- self.request = request
12
- self.headers = response.header
13
- self.body = Nokogiri::XML(response.body.fetch(:get_hotel_valued_avail))
14
- self.errors = HotelBeds::Parser::Errors.new(response).to_model(self)
15
- freeze
16
- end
17
-
18
- def inspect
19
- "<#{self.class.name} errors=#{errors.inspect} headers=#{headers.inspect} body=#{body.to_s}>"
20
- end
21
-
6
+ class Response < HotelBeds::Action::Response
22
7
  def session_id
23
8
  request.session_id
24
9
  end
@@ -9,5 +9,15 @@ module HotelBeds
9
9
  include ActiveModel::Validations
10
10
  end
11
11
  end
12
+
13
+ def deep_attributes
14
+ attributes.inject(Hash.new) do |result, (key, value)|
15
+ if value.respond_to?(:deep_attributes)
16
+ result.merge(key => value.deep_attributes)
17
+ else
18
+ result.merge(key => value)
19
+ end
20
+ end
21
+ end
12
22
  end
13
23
  end
@@ -1,8 +1,8 @@
1
- require "delegate"
1
+ require "hotel_beds/action/envelope"
2
2
 
3
3
  module HotelBeds
4
4
  module PurchaseConfirm
5
- class Envelope < SimpleDelegator
5
+ class Envelope < HotelBeds::Action::Envelope
6
6
  def attributes
7
7
  {
8
8
  Language: language,
@@ -1,36 +1,16 @@
1
+ require "hotel_beds/action/operation"
2
+ require_relative "envelope"
1
3
  require_relative "request"
2
4
  require_relative "response"
3
- require_relative "envelope"
4
5
 
5
6
  module HotelBeds
6
7
  module PurchaseConfirm
7
- class Operation
8
- attr_accessor :request, :response, :errors
9
- private :request=, :response=, :errors=
10
-
11
- def initialize(*args)
12
- self.request = Request.new(*args)
13
- end
14
-
15
- def perform(connection:)
16
- if request.valid?
17
- self.response = Response.new(request, retrieve(connection))
18
- self.errors = response.errors
19
- else
20
- self.errors = request.errors
21
- end
22
- freeze
23
- self
24
- end
25
-
26
- private
27
- def retrieve(connection)
28
- connection.call({
29
- method: :purchaseConfirm,
30
- namespace: :PurchaseConfirmRQ,
31
- data: Envelope.new(request).attributes
32
- })
33
- end
8
+ class Operation < HotelBeds::Action::Operation
9
+ remote_method :purchaseConfirm
10
+ remote_namespace :PurchaseConfirmRQ
11
+ envelope_class Envelope
12
+ request_class Request
13
+ response_class Response
34
14
  end
35
15
  end
36
16
  end
@@ -1,10 +1,11 @@
1
1
  require "securerandom"
2
+ require "hotel_beds/action/request"
2
3
  require "hotel_beds/model"
3
4
  require "hotel_beds/model/customer"
4
5
 
5
6
  module HotelBeds
6
7
  module PurchaseConfirm
7
- class Request
8
+ class Request < HotelBeds::Action::Request
8
9
  class Service
9
10
  include HotelBeds::Model
10
11
 
@@ -51,14 +52,10 @@ module HotelBeds
51
52
  end
52
53
  end
53
54
 
54
- include HotelBeds::Model
55
-
56
55
  # attributes
57
- attribute :language, String, default: "ENG"
58
56
  attribute :purchase, Purchase
59
57
 
60
58
  # validation
61
- validates :language, length: { is: 3 }
62
59
  validates :purchase, presence: true
63
60
  validate do |request|
64
61
  if request.purchase && request.purchase.invalid?
@@ -1,28 +1,9 @@
1
- require "hotel_beds/parser/errors"
1
+ require "hotel_beds/action/response"
2
2
  require "hotel_beds/parser/purchase"
3
3
 
4
4
  module HotelBeds
5
5
  module PurchaseConfirm
6
- class Response
7
- attr_accessor :request, :headers, :body, :errors
8
- private :request=, :headers=, :body=, :errors=
9
-
10
- def initialize(request, response)
11
- self.request = request
12
- self.headers = response.header
13
- self.body = Nokogiri::XML(response.body.fetch(:purchase_confirm))
14
- self.errors = HotelBeds::Parser::Errors.new(response).to_model(self)
15
- freeze
16
- end
17
-
18
- def inspect
19
- "<#{self.class.name} errors=#{errors.inspect} headers=#{headers.inspect} body=#{body.to_s}>"
20
- end
21
-
22
- def success?
23
- errors.empty?
24
- end
25
-
6
+ class Response < HotelBeds::Action::Response
26
7
  def purchase
27
8
  HotelBeds::Parser::Purchase.new(body.at_css("Purchase")).to_model
28
9
  end
@@ -1,8 +1,8 @@
1
- require "delegate"
1
+ require "hotel_beds/action/envelope"
2
2
 
3
3
  module HotelBeds
4
4
  module PurchaseFlush
5
- class Envelope < SimpleDelegator
5
+ class Envelope < HotelBeds::Action::Envelope
6
6
  def attributes
7
7
  {
8
8
  :Language => language,
@@ -1,36 +1,16 @@
1
+ require "hotel_beds/action/operation"
2
+ require_relative "envelope"
1
3
  require_relative "request"
2
4
  require_relative "response"
3
- require_relative "envelope"
4
5
 
5
6
  module HotelBeds
6
7
  module PurchaseFlush
7
- class Operation
8
- attr_accessor :request, :response, :errors
9
- private :request=, :response=, :errors=
10
-
11
- def initialize(*args)
12
- self.request = Request.new(*args)
13
- end
14
-
15
- def perform(connection:)
16
- if request.valid?
17
- self.response = Response.new(request, retrieve(connection))
18
- self.errors = response.errors
19
- else
20
- self.errors = request.errors
21
- end
22
- freeze
23
- self
24
- end
25
-
26
- private
27
- def retrieve(connection)
28
- connection.call({
29
- method: :purchaseFlush,
30
- namespace: :PurchaseFlushRQ,
31
- data: Envelope.new(request).attributes
32
- })
33
- end
8
+ class Operation < HotelBeds::Action::Operation
9
+ remote_method :purchaseFlush
10
+ remote_namespace :PurchaseFlushRQ
11
+ envelope_class Envelope
12
+ request_class Request
13
+ response_class Response
34
14
  end
35
15
  end
36
16
  end
@@ -1,16 +1,12 @@
1
- require "hotel_beds/model"
1
+ require "hotel_beds/action/request"
2
2
 
3
3
  module HotelBeds
4
4
  module PurchaseFlush
5
- class Request
6
- include HotelBeds::Model
7
-
5
+ class Request < HotelBeds::Action::Request
8
6
  # attributes
9
- attribute :language, String, default: "ENG"
10
7
  attribute :purchase_token, String
11
8
 
12
9
  # validation
13
- validates :language, length: { is: 3 }
14
10
  validates :purchase_token, presence: true
15
11
  end
16
12
  end
@@ -1,25 +1,10 @@
1
- require "hotel_beds/parser/errors"
1
+ require "hotel_beds/action/response"
2
2
 
3
3
  module HotelBeds
4
4
  module PurchaseFlush
5
- class Response
6
- attr_accessor :request, :headers, :body, :errors
7
- private :request=, :headers=, :body=, :errors=
8
-
9
- def initialize(request, response)
10
- self.request = request
11
- self.headers = response.header
12
- self.body = Nokogiri::XML(response.body.fetch(:purchase_flush))
13
- self.errors = HotelBeds::Parser::Errors.new(response).to_model(self)
14
- freeze
15
- end
16
-
17
- def inspect
18
- "<#{self.class.name} errors=#{errors.inspect} headers=#{headers.inspect} body=#{body.to_s}>"
19
- end
20
-
5
+ class Response < HotelBeds::Action::Response
21
6
  def success?
22
- errors.empty? && body.at_css("Status").content == "Y"
7
+ super && body.at_css("Status").content == "Y"
23
8
  end
24
9
  end
25
10
  end
@@ -1,3 +1,3 @@
1
1
  module HotelBeds
2
- VERSION = "0.4.0"
2
+ VERSION = "0.5.0"
3
3
  end
@@ -0,0 +1,22 @@
1
+ require "hotel_beds/model"
2
+
3
+ RSpec.describe HotelBeds::Model do
4
+ describe "#deep_attributes" do
5
+ let(:attributes) do
6
+ Hash({ nested: { nested_again: { title: "test" } } })
7
+ end
8
+
9
+ let(:instance_with_nesting) do
10
+ base = Class.new { include HotelBeds::Model }
11
+ deeply_nested = Class.new(base) { attribute :title, String }
12
+ nested = Class.new(base) { attribute :nested_again, deeply_nested }
13
+ Class.new(base) { attribute :nested, nested }.new(attributes)
14
+ end
15
+
16
+ subject { instance_with_nesting.deep_attributes }
17
+
18
+ it "should return a nested hash of attributes" do
19
+ expect(subject).to eq(attributes)
20
+ end
21
+ end
22
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hotel_beds
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Townsend
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-07 00:00:00.000000000 Z
11
+ date: 2014-08-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: savon
@@ -171,13 +171,19 @@ files:
171
171
  - Rakefile
172
172
  - hotel_beds.gemspec
173
173
  - lib/hotel_beds.rb
174
+ - lib/hotel_beds/action/envelope.rb
175
+ - lib/hotel_beds/action/operation.rb
176
+ - lib/hotel_beds/action/request.rb
177
+ - lib/hotel_beds/action/response.rb
174
178
  - lib/hotel_beds/basket_remove/envelope.rb
175
179
  - lib/hotel_beds/basket_remove/operation.rb
176
180
  - lib/hotel_beds/basket_remove/request.rb
177
181
  - lib/hotel_beds/basket_remove/response.rb
182
+ - lib/hotel_beds/builder/hotel_occupancy.rb
178
183
  - lib/hotel_beds/client.rb
179
184
  - lib/hotel_beds/configuration.rb
180
185
  - lib/hotel_beds/connection.rb
186
+ - lib/hotel_beds/core_ext/array.rb
181
187
  - lib/hotel_beds/hotel_basket_add/envelope.rb
182
188
  - lib/hotel_beds/hotel_basket_add/operation.rb
183
189
  - lib/hotel_beds/hotel_basket_add/request.rb
@@ -229,6 +235,7 @@ files:
229
235
  - spec/lib/hotel_beds/configuration_spec.rb
230
236
  - spec/lib/hotel_beds/connection_spec.rb
231
237
  - spec/lib/hotel_beds/hotel_search/request_spec.rb
238
+ - spec/lib/hotel_beds/model_spec.rb
232
239
  - spec/lib/hotel_beds/parser/room_grouper_spec.rb
233
240
  - spec/lib/hotel_beds/parser/service_spec.rb
234
241
  - spec/lib/hotel_beds/version_spec.rb
@@ -265,6 +272,7 @@ test_files:
265
272
  - spec/lib/hotel_beds/configuration_spec.rb
266
273
  - spec/lib/hotel_beds/connection_spec.rb
267
274
  - spec/lib/hotel_beds/hotel_search/request_spec.rb
275
+ - spec/lib/hotel_beds/model_spec.rb
268
276
  - spec/lib/hotel_beds/parser/room_grouper_spec.rb
269
277
  - spec/lib/hotel_beds/parser/service_spec.rb
270
278
  - spec/lib/hotel_beds/version_spec.rb