cyrax 0.3.7 → 0.3.8

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,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ZWZlN2M4YjZiODVmYWUwNzQ4YjEzODRjZTZiOGJlZWI4NjcxZmI1Nw==
4
+ NGUwYzA1NjdmZDE3NTA2M2EzNDMzN2RmNmE3NWU3YmZjYTdjYWQ0NA==
5
5
  data.tar.gz: !binary |-
6
- OGY1YjU5YmJkNTBkYWFiODc1NzVkMDMwMmU5Mzg2ZGQxZThkOWY2Ng==
6
+ ZTM5YWUzZWQ4YjViY2ZmZmY4MWMzZTI2NDgxNzIxNjNjZTAxNDBhZQ==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- NDdjMjg3MjI1ODkzZjk4MjRmODJhNzNjNjNlOWZkZTkwOWRlY2FlMjFmZWI0
10
- YzY4MzE0ZDRiZmMxNDQ0NTdmODZkNzA2Y2RhMzJjNzI2MjZmYzA3ODMwN2M3
11
- NDAzOGEwMDQ4NjY5ZThjYTI2NzEyYzkyNTNjZDM1NTllNTNmZGE=
9
+ Yzg2M2I5MzRlYjhjYWNlMTZmZTczYTZhNTA4YjEzN2YwZjk1OWE5OWY2M2Y1
10
+ M2E1ZmVmNDI2NjM0MzI3Y2FmZDE4Y2YyNWMwNWIwOTAyY2Q2YjA1NWZiNDcz
11
+ YTAwMmFhMmUzZDA3ODYyYTEyMDQ1MWUyMjg5N2U2NmVhNzBmODg=
12
12
  data.tar.gz: !binary |-
13
- OTZlNmRiZjJlNzcwZThhMGFlMzRkMGFiY2NhNmQ3NDU0MGI4ZDgxNmJkODNm
14
- NGMyNzRhZTc0MDM1MjYyMDY5MGE2NjY5MDVhMjY3N2ZmODU2NGE5ZjJhNjVl
15
- MzQ2Yzg2NTBkZWRkMDY3NzNhODBlNTlmMWE5ZTBiNGI3MzMyZWM=
13
+ YjYzNWRjZDgxMmMxYThhNDI4MWFhMGNkZGI1ZGIzZmZiYTE0MDdiZTQ2MmQw
14
+ MzIyZjQ2YTc4YzU4MzgyNjNiNmNkNzJkM2JjZTFlNTliZjE3NzBmNmUwN2Rj
15
+ OGRjZDI3OGFhMzNmNTBhNGYzNWI1NmMxMTAzYmQzN2NkOGIyOGU=
data/lib/cyrax/base.rb CHANGED
@@ -5,6 +5,14 @@ class Cyrax::Base
5
5
 
6
6
  attr_accessor :params, :accessor
7
7
 
8
+ # Creates a new Cyrax resource
9
+ #
10
+ # @param options [Hash] Options to pass in. You need `:as` and `:params`
11
+ # :as defines the accessor
12
+ # :params are parameters passed by the controller usually
13
+ #
14
+ # @example Instantiating a new resource
15
+ # Products::UserResource.new(as: current_user, params: params)
8
16
  def initialize(options = {})
9
17
  @accessor = options[:as]
10
18
  @params = options[:params]
@@ -9,6 +9,7 @@ module Cyrax::Extensions
9
9
  class_attribute :collection_name
10
10
  end
11
11
 
12
+ # Returns the resource class as a constant - e.g. Product
12
13
  def resource_class
13
14
  if self.resource_class_name
14
15
  self.resource_class_name.constantize
@@ -17,6 +18,15 @@ module Cyrax::Extensions
17
18
  end
18
19
  end
19
20
 
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
20
30
  def resource_scope
21
31
  resource_class
22
32
  end
@@ -30,6 +40,13 @@ module Cyrax::Extensions
30
40
  end
31
41
 
32
42
  module ClassMethods
43
+
44
+ # Class method for setting all the attributes that you want to access in the resource
45
+ #
46
+ # @example
47
+ # accessible_attributes :description, :model, :price_in_cents, :vendor
48
+ #
49
+ # @param attrs [Array(Symbol)] Symbols of the attributes
33
50
  def accessible_attributes(*attrs)
34
51
  if attrs.blank?
35
52
  @accessible_attributes || []
@@ -39,6 +56,13 @@ module Cyrax::Extensions
39
56
  end
40
57
  end
41
58
 
59
+ # Class method for setting the resource that you want to access
60
+ #
61
+ # @example
62
+ # resource :product
63
+ #
64
+ # @param name [Symbol] The name of the resource
65
+ # @param options Hash [Hash] Options
42
66
  def resource(name, options = {})
43
67
  self.resource_name = name.to_s
