cyrax 0.5.13 → 0.6.0.beta
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 +14 -6
- data/lib/cyrax.rb +2 -9
- data/lib/cyrax/decorator.rb +0 -17
- data/lib/cyrax/extensions/has_decorator.rb +9 -9
- data/lib/cyrax/extensions/has_repository.rb +43 -0
- data/lib/cyrax/extensions/has_resource.rb +23 -32
- data/lib/cyrax/extensions/has_response.rb +0 -1
- data/lib/cyrax/extensions/has_serializer.rb +9 -9
- data/lib/cyrax/extensions/has_service.rb +26 -59
- data/lib/cyrax/helpers/controller.rb +1 -1
- data/lib/cyrax/presenter.rb +1 -1
- data/lib/cyrax/repository.rb +102 -0
- data/lib/cyrax/resource.rb +1 -0
- data/lib/cyrax/response.rb +3 -8
- data/lib/cyrax/serializer.rb +0 -27
- data/lib/cyrax/serializers/scope.rb +4 -18
- data/lib/cyrax/version.rb +1 -1
- data/spec/cyrax/extensions/has_decorator_spec.rb +5 -5
- data/spec/cyrax/extensions/has_repository_spec.rb +28 -0
- data/spec/cyrax/extensions/has_resource_spec.rb +6 -15
- data/spec/cyrax/extensions/has_response_spec.rb +1 -1
- data/spec/cyrax/extensions/has_service_spec.rb +0 -43
- data/spec/cyrax/repository_spec.rb +72 -0
- data/spec/cyrax/resource_spec.rb +21 -35
- data/spec/cyrax/serializer_spec.rb +2 -13
- metadata +28 -36
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
MzJlYTg3MDkzYjVjMzJhODVmODAwNTllMzVlM2Q2Y2Q4MDQ2NjUyNQ==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
ODdlMjE1MGIxMzRkZTc1MmExMTFkZWUyYThlZGViM2RiNjEwYjZmZQ==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
YzE2M2IzNjRmZTAzOGY2MjNlMmJhYzg0NzM2YjFhYjFhZTljNTZlYTMyMTE5
|
10
|
+
YjE0OGQ2ZjE3Y2IzYWIxMTg2MTA2MjFmMzdlYjhhNGFkN2IxOGQ1YzFlNWVi
|
11
|
+
YmY1ODAyM2FkNjdlODcxYTNmYjk3NjcyOGRhYWQxYjdlYjZlMjc=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
NWM1NzBjNDEwM2E2NDc4ZGEyNmZhNGY3MTRiN2YyNThmYzQ3NzU1OWY5Mjg3
|
14
|
+
NzE2ZTEyZWEyMDAyNWU3NDE4MzRhYjNkOTI2NDRiMDFjZTQxNjBkMjU4NmQy
|
15
|
+
ZjA4ZWMzZmUwMjQ4MjJiNzgxYTY2NmZkNDYzMjhjNThkODcyNjQ=
|
data/lib/cyrax.rb
CHANGED
@@ -6,6 +6,7 @@ require "cyrax/extensions/has_response.rb"
|
|
6
6
|
require "cyrax/extensions/has_service.rb"
|
7
7
|
require "cyrax/extensions/has_decorator.rb"
|
8
8
|
require "cyrax/extensions/has_serializer.rb"
|
9
|
+
require "cyrax/extensions/has_repository.rb"
|
9
10
|
require "cyrax/presenters/base_collection.rb"
|
10
11
|
require "cyrax/presenters/decorated_collection.rb"
|
11
12
|
require "cyrax/serializers/scope.rb"
|
@@ -17,10 +18,10 @@ require "cyrax/presenter.rb"
|
|
17
18
|
require "cyrax/response.rb"
|
18
19
|
require "cyrax/decorator.rb"
|
19
20
|
require "cyrax/serializer.rb"
|
21
|
+
require "cyrax/repository.rb"
|
20
22
|
|
21
23
|
module Cyrax
|
22
24
|
@@strong_parameters = true
|
23
|
-
@@automatically_set_invalid_status = true
|
24
25
|
|
25
26
|
def self.strong_parameters
|
26
27
|
@@strong_parameters
|
@@ -29,12 +30,4 @@ module Cyrax
|
|
29
30
|
def self.strong_parameters=(value)
|
30
31
|
@@strong_parameters = value
|
31
32
|
end
|
32
|
-
|
33
|
-
def self.automatically_set_invalid_status
|
34
|
-
@@automatically_set_invalid_status
|
35
|
-
end
|
36
|
-
|
37
|
-
def self.automatically_set_invalid_status=(value)
|
38
|
-
@@automatically_set_invalid_status = value
|
39
|
-
end
|
40
33
|
end
|
data/lib/cyrax/decorator.rb
CHANGED
@@ -21,28 +21,11 @@ class Cyrax::Decorator < Cyrax::Wrapper
|
|
21
21
|
resource.send(method, *args, &block)
|
22
22
|
end
|
23
23
|
|
24
|
-
def respond_to?(method_sym, include_private = false)
|
25
|
-
super || resource.respond_to?(method_sym, include_private)
|
26
|
-
end
|
27
|
-
|
28
24
|
class << self
|
29
25
|
alias_method :decorate, :new
|
30
26
|
|
31
27
|
def decorate_collection(resource)
|
32
28
|
Cyrax::Presenters::DecoratedCollection.decorate(resource, decorator: self)
|
33
29
|
end
|
34
|
-
|
35
|
-
def respond_to?(method_sym, include_private = false)
|
36
|
-
super || @@decorated_class.respond_to?(method_sym, include_private)
|
37
|
-
end
|
38
|
-
|
39
|
-
def method_missing(method, *args, &block)
|
40
|
-
return super unless @@decorated_class.respond_to?(method)
|
41
|
-
@@decorated_class.send(method, *args, &block)
|
42
|
-
end
|
43
|
-
|
44
|
-
def decorated_class(klass)
|
45
|
-
@@decorated_class = klass
|
46
|
-
end
|
47
30
|
end
|
48
31
|
end
|
@@ -3,24 +3,24 @@ module Cyrax::Extensions
|
|
3
3
|
extend ActiveSupport::Concern
|
4
4
|
|
5
5
|
included do
|
6
|
-
class_attribute :
|
7
|
-
end
|
8
|
-
|
9
|
-
def decorator_class_name
|
10
|
-
options[:decorator] || self.class.decorator_class_name
|
6
|
+
class_attribute :_decorator_class
|
11
7
|
end
|
12
8
|
|
13
9
|
def decorable?
|
14
|
-
!
|
10
|
+
!decorator_class.nil?
|
15
11
|
end
|
16
12
|
|
17
13
|
def decorator_class
|
18
|
-
|
14
|
+
options[:decorator] || self.class._decorator_class
|
19
15
|
end
|
20
16
|
|
21
17
|
module ClassMethods
|
22
|
-
def decorator(
|
23
|
-
|
18
|
+
def decorator(klass)
|
19
|
+
if klass.is_a?(String)
|
20
|
+
ActiveSupport::Deprecation.warn "sending String in #decorator method is deprecated. send Class instead"
|
21
|
+
klass = klass.constantize
|
22
|
+
end
|
23
|
+
self._decorator_class = klass
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Cyrax::Extensions
|
2
|
+
module HasRepository
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
class_attribute :_repository_class
|
7
|
+
class_attribute :_repository_options
|
8
|
+
end
|
9
|
+
|
10
|
+
def repository_class
|
11
|
+
options[:repository] || self.class._repository_class || Cyrax::Repository
|
12
|
+
end
|
13
|
+
|
14
|
+
def repository
|
15
|
+
options = (self.class._repository_options || {}).merge(
|
16
|
+
as: accessor, resource_class: resource_class, params: params
|
17
|
+
)
|
18
|
+
repository_class.new(options)
|
19
|
+
end
|
20
|
+
|
21
|
+
module ClassMethods
|
22
|
+
def repository(name = nil, &block)
|
23
|
+
if name.is_a?(Symbol)
|
24
|
+
klass, finder_name = nil, name
|
25
|
+
elsif name.is_a?(String)
|
26
|
+
ActiveSupport::Deprecation.warn "sending String in #decorator method is deprecated. send Class instead"
|
27
|
+
klass, finder_name = name.constantize, nil
|
28
|
+
elsif name.present?
|
29
|
+
klass, finder_name = name, nil
|
30
|
+
end
|
31
|
+
|
32
|
+
if klass.present?
|
33
|
+
self._repository_class = klass
|
34
|
+
end
|
35
|
+
if block_given?
|
36
|
+
self._repository_options ||= {}
|
37
|
+
self._repository_options[:finder_blocks] = {}
|
38
|
+
self._repository_options[:finder_blocks][finder_name || :scope] = block
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -4,39 +4,26 @@ module Cyrax::Extensions
|
|
4
4
|
extend ActiveSupport::Concern
|
5
5
|
|
6
6
|
included do
|
7
|
-
class_attribute :
|
8
|
-
class_attribute :
|
9
|
-
class_attribute :
|
7
|
+
class_attribute :_resource_name
|
8
|
+
class_attribute :_collection_name
|
9
|
+
class_attribute :_resource_class
|
10
10
|
end
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
if self.resource_class_name
|
15
|
-
self.resource_class_name.constantize
|
16
|
-
else
|
17
|
-
resource_name.classify.constantize
|
18
|
-
end
|
12
|
+
def resource_name
|
13
|
+
self.class._resource_name
|
19
14
|
end
|
20
15
|
|
21
|
-
|
22
|
-
|
23
|
-
#
|
24
|
-
# @example Overriding resource_scope
|
25
|
-
# class Products::UserResource < Products::BaseResource
|
26
|
-
# def resource_scope
|
27
|
-
# accessor.products
|
28
|
-
# end
|
29
|
-
# end
|
30
|
-
def resource_scope
|
31
|
-
resource_class
|
16
|
+
def collection_name
|
17
|
+
self.class._collection_name
|
32
18
|
end
|
33
19
|
|
34
|
-
|
35
|
-
|
20
|
+
# Returns the resource class as a constant - e.g. Product
|
21
|
+
def resource_class
|
22
|
+
self.class._resource_class || resource_name.classify.constantize
|
36
23
|
end
|
37
24
|
|
38
|
-
def
|
39
|
-
|
25
|
+
def resource_attributes
|
26
|
+
filter_attributes(dirty_resource_attributes)
|
40
27
|
end
|
41
28
|
|
42
29
|
module ClassMethods
|
@@ -64,13 +51,21 @@ module Cyrax::Extensions
|
|
64
51
|
# @param name [Symbol] The name of the resource
|
65
52
|
# @param options Hash [Hash] Options
|
66
53
|
def resource(name, options = {})
|
67
|
-
|
68
|
-
|
69
|
-
|
54
|
+
if options[:class_name].present?
|
55
|
+
ActiveSupport::Deprecation.warn "sending :class_name in #resource method is deprecated. send :class instead"
|
56
|
+
options[:class] = options[:class_name].to_s.constantize
|
57
|
+
end
|
58
|
+
self._resource_name = name.to_s
|
59
|
+
self._resource_class = options[:class]
|
60
|
+
self._collection_name = name.to_s.pluralize
|
70
61
|
end
|
71
62
|
end
|
72
63
|
|
73
64
|
private
|
65
|
+
def response_name
|
66
|
+
resource_name
|
67
|
+
end
|
68
|
+
|
74
69
|
def dirty_resource_attributes
|
75
70
|
if Cyrax.strong_parameters
|
76
71
|
params.require(resource_name)
|
@@ -79,10 +74,6 @@ module Cyrax::Extensions
|
|
79
74
|
end
|
80
75
|
end
|
81
76
|
|
82
|
-
def default_resource_attributes
|
83
|
-
{}
|
84
|
-
end
|
85
|
-
|
86
77
|
def filter_attributes(attributes)
|
87
78
|
if Cyrax.strong_parameters
|
88
79
|
attributes.permit(self.class.accessible_attributes)
|
@@ -82,7 +82,6 @@ module Cyrax::Extensions
|
|
82
82
|
# @param options [Hash] Options
|
83
83
|
def respond_with(result, options = {})
|
84
84
|
options[:as] ||= accessor
|
85
|
-
options[:assignments] = @_assignments
|
86
85
|
name = options[:name] || response_name
|
87
86
|
result = result.result.to_model if result.is_a?(Cyrax::Response)
|
88
87
|
if sync_errors_with?(result)
|
@@ -3,24 +3,24 @@ module Cyrax::Extensions
|
|
3
3
|
extend ActiveSupport::Concern
|
4
4
|
|
5
5
|
included do
|
6
|
-
class_attribute :
|
7
|
-
end
|
8
|
-
|
9
|
-
def serializer_class_name
|
10
|
-
options[:serializer] || self.class.serializer_class_name
|
6
|
+
class_attribute :_serializer_class
|
11
7
|
end
|
12
8
|
|
13
9
|
def serializable?
|
14
|
-
!
|
10
|
+
!serializer_class.nil?
|
15
11
|
end
|
16
12
|
|
17
13
|
def serializer_class
|
18
|
-
|
14
|
+
options[:serializer] || self.class._serializer_class
|
19
15
|
end
|
20
16
|
|
21
17
|
module ClassMethods
|
22
|
-
def serializer(
|
23
|
-
|
18
|
+
def serializer(klass)
|
19
|
+
if klass.is_a?(String)
|
20
|
+
ActiveSupport::Deprecation.warn "sending String in #serializer method is deprecated. send Class instead"
|
21
|
+
klass = klass.constantize
|
22
|
+
end
|
23
|
+
self._serializer_class = klass
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
@@ -1,17 +1,15 @@
|
|
1
1
|
module Cyrax::Extensions
|
2
2
|
module HasService
|
3
|
-
VALIDATION_ERROR_STATUS = 422
|
4
3
|
extend ActiveSupport::Concern
|
5
4
|
|
6
5
|
# Builds and returns a collection response for Rails
|
7
6
|
# @return [Cyrax::Response] response
|
8
7
|
def read_all(&block)
|
9
8
|
authorize_resource!(:read_all, resource_class)
|
10
|
-
collection =
|
9
|
+
collection = repository.find_all
|
11
10
|
block.call(collection) if block_given?
|
12
11
|
respond_with collection, name: collection_name, present: :collection
|
13
12
|
end
|
14
|
-
# Overrides collection with read_all
|
15
13
|
alias_method :read_all!, :read_all
|
16
14
|
|
17
15
|
# Builds a new resource without saving to DB
|
@@ -19,7 +17,7 @@ module Cyrax::Extensions
|
|
19
17
|
# Used for :new action in controller
|
20
18
|
# @return [Cyrax::Response] response
|
21
19
|
def build(&block)
|
22
|
-
resource =
|
20
|
+
resource = repository.build(nil)
|
23
21
|
authorize_resource!(:build, resource)
|
24
22
|
block.call(resource) if block_given?
|
25
23
|
respond_with resource
|
@@ -30,14 +28,12 @@ module Cyrax::Extensions
|
|
30
28
|
# Used for :create action in controller
|
31
29
|
# @return [Cyrax::Response] response
|
32
30
|
def create(custom_attributes = nil, &block)
|
33
|
-
resource =
|
31
|
+
resource = repository.build(nil, custom_attributes||resource_attributes)
|
34
32
|
authorize_resource!(:create, resource)
|
35
33
|
transaction do
|
36
|
-
if
|
34
|
+
if repository.save(resource)
|
37
35
|
set_message(:created)
|
38
36
|
block.call(resource) if block_given?
|
39
|
-
elsif Cyrax.automatically_set_invalid_status
|
40
|
-
set_status VALIDATION_ERROR_STATUS
|
41
37
|
end
|
42
38
|
end
|
43
39
|
respond_with(resource)
|
@@ -48,7 +44,7 @@ module Cyrax::Extensions
|
|
48
44
|
# Used for :show action in controller
|
49
45
|
# @return [Cyrax::Response] response
|
50
46
|
def read(&block)
|
51
|
-
resource =
|
47
|
+
resource = repository.find(resource_params_id)
|
52
48
|
block.call(resource) if block_given?
|
53
49
|
respond_with resource
|
54
50
|
end
|
@@ -60,14 +56,12 @@ module Cyrax::Extensions
|
|
60
56
|
# Used for :update action in controller
|
61
57
|
# @return [Cyrax::Response] response
|
62
58
|
def update(custom_attributes = nil, &block)
|
63
|
-
resource =
|
59
|
+
resource = repository.build(resource_params_id, custom_attributes||resource_attributes)
|
64
60
|
authorize_resource!(:update, resource)
|
65
61
|
transaction do
|
66
|
-
if
|
62
|
+
if repository.save(resource)
|
67
63
|
set_message(:updated)
|
68
64
|
block.call(resource) if block_given?
|
69
|
-
elsif Cyrax.automatically_set_invalid_status
|
70
|
-
set_status VALIDATION_ERROR_STATUS
|
71
65
|
end
|
72
66
|
end
|
73
67
|
respond_with(resource)
|
@@ -78,50 +72,16 @@ module Cyrax::Extensions
|
|
78
72
|
# Used for :destroy action in controller
|
79
73
|
# @return [Cyrax::Response] response
|
80
74
|
def destroy(&block)
|
81
|
-
resource =
|
75
|
+
resource = repository.find(resource_params_id)
|
82
76
|
authorize_resource!(:destroy, resource)
|
83
77
|
transaction do
|
84
|
-
|
78
|
+
repository.delete(resource)
|
85
79
|
block.call(resource) if block_given?
|
86
80
|
end
|
87
81
|
respond_with(resource)
|
88
82
|
end
|
89
83
|
alias_method :destroy!, :destroy
|
90
84
|
|
91
|
-
# Finds and returns a single item from the DB
|
92
|
-
# @param id [int] ID of item
|
93
|
-
# @return [object] The object
|
94
|
-
def find_resource(id)
|
95
|
-
resource_scope.find(id)
|
96
|
-
end
|
97
|
-
|
98
|
-
# Instantiates the resource
|
99
|
-
# @param id [int] ID or nil if you want a new object
|
100
|
-
# @param attributes [hash] Attributes you want to add to the resource
|
101
|
-
# @return [object] The object
|
102
|
-
def build_resource(id, attributes = {})
|
103
|
-
if id.present?
|
104
|
-
resource = find_resource(id)
|
105
|
-
resource.attributes = attributes
|
106
|
-
resource
|
107
|
-
else
|
108
|
-
resource_scope.new(default_resource_attributes.merge(attributes))
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
# Saves a resource
|
113
|
-
# @param resource [object] The resource to save
|
114
|
-
def save_resource(resource)
|
115
|
-
resource.save
|
116
|
-
end
|
117
|
-
|
118
|
-
# Remove a resource
|
119
|
-
# Calls destroy method on resource
|
120
|
-
# @param resource [object] The resource to destroy
|
121
|
-
def delete_resource(resource)
|
122
|
-
resource.destroy
|
123
|
-
end
|
124
|
-
|
125
85
|
# Authorize a resource
|
126
86
|
# Should be called on each service method and should be implemented on each resource.
|
127
87
|
# Implementation may raise an exception which may be handled by controller.
|
@@ -131,16 +91,6 @@ module Cyrax::Extensions
|
|
131
91
|
# raise AuthorizationError
|
132
92
|
end
|
133
93
|
|
134
|
-
# Returns a collection of the resource we are calling.
|
135
|
-
#
|
136
|
-
# If you want your resource to return something interesting, you should override the resource_scope method.
|
137
|
-
# Otherwise by default it will return the constantized model name and it will call .all on it during presentation.
|
138
|
-
#
|
139
|
-
# @return [type] The collection
|
140
|
-
def build_collection
|
141
|
-
resource_scope
|
142
|
-
end
|
143
|
-
|
144
94
|
def transaction(&block)
|
145
95
|
if defined?(ActiveRecord::Base)
|
146
96
|
ActiveRecord::Base.transaction do
|
@@ -154,5 +104,22 @@ module Cyrax::Extensions
|
|
154
104
|
def resource_params_id
|
155
105
|
params[:id]
|
156
106
|
end
|
107
|
+
|
108
|
+
# DEPRECATED METHODS
|
109
|
+
def resource_scope
|
110
|
+
respository.scope
|
111
|
+
end
|
112
|
+
def build_collection
|
113
|
+
respository.find_all
|
114
|
+
end
|
115
|
+
def find_resource(id)
|
116
|
+
respository.find(id)
|
117
|
+
end
|
118
|
+
def save_resource(resource)
|
119
|
+
respository.save(resource)
|
120
|
+
end
|
121
|
+
def delete_resource(resource)
|
122
|
+
respository.delete(resource)
|
123
|
+
end
|
157
124
|
end
|
158
125
|
end
|