api_recipes 0.7.1 → 2.6.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 +4 -4
- data/{LICENSE.txt → MIT-LICENSE} +0 -0
- data/README.md +2 -2
- data/lib/api_recipes.rb +61 -61
- data/lib/api_recipes/api.rb +70 -0
- data/lib/api_recipes/configuration.rb +9 -9
- data/lib/api_recipes/endpoint.rb +109 -30
- data/lib/api_recipes/exceptions.rb +31 -23
- data/lib/api_recipes/response.rb +22 -0
- data/lib/api_recipes/route.rb +156 -0
- data/lib/api_recipes/settings.rb +9 -6
- data/lib/api_recipes/version.rb +1 -1
- metadata +15 -48
- data/.gitignore +0 -16
- data/.rspec +0 -2
- data/.travis.yml +0 -10
- data/CHANGELOG.md +0 -15
- data/CODE_OF_CONDUCT.md +0 -13
- data/Gemfile +0 -12
- data/Guardfile +0 -14
- data/Rakefile +0 -6
- data/api_recipes.gemspec +0 -23
- data/api_recipes.png +0 -0
- data/bin/console +0 -14
- data/bin/setup +0 -7
- data/examples/authorization.rb +0 -42
- data/examples/authorization_with_default_headers.rb +0 -41
- data/examples/basic_auth.rb +0 -32
- data/examples/config/apis.yml +0 -43
- data/examples/custom_configs.rb +0 -51
- data/examples/delete_me.rb +0 -21
- data/examples/multiple_endpoints.rb +0 -54
- data/examples/simple_usage.rb +0 -38
- data/lib/api_recipes/resource.rb +0 -157
data/lib/api_recipes/resource.rb
DELETED
@@ -1,157 +0,0 @@
|
|
1
|
-
module ApiRecipes
|
2
|
-
class Resource
|
3
|
-
|
4
|
-
def initialize(name, endpoint, routes = {})
|
5
|
-
@name = name
|
6
|
-
@routes = routes
|
7
|
-
@endpoint = endpoint
|
8
|
-
|
9
|
-
generate_routes
|
10
|
-
end
|
11
|
-
|
12
|
-
private
|
13
|
-
|
14
|
-
def build_path(route_name, route_attributes, provided_params)
|
15
|
-
path = route_attributes[:path] || ''
|
16
|
-
|
17
|
-
required_params_for_path(path).each do |rp|
|
18
|
-
unless p = provided_params.delete(rp)
|
19
|
-
raise MissingRouteAttribute.new(@name, route_name, rp)
|
20
|
-
end
|
21
|
-
path.gsub! ":#{rp}", p.to_s
|
22
|
-
end
|
23
|
-
path = "#{settings[:base_path]}#{settings[:api_version]}/#{@name}#{path}"
|
24
|
-
return path, provided_params
|
25
|
-
end
|
26
|
-
|
27
|
-
def build_request
|
28
|
-
|
29
|
-
|
30
|
-
end
|
31
|
-
|
32
|
-
def build_uri_from(path)
|
33
|
-
attrs = {
|
34
|
-
scheme: settings[:protocol],
|
35
|
-
host: settings[:host],
|
36
|
-
port: port,
|
37
|
-
path: path
|
38
|
-
}
|
39
|
-
URI::Generic.build attrs
|
40
|
-
end
|
41
|
-
|
42
|
-
def check_response_code(route, route_attributes, response)
|
43
|
-
# Check if :ok_code is present, check the response
|
44
|
-
if ok_code = route_attributes[:ok_code]
|
45
|
-
code = response.code
|
46
|
-
# If the code does not match, apply the requested strategy (see FAIL_OPTIONS)
|
47
|
-
unless code == ok_code
|
48
|
-
case settings[:on_nok_code]
|
49
|
-
when :do_nothing
|
50
|
-
when :raise
|
51
|
-
raise ResponseCodeNotAsExpected.new(nil, @name, route, ok_code, code, response.body)
|
52
|
-
when :return_false
|
53
|
-
return false
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def encode_residual_params(route_attributes, residual_params)
|
60
|
-
# If :encode_params_as is specified and avalable use it
|
61
|
-
if Settings::AVAILABLE_PARAMS_ENCODINGS.include? route_attributes[:encode_params_as].to_s
|
62
|
-
{ route_attributes[:encode_params_as].to_sym => residual_params }
|
63
|
-
else
|
64
|
-
# default to query string params (get) or json (other methods)
|
65
|
-
case route_attributes[:method].to_sym
|
66
|
-
when :get
|
67
|
-
{ params: residual_params }
|
68
|
-
when :post, :put, :patch, :delete
|
69
|
-
{ json: residual_params }
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
def extract_headers
|
75
|
-
settings[:default_headers] || {}
|
76
|
-
end
|
77
|
-
|
78
|
-
# Generate routes some_endpoint.some_resource.some_route methods
|
79
|
-
# e.g. webapp.alarms.index
|
80
|
-
def generate_routes
|
81
|
-
@routes.each do |route, attrs|
|
82
|
-
# Check if route name clashes with resource name
|
83
|
-
if route.eql? @name
|
84
|
-
raise RouteAndResourceNamesClashError.new(route, @name)
|
85
|
-
end
|
86
|
-
unless respond_to? route.to_sym
|
87
|
-
define_singleton_method route.to_sym do |*params, &block|
|
88
|
-
start_request route, attrs, *params, &block
|
89
|
-
end
|
90
|
-
else
|
91
|
-
raise RouteNameClashWithExistentMethod.new(@name, route)
|
92
|
-
end
|
93
|
-
end
|
94
|
-
self
|
95
|
-
end
|
96
|
-
|
97
|
-
def timeout
|
98
|
-
settings.fetch(:timeout, ApiRecipes::Settings::GLOBAL_TIMEOUT)
|
99
|
-
end
|
100
|
-
|
101
|
-
def port
|
102
|
-
settings[:port] || case settings[:protocol]
|
103
|
-
when 'http'
|
104
|
-
80
|
105
|
-
when 'https'
|
106
|
-
443
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
def request_with_auth
|
111
|
-
req = HTTP
|
112
|
-
req = req.headers(extract_headers)
|
113
|
-
.timeout(timeout)
|
114
|
-
|
115
|
-
basic_auth = @endpoint.basic_auth
|
116
|
-
if basic_auth
|
117
|
-
req = req.basic_auth basic_auth
|
118
|
-
end
|
119
|
-
authorization = @endpoint.authorization
|
120
|
-
if authorization
|
121
|
-
req = req.auth authorization
|
122
|
-
end
|
123
|
-
req
|
124
|
-
end
|
125
|
-
|
126
|
-
def required_params_for_path(path)
|
127
|
-
path.scan(/:(\w+)/).flatten.map { |p| p.to_sym }
|
128
|
-
end
|
129
|
-
|
130
|
-
def settings
|
131
|
-
@endpoint.configs
|
132
|
-
end
|
133
|
-
|
134
|
-
def start_request(route, route_attributes, *pars)
|
135
|
-
unless route_attributes
|
136
|
-
route_attributes = {}
|
137
|
-
end
|
138
|
-
# Merge route attributes with defaults and deep clone route attributes
|
139
|
-
route_attributes = Marshal.load(Marshal.dump(Settings::DEFAULT_ROUTE_ATTRIBUTES.merge(route_attributes).deep_symbolize_keys))
|
140
|
-
|
141
|
-
params = pars.extract_options!
|
142
|
-
path, residual_params = build_path(route, route_attributes, params)
|
143
|
-
residual_params = nil unless residual_params.any?
|
144
|
-
uri = build_uri_from path
|
145
|
-
|
146
|
-
response = request_with_auth.send(route_attributes[:method], uri, encode_residual_params(route_attributes, residual_params))
|
147
|
-
check_response_code route, route_attributes, response
|
148
|
-
|
149
|
-
if block_given?
|
150
|
-
body = Oj.load(response.body.to_s)
|
151
|
-
yield body, response.code, response.reason
|
152
|
-
else
|
153
|
-
response
|
154
|
-
end
|
155
|
-
end
|
156
|
-
end
|
157
|
-
end
|