44
68
  self.resource_class_name = options[:class_name]
@@ -36,6 +36,9 @@ module Cyrax::Extensions
36
36
  self.class.name.demodulize.underscore
37
37
  end
38
38
 
39
+ # Generates the response for to pass to the Rails controller
40
+ # @param result The data you want to respond with - can be an Active Record Relation, the class of the Model itself (e.g. Product)
41
+ # @param options [Hash] Options
39
42
  def respond_with(result, options = {})
40
43
  options[:as] ||= accessor
41
44
  name = options[:name] || response_name
@@ -43,7 +46,7 @@ module Cyrax::Extensions
43
46
  if respond_to?(:decorable?) && decorable?
44
47
  options = {decorator: decorator_class}.merge(options)
45
48
  end
46
- if respond_to?(:seializable?) && seializable?
49
+ if respond_to?(:serializable?) && serializable?
47
50
  options = {serializer: serializer_class}.merge(options)
48
51
  end
49
52
  result = Cyrax::Presenter.present(result, options)
@@ -6,7 +6,7 @@ module Cyrax::Extensions
6
6
  class_attribute :serializer_class_name
7
7
  end
8
8
 
9
- def seializable?
9
+ def serializable?
10
10
  !self.class.serializer_class_name.nil?
11
11
  end
12
12
 
@@ -2,17 +2,27 @@ module Cyrax::Extensions
2
2
  module HasService
3
3
  extend ActiveSupport::Concern
4
4
 
5
+ # Builds and returns a collection response for Rails
6
+ # @return [Cyrax::Response] response
5
7
  def collection
6
8
  respond_with build_collection, name: collection_name, present: :collection
7
9
  end
10
+ # Overrides collection with read_all
8
11
  alias_method :read_all, :collection
9
12
  alias_method :read_all!, :collection
10
13
 
14
+ # Builds a new resource without saving to DB
15
+ # Runs Model.new (before saving)
16
+ # Used for :new action in controller
17
+ # @return [Cyrax::Response] response
11
18
  def build
12
19
  respond_with build_resource(nil)
13
20
  end
14
21
  alias_method :build!, :build
15
22
 
23
+ # Creates a new resource and persists to DB
24
+ # Used for :create action in controller
25
+ # @return [Cyrax::Response] response
16
26
  def create(custom_attributes = nil, &block)
17
27
  resource = build_resource(nil, custom_attributes||resource_attributes)
18
28
  transaction do
@@ -31,6 +41,9 @@ module Cyrax::Extensions
31
41
  end
32
42
  alias_method :create!, :create
33
43
 
44
+ # Reads a single item from the DB
45
+ # Used for :show action in controller
46
+ # @return [Cyrax::Response] response
34
47
  def read
35
48
  respond_with find_resource(params[:id])
36
49
  end
@@ -38,7 +51,9 @@ module Cyrax::Extensions
38
51
  alias_method :edit, :read
39
52
  alias_method :edit!, :read
40
53
 
41
-
54
+ # Updates a single item and persists to DB
55
+ # Used for :update action in controller
56
+ # @return [Cyrax::Response] response
42
57
  def update(custom_attributes = nil, &block)
43
58
  resource = build_resource(params[:id], custom_attributes||resource_attributes)
44
59
  transaction do
@@ -57,6 +72,9 @@ module Cyrax::Extensions
57
72
  end
58
73
  alias_method :update!, :update
59
74
 
75
+ # Destroys a resource from the DB
76
+ # Used for :destroy action in controller
77
+ # @return [Cyrax::Response] response
60
78
  def destroy(&block)
61
79
  resource = find_resource(params[:id])
62
80
  transaction do
@@ -69,10 +87,17 @@ module Cyrax::Extensions
69
87
  end
70
88
  alias_method :destroy!, :destroy
71
89
 
90
+ # Finds and returns a single item from the DB
91
+ # @param id [int] ID of item
92
+ # @return [object] The object
72
93
  def find_resource(id)
73
94
  resource_scope.find(id)
74
95
  end
75
96
 
97
+ # Instantiates the resource
98
+ # @param id [int] ID or nil if you want a new object
99
+ # @param attributes [hash] Attributes you want to add to the resource
100
+ # @return [object] The object
76
101
  def build_resource(id, attributes = {})
77
102
  if id.present?
78
103
  resource = find_resource(id)
@@ -83,14 +108,25 @@ module Cyrax::Extensions
83
108
  end
84
109
  end
85
110
 
111
+ # Saves a resource
112
+ # @param resource [object] The resource to save
86
113
  def save_resource(resource)
87
114
  resource.save
88
115
  end
89
116
 
117
+ # Remove a resource
118
+ # Calls destroy method on resource
119
+ # @param resource [object] The resource to destroy
90
120
  def delete_resource(resource)
91
121
  resource.destroy
92
122
  end
93
123
 
124
+ # Returns a collection of the resource we are calling.
125
+ #
126
+ # If you want your resource to return something interesting, you should override the resource_scope method.
127
+ # Otherwise by default it will return the constantized model name and it will call .all on it during presentation.
128
+ #
129
+ # @return [type] The collection
94
130
  def build_collection
95
131
  resource_scope
96
132
  end
@@ -13,6 +13,16 @@ class Cyrax::Serializer < Cyrax::Wrapper
13
13
  scope.namespace(name, &block)
14
14
  end
15
15
 
16
+ def relation(name, &block)
17
+ scope.relation(name, &block)
18
+ end
19
+ alias_method :has_many, :relation
20
+ alias_method :has_one, :relation
21
+
22
+ def default_attributes
23
+ scope.default_attributes
24
+ end
25
+
16
26
  def attributes(*attrs)
17
27
  scope.attributes(*attrs)
18
28
  end
@@ -3,11 +3,26 @@ module Cyrax::Serializers
3
3
  def initialize(&block)
4
4
  @attrs = {}
5
5
  @dynamic_attrs = {}
6
+ @relation_attrs = {}
7
+ @namespace_attrs = {}
8
+ @default_attributes = false
6
9
  instance_eval(&block) if block_given?
7
10
  end
8
11
 
9
12
  def namespace(name, &block)
10
- @attrs[name] = self.class.new(&block)
13
+ @namespace_attrs[name] = self.class.new(&block)
14
+ end
15
+
16
+ def relation(attribute, &block)
17
+ if block_given?
18
+ @relation_attrs[attribute] = self.class.new(&block)
19
+ else
20
+ @attrs[attribute] = attribute
21
+ end
22
+ end
23
+
24
+ def default_attributes
25
+ @default_attributes = true
11
26
  end
12
27
 
13
28
  def attributes(*attrs)
@@ -25,8 +40,8 @@ module Cyrax::Serializers
25
40
  end
26
41
 
27
42
  def serialize(resource, options = {})
28
- if resource.is_a?(Array)
29
- resource.map{ |r| serialize_one(r, options) }
43
+ if resource.respond_to?(:to_a)
44
+ resource.to_a.map{ |r| serialize_one(r, options) }
30
45
  else
31
46
  serialize_one(resource, options)
32
47
  end
@@ -34,16 +49,22 @@ module Cyrax::Serializers
34
49
 
35
50
  def serialize_one(resource, options = {})
36
51
  result = {}
37
- @attrs.map do |attribute, options|
38
- value = resource.send(attribute)
39
- if options.is_a?(Cyrax::Serializers::Scope)
40
- value = options.serialize(value)
41
- end
42
- result[attribute] = value
52
+ if @default_attributes
53
+ result = resource.attributes rescue {}
43
54
  end
44
55
  @dynamic_attrs.map do |attribute, block|
45
56
  result[attribute] = options[:serializer].instance_exec(resource, &block)
46
57
  end
58
+ @relation_attrs.map do |attribute, scope|
59
+ value = resource.send(attribute)
60
+ result[attribute] = scope.serialize(value)
61
+ end
62
+ @namespace_attrs.map do |attribute, scope|
63
+ result[attribute] = scope.serialize(resource)
64
+ end
65
+ @attrs.map do |attribute, options|
66
+ result[attribute] = resource.send(attribute)
67
+ end
47
68
  result
48
69
  end
49
70
  end
data/lib/cyrax/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Cyrax
2
- VERSION = "0.3.7"
2
+ VERSION = "0.3.8"
3
3
  end
@@ -5,16 +5,26 @@ class FooSerializer < Cyrax::Serializer
5
5
  namespace :some do
6
6
  attributes :foo, :bar
7
7
  end
8
+ relation :another do
9
+ attributes :another_foo, :another_bar
10
+ end
8
11
  end
9
12
 
10
13
  module Cyrax
11
14
  describe FooSerializer do
12
- let(:serializable) { double(name: 'me', some: double(foo: '1234', bar: '1234')) }
15
+ let(:serializable) {
16
+ double(
17
+ name: 'me',
18
+ foo: '2342',
19
+ bar: '4223',
20
+ another: double(another_foo: '1234', another_bar: '1234'))
21
+ }
13
22
  subject { FooSerializer.new(serializable).serialize }
14
23
 
15
24
  it 'should serialize object' do
16
25
  subject[:name].should eq('me')
17
- subject[:some][:foo].should eq('1234')
26
+ subject[:some][:foo].should eq('2342')
27
+ subject[:another][:another_foo].should eq('1234')
18
28
  end
19
29
  end
20
30
  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.3.7
4
+ version: 0.3.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Droidlabs
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-11-09 00:00:00.000000000 Z
11
+ date: 2013-11-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport