rapid_api 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7be5a951b804eca79ba595e4bc916c4c50ab6dfad139c890f9f235ffbf8d4656
4
- data.tar.gz: 3c70c06609a2760e41920e7bcc83a358d151ea2f3a5b89afcccd092a35fa11ee
3
+ metadata.gz: bd5b7f38b622bb70a7153cdb907e8261f9b0bce7160e63be0952d30b41b31217
4
+ data.tar.gz: cd08b0e83ac2fb977fdae26a3dc103c6b7ee839f63a48c24fc7a943bb510cb8e
5
5
  SHA512:
6
- metadata.gz: 8ab4b799f58a483723b45fc720318d127be9f3a48e9b22ca926d6470c0045f77f5a34a218f8af635a6486cb22c5734d3433f81517e6b2ec5f9459c97d64df175
7
- data.tar.gz: ab8442c402ff6bf09c4771a3c27a8ec4f01eaa71560e2d190e2d1724233a1d7889dc7bbb131375e73c277fa4515e4e9e7ea6325a34ff81e7c12acf376a1b0079
6
+ metadata.gz: ab1900d7a216b238989bd3d66e0b5d3356537627b99dfc5082799b8ca48f771b81693ff50dab6ad4fb19c216fe56d73cdbe8f6f48b43b6cb685f15e4aff5c42e
7
+ data.tar.gz: bd176ec865a92ebf48f860baed9c478bdf3dc7b35a2e8574442f98c1ac2e04932ba69ff437f911eb3f3c8b13c7956840baddebddab844ff79ec89af43623a635
@@ -51,7 +51,7 @@ module RapidApi
51
51
  end
52
52
 
53
53
  def _not_authorized(e)
54
- render_error_message 'Not Authenticated', :unauthorized, e
54
+ render_error_message 'Not Authorized', :unauthorized, e
55
55
  end
56
56
 
57
57
  def _not_found(e)
@@ -56,13 +56,27 @@ module RapidApi
56
56
  def destroy
57
57
  id = _adapted_serializer.deserialize_id(params, _params_key)
58
58
  query_result = _adapted_model.destroy id, scope
59
- if query_result.has_errors?
60
- not_processable! query_result.errors
59
+ if query_result.found?
60
+ if query_result.has_errors?
61
+ not_processable! query_result.errors
62
+ else
63
+ head :no_content
64
+ end
61
65
  else
62
- head :no_content
66
+ not_found!
63
67
  end
64
68
  end
65
69
 
70
+ def find_member
71
+ id = _adapted_serializer.deserialize_id(params, _params_key)
72
+ query_result = _adapted_model.find id, scope
73
+ @member = query_result
74
+ end
75
+
76
+ def render_member_ok(member)
77
+ render json: _adapted_serializer.serialize(member) , status: response_code_for(:ok)
78
+ end
79
+
66
80
  private
67
81
 
68
82
  def _adapted_model
@@ -115,10 +129,11 @@ module RapidApi
115
129
  end
116
130
 
117
131
  def serializer
118
- #TODO: BDW - This convention is too dependent on AMS. This should be
119
- # decoupled in some way.
132
+ module_name = self.name.to_s.deconstantize
133
+ serializer_name = "#{model_class_name}Serializer"
134
+ serializer_name = "#{module_name}::#{serializer_name}" unless module_name.empty?
120
135
  @serializer ||= begin
121
- "#{model_class_name}Serializer".constantize
136
+ serializer_name.constantize
122
137
  rescue NameError
123
138
  end
124
139
  end
@@ -10,15 +10,18 @@ module RapidApi
10
10
  @scope ||= {}
11
11
  end
12
12
 
13
- protected
14
-
15
13
  def define_scope
16
- return unless try :_scope_array
14
+ tmp_scope_array = [*_scope_array]
17
15
  self.class.scope_params.each_with_index do |key, index|
18
- scope[key] = _scope_array[index]
16
+ scope[key] = tmp_scope_array[index]
19
17
  end
20
18
  end
21
19
 
20
+ protected
21
+
22
+ def _scope_array
23
+ []
24
+ end
22
25
 
23
26
  module ClassMethods
24
27
  attr_accessor :scope_by_proc, :scope_params
@@ -7,16 +7,13 @@ module RapidApi
7
7
  QueryResult.new data: member
8
8
  end
9
9
 
10
- def find_all(params=nil, scope=nil)
11
- params ||= {}
12
- scope ||= {}
10
+ def find_all(params={}, scope={})
13
11
  scoped_params = params.merge scope
14
12
  collection = klass.where(scoped_params)
15
13
  QueryResult.new data: collection
16
14
  end
17
15
 
18
- def create(params, scope=nil)
19
- scope ||= {}
16
+ def create(params, scope={})
20
17
  create_params = params.merge scope
21
18
  member = klass.create create_params
22
19
  _query_result_for_member member
@@ -24,20 +21,24 @@ module RapidApi
24
21
 
25
22
  def update(id, params, scope=nil)
26
23
  member = _find_member_with_scope(id, scope)
27
- member.update_attributes params
24
+ if member.present?
25
+ member.update_attributes params
26
+ end
28
27
  _query_result_for_member member
29
28
  end
30
29
 
31
30
  def destroy(id, scope=nil)
32
31
  member = _find_member_with_scope(id, scope)
33
- member.destroy
32
+ if member.present?
33
+ member.destroy
34
+ end
34
35
  _query_result_for_member member
35
36
  end
36
37
 
37
38
  private
38
39
 
39
40
  def _query_result_for_member(member)
40
- QueryResult.new data: member, errors: member.errors
41
+ QueryResult.new data: member, errors: member.try(:errors)
41
42
  end
42
43
 
43
44
  def _find_member_with_scope(id, scope)
@@ -9,19 +9,37 @@ module RapidApi
9
9
 
10
10
  def serialize_collection(collection)
11
11
  collection_serializer = ActiveModel::Serializer::CollectionSerializer.new collection, {
12
- each_serializer: klass
12
+ serializer: klass
13
13
  }
14
14
  ActiveModelSerializers::Adapter.create(collection_serializer).to_json
15
15
  end
16
16
 
17
17
  def serialize_errors(query_result)
18
18
  serializer = ActiveModel::Serializer::ErrorSerializer.new(query_result)
19
- ActiveModelSerializers::Adapter.create(serializer).to_json
19
+ if ActiveModelSerializers.config.adapter == :attributes
20
+ { errors: serializer.as_json }
21
+ else
22
+ ActiveModelSerializers::Adapter.create(serializer).to_json
23
+ end
20
24
  end
21
25
 
22
- # NOTE: Need to add support for :attributes serialization
23
26
  def deserialize_attributes(params, root_key)
24
- params.require(:data).require(:attributes)
27
+ #TODO: test attributes deserialization
28
+ if ActiveModelSerializers.config.adapter == :attributes
29
+ params.require(root_key)
30
+ else
31
+ attributes = params
32
+ if params[:data][:attributes].present?
33
+ attributes = params.require(:data).require(:attributes)
34
+ end
35
+ if params[:data][:relationships].present?
36
+ relationships = params.require(:data).require(:relationships)
37
+ relationships.keys.each do |attribute|
38
+ attributes["#{attribute}_id"] = relationships[attribute][:data].try(:[], :id)
39
+ end
40
+ end
41
+ attributes
42
+ end
25
43
  end
26
44
 
27
45
  def deserialize_id(params, root_key)
@@ -0,0 +1,63 @@
1
+ module RapidApi
2
+ module Services
3
+ class RapidApi::Services::BaseService
4
+
5
+ attr_accessor :params,
6
+ :response,
7
+ :bang_mode
8
+
9
+ def self.method_missing(meth, *args, &block)
10
+ if meth[-1] == '!'
11
+ meth = meth.to_s.split('!')[0].to_sym
12
+ bang_mode = true
13
+ else
14
+ bang_mode = false
15
+ end
16
+ if instance_methods.include? meth
17
+ service = self.new(*args)
18
+ service.bang_mode = bang_mode
19
+ service.send(meth)
20
+ if bang_mode
21
+ return service.response.value
22
+ else
23
+ return service.response
24
+ end
25
+ else
26
+ super
27
+ end
28
+ end
29
+
30
+ def initialize(params={})
31
+ @params = params
32
+ @response = ServiceResponse.new
33
+ after_initialize
34
+ end
35
+
36
+ def after_initialize
37
+ end
38
+
39
+ def add_error(key, message)
40
+ raise "#{key}: #{message}" if bang_mode
41
+
42
+ error_key = response.errors[key]
43
+ error_key ||= []
44
+ error_key << message
45
+ end
46
+
47
+ def return_value(value)
48
+ response.value = value
49
+ end
50
+
51
+ protected
52
+
53
+ def _transfer_errors_from_active_record(model)
54
+ if model.errors.any?
55
+ model.errors.keys.each do |k|
56
+ response.errors[k]= model.errors[k]
57
+ end
58
+ end
59
+ end
60
+
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,16 @@
1
+ module RapidApi
2
+ module Services
3
+ class ServiceResponse
4
+ attr_accessor :value, :errors
5
+
6
+ def has_errors?
7
+ !errors.empty?
8
+ end
9
+
10
+ def errors
11
+ @errors ||= HashWithIndifferentAccess.new
12
+ end
13
+
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,8 @@
1
+ require 'rapid_api/services/service_response'
2
+ require 'rapid_api/services/base_service'
3
+
4
+ module RapidApi
5
+ module Services
6
+
7
+ end
8
+ end
@@ -1,3 +1,3 @@
1
1
  module RapidApi
