cyrax 0.2.12 → 0.3.0.pre2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ZmE4NDdlOGZmMzJkNTcyNzMwZmZmNGMwNzdmZTQwOTI1MzE5YmZjMw==
4
+ N2ExMDYyODcwNjBlZDU0M2VhZmJjMmMzODhmZTY4OGY0NTBlNTc0NQ==
5
5
  data.tar.gz: !binary |-
6
- M2U2MjQ4OWFhZmZjNjllNjFmMGZiY2VjMGY1Mjk1NmRjNWVhNGJjNA==
6
+ MGEzNzgzYjhmOWFiMDc2M2JiN2ZhOTJlYTNjOWRlMGRkOWE3N2FlZg==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- YjJiYTZlNDQ3OWYzMDgxM2M3MWMzZGMxNTFmYzEzMTFkZDBlYzBjZjhlOTQy
10
- NTJjOTg3OWYzZDcwZTdmMTZlMjc2YTVjNzhiY2VjMmY4YWQ1MjY5Yzk2YzY5
11
- MWExMjliNGJkZjkyZGZiNTkyODhiMzFhMjQ0NzRiZTEwNTBmMjM=
9
+ MWJjMGJlYTM4YTQ4ODZhZjlkNWRjY2Y0ZjAzN2FlNjBmNmMxNTcyNzJkZWQ4
10
+ ODY4NGIzZTk4NzhjNWY5ZjI0MDM1MGM3NTc4MzU4MWY0MTc0MWU4NmQxMzQx
11
+ ZmRiNDUzYWMyM2U2OGRlYzA5ZjNmMDg3NTY4Y2E1NjEwZWJhYTU=
12
12
  data.tar.gz: !binary |-
13
- Y2JkNzVkNWZlNDZmZTg4Zjk0MDZkNTJjMmVlNjM5OTE1MTNiZWY2ZDUyNmY2
14
- Y2NiZTlkOGY1NTI4MzAyMzhkMTdlNGZjNDZiYTJkOTk0YjNkYjE1YTBiNDJi
15
- YmIxYmRlOTNhYjAwZWNhYWYyYWYzZDdkYWVjNmZlOTJkZGVjNTY=
13
+ NjhmY2I2ZjczZjM3NzhhNTYyMTJhYTU1ZWRiZmZlN2M3ZmU0MDU1YjNhMjk3
14
+ YjUxZjRhOTU1ZTIxM2YxZjY0YTIyYzY3ZmFkYjE3NGY4M2NiODg2OTZhYTIx
15
+ NDEwNjk1YWU5NjYzZjI4NGNmMWVlNTM1ZDEyMGQwYjUxMmFjMDI=
data/lib/cyrax.rb CHANGED
@@ -4,14 +4,18 @@ require "cyrax/extensions/has_response.rb"
4
4
  require "cyrax/extensions/has_callbacks.rb"
5
5
  require "cyrax/extensions/has_service.rb"
6
6
  require "cyrax/extensions/has_decorator.rb"
7
+ require "cyrax/extensions/has_serializer.rb"
8
+ require "cyrax/presenters/base_collection.rb"
9
+ require "cyrax/presenters/decorated_collection.rb"
10
+ require "cyrax/serializers/scope.rb"
11
+ require "cyrax/helpers/controller.rb"
7
12
  require "cyrax/base.rb"
8
- require "cyrax/base_resource.rb"
9
- require "cyrax/base_presenter.rb"
13
+ require "cyrax/resource.rb"
14
+ require "cyrax/presenter.rb"
10
15
  require "cyrax/response.rb"
11
16
  require "cyrax/callbacks.rb"
12
- require "cyrax/base_collection_presenter.rb"
13
- require "cyrax/decorated_collection_presenter.rb"
14
17
  require "cyrax/decorator.rb"
18
+ require "cyrax/serializer.rb"
15
19
 
16
20
  module Cyrax
17
21
  @@strong_parameters = false
@@ -23,4 +27,17 @@ module Cyrax
23
27
  def self.strong_parameters=(value)
24
28
  @@strong_parameters = value
25
29
  end
30
+
31
+ def self.const_missing(const_name)
32
+ case const_name
33
+ when :BaseResource
34
+ warn "`Cyrax::BaseResource` has been deprecated. Use `Cyrax::Resource` instead."
35
+ Cyrax::Resource
36
+ when :DecoratedCollectionPresenter
37
+ warn "`Cyrax:DecoratedCollectionPresenter` has been deprecated. Use `Cyrax::Presenters::DecoratedCollection` instead."
38
+ Cyrax::Presenters::DecoratedCollection
39
+ else
40
+ super
41
+ end
42
+ end
26
43
  end
