siba_api 0.1.0
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/.github/workflows/main.yml +18 -0
- data/.gitignore +18 -0
- data/.irbrc +5 -0
- data/.rspec +3 -0
- data/.rubocop.yml +14 -0
- data/CHANGELOG.md +0 -0
- data/CODE_OF_CONDUCT.md +84 -0
- data/Dockerfile +11 -0
- data/Gemfile +16 -0
- data/Gemfile.lock +107 -0
- data/LICENSE.txt +21 -0
- data/README.md +61 -0
- data/Rakefile +12 -0
- data/SEFRootCA.zip +0 -0
- data/bin/console +16 -0
- data/bin/setup +8 -0
- data/docker-compose.yml +7 -0
- data/lib/siba_api/api/config/property.rb +25 -0
- data/lib/siba_api/api/config/property_set.rb +119 -0
- data/lib/siba_api/api/config.rb +101 -0
- data/lib/siba_api/api.rb +145 -0
- data/lib/siba_api/api_exceptions.rb +14 -0
- data/lib/siba_api/client.rb +144 -0
- data/lib/siba_api/configuration.rb +48 -0
- data/lib/siba_api/constants.rb +62 -0
- data/lib/siba_api/http_status_codes.rb +13 -0
- data/lib/siba_api/version.rb +5 -0
- data/lib/siba_api.rb +88 -0
- data/lib/xml/bal.xsd +196 -0
- data/lib/xml/countries.xml +1052 -0
- data/siba_api.gemspec +40 -0
- metadata +106 -0
data/lib/siba_api/api.rb
ADDED
@@ -0,0 +1,145 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'api_exceptions'
|
4
|
+
require_relative 'configuration'
|
5
|
+
require_relative 'constants'
|
6
|
+
require_relative 'http_status_codes'
|
7
|
+
|
8
|
+
module SIBAApi
|
9
|
+
# Core class responsible for api interface operations
|
10
|
+
class API
|
11
|
+
include ApiExceptions
|
12
|
+
include Constants
|
13
|
+
include HttpStatusCodes
|
14
|
+
|
15
|
+
attr_reader(*SIBAApi.configuration.property_names)
|
16
|
+
|
17
|
+
attr_accessor :current_options, :last_response
|
18
|
+
|
19
|
+
# Callback to update current configuration options
|
20
|
+
class_eval do
|
21
|
+
SIBAApi.configuration.property_names.each do |key|
|
22
|
+
define_method "#{key}=" do |arg|
|
23
|
+
instance_variable_set("@#{key}", arg)
|
24
|
+
current_options.merge!({ "#{key}": arg })
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
API_WSDL = 'https://siba.sef.pt/bawsdev/boletinsalojamento.asmx?wsdl'
|
30
|
+
HTTP_STATUS_MAPPING = {
|
31
|
+
HTTP_BAD_REQUEST_CODE => BadRequestError,
|
32
|
+
HTTP_UNAUTHORIZED_CODE => UnauthorizedError,
|
33
|
+
HTTP_FORBIDDEN_CODE => ForbiddenError,
|
34
|
+
HTTP_NOT_FOUND_CODE => NotFoundError,
|
35
|
+
HTTP_UNPROCESSABLE_ENTITY_CODE => UnprocessableEntityError,
|
36
|
+
'default' => ApiError
|
37
|
+
}.freeze
|
38
|
+
|
39
|
+
# Create new API
|
40
|
+
#
|
41
|
+
# @api public
|
42
|
+
def initialize(options = {}, &block)
|
43
|
+
opts = SIBAApi.configuration.fetch.merge(options)
|
44
|
+
@current_options = opts
|
45
|
+
|
46
|
+
SIBAApi.configuration.property_names.each do |key|
|
47
|
+
send("#{key}=", opts[key])
|
48
|
+
end
|
49
|
+
|
50
|
+
yield_or_eval(&block) if block_given?
|
51
|
+
end
|
52
|
+
|
53
|
+
# Call block with argument
|
54
|
+
#
|
55
|
+
# @api private
|
56
|
+
def yield_or_eval(&block)
|
57
|
+
return unless block
|
58
|
+
|
59
|
+
block.arity.positive? ? yield(self) : instance_eval(&block)
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
def client
|
65
|
+
@client ||= Savon.client do |globals|
|
66
|
+
globals.wsdl @wsdl
|
67
|
+
globals.log true
|
68
|
+
globals.log_level :debug
|
69
|
+
globals.convert_request_keys_to :camelcase
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def request(operation:, params: {})
|
74
|
+
default_params = {
|
75
|
+
UnidadeHoteleira: @current_options[:hotel_unit],
|
76
|
+
Estabelecimento: @current_options[:establishment],
|
77
|
+
ChaveAcesso: @current_options[:access_key]
|
78
|
+
}
|
79
|
+
|
80
|
+
response = client.call(operation.to_sym, message: default_params.merge(params))
|
81
|
+
self.last_response = response
|
82
|
+
|
83
|
+
if response_successful?(response)
|
84
|
+
result = response.body["#{operation}_response".to_sym]["#{operation}_result".to_sym]
|
85
|
+
return response if result == '0'
|
86
|
+
|
87
|
+
parsed_response = parse_response(result)
|
88
|
+
raise error_class(response.http.code), "Code: #{parsed_response[:codigo_retorno]}, response: #{response.body}, description: #{parsed_response[:descricao]}"
|
89
|
+
end
|
90
|
+
|
91
|
+
raise error_class(response.http.code), "Code: #{response.http.code}, response: #{response.body}"
|
92
|
+
end
|
93
|
+
|
94
|
+
# Error:
|
95
|
+
# {:erros_ba=>
|
96
|
+
# {:retorno_ba=>
|
97
|
+
# {:linha=>"0",
|
98
|
+
# :codigo_retorno=>"75",
|
99
|
+
# :descricao=>
|
100
|
+
# "Linha XML 6. -->The element 'Unidade_Hoteleira' in namespace 'http://sef.pt/BAws' has incomplete content. List of possible elements expected: 'Abreviatura' in namespace 'http://sef.pt/BAws'."},
|
101
|
+
# :@xmlns=>"http://www.sef.pt/BAws"}}
|
102
|
+
#
|
103
|
+
# Success:
|
104
|
+
#
|
105
|
+
def parse_response(result)
|
106
|
+
inner_response = Nori.new(convert_tags_to: ->(tag) { tag.snakecase.to_sym }).parse(
|
107
|
+
result
|
108
|
+
)
|
109
|
+
return inner_response[:erros_ba][:retorno_ba] if inner_response[:erros_ba]
|
110
|
+
|
111
|
+
inner_response
|
112
|
+
end
|
113
|
+
|
114
|
+
def error_class(error_code)
|
115
|
+
if HTTP_STATUS_MAPPING.include?(error_code)
|
116
|
+
HTTP_STATUS_MAPPING[error_code]
|
117
|
+
else
|
118
|
+
HTTP_STATUS_MAPPING['default']
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def response_successful?(response)
|
123
|
+
response.successful? and (response.http.code == HTTP_OK_CODE)
|
124
|
+
end
|
125
|
+
|
126
|
+
# Responds to attribute query or attribute clear
|
127
|
+
#
|
128
|
+
# @api private
|
129
|
+
def method_missing(method_name, *args, &block)
|
130
|
+
# :nodoc:
|
131
|
+
case method_name.to_s
|
132
|
+
when /^(.*)\?$/
|
133
|
+
!!send(Regexp.last_match(1).to_s)
|
134
|
+
when /^clear_(.*)$/
|
135
|
+
send("#{Regexp.last_match(1)}=", nil)
|
136
|
+
else
|
137
|
+
super
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
def respond_to_missing?(method_name, include_private = false)
|
142
|
+
method_name.to_s.start_with?('clear_') || super
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SIBAApi
|
4
|
+
module ApiExceptions
|
5
|
+
APIExceptionError = Class.new(StandardError)
|
6
|
+
BadRequestError = Class.new(APIExceptionError)
|
7
|
+
UnauthorizedError = Class.new(APIExceptionError)
|
8
|
+
ForbiddenError = Class.new(APIExceptionError)
|
9
|
+
ApiRequestsQuotaReachedError = Class.new(APIExceptionError)
|
10
|
+
NotFoundError = Class.new(APIExceptionError)
|
11
|
+
UnprocessableEntityError = Class.new(APIExceptionError)
|
12
|
+
ApiError = Class.new(APIExceptionError)
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,144 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'logger'
|
4
|
+
require 'base64'
|
5
|
+
require_relative 'api'
|
6
|
+
|
7
|
+
# Implementation of available methods for SIBA API
|
8
|
+
module SIBAApi
|
9
|
+
# Main client class that implements communication with the API
|
10
|
+
# global_params:
|
11
|
+
# - include_related_objects: int 0-1 0
|
12
|
+
# - page: int positive 1
|
13
|
+
# - per_page: int positive 20
|
14
|
+
class Client < API
|
15
|
+
# SIBAApi::Client.new.calendar(38859, '2022-01-01', '2022-07-31')
|
16
|
+
# <sef:UnidadeHoteleira>?</sef:UnidadeHoteleira>
|
17
|
+
# <sef:Estabelecimento>?</sef:Estabelecimento>
|
18
|
+
# <!--Optional:-->
|
19
|
+
# <sef:ChaveAcesso>?</sef:ChaveAcesso>
|
20
|
+
# <!--Optional:-->
|
21
|
+
# <sef:Boletins>?</sef:Boletins>
|
22
|
+
# Boletins:
|
23
|
+
# <sef:Apelido>Apelido</sef:Apelido>
|
24
|
+
# <sef:Nome>Teste</sef:Nome>
|
25
|
+
# <sef:Nacionalidade>DZA</sef:Nacionalidade>
|
26
|
+
# <sef:Data_Nascimento>2000-01-01</sef:Data_Nascimento>
|
27
|
+
# <sef:Local_Nascimento></sef:Local_Nascimento>
|
28
|
+
# <sef:Documento_Identificacao></sef:Documento_Identificacao>
|
29
|
+
# <sef:Pais_Emissor_Documento></sef:Pais_Emissor_Documento>
|
30
|
+
# <sef:Tipo_Documento></sef:Tipo_Documento>
|
31
|
+
# <sef:Pais_Residencia_Origem></sef:Pais_Residencia_Origem>
|
32
|
+
# <sef:Data_Entrada></sef:Data_Entrada>
|
33
|
+
# <sef:Data_Saida></sef:Data_Saida>
|
34
|
+
# <sef:Local_Residencia_Origem></sef:Local_Residencia_Origem>
|
35
|
+
#
|
36
|
+
# 'Apelido' => 'Surname',
|
37
|
+
# 'Nome' => 'Name',
|
38
|
+
# 'Nacionalidade' => 'VEN',
|
39
|
+
# 'Data_Nascimento' => '19990101',
|
40
|
+
# 'Local_Nascimento' => 'Place of Birth',
|
41
|
+
# 'Documento_Identificacao' => '123456789',
|
42
|
+
# 'Pais_Emissor_Documento' => 'YEM',
|
43
|
+
# 'Tipo_Documento' => 'P',
|
44
|
+
# 'Pais_Residencia_Origem' => 'ZMB',
|
45
|
+
# 'Data_Entrada' => '20220801',
|
46
|
+
# 'Data_Saida' => '20220831',
|
47
|
+
# 'Local_Residencia_Origem' => 'Place of Residence',
|
48
|
+
def deliver_bulletins(file_number, bulletins = [], _global_params = {})
|
49
|
+
logger = Logger.new $stderr
|
50
|
+
logger.level = Logger::DEBUG
|
51
|
+
bulletins_xml = Gyoku.xml(
|
52
|
+
{
|
53
|
+
'MovimentoBAL' => {
|
54
|
+
'Unidade_Hoteleira' => build_hotel_unit,
|
55
|
+
'Boletim_Alojamento' => build_bulletins(bulletins),
|
56
|
+
'Envio' => build_control_data(file_number),
|
57
|
+
:@xmlns => 'http://sef.pt/BAws'
|
58
|
+
}
|
59
|
+
},
|
60
|
+
pretty_print: true
|
61
|
+
)
|
62
|
+
logger.debug(bulletins_xml)
|
63
|
+
bulletins_encoded = Base64.encode64(bulletins_xml)
|
64
|
+
response = request(
|
65
|
+
operation: :entrega_boletins_alojamento,
|
66
|
+
params: {
|
67
|
+
Boletins: bulletins_encoded
|
68
|
+
}
|
69
|
+
)
|
70
|
+
process_response(response)
|
71
|
+
end
|
72
|
+
|
73
|
+
protected
|
74
|
+
|
75
|
+
# <Unidade_Hoteleira>
|
76
|
+
# <Codigo_Unidade_Hoteleira>121212121</Codigo_Unidade_Hoteleira>
|
77
|
+
# <Estabelecimento>00</Estabelecimento>
|
78
|
+
# <Nome>Hotel teste</Nome>
|
79
|
+
# <Abreviatura>teste</Abreviatura>
|
80
|
+
# <Morada>Rua da Alegria, 172</Morada>
|
81
|
+
# <Localidade>Portalegre</Localidade>
|
82
|
+
# <Codigo_Postal>1000</Codigo_Postal>
|
83
|
+
# <Zona_Postal>234</Zona_Postal>
|
84
|
+
# <Telefone>214017744</Telefone>
|
85
|
+
# <Fax>214017766</Fax>
|
86
|
+
# <Nome_Contacto>Nuno teste</Nome_Contacto>
|
87
|
+
# <Email_Contacto>teste.teste@sef.pt</Email_Contacto>
|
88
|
+
# </Unidade_Hoteleira>
|
89
|
+
def build_hotel_unit
|
90
|
+
@hotel_unit_info
|
91
|
+
end
|
92
|
+
|
93
|
+
# <Numero_Ficheiro>97</Numero_Ficheiro>
|
94
|
+
# <Data_Movimento>2008-05-20T00:00:00</Data_Movimento>
|
95
|
+
def build_control_data(file_number)
|
96
|
+
{
|
97
|
+
'Numero_Ficheiro' => file_number,
|
98
|
+
'Data_Movimento' => DateTime.now.strftime('%FT%T')
|
99
|
+
}
|
100
|
+
end
|
101
|
+
|
102
|
+
def build_bulletins(bulletins = [])
|
103
|
+
translation_hash = {
|
104
|
+
surname: 'Apelido',
|
105
|
+
name: 'Nome',
|
106
|
+
nationality: 'Nacionalidade',
|
107
|
+
birthdate: 'Data_Nascimento',
|
108
|
+
place_of_birth: 'Local_Nascimento',
|
109
|
+
id_document: 'Documento_Identificacao',
|
110
|
+
document_country: 'Pais_Emissor_Documento',
|
111
|
+
document_type: 'Tipo_Documento',
|
112
|
+
start_date: 'Data_Entrada',
|
113
|
+
end_date: 'Data_Saida',
|
114
|
+
origin_country: 'Pais_Residencia_Origem',
|
115
|
+
origin_place: 'Local_Residencia_Origem'
|
116
|
+
}
|
117
|
+
translated_bulletins = []
|
118
|
+
bulletins.each do |b|
|
119
|
+
bt = {}
|
120
|
+
translation_hash.each_key do |k|
|
121
|
+
bt[translation_hash[k]] = b[k]
|
122
|
+
end
|
123
|
+
translated_bulletins.push(bt)
|
124
|
+
end
|
125
|
+
translated_bulletins
|
126
|
+
end
|
127
|
+
|
128
|
+
def process_response(response)
|
129
|
+
result = response
|
130
|
+
case result
|
131
|
+
when Hash
|
132
|
+
result.transform_keys!(&:to_sym)
|
133
|
+
result.each_value do |r|
|
134
|
+
process_response(r)
|
135
|
+
end
|
136
|
+
when Array
|
137
|
+
result.each do |r|
|
138
|
+
process_response(r)
|
139
|
+
end
|
140
|
+
end
|
141
|
+
result
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'api/config'
|
4
|
+
require_relative 'version'
|
5
|
+
|
6
|
+
module SIBAApi
|
7
|
+
# Stores the configuration
|
8
|
+
class Configuration < API::Config
|
9
|
+
property :follow_redirects, default: true
|
10
|
+
|
11
|
+
# The value sent in the http header for 'User-Agent' if none is set
|
12
|
+
property :user_agent, default: "SIBAApi API Ruby Gem #{SIBAApi::VERSION}"
|
13
|
+
|
14
|
+
# By default uses the Faraday connection options if none is set
|
15
|
+
property :connection_options, default: {}
|
16
|
+
|
17
|
+
# Add Faraday::RackBuilder to overwrite middleware
|
18
|
+
property :stack
|
19
|
+
|
20
|
+
# WSDL to use for SIBA API
|
21
|
+
property :wsdl, default: 'https://siba.sef.pt/bawsdev/boletinsalojamento.asmx?wsdl'
|
22
|
+
|
23
|
+
# Hotel unit
|
24
|
+
property :hotel_unit, default: '121212121'
|
25
|
+
|
26
|
+
# API Key
|
27
|
+
property :access_key, default: '999999999'
|
28
|
+
|
29
|
+
# Establishment to use
|
30
|
+
property :establishment, default: '00'
|
31
|
+
|
32
|
+
# Hotel Unit complete information
|
33
|
+
property :hotel_unit_info, default: {
|
34
|
+
'Codigo_Unidade_Hoteleira' => '121212121',
|
35
|
+
'Estabelecimento' => '00',
|
36
|
+
'Nome' => 'Hotel teste',
|
37
|
+
'Abreviatura' => 'teste',
|
38
|
+
'Morada' => 'Rua da Alegria, 172',
|
39
|
+
'Localidade' => 'Portalegre',
|
40
|
+
'Codigo_Postal' => '1000',
|
41
|
+
'Zona_Postal' => '234',
|
42
|
+
'Telefone' => '214017744',
|
43
|
+
'Fax' => '214017766',
|
44
|
+
'Nome_Contacto' => 'Nuno teste',
|
45
|
+
'Email_Contacto' => 'teste.teste@sef.pt'
|
46
|
+
}
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SIBAApi
|
4
|
+
# Constants
|
5
|
+
module Constants
|
6
|
+
# Response headers
|
7
|
+
RATELIMIT_REMAINING = 'X-RateLimit-Remaining'
|
8
|
+
|
9
|
+
RATELIMIT_LIMIT = 'X-RateLimit-Limit'
|
10
|
+
|
11
|
+
RATELIMIT_RESET = 'X-RateLimit-Reset'
|
12
|
+
|
13
|
+
CONTENT_TYPE = 'Content-Type'
|
14
|
+
|
15
|
+
CONTENT_LENGTH = 'content-length'
|
16
|
+
|
17
|
+
CACHE_CONTROL = 'cache-control'
|
18
|
+
|
19
|
+
ETAG = 'ETag'
|
20
|
+
|
21
|
+
SERVER = 'Server'
|
22
|
+
|
23
|
+
DATE = 'Date'
|
24
|
+
|
25
|
+
LOCATION = 'Location'
|
26
|
+
|
27
|
+
USER_AGENT = 'User-Agent'
|
28
|
+
|
29
|
+
ACCEPT = 'Accept'
|
30
|
+
|
31
|
+
ACCEPT_CHARSET = 'Accept-Charset'
|
32
|
+
|
33
|
+
OAUTH_SCOPES = 'X-OAuth-Scopes'
|
34
|
+
|
35
|
+
ACCEPTED_OAUTH_SCOPES = 'X-Accepted-Oauth-Scopes'
|
36
|
+
|
37
|
+
# Link headers
|
38
|
+
HEADER_LINK = 'Link'
|
39
|
+
|
40
|
+
HEADER_NEXT = 'X-Next'
|
41
|
+
|
42
|
+
HEADER_LAST = 'X-Last'
|
43
|
+
|
44
|
+
META_REL = 'rel'
|
45
|
+
|
46
|
+
META_LAST = 'last'
|
47
|
+
|
48
|
+
META_NEXT = 'next'
|
49
|
+
|
50
|
+
META_FIRST = 'first'
|
51
|
+
|
52
|
+
META_PREV = 'prev'
|
53
|
+
|
54
|
+
PARAM_PAGE = 'page'
|
55
|
+
|
56
|
+
PARAM_PER_PAGE = 'per_page'
|
57
|
+
|
58
|
+
PARAM_START_PAGE = 'start_page'
|
59
|
+
|
60
|
+
PARAM_INCLUDE_RELATED = 'include_related_objects'
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SIBAApi
|
4
|
+
module HttpStatusCodes
|
5
|
+
HTTP_OK_CODE = 200
|
6
|
+
|
7
|
+
HTTP_BAD_REQUEST_CODE = 400
|
8
|
+
HTTP_UNAUTHORIZED_CODE = 401
|
9
|
+
HTTP_FORBIDDEN_CODE = 403
|
10
|
+
HTTP_NOT_FOUND_CODE = 404
|
11
|
+
HTTP_UNPROCESSABLE_ENTITY_CODE = 429
|
12
|
+
end
|
13
|
+
end
|
data/lib/siba_api.rb
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'savon'
|
4
|
+
require_relative 'siba_api/version'
|
5
|
+
|
6
|
+
# Base module for SIBA API Wrapper
|
7
|
+
module SIBAApi
|
8
|
+
class Error < StandardError; end
|
9
|
+
|
10
|
+
LIBNAME = 'siba_api'
|
11
|
+
|
12
|
+
LIBDIR = File.expand_path(LIBNAME.to_s, __dir__)
|
13
|
+
|
14
|
+
class << self
|
15
|
+
# The client configuration
|
16
|
+
#
|
17
|
+
# @return [Configuration]
|
18
|
+
#
|
19
|
+
# @api public
|
20
|
+
def configuration
|
21
|
+
@configuration ||= Configuration.new
|
22
|
+
end
|
23
|
+
|
24
|
+
alias config configuration
|
25
|
+
|
26
|
+
# Configure options
|
27
|
+
#
|
28
|
+
# @example
|
29
|
+
# SIBAApi.configure do |c|
|
30
|
+
# c.some_option = true
|
31
|
+
# end
|
32
|
+
#
|
33
|
+
# @yield the configuration block
|
34
|
+
# @yieldparam configuration [SIBAApi::Configuration]
|
35
|
+
# the configuration instance
|
36
|
+
#
|
37
|
+
# @return [nil]
|
38
|
+
#
|
39
|
+
# @api public
|
40
|
+
def configure
|
41
|
+
yield configuration
|
42
|
+
end
|
43
|
+
|
44
|
+
# Alias for SIBAApi::Client.new
|
45
|
+
#
|
46
|
+
# @param [Hash] options
|
47
|
+
# the configuration options
|
48
|
+
#
|
49
|
+
# @return [SEFApi::Client]
|
50
|
+
#
|
51
|
+
# @api public
|
52
|
+
def new(options = {}, &block)
|
53
|
+
Client.new(options, &block)
|
54
|
+
end
|
55
|
+
|
56
|
+
# Default middleware stack that uses default adapter as specified
|
57
|
+
# by configuration setup
|
58
|
+
#
|
59
|
+
# @return [Proc]
|
60
|
+
#
|
61
|
+
# @api private
|
62
|
+
def default_middleware(options = {})
|
63
|
+
Middleware.default(options)
|
64
|
+
end
|
65
|
+
|
66
|
+
# Delegate to SIBAApi::Client
|
67
|
+
#
|
68
|
+
# @api private
|
69
|
+
def method_missing(method_name, *args, &block)
|
70
|
+
if new.respond_to?(method_name)
|
71
|
+
new.send(method_name, *args, &block)
|
72
|
+
elsif configuration.respond_to?(method_name)
|
73
|
+
SIBAApi.configuration.send(method_name, *args, &block)
|
74
|
+
else
|
75
|
+
super.respond_to_missing?
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def respond_to_missing?(method_name, include_private = false)
|
80
|
+
new.respond_to?(method_name, include_private) ||
|
81
|
+
configuration.respond_to?(method_name) ||
|
82
|
+
super(method_name, include_private)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
require_relative 'siba_api/client'
|
88
|
+
require_relative 'siba_api/configuration'
|