smooth_operator 1.10.13 → 1.10.14
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/Gemfile +1 -0
- data/README.md +2 -5
- data/console.rb +1 -1
- data/lib/smooth_operator/attributes/base.rb +8 -8
- data/lib/smooth_operator/helpers.rb +1 -1
- data/lib/smooth_operator/operator.rb +56 -26
- data/lib/smooth_operator/operators/faraday.rb +36 -8
- data/lib/smooth_operator/operators/typhoeus.rb +44 -42
- data/lib/smooth_operator/serialization.rb +2 -2
- data/lib/smooth_operator/version.rb +1 -1
- data/smooth_operator.gemspec +1 -1
- data/spec/smooth_operator/attribute_assignment_spec.rb +71 -0
- data/spec/smooth_operator/persistence_spec.rb +1 -1
- data/spec/smooth_operator/serialization_spec.rb +28 -4
- data/spec/support/models/user.rb +1 -1
- data/spec/support/models/user_with_address_and_posts.rb +4 -1
- data/spec/support/test_server.rb +1 -1
- metadata +3 -4
- data/lib/smooth_operator/operators/base.rb +0 -55
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZGUwNjgxZDAyZTJmMDg3ZTRhZWMwZjFhY2UxYjhjYTIyOTBlZWNlOQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
YWRiNzFhZjlmYTI2MTRjYzM0MTU2NGMzZjJkNTgwZGI5NzdmOTJjZg==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MjI2ZTFjNjUyZTMwMWE0MWIyNDk2MTU1ZDEwZmU1OTBlNjAxMjRhZDhhNzZi
|
10
|
+
ZDljMmI5OTQyZDIzNDQ4ZDFkNjFhYWVlNTE0Y2YzMDAyZDdjYzA0ZWE3MTc0
|
11
|
+
MDY5YjM0NjcyOGIzNzNkMDdkYmY4MzA4MTEzNTE5MmYxNTUyMDQ=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
NDc2NWQ4Mzk2ZDk3YWFkMjZjZDI0MGYzZThkNmY4NzE0MDUyN2Y1NmQ2M2Rh
|
14
|
+
OGUyMWQ2MmU2ZTQxMzM2ODk4Mjk3YmE3MWRlODBkMmEwMjQzOTAyYTMxZjEx
|
15
|
+
YjQ4MmViM2VhYTViMzU2MTZjMzI0MTU3ODc2NTVkMTc0YjUzYjA=
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -274,8 +274,5 @@ Methods | Behaviour | Arguments | Return
|
|
274
274
|
## 4) TODO
|
275
275
|
|
276
276
|
1. Finish "Methods" and "Behaviours" documentation;
|
277
|
-
2.
|
278
|
-
3.
|
279
|
-
4. serialization_specs to test the json options for nested classes;
|
280
|
-
5. model_schema_specs;
|
281
|
-
6. Cache.
|
277
|
+
2. ModelSchema specs;
|
278
|
+
3. Cache.
|
data/console.rb
CHANGED
@@ -42,12 +42,6 @@ module SmoothOperator
|
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
|
-
def to_int(string)
|
46
|
-
return string if string.is_a?(Fixnum)
|
47
|
-
|
48
|
-
to_float(string).to_i
|
49
|
-
end
|
50
|
-
|
51
45
|
def to_date(string)
|
52
46
|
return string if string.is_a?(Date)
|
53
47
|
|
@@ -66,12 +60,18 @@ module SmoothOperator
|
|
66
60
|
['1', 'true'].include?(value) ? true : ['0', 'false'].include?(value) ? false : nil
|
67
61
|
end
|
68
62
|
|
63
|
+
def to_int(string)
|
64
|
+
return string if string.is_a?(Fixnum)
|
65
|
+
|
66
|
+
to_float(string).to_i
|
67
|
+
end
|
68
|
+
|
69
69
|
def to_float(string)
|
70
70
|
return string if string.is_a?(Float)
|
71
71
|
|
72
|
-
return 0 if string.nil? || !string.is_a?(String)
|
72
|
+
return 0 if string.nil? || !(string.is_a?(String) || string.is_a?(Fixnum))
|
73
73
|
|
74
|
-
value = string.scan(/-*\d+[
|
74
|
+
value = string.to_s.gsub(',', '.').scan(/-*\d+[.]*\d*/).flatten.map(&:to_f).first
|
75
75
|
|
76
76
|
value.nil? ? 0 : value
|
77
77
|
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
require "smooth_operator/operators/base"
|
2
1
|
require "smooth_operator/remote_call/base"
|
3
2
|
require "smooth_operator/operators/faraday"
|
4
3
|
require "smooth_operator/operators/typhoeus"
|
@@ -9,16 +8,19 @@ module SmoothOperator
|
|
9
8
|
|
10
9
|
module Operator
|
11
10
|
|
12
|
-
HTTP_VERBS = [:get, :post, :put, :patch, :delete]
|
13
|
-
|
14
11
|
OPTIONS = [:endpoint, :endpoint_user, :endpoint_pass, :timeout]
|
15
12
|
|
13
|
+
OPTIONS.each do |option|
|
14
|
+
define_method(option) { Helpers.get_instance_variable(self, option, '') }
|
15
|
+
end
|
16
16
|
|
17
17
|
attr_writer *OPTIONS
|
18
18
|
|
19
|
-
|
19
|
+
HTTP_VERBS = [:get, :post, :put, :patch, :delete]
|
20
20
|
|
21
|
-
HTTP_VERBS.each
|
21
|
+
HTTP_VERBS.each do |http_verb|
|
22
|
+
define_method(http_verb) { |relative_path = '', params = {}, options = {}| make_the_call(http_verb, relative_path, params, options) }
|
23
|
+
end
|
22
24
|
|
23
25
|
def headers
|
24
26
|
Helpers.get_instance_variable(self, :headers, {})
|
@@ -26,33 +28,19 @@ module SmoothOperator
|
|
26
28
|
|
27
29
|
attr_writer :headers
|
28
30
|
|
29
|
-
|
30
|
-
def generate_parallel_connection
|
31
|
-
generate_connection(:typhoeus)
|
32
|
-
end
|
33
|
-
|
34
|
-
def generate_connection(adapter = nil, options = nil)
|
35
|
-
adapter ||= :net_http
|
36
|
-
options ||= {}
|
37
|
-
url, timeout = (options[:endpoint] || self.endpoint), (options[:timeout] || self.timeout)
|
38
|
-
|
39
|
-
::Faraday.new(url: url) do |builder|
|
40
|
-
builder.options[:timeout] = timeout unless Helpers.blank?(timeout)
|
41
|
-
builder.request :url_encoded
|
42
|
-
builder.adapter adapter
|
43
|
-
end
|
44
|
-
end
|
45
31
|
|
46
32
|
def make_the_call(http_verb, relative_path = '', data = {}, options = {})
|
47
|
-
|
48
|
-
|
33
|
+
operator_args = operator_method_args(http_verb, relative_path, data, options)
|
34
|
+
|
35
|
+
if Helpers.present?(operator_args[4][:hydra])
|
36
|
+
operator_call = Operators::Typhoeus
|
49
37
|
else
|
50
|
-
operator_call = Operators::Faraday
|
38
|
+
operator_call = Operators::Faraday
|
51
39
|
end
|
52
|
-
|
40
|
+
|
53
41
|
remote_call = {}
|
54
42
|
|
55
|
-
operator_call.make_the_call do |_remote_call|
|
43
|
+
operator_call.make_the_call(*operator_args) do |_remote_call|
|
56
44
|
remote_call = _remote_call
|
57
45
|
|
58
46
|
yield(remote_call) if block_given?
|
@@ -65,6 +53,48 @@ module SmoothOperator
|
|
65
53
|
params
|
66
54
|
end
|
67
55
|
|
56
|
+
|
57
|
+
protected #################### PROTECTED ##################
|
58
|
+
|
59
|
+
def operator_method_args(http_verb, relative_path, data, options)
|
60
|
+
options = populate_options(options)
|
61
|
+
|
62
|
+
[http_verb, resource_path(relative_path, options), *strip_params(http_verb, data), options]
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
private #################### PRIVATE ##################
|
67
|
+
|
68
|
+
def populate_options(options)
|
69
|
+
options ||= {}
|
70
|
+
|
71
|
+
OPTIONS.each { |option| options[option] ||= send(option) }
|
72
|
+
|
73
|
+
options[:headers] = headers.merge(options[:headers] || {})
|
74
|
+
|
75
|
+
options
|
76
|
+
end
|
77
|
+
|
78
|
+
def resource_path(relative_path, options)
|
79
|
+
table_name = options[:table_name] || self.table_name
|
80
|
+
|
81
|
+
if Helpers.present?(table_name)
|
82
|
+
Helpers.present?(relative_path) ? "#{table_name}/#{relative_path}" : table_name
|
83
|
+
else
|
84
|
+
relative_path.to_s
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def strip_params(http_verb, data)
|
89
|
+
data ||= {}
|
90
|
+
|
91
|
+
if [:get, :head, :delete].include?(http_verb)
|
92
|
+
[query_string(data), nil]
|
93
|
+
else
|
94
|
+
[query_string({}), data]
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
68
98
|
end
|
69
99
|
|
70
100
|
end
|
@@ -6,13 +6,33 @@ module SmoothOperator
|
|
6
6
|
|
7
7
|
module Operators
|
8
8
|
|
9
|
-
|
9
|
+
module Faraday
|
10
|
+
|
11
|
+
extend self
|
12
|
+
|
13
|
+
# def generate_parallel_connection
|
14
|
+
# generate_connection(:typhoeus)
|
15
|
+
# end
|
16
|
+
|
17
|
+
def generate_connection(adapter = nil, options = nil)
|
18
|
+
adapter ||= :net_http
|
19
|
+
|
20
|
+
::Faraday.new(url: options[:endpoint]) do |builder|
|
21
|
+
builder.options[:timeout] = options[:timeout].to_i unless Helpers.blank?(options[:timeout])
|
22
|
+
builder.request :url_encoded
|
23
|
+
builder.adapter adapter
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def make_the_call(http_verb, resource_path, params, body, options)
|
28
|
+
connection, request_options, options = strip_options(options)
|
10
29
|
|
11
|
-
def make_the_call
|
12
30
|
remote_call = begin
|
13
|
-
set_basic_authentication
|
31
|
+
set_basic_authentication(connection, options)
|
14
32
|
|
15
|
-
response = connection.send(http_verb,
|
33
|
+
response = connection.send(http_verb, resource_path) do |request|
|
34
|
+
request_configuration(request, request_options, options, params, body)
|
35
|
+
end
|
16
36
|
|
17
37
|
RemoteCall::Faraday.new(response)
|
18
38
|
rescue ::Faraday::Error::ConnectionFailed
|
@@ -29,12 +49,20 @@ module SmoothOperator
|
|
29
49
|
|
30
50
|
protected ################ PROTECTED ################
|
31
51
|
|
32
|
-
def
|
33
|
-
|
52
|
+
def strip_options(options)
|
53
|
+
request_options = options.delete(:request_options) || {}
|
54
|
+
|
55
|
+
connection = options.delete(:connection) || generate_connection(nil, options)
|
56
|
+
|
57
|
+
[connection, request_options, options]
|
58
|
+
end
|
59
|
+
|
60
|
+
def set_basic_authentication(connection, options)
|
61
|
+
connection.basic_auth(options[:endpoint_user], options[:endpoint_pass]) if Helpers.present?(options[:endpoint_user])
|
34
62
|
end
|
35
63
|
|
36
|
-
def request_configuration(request)
|
37
|
-
|
64
|
+
def request_configuration(request, request_options, options, params, body)
|
65
|
+
request_options.each { |key, value| request.options.send("#{key}=", value) }
|
38
66
|
|
39
67
|
options[:headers].each { |key, value| request.headers[key] = value }
|
40
68
|
|
@@ -5,70 +5,72 @@ module SmoothOperator
|
|
5
5
|
|
6
6
|
module Operators
|
7
7
|
|
8
|
-
|
8
|
+
module Typhoeus
|
9
9
|
|
10
|
-
|
11
|
-
set_basic_authentication
|
10
|
+
extend self
|
12
11
|
|
13
|
-
|
12
|
+
def make_the_call(http_verb, resource_path, params, body, options)
|
13
|
+
request = ::Typhoeus::Request.new *typhoeus_request_args(http_verb, resource_path, params, body, options)
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
request
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
RemoteCall::Typhoeus
|
26
|
-
end
|
27
|
-
|
28
|
-
remote_call = remote_call_class.new(typhoeus_response)
|
29
|
-
|
30
|
-
yield(remote_call) if block_given?
|
15
|
+
hydra = options[:hydra] || ::Typhoeus::Hydra::hydra
|
16
|
+
|
17
|
+
_remote_call = {}
|
18
|
+
|
19
|
+
hydra.queue(request)
|
20
|
+
|
21
|
+
request.on_complete do |typhoeus_response|
|
22
|
+
_remote_call = remote_call(typhoeus_response)
|
23
|
+
|
24
|
+
yield(_remote_call) if block_given?
|
31
25
|
end
|
32
26
|
|
33
|
-
|
27
|
+
hydra.run
|
34
28
|
|
35
|
-
request.run
|
29
|
+
# request.run
|
36
30
|
|
37
|
-
|
31
|
+
_remote_call
|
38
32
|
end
|
39
33
|
|
40
34
|
|
41
35
|
protected ################ PROTECTED ################
|
42
36
|
|
43
|
-
def
|
44
|
-
|
37
|
+
def typhoeus_request_args(http_verb, relative_path, params, body, options)
|
38
|
+
[url(options, relative_path), build_typhoeus_options(http_verb, params, body, options)]
|
45
39
|
end
|
46
40
|
|
47
|
-
def
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
41
|
+
def remote_call(typhoeus_response)
|
42
|
+
if typhoeus_response.return_code == :couldnt_connect
|
43
|
+
RemoteCall::Errors::ConnectionFailed
|
44
|
+
elsif typhoeus_response.timed_out?
|
45
|
+
RemoteCall::Errors::Timeout
|
46
|
+
else
|
47
|
+
RemoteCall::Typhoeus
|
48
|
+
end.new(typhoeus_response)
|
53
49
|
end
|
54
50
|
|
55
|
-
def typhoeus_options
|
56
|
-
return @typhoeus_options if defined?(@typhoeus_options)
|
57
|
-
|
58
|
-
@typhoeus_options = { method: http_verb, headers: options[:headers].merge({ "Content-type" => "application/x-www-form-urlencoded" }) }
|
59
51
|
|
60
|
-
|
52
|
+
private ################### PRIVATE ###############
|
53
|
+
|
54
|
+
def build_typhoeus_options(http_verb, params, body, options)
|
55
|
+
typhoeus_options = { method: http_verb, headers: options[:headers].merge({ "Content-type" => "application/x-www-form-urlencoded" }) }
|
61
56
|
|
62
|
-
|
57
|
+
typhoeus_options[:timeout] = options[:timeout] if Helpers.present?(options[:timeout])
|
58
|
+
|
59
|
+
typhoeus_options[:body] = body if Helpers.present?(body)
|
60
|
+
|
61
|
+
typhoeus_options[:params] = params if Helpers.present?(params)
|
63
62
|
|
64
|
-
|
65
|
-
# @typhoeus_options[:params] = params if Helpers.present?(params)
|
63
|
+
typhoeus_options[:userpwd] = "#{options[:endpoint_user]}:#{options[:endpoint_pass]}" if Helpers.present?(options[:endpoint_user])
|
66
64
|
|
67
|
-
|
65
|
+
typhoeus_options
|
68
66
|
end
|
69
67
|
|
70
|
-
def
|
71
|
-
|
68
|
+
def url(options, relative_path)
|
69
|
+
url = options[:endpoint]
|
70
|
+
|
71
|
+
slice = url[-1] != '/' ? '/' : ''
|
72
|
+
|
73
|
+
url = "#{url}#{slice}#{relative_path}" if Helpers.present?(relative_path)
|
72
74
|
end
|
73
75
|
|
74
76
|
end
|
@@ -3,7 +3,7 @@ module SmoothOperator
|
|
3
3
|
module Serialization
|
4
4
|
|
5
5
|
def to_hash(options = nil)
|
6
|
-
Helpers.symbolyze_keys
|
6
|
+
Helpers.symbolyze_keys(serializable_hash(options) || {})
|
7
7
|
end
|
8
8
|
|
9
9
|
# alias :attributes :to_hash
|
@@ -12,7 +12,7 @@ module SmoothOperator
|
|
12
12
|
def to_json(options = nil)
|
13
13
|
require 'json' unless defined? JSON
|
14
14
|
|
15
|
-
JSON(serializable_hash(options))
|
15
|
+
JSON(serializable_hash(options) || {})
|
16
16
|
end
|
17
17
|
|
18
18
|
def read_attribute_for_serialization(attribute)
|
data/smooth_operator.gemspec
CHANGED
@@ -12,7 +12,7 @@ Gem::Specification.new do |spec|
|
|
12
12
|
spec.authors = ["João Gonçalves"]
|
13
13
|
spec.email = ["goncalves.joao@gmail.com"]
|
14
14
|
spec.description = %q{ActiveResource alternative}
|
15
|
-
spec.summary = %q{Simple and fully customizable alternative to ActiveResource, using faraday gem to stablish
|
15
|
+
spec.summary = %q{Simple and fully customizable alternative to ActiveResource, using faraday gem to stablish remote calls"}
|
16
16
|
spec.homepage = "https://github.com/goncalvesjoao/smooth_operator"
|
17
17
|
spec.license = "MIT"
|
18
18
|
|
@@ -157,6 +157,50 @@ describe SmoothOperator::AttributeAssignment do
|
|
157
157
|
|
158
158
|
end
|
159
159
|
|
160
|
+
context "that is declared (in schema) as an float" do
|
161
|
+
|
162
|
+
it "when the attributes's value is '1', should be converted to 1" do
|
163
|
+
expect(subject.new(price: '1').price).to eq(1.0)
|
164
|
+
end
|
165
|
+
|
166
|
+
it "when the attributes's value is '-1', should be converted to -1" do
|
167
|
+
expect(subject.new(price: '-1').price).to eq(-1.0)
|
168
|
+
end
|
169
|
+
|
170
|
+
it "when the attributes's value is 's-10s', should be converted to -10" do
|
171
|
+
expect(subject.new(price: 's-10s').price).to eq(-10.0)
|
172
|
+
end
|
173
|
+
|
174
|
+
it "when the attributes's value is ' 10s', should be converted to 10" do
|
175
|
+
expect(subject.new(price: ' 10s').price).to eq(10.0)
|
176
|
+
end
|
177
|
+
|
178
|
+
it "when the attributes's value is 123, should be converted to 123" do
|
179
|
+
expect(subject.new(price: 123).price).to eq(123.0)
|
180
|
+
end
|
181
|
+
|
182
|
+
it "when the attributes's value is -5, should be converted to -5" do
|
183
|
+
expect(subject.new(price: -5).price).to eq(-5.0)
|
184
|
+
end
|
185
|
+
|
186
|
+
it "when the attributes's value is '12.3', should be converted to 12.3" do
|
187
|
+
expect(subject.new(price: '12.3').price).to eq(12.3)
|
188
|
+
end
|
189
|
+
|
190
|
+
it "when the attributes's value is 's12.3s', should be converted to 12.3" do
|
191
|
+
expect(subject.new(price: 's12.3s').price).to eq(12.3)
|
192
|
+
end
|
193
|
+
|
194
|
+
it "when the attributes's value is 's12,3s', should be converted to 12.3" do
|
195
|
+
expect(subject.new(price: 's12,3s').price).to eq(12.3)
|
196
|
+
end
|
197
|
+
|
198
|
+
it "when the attributes's value is 1.2, should be converted to 1.2" do
|
199
|
+
expect(subject.new(price: 1.2).price).to eq(1.2)
|
200
|
+
end
|
201
|
+
|
202
|
+
end
|
203
|
+
|
160
204
|
context "that is declared (in schema) as an boolean" do
|
161
205
|
|
162
206
|
it "when the attributes's value is true, should be converted to true" do
|
@@ -245,6 +289,33 @@ describe SmoothOperator::AttributeAssignment do
|
|
245
289
|
|
246
290
|
end
|
247
291
|
|
292
|
+
context "that is declared (in schema) as a datetime" do
|
293
|
+
|
294
|
+
it "if the attribute's value is a valid datetime string" do
|
295
|
+
date = subject.new(date: '2-2-2222 12:30').date
|
296
|
+
|
297
|
+
expect(date).to be_instance_of(DateTime)
|
298
|
+
expect(date.day).to be(2)
|
299
|
+
expect(date.month).to be(2)
|
300
|
+
expect(date.year).to be(2222)
|
301
|
+
expect(date.hour).to be(12)
|
302
|
+
expect(date.min).to be(30)
|
303
|
+
end
|
304
|
+
|
305
|
+
it "if the attribute's value is a valid datetime" do
|
306
|
+
date_now = DateTime.now
|
307
|
+
date = subject.new(date: date_now).date
|
308
|
+
|
309
|
+
expect(date).to be_instance_of(DateTime)
|
310
|
+
expect(date).to eq(date_now)
|
311
|
+
end
|
312
|
+
|
313
|
+
it "if the attribute's value is an invalid datetime string, the returning value should be nil" do
|
314
|
+
expect(subject.new(date: '2s-2-2222').date).to be_nil
|
315
|
+
end
|
316
|
+
|
317
|
+
end
|
318
|
+
|
248
319
|
end
|
249
320
|
|
250
321
|
end
|
@@ -20,9 +20,33 @@ describe SmoothOperator::Serialization do
|
|
20
20
|
describe "#to_hash" do
|
21
21
|
subject { UserWithAddressAndPosts::Son.new(attributes_for(:user_with_address_and_posts)) }
|
22
22
|
|
23
|
+
it 'it should call #serializable_hash with the same arguments' do
|
24
|
+
options = { option1: 'option1', option2: 'option2' }
|
25
|
+
|
26
|
+
expect(subject).to receive(:serializable_hash).with(options)
|
27
|
+
|
28
|
+
subject.to_hash(options)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "#to_json" do
|
33
|
+
subject { UserWithAddressAndPosts::Son.new(attributes_for(:user_with_address_and_posts)) }
|
34
|
+
|
35
|
+
it 'it should call #serializable_hash with the same arguments' do
|
36
|
+
options = { option1: 'option1', option2: 'option2' }
|
37
|
+
|
38
|
+
expect(subject).to receive(:serializable_hash).with(options)
|
39
|
+
|
40
|
+
subject.to_json(options)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe "#serializable_hash" do
|
45
|
+
subject { UserWithAddressAndPosts::Son.new(attributes_for(:user_with_address_and_posts)) }
|
46
|
+
|
23
47
|
context "when no options are given" do
|
24
48
|
it 'it should return all attributes' do
|
25
|
-
expect(subject.
|
49
|
+
expect(subject.serializable_hash).to eq(SmoothOperator::Helpers.stringify_keys(attributes_for(:user_with_address_and_posts)))
|
26
50
|
end
|
27
51
|
end
|
28
52
|
|
@@ -30,7 +54,7 @@ describe SmoothOperator::Serialization do
|
|
30
54
|
let(:options_with_only) { { only: [:id, :first_name] } }
|
31
55
|
|
32
56
|
it 'it should only return the filtered options' do
|
33
|
-
expect(subject.
|
57
|
+
expect(subject.serializable_hash(options_with_only)).to eq(SmoothOperator::Helpers.stringify_keys(attributes_for(:white_list)))
|
34
58
|
end
|
35
59
|
end
|
36
60
|
|
@@ -38,7 +62,7 @@ describe SmoothOperator::Serialization do
|
|
38
62
|
let(:options_with_except) { { except: [:last_name, :admin] } }
|
39
63
|
|
40
64
|
it 'it should return all fields except for the filtered options' do
|
41
|
-
expect(subject.
|
65
|
+
expect(subject.serializable_hash(options_with_except)).not_to include(attributes_for(:black_list))
|
42
66
|
end
|
43
67
|
end
|
44
68
|
|
@@ -47,7 +71,7 @@ describe SmoothOperator::Serialization do
|
|
47
71
|
subject(:user_with_my_method) { UserWithAddressAndPosts::UserWithMyMethod.new(attributes_for(:user_with_address_and_posts)) }
|
48
72
|
|
49
73
|
it 'it should return all fields including the expected method and its returning value' do
|
50
|
-
expect(user_with_my_method.
|
74
|
+
expect(user_with_my_method.serializable_hash(options_with_method)).to eq(SmoothOperator::Helpers.stringify_keys(attributes_for(:user_with_my_method)))
|
51
75
|
end
|
52
76
|
end
|
53
77
|
|
data/spec/support/models/user.rb
CHANGED
data/spec/support/test_server.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: smooth_operator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.10.
|
4
|
+
version: 1.10.14
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- João Gonçalves
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-05-
|
11
|
+
date: 2014-05-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -92,7 +92,6 @@ files:
|
|
92
92
|
- lib/smooth_operator/model_schema.rb
|
93
93
|
- lib/smooth_operator/open_struct.rb
|
94
94
|
- lib/smooth_operator/operator.rb
|
95
|
-
- lib/smooth_operator/operators/base.rb
|
96
95
|
- lib/smooth_operator/operators/faraday.rb
|
97
96
|
- lib/smooth_operator/operators/typhoeus.rb
|
98
97
|
- lib/smooth_operator/persistence.rb
|
@@ -150,7 +149,7 @@ rubygems_version: 2.1.10
|
|
150
149
|
signing_key:
|
151
150
|
specification_version: 4
|
152
151
|
summary: Simple and fully customizable alternative to ActiveResource, using faraday
|
153
|
-
gem to stablish
|
152
|
+
gem to stablish remote calls"
|
154
153
|
test_files:
|
155
154
|
- spec/factories/user_factory.rb
|
156
155
|
- spec/require_helper.rb
|
@@ -1,55 +0,0 @@
|
|
1
|
-
module SmoothOperator
|
2
|
-
|
3
|
-
module Operators
|
4
|
-
|
5
|
-
class Base
|
6
|
-
|
7
|
-
attr_reader :operator_class, :http_verb, :params, :body, :connection, :operator_options, :options, :relative_path, :endpoint_user, :endpoint_pass
|
8
|
-
|
9
|
-
def initialize(operator_class, http_verb, relative_path, data, options)
|
10
|
-
@operator_class, @http_verb = operator_class, http_verb
|
11
|
-
|
12
|
-
@params, @body = strip_params(http_verb, data)
|
13
|
-
|
14
|
-
@connection, @operator_options, @options = strip_options(options)
|
15
|
-
|
16
|
-
@relative_path = resource_path(relative_path, options)
|
17
|
-
|
18
|
-
@endpoint_user = options[:endpoint_user] || @operator_class.endpoint_user
|
19
|
-
|
20
|
-
@endpoint_pass = options[:endpoint_pass] || @operator_class.endpoint_pass
|
21
|
-
end
|
22
|
-
|
23
|
-
|
24
|
-
protected ################# PROTECTED ###################
|
25
|
-
|
26
|
-
def strip_params(http_verb, data)
|
27
|
-
data ||= {}
|
28
|
-
|
29
|
-
([:get, :head, :delete].include?(http_verb) ? [@operator_class.query_string(data), nil] : [@operator_class.query_string({}), data])
|
30
|
-
end
|
31
|
-
|
32
|
-
def strip_options(options)
|
33
|
-
options ||= {}
|
34
|
-
|
35
|
-
options[:headers] = @operator_class.headers.merge(options[:headers] || {})
|
36
|
-
operator_options = options.delete(:operator_options) || {}
|
37
|
-
connection = options.delete(:connection) || @operator_class.generate_connection(nil, operator_options)
|
38
|
-
|
39
|
-
[connection, operator_options, options]
|
40
|
-
end
|
41
|
-
|
42
|
-
def resource_path(relative_path, options)
|
43
|
-
table_name = options[:table_name] || @operator_class.table_name
|
44
|
-
|
45
|
-
if Helpers.present?(table_name)
|
46
|
-
Helpers.present?(relative_path) ? "#{table_name}/#{relative_path}" : table_name
|
47
|
-
else
|
48
|
-
relative_path
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
end
|
53
|
-
|
54
|
-
end
|
55
|
-
end
|