@@ -31,7 +31,7 @@ class Cyrax::Decorator
31
31
  alias_method :decorate, :new
32
32
 
33
33
  def decorate_collection(resource)
34
- Cyrax::DecoratedCollectionPresenter.decorate(resource, decorator: self)
34
+ Cyrax::Presenters::DecoratedCollection.decorate(resource, decorator: self)
35
35
  end
36
36
  end
37
37
  end
@@ -9,7 +9,6 @@ module Cyrax::Extensions
9
9
 
10
10
  def assign_resource(resource_name, resource, options = {})
11
11
  if options[:decorator]
12
- options.merge!(decorable: true)
13
12
  resource = Cyrax::BasePresenter.present(resource, options)
14
13
  end
15
14
  @_assignments ||= {}
@@ -40,10 +39,13 @@ module Cyrax::Extensions
40
39
  def respond_with(result, options = {})
41
40
  name = options[:name] || response_name
42
41
  result = result.result.to_model if result.is_a?(Cyrax::Response)
43
- if respond_to?(:decorable?)
44
- options.merge!(decorable: decorable?, decorator: decorator_class)
45
- result = Cyrax::BasePresenter.present(result, options)
42
+ if respond_to?(:decorable?) && decorable?
43
+ options = {decorator: decorator_class}.merge(options)
46
44
  end
45
+ if respond_to?(:seializable?) && seializable?
46
+ options = {serializer: serializer_class}.merge(options)
47
+ end
48
+ result = Cyrax::Presenter.present(result, options)
47
49
  response = Cyrax::Response.new(name, result)
48
50
  response.message = @_message
49
51
  response.errors = @_errors
@@ -0,0 +1,23 @@
1
+ module Cyrax::Extensions
2
+ module HasSerializer
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ class_attribute :serializer_class_name
7
+ end
8
+
9
+ def seializable?
10
+ !self.class.serializer_class_name.nil?
11
+ end
12
+
13
+ def serializer_class
14
+ self.class.serializer_class_name.to_s.classify.constantize
15
+ end
16
+
17
+ module ClassMethods
18
+ def serializer(name)
19
+ self.serializer_class_name = name ? name.to_s : nil
20
+ end
21
+ end
22
+ end
23
+ end
@@ -13,14 +13,16 @@ module Cyrax::Extensions
13
13
 
14
14
  def create(custom_attributes=nil)
15
15
  resource = build_resource(nil, custom_attributes||resource_attributes)
16
- invoke_callback(:before_create, resource)
17
- invoke_callback(:before_save, resource)
18
- if save_resource(resource)
19
- invoke_callback(:after_create, resource)
20
- invoke_callback(:after_save, resource)
21
- set_message("#{resource_name.titleize} successfully created")
22
- else
23
- add_errors_from(resource)
16
+ transaction do
17
+ invoke_callback(:before_create, resource)
18
+ invoke_callback(:before_save, resource)
19
+ if save_resource(resource)
20
+ invoke_callback(:after_create, resource)
21
+ invoke_callback(:after_save, resource)
22
+ set_message("#{resource_name.titleize} successfully created")
23
+ else
24
+ add_errors_from(resource)
25
+ end
24
26
  end
25
27
  respond_with(resource)
26
28
  end
@@ -33,23 +35,27 @@ module Cyrax::Extensions
33
35
 
34
36
  def update(custom_attributes=nil)
35
37
  resource = build_resource(params[:id], custom_attributes||resource_attributes)
36
- invoke_callback(:before_update, resource)
37
- invoke_callback(:before_save, resource)
38
- if save_resource(resource)
39
- invoke_callback(:after_update, resource)
40
- invoke_callback(:after_save, resource)
41
- set_message("#{resource_name.titleize} successfully updated")
42
- else
43
- add_errors_from(resource)
38
+ transaction do
39
+ invoke_callback(:before_update, resource)
40
+ invoke_callback(:before_save, resource)
41
+ if save_resource(resource)
42
+ invoke_callback(:after_update, resource)
43
+ invoke_callback(:after_save, resource)
44
+ set_message("#{resource_name.titleize} successfully updated")
45
+ else
46
+ add_errors_from(resource)
47
+ end
44
48
  end
45
49
  respond_with(resource)
46
50
  end
47
51
 
48
52
  def destroy
49
53
  resource = find_resource(params[:id])