2
- VERSION = "0.2.1"
2
+ VERSION = "0.3.0"
3
3
  end
data/lib/rapid_api.rb CHANGED
@@ -5,6 +5,7 @@ require 'rapid_api/serializer_adapters'
5
5
  require 'rapid_api/action_controller'
6
6
  require 'rapid_api/auth'
7
7
  require 'rapid_api/configuration'
8
+ require 'rapid_api/services'
8
9
 
9
10
  module RapidApi
10
11
 
@@ -30,7 +30,7 @@ class ActionControllerErrorsTest < ActionController::TestCase
30
30
  def test_unauthenticated_error
31
31
  get :unauthenticated_action
32
32
  assert_response :unauthorized
33
- assert_equal ['Not Authenticated'], JSON.parse(@controller.response.body)['errors']
33
+ assert_equal ['Not Authorized'], JSON.parse(@controller.response.body)['errors']
34
34
  end
35
35
 
36
36
  def test_server_error
@@ -150,7 +150,7 @@ module ActionController
150
150
  def test_destroy
151
151
  BricksController.adapted_model = Minitest::Mock.new
152
152
  BricksController.serializer = TestSerializerAdapter
153
- query_result = RapidApi::ModelAdapters::QueryResult.new()
153
+ query_result = RapidApi::ModelAdapters::QueryResult.new(data: 'data')
154
154
  BricksController.adapted_model.expect :destroy, query_result, ["1", {color: 'blue'}]
155
155
  post :destroy, params: {id: 1}
156
156
  assert_response :no_content
@@ -160,7 +160,7 @@ module ActionController
160
160
  def test_destroy_errors
161
161
  BricksController.adapted_model = Minitest::Mock.new
162
162
  BricksController.serializer = TestSerializerAdapter
163
- query_result = RapidApi::ModelAdapters::QueryResult.new(errors: 'dummy error')
163
+ query_result = RapidApi::ModelAdapters::QueryResult.new(data: 'data', errors: 'dummy error')
164
164
  BricksController.adapted_model.expect :destroy, query_result, ["1", {color: 'blue'}]
165
165
  post :destroy, params: {id: 1}
166
166
  assert_response :unprocessable_entity
@@ -13,9 +13,9 @@ module RapidApi
13
13
  end
14
14
 
15
15
  def test_serialize
16
- brick = Brick.create color: 'yellow', weight: 10, material: 'paper'
16
+ brick = Brick.new color: 'yellow', weight: 10, material: 'paper'
17
17
  serialized_brick = @adapter.serialize brick
18
- assert_equal "{\"data\":{\"id\":\"#{brick.id}\",\"type\":\"bricks\",\"attributes\":{\"color\":\"yellow\",\"weight\":\"10.0\",\"material\":\"paper\"}}}", serialized_brick
18
+ assert_equal "{\"data\":{\"type\":\"bricks\",\"attributes\":{\"color\":\"yellow\",\"weight\":\"10.0\",\"material\":\"paper\"}}}", serialized_brick
19
19
  end
20
20
 
21
21
  def test_serialize_collection
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rapid_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - briandavidwetzel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-09-20 00:00:00.000000000 Z
11
+ date: 2018-09-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionpack
@@ -125,6 +125,9 @@ files:
125
125
  - lib/rapid_api/serializer_adapters.rb
126
126
  - lib/rapid_api/serializer_adapters/abstract.rb
127
127
  - lib/rapid_api/serializer_adapters/ams_adapter.rb
128
+ - lib/rapid_api/services.rb
129
+ - lib/rapid_api/services/base_service.rb
130
+ - lib/rapid_api/services/service_response.rb
128
131
  - lib/rapid_api/version.rb
129
132
  - test/integration/ams_ar_test.rb
130
133
  - test/support/code_climate.rb