smooth_operator 1.10.0 → 1.10.3
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 +8 -8
- data/console.rb +2 -8
- data/lib/smooth_operator/helpers.rb +2 -0
- data/lib/smooth_operator/operator.rb +16 -6
- data/lib/smooth_operator/{operator_call → operators}/base.rb +2 -2
- data/lib/smooth_operator/{operator_call → operators}/faraday.rb +8 -3
- data/lib/smooth_operator/operators/typhoeus.rb +73 -0
- data/lib/smooth_operator/persistence.rb +32 -11
- data/lib/smooth_operator/remote_call/base.rb +10 -12
- data/lib/smooth_operator/remote_call/errors/connection_failed.rb +6 -0
- data/lib/smooth_operator/remote_call/errors/timeout.rb +6 -0
- data/lib/smooth_operator/remote_call/faraday.rb +19 -0
- data/lib/smooth_operator/remote_call/typhoeus.rb +19 -0
- data/lib/smooth_operator/version.rb +1 -1
- data/smooth_operator.gemspec +1 -1
- data/spec/smooth_operator/persistence_spec.rb +2 -2
- data/spec/support/models/user.rb +2 -0
- metadata +9 -8
- data/lib/smooth_operator/operator_call/typhoeus.rb +0 -40
- data/lib/smooth_operator/remote_call/errors/base.rb +0 -27
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZDQ4MTZhNjkzMDYwMjRmNTUwYzZhMjU3YzZlZjFlZWE2YTJjODE3Zg==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MGVhNzg5MzQyNTU0ZWVlMDZmMmEwZjcxNjlkOTI4MWMxNTc0MWQxYg==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MmUzOTIxOTgwNWE2ZGM1NjhiNmMzYzE0YjA1MGNhYTRiMzhlMTRlOWVhY2Mw
|
10
|
+
NDdlZWU2YmEyZmVkMDY2MTFhYTdjYmFjN2Q4ZGIyYjM5YTFkMzllNmY2M2Jl
|
11
|
+
NmRlYjRkZGIwM2Q1NTAzZTg3ZjcxNWJkNzEzMmJiNmMzZTcyZWE=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MTE2YzIyNzVkMjRhZGY3MGMyOTdmNzAyODQ5ODY0NjI3ZDNkMmVkYzYwZTBk
|
14
|
+
MmY0MDVhNmQ4ZDM3Mjc0MTc2NzMxMjFlN2I0ZjY2NTBjMjY0ZGUxZWU4MmM1
|
15
|
+
MjE5YjE0NDc3Y2Y1ZWUyYWE5MjU4ZjY0NzcyY2ZlYzM4NjM0MTA=
|
data/console.rb
CHANGED
@@ -7,14 +7,8 @@ require "spec/spec_helper"
|
|
7
7
|
|
8
8
|
#User::Base.post('', { user: { age: 1, posts: [{ body: 'post1' }, 2] } })
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
conn.in_parallel do
|
14
|
-
remote_call = User::Base.find('http://localhost:4567/users', nil, { connection: conn })
|
15
|
-
end
|
16
|
-
|
17
|
-
remote_call
|
10
|
+
#user = UserWithAddressAndPosts::Son.new(FactoryGirl.attributes_for(:user_with_address_and_posts))
|
11
|
+
#user.save('', { status: 200 })
|
18
12
|
|
19
13
|
binding.pry
|
20
14
|
|
@@ -1,7 +1,9 @@
|
|
1
|
+
require "smooth_operator/operators/base"
|
1
2
|
require "smooth_operator/remote_call/base"
|
2
|
-
require "smooth_operator/
|
3
|
-
require "smooth_operator/
|
4
|
-
require "smooth_operator/
|
3
|
+
require "smooth_operator/operators/faraday"
|
4
|
+
require "smooth_operator/operators/typhoeus"
|
5
|
+
require "smooth_operator/remote_call/errors/timeout"
|
6
|
+
require "smooth_operator/remote_call/errors/connection_failed"
|
5
7
|
|
6
8
|
module SmoothOperator
|
7
9
|
|
@@ -43,12 +45,20 @@ module SmoothOperator
|
|
43
45
|
|
44
46
|
def make_the_call(http_verb, relative_path = '', data = {}, options = {})
|
45
47
|
if Helpers.present?(options[:hydra])
|
46
|
-
operator_call =
|
48
|
+
operator_call = Operators::Typhoeus.new(self, http_verb, relative_path, data, options)
|
47
49
|
else
|
48
|
-
operator_call =
|
50
|
+
operator_call = Operators::Faraday.new(self, http_verb, relative_path, data, options)
|
49
51
|
end
|
50
52
|
|
51
|
-
|
53
|
+
remote_call = {}
|
54
|
+
|
55
|
+
operator_call.make_the_call do |_remote_call|
|
56
|
+
remote_call = _remote_call
|
57
|
+
|
58
|
+
yield(remote_call) if block_given?
|
59
|
+
end
|
60
|
+
|
61
|
+
remote_call
|
52
62
|
end
|
53
63
|
|
54
64
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module SmoothOperator
|
2
2
|
|
3
|
-
module
|
3
|
+
module Operators
|
4
4
|
|
5
5
|
class Base
|
6
6
|
|
@@ -25,7 +25,7 @@ module SmoothOperator
|
|
25
25
|
|
26
26
|
def strip_params(http_verb, data)
|
27
27
|
data ||= {}
|
28
|
-
|
28
|
+
|
29
29
|
([:get, :head, :delete].include?(http_verb) ? [@operator_class.query_string(data), nil] : [@operator_class.query_string({}), data])
|
30
30
|
end
|
31
31
|
|
@@ -1,14 +1,15 @@
|
|
1
1
|
require 'faraday'
|
2
2
|
require 'typhoeus/adapters/faraday'
|
3
|
+
require "smooth_operator/remote_call/faraday"
|
3
4
|
|
4
5
|
module SmoothOperator
|
5
6
|
|
6
|
-
module
|
7
|
+
module Operators
|
7
8
|
|
8
9
|
class Faraday < Base
|
9
10
|
|
10
11
|
def make_the_call
|
11
|
-
begin
|
12
|
+
remote_call = begin
|
12
13
|
set_basic_authentication
|
13
14
|
|
14
15
|
response = connection.send(http_verb) do |request|
|
@@ -20,12 +21,16 @@ module SmoothOperator
|
|
20
21
|
request.body = body
|
21
22
|
end
|
22
23
|
|
23
|
-
RemoteCall::
|
24
|
+
RemoteCall::Faraday.new(response)
|
24
25
|
rescue ::Faraday::Error::ConnectionFailed
|
25
26
|
RemoteCall::Errors::ConnectionFailed.new(response)
|
26
27
|
rescue ::Faraday::Error::TimeoutError
|
27
28
|
RemoteCall::Errors::Timeout.new(response)
|
28
29
|
end
|
30
|
+
|
31
|
+
yield(remote_call) if block_given?
|
32
|
+
|
33
|
+
remote_call
|
29
34
|
end
|
30
35
|
|
31
36
|
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'typhoeus'
|
2
|
+
require "smooth_operator/remote_call/typhoeus"
|
3
|
+
|
4
|
+
module SmoothOperator
|
5
|
+
|
6
|
+
module Operators
|
7
|
+
|
8
|
+
class Typhoeus < Base
|
9
|
+
|
10
|
+
def make_the_call
|
11
|
+
set_basic_authentication
|
12
|
+
|
13
|
+
request = ::Typhoeus::Request.new(url, typhoeus_options)
|
14
|
+
|
15
|
+
remote_call = {}
|
16
|
+
|
17
|
+
hydra.queue(request)
|
18
|
+
|
19
|
+
request.on_complete do |typhoeus_response|
|
20
|
+
remote_call_class = if typhoeus_response.timed_out?
|
21
|
+
RemoteCall::Errors::Timeout
|
22
|
+
else
|
23
|
+
RemoteCall::Typhoeus
|
24
|
+
end
|
25
|
+
binding.pry
|
26
|
+
remote_call = remote_call_class.new(typhoeus_response)
|
27
|
+
|
28
|
+
yield(remote_call) if block_given?
|
29
|
+
end
|
30
|
+
|
31
|
+
hydra.run
|
32
|
+
|
33
|
+
remote_call
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
protected ################ PROTECTED ################
|
38
|
+
|
39
|
+
def set_basic_authentication
|
40
|
+
typhoeus_options[:userpwd] = "#{endpoint_user}:#{endpoint_pass}" if Helpers.present?(endpoint_user)
|
41
|
+
end
|
42
|
+
|
43
|
+
def url
|
44
|
+
url = (options[:endpoint] || operator_class.endpoint)
|
45
|
+
|
46
|
+
slice = url[-1] != '/' ? '/' : ''
|
47
|
+
|
48
|
+
url = "#{url}#{slice}#{relative_path}" if Helpers.present?(relative_path)
|
49
|
+
end
|
50
|
+
|
51
|
+
def typhoeus_options
|
52
|
+
return @typhoeus_options if defined?(@typhoeus_options)
|
53
|
+
|
54
|
+
@typhoeus_options = { method: http_verb, headers: options[:headers] }
|
55
|
+
|
56
|
+
timeout = (options[:timeout] || operator_class.timeout)
|
57
|
+
|
58
|
+
@typhoeus_options[:timeout] = timeout if Helpers.present?(timeout)
|
59
|
+
|
60
|
+
@typhoeus_options[:body] = body if Helpers.present?(body)
|
61
|
+
@typhoeus_options[:params] = params if Helpers.present?(params)
|
62
|
+
|
63
|
+
@typhoeus_options
|
64
|
+
end
|
65
|
+
|
66
|
+
def hydra
|
67
|
+
@hydra ||= operator_options[:hydra] || ::Typhoeus::Hydra::hydra
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
end
|
@@ -27,6 +27,8 @@ module SmoothOperator
|
|
27
27
|
end
|
28
28
|
|
29
29
|
|
30
|
+
attr_accessor :extra_params
|
31
|
+
|
30
32
|
def new_record?
|
31
33
|
return @new_record if defined?(@new_record)
|
32
34
|
|
@@ -56,9 +58,13 @@ module SmoothOperator
|
|
56
58
|
|
57
59
|
relative_path = id.to_s if Helpers.blank?(relative_path)
|
58
60
|
|
59
|
-
success =
|
61
|
+
success = {}
|
62
|
+
|
63
|
+
success = make_remote_call(self.class.methods_http_verbs[:destroy], relative_path, data, options) do |remote_call|
|
64
|
+
success = remote_call.status
|
60
65
|
|
61
|
-
|
66
|
+
@destroyed = true if success
|
67
|
+
end
|
62
68
|
|
63
69
|
success
|
64
70
|
end
|
@@ -71,34 +77,49 @@ module SmoothOperator
|
|
71
77
|
end
|
72
78
|
|
73
79
|
def create(relative_path, data, options)
|
74
|
-
success =
|
80
|
+
success = {}
|
81
|
+
|
82
|
+
make_remote_call(self.class.methods_http_verbs[:create], relative_path, data, options) do |remote_call|
|
83
|
+
success = remote_call.status
|
75
84
|
|
76
|
-
|
85
|
+
@new_record = false if success
|
86
|
+
end
|
77
87
|
|
78
88
|
success
|
79
89
|
end
|
80
90
|
|
81
91
|
def update(relative_path, data, options)
|
82
92
|
relative_path = id.to_s if Helpers.blank?(relative_path)
|
93
|
+
|
94
|
+
success = {}
|
95
|
+
|
96
|
+
make_remote_call(self.class.methods_http_verbs[:save], relative_path, data, options) do |remote_call|
|
97
|
+
success = remote_call.status
|
98
|
+
end
|
83
99
|
|
84
|
-
|
100
|
+
success
|
85
101
|
end
|
86
102
|
|
87
103
|
|
88
104
|
private ##################### PRIVATE ####################
|
89
105
|
|
90
106
|
def make_remote_call(http_verb, relative_path, data, options)
|
107
|
+
data ||= {}
|
108
|
+
data.merge!(extra_params || {})
|
109
|
+
|
91
110
|
data, options = build_remote_call_args(http_verb, data, options)
|
92
111
|
|
93
|
-
|
112
|
+
self.class.make_the_call(http_verb, relative_path, data, options) do |remote_call|
|
113
|
+
@last_remote_call = remote_call
|
94
114
|
|
95
|
-
|
115
|
+
returning_data = @last_remote_call.parsed_response
|
96
116
|
|
97
|
-
|
98
|
-
|
99
|
-
|
117
|
+
if !@last_remote_call.error? && returning_data.is_a?(Hash)
|
118
|
+
assign_attributes returning_data.include?(model_name) ? returning_data[model_name] : returning_data
|
119
|
+
end
|
100
120
|
|
101
|
-
|
121
|
+
yield(remote_call)
|
122
|
+
end
|
102
123
|
end
|
103
124
|
|
104
125
|
def build_remote_call_args(http_verb, data, options)
|
@@ -1,7 +1,3 @@
|
|
1
|
-
require "smooth_operator/remote_call/errors/base"
|
2
|
-
require "smooth_operator/remote_call/errors/timeout"
|
3
|
-
require "smooth_operator/remote_call/errors/connection_failed"
|
4
|
-
|
5
1
|
module SmoothOperator
|
6
2
|
|
7
3
|
module RemoteCall
|
@@ -10,30 +6,32 @@ module SmoothOperator
|
|
10
6
|
|
11
7
|
extend Forwardable
|
12
8
|
|
13
|
-
attr_reader :response
|
9
|
+
attr_reader :response, :http_status, :body, :headers
|
14
10
|
|
15
11
|
attr_accessor :object
|
16
12
|
|
17
|
-
def_delegator :response, :status, :http_status
|
18
|
-
|
19
|
-
def_delegators :response, :success?, :headers, :body
|
20
|
-
|
21
|
-
alias :ok? :success?
|
22
|
-
|
23
13
|
def initialize(response)
|
24
14
|
@response = response
|
25
15
|
end
|
26
16
|
|
27
17
|
|
18
|
+
def success?
|
19
|
+
http_status.between?(200, 299)
|
20
|
+
end
|
21
|
+
|
22
|
+
alias :ok? :success?
|
23
|
+
|
28
24
|
def failure?
|
29
25
|
http_status.between?(400, 499)
|
30
26
|
end
|
31
27
|
|
32
28
|
def error?
|
33
|
-
http_status.between?(500, 599)
|
29
|
+
http_status.between?(500, 599) || http_status == 0
|
34
30
|
end
|
35
31
|
|
36
32
|
def parsed_response
|
33
|
+
return nil if body.nil?
|
34
|
+
|
37
35
|
require 'json' unless defined? JSON
|
38
36
|
|
39
37
|
begin
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module SmoothOperator
|
2
|
+
|
3
|
+
module RemoteCall
|
4
|
+
|
5
|
+
class Faraday < Base
|
6
|
+
|
7
|
+
def initialize(response)
|
8
|
+
@response = response
|
9
|
+
|
10
|
+
@body = response.body
|
11
|
+
@headers = response.headers
|
12
|
+
@http_status = response.status
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module SmoothOperator
|
2
|
+
|
3
|
+
module RemoteCall
|
4
|
+
|
5
|
+
class Typhoeus < Base
|
6
|
+
|
7
|
+
def initialize(response)
|
8
|
+
@response = response
|
9
|
+
|
10
|
+
@body = response.body
|
11
|
+
@http_status = response.code
|
12
|
+
@headers = response.headers_hash
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
data/smooth_operator.gemspec
CHANGED
@@ -9,7 +9,7 @@ shared_examples_for "successful persistent remote call" do
|
|
9
9
|
it "it should populate 'last_remote_call' with the remote_call used on this transaction" do
|
10
10
|
expect(subject.last_remote_call).to be_nil unless method_to_execute.to_s =~ /create/
|
11
11
|
execute_method
|
12
|
-
expect(subject.last_remote_call).to
|
12
|
+
expect(subject.last_remote_call).to be_a_kind_of(SmoothOperator::RemoteCall::Base)
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
@@ -70,7 +70,7 @@ shared_examples_for "persistent remote call" do
|
|
70
70
|
it "it should populate 'last_remote_call' with the remote_call used on this transaction" do
|
71
71
|
expect(subject.last_remote_call).to be_nil unless method_to_execute.to_s =~ /create/
|
72
72
|
execute_method
|
73
|
-
expect(subject.last_remote_call).to
|
73
|
+
expect(subject.last_remote_call).to be_a_kind_of(SmoothOperator::RemoteCall::Base)
|
74
74
|
end
|
75
75
|
|
76
76
|
it "it should assert the subject's persistence" do
|
data/spec/support/models/user.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.3
|
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-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -58,14 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - ~>
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 0.8.
|
61
|
+
version: 0.8.9
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - ~>
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 0.8.
|
68
|
+
version: 0.8.9
|
69
69
|
description: ActiveResource alternative
|
70
70
|
email:
|
71
71
|
- goncalves.joao@gmail.com
|
@@ -91,14 +91,15 @@ files:
|
|
91
91
|
- lib/smooth_operator/model_schema.rb
|
92
92
|
- lib/smooth_operator/open_struct.rb
|
93
93
|
- lib/smooth_operator/operator.rb
|
94
|
-
- lib/smooth_operator/
|
95
|
-
- lib/smooth_operator/
|
96
|
-
- lib/smooth_operator/
|
94
|
+
- lib/smooth_operator/operators/base.rb
|
95
|
+
- lib/smooth_operator/operators/faraday.rb
|
96
|
+
- lib/smooth_operator/operators/typhoeus.rb
|
97
97
|
- lib/smooth_operator/persistence.rb
|
98
98
|
- lib/smooth_operator/remote_call/base.rb
|
99
|
-
- lib/smooth_operator/remote_call/errors/base.rb
|
100
99
|
- lib/smooth_operator/remote_call/errors/connection_failed.rb
|
101
100
|
- lib/smooth_operator/remote_call/errors/timeout.rb
|
101
|
+
- lib/smooth_operator/remote_call/faraday.rb
|
102
|
+
- lib/smooth_operator/remote_call/typhoeus.rb
|
102
103
|
- lib/smooth_operator/serialization.rb
|
103
104
|
- lib/smooth_operator/translation.rb
|
104
105
|
- lib/smooth_operator/type_converter.rb
|
@@ -1,40 +0,0 @@
|
|
1
|
-
require 'typhoeus'
|
2
|
-
|
3
|
-
module SmoothOperator
|
4
|
-
|
5
|
-
module OperatorCall
|
6
|
-
|
7
|
-
class Typhoeus < Base
|
8
|
-
|
9
|
-
def make_the_call
|
10
|
-
begin
|
11
|
-
set_basic_authentication
|
12
|
-
|
13
|
-
response = connection.send(http_verb) do |request|
|
14
|
-
operator_options.each { |key, value| request.options.send("#{key}=", value) }
|
15
|
-
options[:headers].each { |key, value| request.headers[key] = value }
|
16
|
-
params.each { |key, value| request.params[key] = value }
|
17
|
-
|
18
|
-
request.url relative_path
|
19
|
-
request.body = body
|
20
|
-
end
|
21
|
-
|
22
|
-
RemoteCall::Base.new(response)
|
23
|
-
rescue ::Faraday::Error::ConnectionFailed
|
24
|
-
RemoteCall::Errors::ConnectionFailed.new(response)
|
25
|
-
rescue ::Faraday::Error::TimeoutError
|
26
|
-
RemoteCall::Errors::Timeout.new(response)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
|
31
|
-
protected ################ PROTECTED ################
|
32
|
-
|
33
|
-
def set_basic_authentication
|
34
|
-
connection.basic_auth(endpoint_user, endpoint_pass) if Helpers.present?(endpoint_user)
|
35
|
-
end
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
end
|
40
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
module SmoothOperator
|
2
|
-
module RemoteCall
|
3
|
-
module Errors
|
4
|
-
|
5
|
-
class Base
|
6
|
-
|
7
|
-
attr_reader :response, :data, :object, :objects, :parsed_response, :status, :headers, :body
|
8
|
-
|
9
|
-
def initialize(response)
|
10
|
-
@response = response
|
11
|
-
end
|
12
|
-
|
13
|
-
def http_status; 0; end
|
14
|
-
|
15
|
-
def error?; true; end
|
16
|
-
|
17
|
-
def success?; false; end
|
18
|
-
|
19
|
-
def failure?; false; end
|
20
|
-
|
21
|
-
alias :ok? :success?
|
22
|
-
|
23
|
-
end
|
24
|
-
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|