50
- invoke_callback(:before_destroy, resource)
51
- delete_resource(resource)
52
- invoke_callback(:after_destroy, resource)
54
+ transaction do
55
+ invoke_callback(:before_destroy, resource)
56
+ delete_resource(resource)
57
+ invoke_callback(:after_destroy, resource)
58
+ end
53
59
  respond_with(resource)
54
60
  end
55
61
 
@@ -78,5 +84,15 @@ module Cyrax::Extensions
78
84
  def build_collection
79
85
  resource_scope
80
86
  end
87
+
88
+ def transaction(&block)
89
+ if defined?(ActiveRecord::Base)
90
+ ActiveRecord::Base.transaction do
91
+ block.call
92
+ end
93
+ else
94
+ block.call
95
+ end
96
+ end
81
97
  end
82
98
  end
@@ -0,0 +1,28 @@
1
+ module Cyrax::ControllerHelper
2
+ def respond_with(*args)
3
+ if args.present? && args.first.is_a?(Cyrax::Response)
4
+ response, options = *args
5
+ default_options = {
6
+ notice: response.notice,
7
+ error: response.error
8
+ }
9
+ set_resource_from(response)
10
+ flash[:notice] = response.notice if response.notice.present?
11
+
12
+ # convert result to model if possible
13
+ result = response.result
14
+ result = result.to_model if result.respond_to?(:to_model)
15
+
16
+ super(result, default_options.merge(options || {}))
17
+ else
18
+ super(*args)
19
+ end
20
+ end
21
+
22
+ def set_resource_from(response)
23
+ instance_variable_set("@#{response.resource_name}", response.result)
24
+ response.assignments.each do |key, value|
25
+ instance_variable_set("@#{key}", value)
26
+ end if response.assignments.present? && response.assignments.is_a?(Hash)
27
+ end
28
+ end
@@ -1,8 +1,7 @@
1
- class Cyrax::BasePresenter
2
-
1
+ class Cyrax::Presenter
3
2
  def present(object, options = {})
4
3
  should_decorate = options[:decorate].nil? || options[:decorate]
5
- if options[:decorable] && should_decorate
4
+ if options[:decorator] && should_decorate
6
5
  present_with_decoration(object, options)
7
6
  else
8
7
  present_without_decoration(object, options)
@@ -19,7 +18,7 @@ class Cyrax::BasePresenter
19
18
 
20
19
  def present_with_decoration(object, options)
21
20
  if options[:present] == :collection
22
- options[:decorator].decorate_collection(object)
21
+ Cyrax::Presenters::DecoratedCollection.new(object, options)
23
22
  else
24
23
  options[:decorator].decorate(object)
25
24
  end
@@ -27,7 +26,7 @@ class Cyrax::BasePresenter
27
26
 
28
27
  def present_without_decoration(object, options)
29
28
  if options[:present] == :collection
30
- Cyrax::BaseCollectionPresenter.new(object).fetched_collection
29
+ Cyrax::Presenters::BaseCollection.new(object, options)
31
30
  else
32
31
  object
33
32
  end
@@ -0,0 +1,36 @@
1
+ module Cyrax::Presenters
2
+ class BaseCollection
3
+ attr_reader :collection, :options
4
+
5
+ def initialize(collection, options = {})
6
+ @collection = collection
7
+ @options = options
8
+ end
9
+
10
+ array_methods = Array.instance_methods - Object.instance_methods
11
+ delegate *array_methods, to: :presented_collection
12
+
13
+ def presented_collection
14
+ if collection.is_a?(ActiveRecord::Relation)
15
+ collection.to_a
16
+ elsif collection.respond_to?(:all)
17
+ collection.all
18
+ else
19
+ Array.wrap collection
20
+ end
21
+ end
22
+
23
+ def as_json
24
+ if options[:serializer]
25
+ options[:serializer].new(presented_collection).serialize
26
+ else
27
+ presented_collection.as_json
28
+ end
29
+ end
30
+
31
+ def method_missing(method, *args, &block)
32
+ return super unless collection.respond_to?(method)
33
+ collection.send(method, *args, &block)
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,24 @@
1
+ module Cyrax::Presenters
2
+ class DecoratedCollection < Cyrax::Presenters::BaseCollection
3
+ def initialize(collection, options = {})
4
+ super
5
+ unless options[:decorator]
6
+ raise "Decorator is not defined! Please define it with option :decorator"
7
+ end
8
+ end
9
+
10
+ def presented_collection
11
+ @decorated_collection ||= super.map {|item| decorate_item(item)}
12
+ end
13
+
14
+ def self.decorate(*args)
15
+ new(*args).presented_collection
16
+ end
17
+
18
+ private
19
+
20
+ def decorate_item(item)
21
+ options[:decorator].new(item)
22
+ end
23
+ end
24
+ end
@@ -1,6 +1,7 @@
1
- class Cyrax::BaseResource < Cyrax::Base
1
+ class Cyrax::Resource < Cyrax::Base
2
2
  include Cyrax::Extensions::HasResource
