smooth_operator 1.30.7 → 1.30.8

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 CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NDNhMzVmMTUyOWZjZmNlNDQxNmM2ZWE3Y2YyNmIxNDM3MzllZDYzNg==
4
+ MzFiZGRjMTk0YTBlMzU0MDg5ZmExNDllMTk4ZDYwZTcyZTRhMGYxOQ==
5
5
  data.tar.gz: !binary |-
6
- M2MxMzc4MDJmMWE2NmFlYmNlMDE3NjVmODg0Y2VjMTI1MWIzNTQ1Yw==
7
- SHA512:
6
+ ZDZkOWM3MDM4ZGM5ZmRlYzIyZmM4YjUwZDBmZDE3OTUxMWZmNzY4Mg==
7
+ !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- ZDZjNjM3ODFjZWY1ZDJiM2ExMDg1ZWNkZTRlMmVkYTVjYWE0YWY3MzlmNTBk
10
- MWM2ZGNjODg0MmZjYTlkMWExMmIyNzNiYTBiNDE2MjJhOWVlYjBjYTlhYjU2
11
- YzI5MWVjNWZhYmNkZDQxNjg3YjFkNTM2M2FkZmE5ZDkyOGNhYjc=
9
+ MDBjNDc2YmIwODVjZmY5NTc5YWFhM2MwZTljMzNhMGYzNjgxZGVmZjA1NDY2
10
+ MjgwYjRiZWM3YzUwNDFhYzM1OTI0MDZjM2EwYzYwZTViNGI1ZTljNWFlZjI4
11
+ ZGRmZjM3ZjA1ZGFkMzY2ODBkOGM1NmE3OGEzYWNmZmY3ZjA2NGM=
12
12
  data.tar.gz: !binary |-
13
- NTZjMGZhMjJhNTBhOTMxYWIxYWNmYjM1N2E0N2RkYzQ5NmZmMzNkNGZkZWVk
14
- ZDVkOWE5Nzc0MGFjYjUzMzQ3ZGIzZDYzNWM2ZGQ5MGU5MjJiOGRlOWZhOWNh
15
- NGE3Y2VjMWZmZDEyZTRkMGQ1ZDFkYzIyZTNiODU2YWY3YWQ0MzM=
13
+ ODc1ODMwNWU0OGU4ZDk5MmM3MWNlNzUyNzc3NWU2NGQwMmI0NjQwZGIxM2Jj
14
+ M2VmMzEyZDYzZmY0ZWVjMmEyYWViYTc0ZGQ2NzZjNzA2YzI1M2U3YTRhMDIw
15
+ ZjRiNDM3N2FhMTliOWQ3OWRkZGE5OTE5MGJlYzI0NGFlYWZlOTM=
@@ -32,6 +32,10 @@ module SmoothOperator
32
32
  attributes.is_a?(Array) ? new_entries : new_entries.first
33
33
  end
34
34
 
35
+ def attributes
36
+ get_array.map(&:attributes)
37
+ end
38
+
35
39
  undef :is_a?
36
40
 
37
41
  protected ############### PROTECTED ###############
@@ -1,6 +1,7 @@
1
1
  require 'faraday'
2
2
  require 'typhoeus/adapters/faraday'
3
3
  require "smooth_operator/remote_call/faraday"
4
+ require "smooth_operator/operators/faraday_encoder"
4
5
 
5
6
  module SmoothOperator
6
7
 
@@ -8,6 +9,8 @@ module SmoothOperator
8
9
 
9
10
  module Faraday
10
11
 
12
+ # ::Faraday::Utils.default_params_encoder = FaradayEncoder
13
+
11
14
  extend self
12
15
 
13
16
  # def generate_parallel_connection
@@ -0,0 +1,116 @@
1
+ module SmoothOperator
2
+ module Operators
3
+
4
+ module FaradayEncoder
5
+
6
+ class << self
7
+ extend Forwardable
8
+ def_delegators :'Faraday::Utils', :escape, :unescape
9
+ end
10
+
11
+ def self.encode(params)
12
+ return nil if params == nil
13
+
14
+ if !params.is_a?(Array)
15
+ if !params.respond_to?(:to_hash)
16
+ raise TypeError,
17
+ "Can't convert #{params.class} into Hash."
18
+ end
19
+ params = params.to_hash
20
+ params = params.map do |key, value|
21
+ key = key.to_s if key.kind_of?(Symbol)
22
+ [key, value]
23
+ end
24
+ # Useful default for OAuth and caching.
25
+ # Only to be used for non-Array inputs. Arrays should preserve order.
26
+ params.sort!
27
+ end
28
+
29
+ # Helper lambda
30
+ to_query = lambda do |parent, value|
31
+ if value.is_a?(Hash)
32
+ value = value.map do |key, val|
33
+ key = escape(key)
34
+ [key, val]
35
+ end
36
+ value.sort!
37
+ buffer = ""
38
+ value.each do |key, val|
39
+ new_parent = "#{parent}%5B#{key}%5D"
40
+ buffer << "#{to_query.call(new_parent, val)}&"
41
+ end
42
+ return buffer.chop
43
+ elsif value.is_a?(Array)
44
+ buffer = ""
45
+ value.each_with_index do |val, i|
46
+ new_parent = "#{parent}%5B%5D"
47
+ buffer << "#{to_query.call(new_parent, val)}&"
48
+ end
49
+ return buffer.chop
50
+ else
51
+ encoded_value = escape(value)
52
+ return "#{parent}=#{encoded_value}"
53
+ end
54
+ end
55
+
56
+ # The params have form [['key1', 'value1'], ['key2', 'value2']].
57
+ buffer = ''
58
+ params.each do |parent, value|
59
+ encoded_parent = escape(parent)
60
+ buffer << "#{to_query.call(encoded_parent, value)}&"
61
+ end
62
+ return buffer.chop
63
+ end
64
+
65
+ def self.decode(query)
66
+ return nil if query == nil
67
+ # Recursive helper lambda
68
+ dehash = lambda do |hash|
69
+ hash.each do |(key, value)|
70
+ if value.kind_of?(Hash)
71
+ hash[key] = dehash.call(value)
72
+ end
73
+ end
74
+ # Numeric keys implies an array
75
+ if hash != {} && hash.keys.all? { |key| key =~ /^\d+$/ }
76
+ hash.sort.inject([]) do |accu, (_, value)|
77
+ accu << value; accu
78
+ end
79
+ else
80
+ hash
81
+ end
82
+ end
83
+
84
+ empty_accumulator = {}
85
+ return ((query.split('&').map do |pair|
86
+ pair.split('=', 2) if pair && !pair.empty?
87
+ end).compact.inject(empty_accumulator.dup) do |accu, (key, value)|
88
+ key = unescape(key)
89
+ if value.kind_of?(String)
90
+ value = unescape(value.gsub(/\+/, ' '))
91
+ end
92
+
93
+ array_notation = !!(key =~ /\[\]$/)
94
+ subkeys = key.split(/[\[\]]+/)
95
+ current_hash = accu
96
+ for i in 0...(subkeys.size - 1)
97
+ subkey = subkeys[i]
98
+ current_hash[subkey] = {} unless current_hash[subkey]
99
+ current_hash = current_hash[subkey]
100
+ end
101
+ if array_notation
102
+ current_hash[subkeys.last] = [] unless current_hash[subkeys.last]
103
+ current_hash[subkeys.last] << value
104
+ else
105
+ current_hash[subkeys.last] = value
106
+ end
107
+ accu
108
+ end).inject(empty_accumulator.dup) do |accu, (key, value)|
109
+ accu[key] = value.kind_of?(Hash) ? dehash.call(value) : value
110
+ accu
111
+ end
112
+ end
113
+ end
114
+
115
+ end
116
+ end
@@ -1,3 +1,3 @@
1
1
  module SmoothOperator
2
- VERSION = '1.30.7'
2
+ VERSION = '1.30.8'
3
3
  end
@@ -1,7 +1,7 @@
1
1
  FactoryGirl.define do
2
-
2
+
3
3
  factory :user, class: User::Base do
4
-
4
+
5
5
  id 1
6
6
  admin true
7
7
  last_name 'Doe'
@@ -19,13 +19,27 @@ FactoryGirl.define do
19
19
  end
20
20
  factory :user_with_my_method, traits: [:with_address_and_posts, :has_my_method]
21
21
 
