smooth_operator 0.4.4 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +9 -9
  2. data/.gitignore +2 -1
  3. data/.rspec +4 -0
  4. data/Gemfile +13 -0
  5. data/README.md +258 -10
  6. data/console.rb +44 -0
  7. data/lib/smooth_operator/array_with_meta_data.rb +31 -0
  8. data/lib/smooth_operator/attribute_assignment.rb +102 -0
  9. data/lib/smooth_operator/attribute_methods.rb +87 -0
  10. data/lib/smooth_operator/attributes/base.rb +107 -0
  11. data/lib/smooth_operator/attributes/dirty.rb +29 -0
  12. data/lib/smooth_operator/attributes/normal.rb +15 -0
  13. data/lib/smooth_operator/delegation.rb +60 -0
  14. data/lib/smooth_operator/finder_methods.rb +43 -0
  15. data/lib/smooth_operator/helpers.rb +79 -0
  16. data/lib/smooth_operator/model_schema.rb +81 -0
  17. data/lib/smooth_operator/open_struct.rb +37 -0
  18. data/lib/smooth_operator/operator.rb +145 -0
  19. data/lib/smooth_operator/operators/faraday.rb +75 -0
  20. data/lib/smooth_operator/operators/typhoeus.rb +77 -0
  21. data/lib/smooth_operator/persistence.rb +144 -0
  22. data/lib/smooth_operator/relation/array_relation.rb +13 -0
  23. data/lib/smooth_operator/relation/association_reflection.rb +75 -0
  24. data/lib/smooth_operator/relation/associations.rb +75 -0
  25. data/lib/smooth_operator/relation/reflection.rb +41 -0
  26. data/lib/smooth_operator/relation/single_relation.rb +14 -0
  27. data/lib/smooth_operator/remote_call/base.rb +80 -0
  28. data/lib/smooth_operator/remote_call/errors/connection_failed.rb +20 -0
  29. data/lib/smooth_operator/remote_call/errors/timeout.rb +20 -0
  30. data/lib/smooth_operator/remote_call/faraday.rb +19 -0
  31. data/lib/smooth_operator/remote_call/typhoeus.rb +19 -0
  32. data/lib/smooth_operator/serialization.rb +79 -0
  33. data/lib/smooth_operator/translation.rb +27 -0
  34. data/lib/smooth_operator/validations.rb +15 -0
  35. data/lib/smooth_operator/version.rb +1 -1
  36. data/lib/smooth_operator.rb +26 -5
  37. data/smooth_operator.gemspec +12 -3
  38. data/spec/factories/user_factory.rb +34 -0
  39. data/spec/require_helper.rb +11 -0
  40. data/spec/smooth_operator/attribute_assignment_spec.rb +351 -0
  41. data/spec/smooth_operator/attributes_dirty_spec.rb +53 -0
  42. data/spec/smooth_operator/delegation_spec.rb +139 -0
  43. data/spec/smooth_operator/finder_methods_spec.rb +105 -0
  44. data/spec/smooth_operator/model_schema_spec.rb +31 -0
  45. data/spec/smooth_operator/operator_spec.rb +46 -0
  46. data/spec/smooth_operator/persistence_spec.rb +424 -0
  47. data/spec/smooth_operator/remote_call_spec.rb +320 -0
  48. data/spec/smooth_operator/serialization_spec.rb +80 -0
  49. data/spec/smooth_operator/validations_spec.rb +42 -0
  50. data/spec/spec_helper.rb +25 -0
  51. data/spec/support/helpers/persistence_helper.rb +38 -0
  52. data/spec/support/localhost_server.rb +97 -0
  53. data/spec/support/models/address.rb +14 -0
  54. data/spec/support/models/comment.rb +3 -0
  55. data/spec/support/models/post.rb +13 -0
  56. data/spec/support/models/user.rb +41 -0
  57. data/spec/support/models/user_with_address_and_posts.rb +89 -0
  58. data/spec/support/test_server.rb +165 -0
  59. metadata +108 -18
  60. data/lib/smooth_operator/base.rb +0 -30
  61. data/lib/smooth_operator/core.rb +0 -218
  62. data/lib/smooth_operator/http_handlers/typhoeus/base.rb +0 -58
  63. data/lib/smooth_operator/http_handlers/typhoeus/orm.rb +0 -34
  64. data/lib/smooth_operator/http_handlers/typhoeus/remote_call.rb +0 -28
  65. data/lib/smooth_operator/operator/base.rb +0 -43
  66. data/lib/smooth_operator/operator/exceptions.rb +0 -64
  67. data/lib/smooth_operator/operator/orm.rb +0 -118
  68. data/lib/smooth_operator/operator/remote_call.rb +0 -84
@@ -0,0 +1,320 @@
1
+ require "spec_helper"
2
+
3
+ describe SmoothOperator::RemoteCall do
4
+ subject { UserWithAddressAndPosts::Son.new(attributes_for(:user_with_address_and_posts)) }
5
+
6
+ context "when the server response has a http code in the 200 range" do
7
+ before { subject.save(nil, { status: 200 }) }
8
+
9
+ it "#ok? should return true" do
10
+ expect(subject.last_remote_call.ok?).to be true
11
+ end
12
+
13
+ it "#not_processed? should return false" do
14
+ expect(subject.last_remote_call.not_processed?).to be false
15
+ end
16
+
17
+ it "#client_error? should return false" do
18
+ expect(subject.last_remote_call.client_error?).to be false
19
+ end
20
+
21
+ it "#server_error? should return false" do
22
+ expect(subject.last_remote_call.server_error?).to be false
23
+ end
24
+
25
+ it "#error? should return false" do
26
+ expect(subject.last_remote_call.error?).to be false
27
+ end
28
+
29
+ it "#not_found? should return false" do
30
+ expect(subject.last_remote_call.not_found?).to be false
31
+ end
32
+
33
+ it "#timeout? should return false" do
34
+ expect(subject.last_remote_call.timeout?).to be false
35
+ end
36
+
37
+ it "#connection_failed? should return false" do
38
+ expect(subject.last_remote_call.connection_failed?).to be false
39
+ end
40
+
41
+ it "#status should return true" do
42
+ expect(subject.last_remote_call.status).to be true
43
+ end
44
+ end
45
+
46
+ context "when the server response has a http code in the 400 range (not 422, 404)" do
47
+ before { subject.save(nil, { status: 400 }) }
48
+
49
+ it "#ok? should return false" do
50
+ expect(subject.last_remote_call.ok?).to be false
51
+ end
52
+
53
+ it "#not_processed? should return false" do
54
+ expect(subject.last_remote_call.not_processed?).to be false
55
+ end
56
+
57
+ it "#client_error? should return true" do
58
+ expect(subject.last_remote_call.client_error?).to be true
59
+ end
60
+
61
+ it "#server_error? should return false" do
62
+ expect(subject.last_remote_call.server_error?).to be false
63
+ end
64
+
65
+ it "#error? should return true" do
66
+ expect(subject.last_remote_call.error?).to be true
67
+ end
68
+
69
+ it "#not_found? should return false" do
70
+ expect(subject.last_remote_call.not_found?).to be false
71
+ end
72
+
73
+ it "#timeout? should return false" do
74
+ expect(subject.last_remote_call.timeout?).to be false
75
+ end
76
+
77
+ it "#connection_failed? should return false" do
78
+ expect(subject.last_remote_call.connection_failed?).to be false
79
+ end
80
+
81
+ it "#status should return nil" do
82
+ expect(subject.last_remote_call.status).to be nil
83
+ end
84
+ end
85
+
86
+ context "when the server response has a http is 404" do
87
+ before { subject.save(nil, { status: 404 }) }
88
+
89
+ it "#ok? should return false" do
90
+ expect(subject.last_remote_call.ok?).to be false
91
+ end
92
+
93
+ it "#not_processed? should return false" do
94
+ expect(subject.last_remote_call.not_processed?).to be false
95
+ end
96
+
97
+ it "#client_error? should return true" do
98
+ expect(subject.last_remote_call.client_error?).to be true
99
+ end
100
+
101
+ it "#server_error? should return false" do
102
+ expect(subject.last_remote_call.server_error?).to be false
103
+ end
104
+
105
+ it "#error? should return true" do
106
+ expect(subject.last_remote_call.error?).to be true
107
+ end
108
+
109
+ it "#not_found? should return true" do
110
+ expect(subject.last_remote_call.not_found?).to be true
111
+ end
112
+
113
+ it "#timeout? should return false" do
114
+ expect(subject.last_remote_call.timeout?).to be false
115
+ end
116
+
117
+ it "#connection_failed? should return false" do
118
+ expect(subject.last_remote_call.connection_failed?).to be false
119
+ end
120
+
121
+ it "#status should return nil" do
122
+ expect(subject.last_remote_call.status).to be nil
123
+ end
124
+ end
125
+
126
+ context "when the server response has a http is 422" do
127
+ before { subject.save(nil, { status: 422 }) }
128
+
129
+ it "#ok? should return false" do
130
+ expect(subject.last_remote_call.ok?).to be false
131
+ end
132
+
133
+ it "#not_processed? should return true" do
134
+ expect(subject.last_remote_call.not_processed?).to be true
135
+ end
136
+
137
+ it "#client_error? should return true" do
138
+ expect(subject.last_remote_call.client_error?).to be true
139
+ end
140
+
141
+ it "#server_error? should return false" do
142
+ expect(subject.last_remote_call.server_error?).to be false
143
+ end
144
+
145
+ it "#error? should return false" do
146
+ expect(subject.last_remote_call.error?).to be false
147
+ end
148
+
149
+ it "#not_found? should return false" do
150
+ expect(subject.last_remote_call.not_found?).to be false
151
+ end
152
+
153
+ it "#timeout? should return false" do
154
+ expect(subject.last_remote_call.timeout?).to be false
155
+ end
156
+
157
+ it "#connection_failed? should return false" do
158
+ expect(subject.last_remote_call.connection_failed?).to be false
159
+ end
160
+
161
+ it "#status should return false" do
162
+ expect(subject.last_remote_call.status).to be false
163
+ end
164
+ end
165
+
166
+ context "when the server response has a http code in the 500 range" do
167
+ before { subject.save(nil, { status: 500 }) }
168
+
169
+ it "#ok? should return false" do
170
+ expect(subject.last_remote_call.ok?).to be false
171
+ end
172
+
173
+ it "#not_processed? should return false" do
174
+ expect(subject.last_remote_call.not_processed?).to be false
175
+ end
176
+
177
+ it "#client_error? should return false" do
178
+ expect(subject.last_remote_call.client_error?).to be false
179
+ end
180
+
181
+ it "#server_error? should return true" do
182
+ expect(subject.last_remote_call.server_error?).to be true
183
+ end
184
+
185
+ it "#error? should return true" do
186
+ expect(subject.last_remote_call.error?).to be true
187
+ end
188
+
189
+ it "#not_found? should return false" do
190
+ expect(subject.last_remote_call.not_found?).to be false
191
+ end
192
+
193
+ it "#timeout? should return false" do
194
+ expect(subject.last_remote_call.timeout?).to be false
195
+ end
196
+
197
+ it "#connection_failed? should return false" do
198
+ expect(subject.last_remote_call.connection_failed?).to be false
199
+ end
200
+
201
+ it "#status should return nil" do
202
+ expect(subject.last_remote_call.status).to be nil
203
+ end
204
+ end
205
+
206
+ context "when the connection is broken" do
207
+ subject { User::BrokenConnection.new }
208
+
209
+ before { subject.save }
210
+
211
+ it "#ok? should return false" do
212
+ expect(subject.last_remote_call.ok?).to be false
213
+ end
214
+
215
+ it "#not_processed? should return false" do
216
+ expect(subject.last_remote_call.not_processed?).to be false
217
+ end
218
+
219
+ it "#client_error? should return false" do
220
+ expect(subject.last_remote_call.client_error?).to be false
221
+ end
222
+
223
+ it "#server_error? should return true" do
224
+ expect(subject.last_remote_call.server_error?).to be true
225
+ end
226
+
227
+ it "#error? should return true" do
228
+ expect(subject.last_remote_call.error?).to be true
229
+ end
230
+
231
+ it "#not_found? should return false" do
232
+ expect(subject.last_remote_call.not_found?).to be false
233
+ end
234
+
235
+ it "#timeout? should return false" do
236
+ expect(subject.last_remote_call.timeout?).to be false
237
+ end
238
+
239
+ it "#connection_failed? should return true" do
240
+ expect(subject.last_remote_call.connection_failed?).to be true
241
+ end
242
+
243
+ it "#status should return nil" do
244
+ expect(subject.last_remote_call.status).to be nil
245
+ end
246
+ end
247
+
248
+ context "when the connection exceeds the timeout" do
249
+ subject { User::TimeoutConnection.new }
250
+
251
+ before { subject.save('/timeout') }
252
+
253
+ it "#ok? should return false" do
254
+ expect(subject.last_remote_call.ok?).to be false
255
+ end
256
+
257
+ it "#not_processed? should return false" do
258
+ expect(subject.last_remote_call.not_processed?).to be false
259
+ end
260
+
261
+ it "#client_error? should return false" do
262
+ expect(subject.last_remote_call.client_error?).to be false
263
+ end
264
+
265
+ it "#server_error? should return true" do
266
+ expect(subject.last_remote_call.server_error?).to be true
267
+ end
268
+
269
+ it "#error? should return true" do
270
+ expect(subject.last_remote_call.error?).to be true
271
+ end
272
+
273
+ it "#not_found? should return false" do
274
+ expect(subject.last_remote_call.not_found?).to be false
275
+ end
276
+
277
+ it "#timeout? should return true" do
278
+ expect(subject.last_remote_call.timeout?).to be true
279
+ end
280
+
281
+ it "#connection_failed? should return false" do
282
+ expect(subject.last_remote_call.connection_failed?).to be false
283
+ end
284
+
285
+ it "#status should return nil" do
286
+ expect(subject.last_remote_call.status).to be nil
287
+ end
288
+ end
289
+
290
+ describe "#parsed_response" do
291
+ context "when the server response's body does not contains valid json data" do
292
+ let(:remote_call) { User::Base.find('bad_json') }
293
+
294
+ it "should return nil" do
295
+ expect(remote_call.data).to be nil
296
+ end
297
+ end
298
+ end
299
+
300
+ describe "#http_status" do
301
+ context "when a server connection is established" do
302
+ before { subject.save(nil, { status: 422 }) }
303
+
304
+ it "it should return the server's http response code" do
305
+ expect(subject.last_remote_call.http_status).to be 422
306
+ end
307
+ end
308
+
309
+ context "when a server connection fails" do
310
+ subject { User::TimeoutConnection.new }
311
+
312
+ before { subject.save('/timeout') }
313
+
314
+ it "should return 0" do
315
+ expect(subject.last_remote_call.http_status).to be 0
316
+ end
317
+ end
318
+ end
319
+
320
+ end
@@ -0,0 +1,80 @@
1
+ require "spec_helper"
2
+
3
+ describe SmoothOperator::Serialization do
4
+
5
+ describe "#attributes" do
6
+ subject { UserWithAddressAndPosts::Son.new(attributes_for(:user_with_address_and_posts)) }
7
+
8
+ context "when there are changes to nested objects" do
9
+ before { subject.address.street = 'new street' }
10
+
11
+ it "should refect those changes" do
12
+ new_attributes = attributes_for(:user_with_address_and_posts)
13
+ new_attributes[:address][:street] = 'new street'
14
+
15
+ expect(subject.attributes).to eq(new_attributes)
16
+ end
17
+ end
18
+ end
19
+
20
+ describe "#to_hash" do
21
+ subject { UserWithAddressAndPosts::Son.new(attributes_for(:user_with_address_and_posts)) }
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
+
47
+ context "when no options are given" do
48
+ it 'it should return all attributes' do
49
+ expect(subject.serializable_hash).to eq(SmoothOperator::Helpers.stringify_keys(attributes_for(:user_with_address_and_posts)))
50
+ end
51
+ end
52
+
53
+ context "when option 'only' is introduced" do
54
+ let(:options_with_only) { { only: [:id, :first_name] } }
55
+
56
+ it 'it should only return the filtered options' do
57
+ expect(subject.serializable_hash(options_with_only)).to eq(SmoothOperator::Helpers.stringify_keys(attributes_for(:white_list)))
58
+ end
59
+ end
60
+
61
+ context "when option 'except' is introduced" do
62
+ let(:options_with_except) { { except: [:last_name, :admin] } }
63
+
64
+ it 'it should return all fields except for the filtered options' do
65
+ expect(subject.serializable_hash(options_with_except)).not_to include(attributes_for(:black_list))
66
+ end
67
+ end
68
+
69
+ context "when option 'methods' is introduced" do
70
+ let(:options_with_method) { { methods: :my_method } }
71
+ subject(:user_with_my_method) { UserWithAddressAndPosts::UserWithMyMethod.new(attributes_for(:user_with_address_and_posts)) }
72
+
73
+ it 'it should return all fields including the expected method and its returning value' do
74
+ expect(user_with_my_method.serializable_hash(options_with_method)).to eq(SmoothOperator::Helpers.stringify_keys(attributes_for(:user_with_my_method)))
75
+ end
76
+ end
77
+
78
+ end
79
+
80
+ end
@@ -0,0 +1,42 @@
1
+ require "spec_helper"
2
+
3
+ describe SmoothOperator::Validations do
4
+ subject { User::Base.new(attributes_for(:user)) }
5
+
6
+ describe "#valid?" do
7
+ context "when executing a persistence method, and the server response has a hash with the key 'errors'" do
8
+ before { subject.save('send_error') }
9
+
10
+ it "it should return false" do
11
+ expect(subject.valid?).to be false
12
+ end
13
+ end
14
+
15
+ context "when executing a persistence method, and the server response does NOT have a hash with the key 'errors'" do
16
+ before { subject.save }
17
+
18
+ it "it should return true" do
19
+ expect(subject.valid?).to be true
20
+ end
21
+ end
22
+ end
23
+
24
+ describe "#invalid?" do
25
+ context "when executing a persistence method, and the server response has a hash with the key 'errors'" do
26
+ before { subject.save('send_error') }
27
+
28
+ it "it should return true" do
29
+ expect(subject.invalid?).to be true
30
+ end
31
+ end
32
+
33
+ context "when executing a persistence method, and the server response does NOT have a hash with the key 'errors'" do
34
+ before { subject.save }
35
+
36
+ it "it should return false" do
37
+ expect(subject.invalid?).to be false
38
+ end
39
+ end
40
+ end
41
+
42
+ end
@@ -0,0 +1,25 @@
1
+ require 'simplecov'
2
+
3
+ SimpleCov.start do
4
+ root('lib/')
5
+ project_name('SmoothOperator')
6
+ coverage_dir('../tmp/coverage/')
7
+ end
8
+
9
+ require 'require_helper'
10
+
11
+ FactoryGirl.find_definitions
12
+
13
+ RSpec.configure do |config|
14
+
15
+ config.include FactoryGirl::Syntax::Methods
16
+
17
+ config.include PersistenceHelper, helpers: :persistence
18
+
19
+ config.expect_with :rspec do |c|
20
+ c.syntax = :expect
21
+ end
22
+
23
+ LocalhostServer.new(TestServer.new, 4567)
24
+
25
+ end
@@ -0,0 +1,38 @@
1
+ module PersistenceHelper
2
+
3
+ def subject_class
4
+ UserWithAddressAndPosts::Son
5
+ end
6
+
7
+ def new_user
8
+ attributes = attributes_for(:user_with_address_and_posts)
9
+ attributes.delete(:id)
10
+
11
+ subject_class.new attributes
12
+ end
13
+
14
+ def existing_user
15
+ subject_class.new(attributes_for(:user_with_address_and_posts))
16
+ end
17
+
18
+ def existing_user_with_patch
19
+ UserWithAddressAndPosts::WithPatch.new(attributes_for(:user_with_address_and_posts))
20
+ end
21
+
22
+ def created_subject
23
+ @created_subject
24
+ end
25
+
26
+ def execute_method
27
+ if method_to_execute.to_s =~ /create/
28
+ attributes = attributes_for(:user_with_address_and_posts)
29
+
30
+ attributes.delete(:id) if method_to_execute == :create_without_id
31
+
32
+ @created_subject = subject_class.create(attributes, *method_arguments)
33
+ else
34
+ subject.send(method_to_execute, *method_arguments)
35
+ end
36
+ end
37
+
38
+ end
@@ -0,0 +1,97 @@
1
+ # THIS FILE CODE BELONGS TO "typhoeus gem"
2
+ # https://github.com/typhoeus/typhoeus/blob/master/spec/support/localhost_server.rb
3
+
4
+ require 'rack'
5
+ require 'rack/handler/webrick'
6
+ require 'net/http'
7
+
8
+ # The code for this is inspired by Capybara's server:
9
+ # http://github.com/jnicklas/capybara/blob/0.3.9/lib/capybara/server.rb
10
+ class LocalhostServer
11
+ READY_MESSAGE = "Server ready"
12
+
13
+ class Identify
14
+ def initialize(app)
15
+ @app = app
16
+ end
17
+
18
+ def call(env)
19
+ if env["PATH_INFO"] == "/__identify__"
20
+ [200, {}, [LocalhostServer::READY_MESSAGE]]
21
+ else
22
+ @app.call(env)
23
+ end
24
+ end
25
+ end
26
+
27
+ attr_reader :port
28
+
29
+ def initialize(rack_app, port = nil)
30
+ @port = port || find_available_port
31
+ @rack_app = rack_app
32
+ concurrently { boot }
33
+ wait_until(10, "Boot failed.") { booted? }
34
+ end
35
+
36
+ private
37
+
38
+ def find_available_port
39
+ server = TCPServer.new('127.0.0.1', 0)
40
+ server.addr[1]
41
+ ensure
42
+ server.close if server
43
+ end
44
+
45
+ def boot
46
+ # Use WEBrick since it's part of the ruby standard library and is available on all ruby interpreters.
47
+ options = { :Port => port }
48
+ options.merge!(:AccessLog => [], :Logger => WEBrick::BasicLog.new(StringIO.new)) unless ENV['VERBOSE_SERVER']
49
+ Rack::Handler::WEBrick.run(Identify.new(@rack_app), options)
50
+ end
51
+
52
+ def booted?
53
+ res = ::Net::HTTP.get_response("localhost", '/__identify__', port)
54
+ if res.is_a?(::Net::HTTPSuccess) or res.is_a?(::Net::HTTPRedirection)
55
+ return res.body == READY_MESSAGE
56
+ end
57
+ rescue Errno::ECONNREFUSED, Errno::EBADF
58
+ return false
59
+ end
60
+
61
+ def concurrently
62
+ if should_use_subprocess?
63
+ pid = Process.fork do
64
+ trap(:INT) { ::Rack::Handler::WEBrick.shutdown }
65
+ yield
66
+ exit # manually exit; otherwise this sub-process will re-run the specs that haven't run yet.
67
+ end
68
+
69
+ at_exit do
70
+ Process.kill('INT', pid)
71
+ begin
72
+ Process.wait(pid)
73
+ rescue Errno::ECHILD
74
+ # ignore this error...I think it means the child process has already exited.
75
+ end
76
+ end
77
+ else
78
+ Thread.new { yield }
79
+ end
80
+ end
81
+
82
+ def should_use_subprocess?
83
+ # !ENV['THREADED']
84
+ false
85
+ end
86
+
87
+ def wait_until(timeout, error_message, &block)
88
+ start_time = Time.now
89
+
90
+ while true
91
+ return if yield
92
+ raise TimeoutError.new(error_message) if (Time.now - start_time) > timeout
93
+ sleep(0.05)
94
+ end
95
+ end
96
+ end
97
+
@@ -0,0 +1,14 @@
1
+ class Address < SmoothOperator::Base
2
+
3
+ self.dirty_attributes
4
+
5
+ self.resource_name = ''
6
+
7
+ self.endpoint_user = 'admin'
8
+ self.endpoint_pass = 'admin'
9
+
10
+ self.endpoint = 'http://localhost:4567/'
11
+
12
+ self.headers = { "X-APPTOKEN" => "joaquim_app_token", "X-LAYERTOKEN" => "joaquim_layer_token" }
13
+
14
+ end
@@ -0,0 +1,3 @@
1
+ class Comment < SmoothOperator::Base
2
+
3
+ end
@@ -0,0 +1,13 @@
1
+ class Post < SmoothOperator::Base
2
+
3
+ self.endpoint_user = 'admin'
4
+
5
+ self.endpoint_pass = 'admin'
6
+
7
+ self.endpoint = 'http://localhost:4567/'
8
+
9
+ has_many :comments
10
+
11
+ belongs_to :address
12
+
13
+ end
@@ -0,0 +1,41 @@
1
+ module User
2
+
3
+ class Base < SmoothOperator::Base
4
+
5
+ self.resource_name = 'user'
6
+
7
+ self.endpoint_user = 'admin'
8
+
9
+ self.endpoint_pass = 'admin'
10
+
11
+ self.endpoint = 'http://localhost:4567/'
12
+
13
+ def self.query_string(params)
14
+ params['query_string_param'] = true
15
+
16
+ params
17
+ end
18
+
19
+ end
20
+
21
+ module UnknownHashClass
22
+
23
+ class OpenStructBase < User::Base
24
+ self.unknown_hash_class = SmoothOperator::OpenStruct::Base
25
+ end
26
+
27
+ class None < User::Base
28
+ self.unknown_hash_class = :none
29
+ end
30
+
31
+ end
32
+
33
+ class BrokenConnection < SmoothOperator::Base
34
+ self.endpoint = 'http://localhost:1234/'
35
+ end
36
+
37
+ class TimeoutConnection < Base
38
+ self.timeout = 1
39
+ end
40
+
41
+ end