3
3
  include Cyrax::Extensions::HasCallbacks
4
4
  include Cyrax::Extensions::HasService
5
5
  include Cyrax::Extensions::HasDecorator
6
+ include Cyrax::Extensions::HasSerializer
6
7
  end
@@ -0,0 +1,28 @@
1
+ class Cyrax::Serializer
2
+ attr_accessor :object
3
+ def initialize(object)
4
+ @object = object
5
+ end
6
+
7
+ def serialize
8
+ self.class.scope.serialize(object)
9
+ end
10
+
11
+ class << self
12
+ def scope
13
+ @scope ||= Cyrax::Serializers::Scope.new()
14
+ end
15
+
16
+ def namespace(name, &block)
17
+ scope.namespace(name, &block)
18
+ end
19
+
20
+ def attributes(*attrs)
21
+ scope.attributes(*attrs)
22
+ end
23
+
24
+ def attribute(attribute, options = {})
25
+ scope.attribute(attribute, options)
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,35 @@
1
+ module Cyrax::Serializers
2
+ class Scope
3
+ def initialize(&block)
4
+ @attrs = {}
5
+ instance_eval(&block) if block_given?
6
+ end
7
+
8
+ def namespace(name, &block)
9
+ @attrs[name] = self.class.new(&block)
10
+ end
11
+
12
+ def attributes(*attrs)
13
+ attrs.map do |attribute|
14
+ attribute(attribute)
15
+ end
16
+ end
17
+
18
+ def attribute(attribute, options = {})
19
+ @attrs ||= {}
20
+ @attrs[attribute] ||= attribute
21
+ end
22
+
23
+ def serialize(object)
24
+ result = {}
25
+ @attrs.map do |attribute, options|
26
+ value = object.send(attribute)
27
+ if options.is_a?(Cyrax::Serializers::Scope)
28
+ value = options.serialize(value)
29
+ end
30
+ result[attribute] = value
31
+ end
32
+ result
33
+ end
34
+ end
35
+ end
data/lib/cyrax/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Cyrax
2
- VERSION = "0.2.12"
2
+ VERSION = "0.3.0.pre2"
3
3
  end
@@ -2,10 +2,10 @@ require 'spec_helper'
2
2
 
3
3
  class Foo; end
4
4
  module Cyrax
5
- describe BaseResource do
5
+ describe Resource do
6
6
  describe 'it should behave like resource' do
7
7
  context 'instance methods' do
8
- subject { Cyrax::BaseResource.new }
8
+ subject { Cyrax::Resource.new }
9
9
  it{ should respond_to(:accessor) }
10
10
  it{ should respond_to(:params) }
11
11
  it{ should respond_to(:resource_name) }
@@ -25,7 +25,7 @@ module Cyrax
25
25
  end
26
26
  end
27
27
 
28
- subject { Cyrax::BaseResource.new }
28
+ subject { Cyrax::Resource.new }
29
29
  let(:resource) { double.as_null_object }
30
30
  let(:collection) { [double] }
31
31
  before do
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ class FooSerializer < Cyrax::Serializer
4
+ attribute :name
5
+ namespace :some do
6
+ attributes :foo, :bar
7
+ end
8
+ end
9
+
10
+ module Cyrax
11
+ describe FooSerializer do
12
+ let(:serializable) { double(name: 'me', some: double(foo: '1234', bar: '1234')) }
13
+ subject { FooSerializer.new(serializable).serialize }
14
+
15
+ it 'should serialize object' do
16
+ subject[:name].should eq('me')
17
+ subject[:some][:foo].should eq('1234')
18
+ end
19
+ end
20
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cyrax
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.12
4
+ version: 0.3.0.pre2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Droidlabs
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-03 00:00:00.000000000 Z
11
+ date: 2013-10-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -73,24 +73,27 @@ extensions: []
73
73
  extra_rdoc_files: []
74
74
  files:
75
75
  - lib/cyrax/base.rb
76
- - lib/cyrax/base_collection_presenter.rb
77
- - lib/cyrax/base_presenter.rb
78
- - lib/cyrax/base_resource.rb
79
76
  - lib/cyrax/callbacks.rb
80
- - lib/cyrax/decorated_collection_presenter.rb
81
77
  - lib/cyrax/decorator.rb