22
+ trait :with_complex_hash do
23
+ alarms [{
24
+ :action=>"AMQP",
25
+ :attach=>"amqp:bus/routing_key",
26
+ :description=>{"alarm_id"=>"542d2cd24a756e6006000000", "alarm_type"=>"MedicationAlarm", "medicine_id"=>"25", "medicine_type"=>"medicine", "body"=>""},
27
+ :trigger=>{:positive=>false, :relative=>"START", :value=>"RELATIVE"}
28
+ }]
29
+ recurrence_rules [
30
+ {:by_hour=>[0], :by_minute=>[30], :by_weekday=>[], :cycle=>nil, :frequency=>"DAILY", :interval=>1, :repeat_until=>nil},
31
+ {:by_hour=>[1], :by_minute=>[0], :by_weekday=>[], :cycle=>nil, :frequency=>"DAILY", :interval=>1, :repeat_until=>nil}
32
+ ]
33
+ end
34
+ factory :user_with_complex_hash, traits: [:with_complex_hash]
35
+
22
36
  end
23
37
 
24
38
  factory :white_list, class: User::Base do
25
39
  id 1
26
40
  first_name 'John'
27
41
  end
28
-
42
+
29
43
  factory :black_list, class: User::Base do
30
44
  admin true
31
45
  last_name 'Doe'
@@ -9,7 +9,17 @@ describe SmoothOperator::Operator do
9
9
 
10
10
  it 'should correctly encode that hash' do
11
11
  remote_call = subject.get('test_hash_with_array', attributes_for(:user_with_address_and_posts))
12
-
12
+
13
+ expect(remote_call.status).to eq(true)
14
+ end
15
+
16
+ end
17
+
18
+ context "submiting a complex hash" do
19
+
20
+ it 'should correctly encode that hash' do
21
+ remote_call = subject.get('test_complex_hash', attributes_for(:user_with_complex_hash))
22
+
13
23
  expect(remote_call.status).to eq(true)
14
24
  end
15
25
 
@@ -35,6 +45,16 @@ describe SmoothOperator::Operator do
35
45
 
36
46
  end
37
47
 
48
+ context "submiting a complex hash", current: true do
49
+
50
+ it 'should correctly encode that hash' do
51
+ remote_call = subject.post('test_complex_hash', attributes_for(:user_with_complex_hash))
52
+
53
+ expect(remote_call.status).to eq(true)
54
+ end
55
+
56
+ end
57
+
38
58
  it "should send the extra params set by .query_string method" do
39
59
  remote_call = subject.post('test_query_string', { normal_param: true })
40
60
 
@@ -23,10 +23,18 @@ class TestServer < Sinatra::Base
23
23
  status test_hash_with_array
24
24
  end
25
25
 
26
+ get '/users/test_complex_hash' do
27
+ status test_complex_hash
28
+ end
29
+
26
30
  post '/users/test_hash_with_array' do
27
31
  status test_hash_with_array
28
32
  end
29
33
 
34
+ post '/users/test_complex_hash' do
35
+ status test_complex_hash
36
+ end
37
+
30
38
  get '/users/test_query_string' do
31
39
  status test_query_string
32
40
  end
@@ -137,6 +145,12 @@ class TestServer < Sinatra::Base
137
145
  (params == data) ? 200 : 422
138
146
  end
139
147
 
148
+ def test_complex_hash
149
+ data = stringify_data FactoryGirl.attributes_for(:user_with_complex_hash)
150
+ binding.pry
151
+ (params == data) ? 200 : 422
152
+ end
153
+
140
154
  def test_query_string
141
155
  params[:normal_param] == 'true' && params[:query_string_param] == 'true' ? 200 : 422
142
156
  end
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.30.7
4
+ version: 1.30.8
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-09-09 00:00:00.000000000 Z
11
+ date: 2014-10-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -97,6 +97,7 @@ files:
97
97
  - lib/smooth_operator/operator.rb
98
98
  - lib/smooth_operator/operators/connection_wrapper.rb
99
99
  - lib/smooth_operator/operators/faraday.rb
100
+ - lib/smooth_operator/operators/faraday_encoder.rb
100
101
  - lib/smooth_operator/operators/typhoeus.rb
101
102
  - lib/smooth_operator/options.rb
102
103
  - lib/smooth_operator/persistence.rb
@@ -153,7 +154,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
153
154
  version: '0'
154
155
  requirements: []
155
156
  rubyforge_project:
156
- rubygems_version: 2.2.2
157
+ rubygems_version: 2.0.7
157
158
  signing_key:
158
159
  specification_version: 4
159
160
  summary: Simple and fully customizable alternative to ActiveResource, using faraday
@@ -179,3 +180,4 @@ test_files:
179
180
  - spec/support/models/user.rb
180
181
  - spec/support/models/user_with_address_and_posts.rb
181
182
  - spec/support/test_server.rb
183
+ has_rdoc: