api-resource 0.4.2 → 0.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5399345c2d2f04410d0c5d101a341c6118c4f2f3
4
- data.tar.gz: b856b7ed659a37531a2c647f6f39d482e73c303e
3
+ metadata.gz: 75454aa3ecbcf1e99126cbfad6d289de2b134268
4
+ data.tar.gz: 85cd9a9492a38e315998ae2a1df4d3b4dfea64a7
5
5
  SHA512:
6
- metadata.gz: 25e9c12ee00a9cb4094dd3b4bd1db79269b21ed9906e0a1f1a55f27fc0a3ec62034dff2db46256f9fe1430cadaeea85640cdc760e6e5ae784cc72f7e6e727ca5
7
- data.tar.gz: 40d994e49684c47d585120f109931cb4416caec48ca156f668768ce9ac6667d1d7346df940ca6d311c9a7e4ced0930689863ab1b7f5caad90690d29c3bc86f5b
6
+ metadata.gz: bcaeb7fda2107f869d38c16e2ee037342dc2885388b248afd40b33bb7796ec4e6b25ab0e53f224da0d952fcb049151d1cb3c2e00ceb4ed31daa0beb158259f8d
7
+ data.tar.gz: 5cde687ca57ec77b89c673f93375d57f7037373e1f157664844b4823d4f18702eed854122112a561257c12af166eb33f2fe5d7d483d84e4db4bb0806d14e5e99
@@ -20,6 +20,8 @@ module ApiResource
20
20
  class_attribute :api_id
21
21
  class_attribute :api_secret
22
22
  class_attribute :hmac_options
23
+ class_attribute :submitted_attributes_filter
24
+
23
25
 
24
26
  def self.with_hmac(api_id, api_secret, options={})
25
27
  self.hmac = true
@@ -28,24 +30,24 @@ module ApiResource
28
30
  self.hmac_options = options
29
31
  end
30
32
 
33
+ def self.filter_submitted_attributes(&block)
34
+ self.submitted_attributes_filter = block if block_given?
35
+ end
36
+
31
37
  def initialize(hash=nil)
32
38
  self.attributes = hash if hash
33
39
  end
34
40
 
35
41
  def self.resource_path
36
- @resource_path || resource_name
42
+ @resource_path || name.to_s.tableize
37
43
  end
38
44
 
39
45
  def self.resource_path=(path)
40
46
  @resource_path = path
41
47
  end
42
48
 
43
- def self.resource_name
44
- name.to_s.tableize
45
- end
46
-
47
- [:resource_name, :resource_path].each do |name|
48
- define_method(name) { self.class.public_send(name) }
49
+ def resource_path
50
+ self.class.resource_path
49
51
  end
50
52
 
51
53
  def self.find(id)
@@ -88,7 +90,7 @@ module ApiResource
88
90
  path = options.fetch(:path, resource_path)
89
91
  type = options[:type]
90
92
  json = submit_resource(path, false)
91
- meta = json['meta']
93
+ meta = json && json['meta']
92
94
  type ||= meta && meta['type']
93
95
  if type
94
96
  returned_type = self.class.load_class(type)
@@ -104,7 +106,7 @@ module ApiResource
104
106
  end
105
107
 
106
108
  def attributes
107
- instance_values.with_indifferent_access
109
+ instance_values.with_indifferent_access.except(:errors, :validation_context)
108
110
  end
109
111
 
110
112
  protected
@@ -113,13 +115,15 @@ module ApiResource
113
115
  raise ResourceError unless valid?
114
116
  verb = respond_to?(:id) && id ? :put : :post
115
117
  begin
116
- result = self.class.client(verb, attributes, path)
118
+ attrs = attributes
119
+ attrs = submitted_attributes_filter[attrs] if submitted_attributes_filter
120
+ result = self.class.client(verb, attrs, path)
117
121
  rescue RestClient::ExceptionWithResponse => e
118
122
  result = e.http_body
119
123
  raise ResourceError, 'Error executing request'
120
124
  ensure
121
125
  json = parse_and_check_error(result)
122
- self.attributes = json['data'] || json if verb == :post && save_attributes
126
+ self.attributes = json['data'] || json if json && verb == :post && save_attributes
123
127
  end
124
128
  json
125
129
  end
@@ -1,3 +1,3 @@
1
1
  module ApiResource
2
- VERSION = '0.4.2'
2
+ VERSION = '0.4.3'
3
3
  end
@@ -27,9 +27,9 @@ RSpec.describe ApiResource::Resource do
27
27
  expect(actual.attributes).to match((expected[:data] || expected).except(*except))
28
28
  end
29
29
 
30
- def req(verb, path, resource, status=200)
30
+ def req(verb, path, resource, status=200, params=nil)
31
31
  stub_request(verb, "#{BlogResource.base_url}#{path}").
32
- with(headers: { 'Accept' => 'application/json' }).
32
+ with(headers: { 'Accept' => 'application/json' }, body: params).
33
33
  to_return(status: status, body: resource.is_a?(String) || resource.blank? ? resource : resource.to_json)
34
34
  end
35
35
 
@@ -189,9 +189,9 @@ RSpec.describe ApiResource::Resource do
189
189
  it 'POSTs data when id is nil' do
190
190
  blog = Blog.new(title: 'hello')
191
191
  expect(blog.id).to be_nil
192
- expected_value = { data: { id: 325, title: 'hello' } }
192
+ expected_value = { data: { id: 32, title: 'hello' } }
193
193
 
194
- stub = req(:post, '/blogs', expected_value, 201)
194
+ stub = req(:post, '/blogs', expected_value, 201, { title: 'hello' })
195
195
  returned = blog.save!
196
196
  expect(returned).to eq(blog)
197
197
  check_returned_object(Blog, expected_value, blog)
@@ -201,7 +201,7 @@ RSpec.describe ApiResource::Resource do
201
201
  blog_id = 525
202
202
  blog = Blog.new(id: blog_id, title: 'hello')
203
203
 
204
- stub = req(:put, '/blogs', nil, 204)
204
+ stub = req(:put, '/blogs', nil, 204, id: blog_id.to_s, title: 'hello')
205
205
  returned = blog.save!
206
206
  expect(returned).to eq(blog)
207
207
  expect(blog.id).to eq(blog_id)
@@ -238,14 +238,15 @@ RSpec.describe ApiResource::Resource do
238
238
  attr_accessor :id, :email, :name
239
239
  end
240
240
 
241
- let (:sign_up) { SignUp.new(email: 'user@example.com', password: 'pass', password_confirmation: 'pass', name: 'Joe') }
241
+ let(:sign_up_data) { { email: 'user@example.com', password: 'pass', password_confirmation: 'pass', name: 'Joe' } }
242
+ let (:sign_up) { SignUp.new(sign_up_data) }
242
243
 
243
244
  before do
244
245
 
245
246
  end
246
247
  it 'uses the resource_path and uses the type in meta' do
247
248
  expected_value = { data: { id: 3, email: 'user@example.com', name: 'Jane' }, meta: { type: 'user' } }
248
- stub = req(:post, '/sign_up', expected_value, 200)
249
+ stub = req(:post, '/sign_up', expected_value, 200, sign_up_data)
249
250
  returned = sign_up.submit!
250
251
  check_returned_object(User, expected_value, returned)
251
252
  expect(stub).to have_been_requested
@@ -253,7 +254,7 @@ RSpec.describe ApiResource::Resource do
253
254
 
254
255
  it 'sets the returned errors' do
255
256
  expected_value = { errors: { password_confrimation: ["can't be blank"], email: ["can't be blank", 'is invalid'] } }
256
- stub = req(:post, '/sign_up', expected_value, 422)
257
+ stub = req(:post, '/sign_up', expected_value, 422, sign_up.attributes)
257
258
  expect(proc { sign_up.submit! }).to raise_error(ApiResource::ResourceError)
258
259
  expect(sign_up.errors.messages).to match(expected_value[:errors])
259
260
  expect(stub).to have_been_requested
@@ -261,10 +262,25 @@ RSpec.describe ApiResource::Resource do
261
262
 
262
263
  it 'no request if not valid' do
263
264
  sign_up.name = nil
264
- stub = req(:post, '/sign_up', nil, 422)
265
+ stub = req(:post, '/sign_up', nil, 422)
265
266
  expect(proc { sign_up.submit! }).to raise_error(ApiResource::ResourceError)
266
267
  expect(sign_up.errors[:name]).to be_truthy
267
268
  expect(stub).to_not have_been_requested
268
269
  end
269
270
  end
271
+ context '::filter_submit_params' do
272
+ class Purchase < BlogResource
273
+ filter_submitted_attributes do |attrs|
274
+ address_attrs = [:name, :street, :zip_code]
275
+ attrs.except(*address_attrs).merge(address: attrs.slice(*address_attrs))
276
+ end
277
+ attr_accessor :amount, :name, :street, :zip_code
278
+ end
279
+ it 'submit! filters params before being submitted' do
280
+ comment = Purchase.new(amount: 30, name: 'Jane', street: 'Old Street', zip_code: 'EC1Y 1BE')
281
+ stub = req(:post, '/purchases', nil, 200, { amount: '30', address: { name: 'Jane', street: 'Old Street', zip_code: 'EC1Y 1BE' } })
282
+ comment.submit!
283
+ expect(stub).to have_been_requested
284
+ end
285
+ end
270
286
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: api-resource
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ version: 0.4.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chaker Nakhli
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-25 00:00:00.000000000 Z
11
+ date: 2015-03-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: simple-hmac