82
78
  - lib/cyrax/extensions/has_callbacks.rb
83
79
  - lib/cyrax/extensions/has_decorator.rb
84
80
  - lib/cyrax/extensions/has_resource.rb
85
81
  - lib/cyrax/extensions/has_response.rb
82
+ - lib/cyrax/extensions/has_serializer.rb
86
83
  - lib/cyrax/extensions/has_service.rb
84
+ - lib/cyrax/helpers/controller.rb
85
+ - lib/cyrax/presenter.rb
86
+ - lib/cyrax/presenters/base_collection.rb
87
+ - lib/cyrax/presenters/decorated_collection.rb
88
+ - lib/cyrax/resource.rb
87
89
  - lib/cyrax/response.rb
90
+ - lib/cyrax/serializer.rb
91
+ - lib/cyrax/serializers/scope.rb
88
92
  - lib/cyrax/version.rb
89
93
  - lib/cyrax.rb
90
94
  - LICENSE.txt
91
95
  - Rakefile
92
96
  - README.md
93
- - spec/cyrax/base_resource_spec.rb
94
97
  - spec/cyrax/base_spec.rb
95
98
  - spec/cyrax/callbacks_spec.rb
96
99
  - spec/cyrax/decorator_spec.rb
@@ -99,7 +102,9 @@ files:
99
102
  - spec/cyrax/extensions/has_resource_spec.rb
100
103
  - spec/cyrax/extensions/has_response_spec.rb
101
104
  - spec/cyrax/extensions/has_service_spec.rb
105
+ - spec/cyrax/resource_spec.rb
102
106
  - spec/cyrax/response_spec.rb
107
+ - spec/cyrax/serializer_spec.rb
103
108
  - spec/spec_helper.rb
104
109
  homepage:
105
110
  licenses:
@@ -116,9 +121,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
116
121
  version: '0'
117
122
  required_rubygems_version: !ruby/object:Gem::Requirement
118
123
  requirements:
119
- - - ! '>='
124
+ - - ! '>'
120
125
  - !ruby/object:Gem::Version
121
- version: '0'
126
+ version: 1.3.1
122
127
  requirements: []
123
128
  rubyforge_project:
124
129
  rubygems_version: 2.0.5
@@ -126,7 +131,6 @@ signing_key:
126
131
  specification_version: 4
127
132
  summary: Small library for adding service layer to Rails projects
128
133
  test_files:
129
- - spec/cyrax/base_resource_spec.rb
130
134
  - spec/cyrax/base_spec.rb
131
135
  - spec/cyrax/callbacks_spec.rb
132
136
  - spec/cyrax/decorator_spec.rb
@@ -135,5 +139,7 @@ test_files:
135
139
  - spec/cyrax/extensions/has_resource_spec.rb
136
140
  - spec/cyrax/extensions/has_response_spec.rb
137
141
  - spec/cyrax/extensions/has_service_spec.rb
142
+ - spec/cyrax/resource_spec.rb
138
143
  - spec/cyrax/response_spec.rb
144
+ - spec/cyrax/serializer_spec.rb
139
145
  - spec/spec_helper.rb
@@ -1,17 +0,0 @@
1
- class Cyrax::BaseCollectionPresenter
2
- attr_reader :collection
3
-
4
- def initialize(collection, options = {})
5
- @collection = collection
6
- end
7
-
8
- def fetched_collection
9
- if collection.is_a?(ActiveRecord::Relation)
10
- collection.to_a
11
- elsif collection.respond_to?(:all)
12
- collection.all
13
- else
14
- Array.wrap collection
15
- end
16
- end
17
- end
@@ -1,31 +0,0 @@
1
- class Cyrax::DecoratedCollectionPresenter < Cyrax::BaseCollectionPresenter
2
- attr_reader :decorator
3
-
4
- def initialize(collection, options = {})
5
- super
6
- @decorator = options[:decorator]
7
- raise "Decorator class is not defined! Please define it with option :decorator" unless decorator
8
- end
9
-
10
- class << self
11
- alias_method :decorate, :new
12
- end
13
-
14
- array_methods = Array.instance_methods - Object.instance_methods
15
- delegate *array_methods, to: :decorated_collection
16
-
17
- def decorated_collection
18
- @decorated_collection ||= fetched_collection.map {|item| decorate_item(item)}
19
- end
20
-
21
- def method_missing(method, *args, &block)
22
- return super unless collection.respond_to?(method)
23
- collection.send(method, *args, &block)
24
- end
25
-
26
- private
27
-
28
- def decorate_item(item)
29
- decorator.new(item)
30
- end
31
- end