cyrax 0.5.15 → 0.6.0.beta

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,15 @@
1
1
  ---
2
- SHA256:
3
- metadata.gz: 9d1b6765085639d4473934d340f48c3dd72d519e3837b5af945dbdcd8c74ae89
4
- data.tar.gz: 6239d1cf32f003eb211d3d3bafdb8fcbf441abaaafbd4140367c535664af518d
5
- SHA512:
6
- metadata.gz: 59dc7b1b3207e35a7c5c27aff5e84fec4fdcbc35d0521bb73923c33109156c6c57a346806924cdcff7d71e2a886cd81e94cc260a017d515b52a4c74c38828d8d
7
- data.tar.gz: '097ccfc3c5d7ba33098dd565da4c04813f082e5da11dff300c55e7908125507c64c1218cb3db35d944e0e8f79bc9c92bf5b777cef6a82f48eecd545d6b8a3187'
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=
@@ -1,6 +1,4 @@
1
1
  require 'active_model'
2
- # require 'active_model/serializers/xml'
3
-
4
2
  class Cyrax::Decorator < Cyrax::Wrapper
5
3
  include ActiveModel::Serialization
6
4
  include ActiveModel::Serializers::JSON
@@ -23,28 +21,11 @@ class Cyrax::Decorator < Cyrax::Wrapper
23
21
  resource.send(method, *args, &block)
24
22
  end
25
23
 
26
- def respond_to?(method_sym, include_private = false)
27
- super || resource.respond_to?(method_sym, include_private)
28
- end
29
-
30
24
  class << self
31
25
  alias_method :decorate, :new
32
26
 
33
27
  def decorate_collection(resource)
34
28
  Cyrax::Presenters::DecoratedCollection.decorate(resource, decorator: self)
35
29
  end
36
-
37
- def respond_to?(method_sym, include_private = false)
38
- super || @@decorated_class.respond_to?(method_sym, include_private)
39
- end
40
-
41
- def method_missing(method, *args, &block)
42
- return super unless @@decorated_class.respond_to?(method)
43
- @@decorated_class.send(method, *args, &block)
44
- end
45
-
46
- def decorated_class(klass)
47
- @@decorated_class = klass
48
- end
49
30
  end
50
31
  end
@@ -3,24 +3,24 @@ module Cyrax::Extensions
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  included do
6
- class_attribute :decorator_class_name
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
- !decorator_class_name.nil?
10
+ !decorator_class.nil?
15
11
  end
16
12
 
17
13
  def decorator_class
18
- decorator_class_name.to_s.classify.constantize
14
+ options[:decorator] || self.class._decorator_class
19
15
  end
20
16
 
21
17
  module ClassMethods
22
- def decorator(name)
23
- self.decorator_class_name = name ? name.to_s : nil
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 :resource_name
8
- class_attribute :resource_class_name
9
- class_attribute :collection_name
7
+ class_attribute :_resource_name
8
+ class_attribute :_collection_name
9
+ class_attribute :_resource_class
10
10
  end
11
11
 
12
- # Returns the resource class as a constant - e.g. Product
13
- def resource_class
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
- # Returns the resource class - e.g. Product
22
- # If you want your resource to return something interesting, you should override this in your resource by defining the method and returning your own scope
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
- def resource_attributes
35
- filter_attributes(dirty_resource_attributes)
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 response_name
39
- resource_name
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
- self.resource_name = name.to_s
68
- self.resource_class_name = options[:class_name]
69
- self.collection_name = name.to_s.pluralize
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 :serializer_class_name
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
- !serializer_class_name.nil?
10
+ !serializer_class.nil?
15
11
  end
16
12
 
17
13
  def serializer_class
18
- serializer_class_name.to_s.classify.constantize
14
+ options[:serializer] || self.class._serializer_class
19
15
  end
20
16
 
21
17
  module ClassMethods
22
- def serializer(name)
23
- self.serializer_class_name = name ? name.to_s : nil
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 = build_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 = build_resource(nil)
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 = build_resource(nil, custom_attributes||resource_attributes)
31
+ resource = repository.build(nil, custom_attributes||resource_attributes)
34
32
  authorize_resource!(:create, resource)
35
33
  transaction do
36
- if save_resource(resource)
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 = find_resource(resource_params_id)
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 = build_resource(resource_params_id, custom_attributes||resource_attributes)
59
+ resource = repository.build(resource_params_id, custom_attributes||resource_attributes)
64
60
  authorize_resource!(:update, resource)
65
61
  transaction do
66
- if save_resource(resource)
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 = find_resource(resource_params_id)
75
+ resource = repository.find(resource_params_id)
82
76
  authorize_resource!(:destroy, resource)
83
77
  transaction do
84
- delete_resource(resource)
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
@@ -15,7 +15,7 @@ module Cyrax::ControllerHelper
15
15
  result = result.to_model if result.respond_to?(:to_model)
16
16
 
17
17
  respond_to do |format|
18
- format.html do
18
+ format.any do
19
19
  # set flashes
20
20
  if response.success?
21
21
  flash[:notice] = options[:notice] if options[:notice].present?
@@ -27,11 +27,7 @@ module Cyrax::ControllerHelper
27
27
  super(result, options, &block)
28
28
  end
29
29
  format.json do
30
- render json: MultiJson.dump(response.as_json), status: options[:status] || 200
31
- end
32
- format.any do
33
- set_resource_from(response)
34
- super(response, options, &block)
30
+ render json: response.as_json
35
31
  end
36
32
  end
37
33
  else
@@ -20,7 +20,7 @@ class Cyrax::Presenter < Cyrax::Wrapper
20
20
  if options[:present] == :collection
21
21
  Cyrax::Presenters::DecoratedCollection.new(resource, options)
22
22
  else
23
- options[:decorator].decorate(resource, options)
23
+ options[:decorator].decorate(resource)
24
24
  end
25
25
  end
26
26
 
@@ -0,0 +1,102 @@
1
+ class Cyrax::Repository
2
+ include HasActiveLogger::Mixin
3
+ attr_accessor :options
4
+ attr_accessor :accessor
5
+ attr_accessor :params
6
+ attr_accessor :resource_class
7
+ attr_accessor :finder_blocks
8
+
9
+ def initialize(options = {})
10
+ @options = options
11
+ @accessor = options[:as]
12
+ @params = options[:params]
13
+ @resource_class = options[:resource_class]
14
+ @finder_blocks = options[:finder_blocks] || {}
15
+ end
16
+
17
+ # Returns the resource class - e.g. Product by default.
18
+ # If you want your repository to scope with something interesting,
19
+ # you should override this in your repository by defining the method and returning your own scope
20
+ #
21
+ # @example Overriding scope
22
+ # class Products::Repository < Cyrax::Repository
23
+ # def scope
24
+ # accessor.products
25
+ # end
26
+ # end
27
+ def scope
28
+ if block = finder_blocks[:scope]
29
+ instance_exec(&block)
30
+ else
31
+ resource_class
32
+ end
33
+ end
34
+
35
+ # Instantiates the resource
36
+ # @param id [int] ID or nil if you want a new object
37
+ # @param attributes [hash] Attributes you want to add to the resource
38
+ # @return [object] The object
39
+ def build(id, attributes = {})
40
+ if block = finder_blocks[:build]
41
+ instance_exec(id, attributes, &block)
42
+ else
43
+ if id.present?
44
+ resource = find(id)
45
+ resource.attributes = attributes
46
+ resource
47
+ else
48
+ scope.new(default_attributes.merge(attributes))
49
+ end
50
+ end
51
+ end
52
+
53
+ # Finds and returns a multiple items within the scope from the DB
54
+ # @return [Array] Array of objects
55
+ def find_all
56
+ if block = finder_blocks[:find_all]
57
+ instance_exec(&block)
58
+ else
59
+ scope.is_a?(ActiveRecord::Relation) ? scope.load : scope.all
60
+ end
61
+ end
62
+
63
+ # Finds and returns a single item from the DB
64
+ # @param id [int] ID of item
65
+ # @return [object] The object
66
+ def find(id)
67
+ if block = finder_blocks[:find]
68
+ instance_exec(id, &block)
69
+ else
70
+ scope.find(id)
71
+ end
72
+ end
73
+
74
+ # Saves a resource
75
+ # @param resource [object] The resource to save
76
+ def save(resource)
77
+ if block = finder_blocks[:save]
78
+ instance_exec(resource, &block)
79
+ else
80
+ resource.save
81
+ end
82
+ end
83
+
84
+ # Removes a resource
85
+ # Calls destroy method on resource
86
+ # @param resource [object] The resource to destroy
87
+ def delete(resource)
88
+ if block = finder_blocks[:delete]
89
+ instance_exec(resource, &block)
90
+ else
91
+ resource.destroy
92
+ end
93
+ end
94
+
95
+ def default_attributes
96
+ if block = finder_blocks[:default_attributes]
97
+ instance_exec(&block)
98
+ else
99
+ {}
100
+ end
101
+ end
102
+ end
@@ -1,5 +1,6 @@
1
1
  class Cyrax::Resource < Cyrax::Base
2
2
  include Cyrax::Extensions::HasResource
3
+ include Cyrax::Extensions::HasRepository
3
4
  include Cyrax::Extensions::HasService
4
5
  include Cyrax::Extensions::HasDecorator
5
6
  include Cyrax::Extensions::HasSerializer
@@ -55,19 +55,14 @@ class Cyrax::Response
55
55
  if failure?
56
56
  {errors: @errors}
57
57
  elsif options[:serializer]
58
- options[:serializer].new(result, options).serialize
58
+ options[:serializer].new(result, as: accessor).serialize
59
59
  else
60
60
  result.as_json
61
61
  end
62
62
  end
63
63
 
64
64
  def method_missing(method, *args, &block)
65
- if method.to_s == resource_name
66
- result
67
- elsif assignments.has_key?(method)
68
- assignments[method]
69
- else
70
- super
71
- end
65
+ super unless assignments.has_key?(method)
66
+ assignments[method]
72
67
  end
73
68
  end
@@ -1,45 +1,18 @@
1
1
  class Cyrax::Serializer < Cyrax::Wrapper
2
2
  def serialize
3
3
  options[:serializer] = self
4
-
5
- if block = self.class.total_count_block
6
- serialize_wrapped(options, &block)
7
- else
8
- serialize_simple(options)
9
- end
10
- end
11
-
12
- def serialize_simple(options = {})
13
4
  self.class.scope.serialize(resource, options)
14
5
  end
15
6
 
16
- def serialize_wrapped(options = {}, &counter_block)
17
- total_count = self.instance_eval(&counter_block)
18
- data = self.class.scope.serialize(resource, options)
19
- {total_count: total_count, data: data}
20
- end
21
-
22
7
  class << self
23
8
  def scope
24
9
  @scope ||= Cyrax::Serializers::Scope.new()
25
10
  end
26
11
 
27
- def total_count(&block)
28
- @total_count_block = block
29
- end
30
-
31
- def total_count_block
32
- @total_count_block
33
- end
34
-
35
12
  def namespace(name, &block)
36
13
  scope.namespace(name, &block)
37
14
  end
38
15
 
39
- def assigned(name, &block)
40
- scope.assigned(name, &block)
41
- end
42
-
43
16
  def relation(name, &block)
44
17
  scope.relation(name, &block)
45
18
  end