jsonapi-resources 0.0.16 → 0.1.0

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,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a7b404cc6b45386898cdeda9754dae8c7cc993d0
4
- data.tar.gz: db594be4a5815e815380940a43fde76d178daad1
3
+ metadata.gz: 9857d701e9136cba9b504cc0439b43e939722565
4
+ data.tar.gz: 5696329e4c5865e17b7b3bb0f6a40d4840a06f16
5
5
  SHA512:
6
- metadata.gz: bcaffc65ba5ad2cbf7fd70fa444b2bc97c05f973bd3056b15089af830bbfa7c9c53804aa130ba6de78370a45fdb064c7af193e81716f82dbe8f8dc7bc2df2ebf
7
- data.tar.gz: 34f9f78a40732753b294470c0b6cb1ae6548bb726d573fec05b25fe27b1df6436dd48dab7f41e8818c880ecd4204282e2fa0f01ea1dc77d4338c3258fca1e0ba
6
+ metadata.gz: 00981170f6a4d0743a298cc8478c9cf2e8d7cd07153a204fc878188a07aaeb79d3ed45529a2f3cc5a84dde326d2697b0faa880c619a9554e4689d0d60fb8f4c8
7
+ data.tar.gz: 8b42c9bdc12fc6b40aaec0e18b73d2871899047ce86ef77d8edf28e5775872337de9f83b4bc883d647fa4f563330a0987046c59ac4bf41f051d8f2f97a416e1e
data/README.md CHANGED
@@ -124,7 +124,7 @@ class ContactResource < JSONAPI::Resource
124
124
  super - [:full_name]
125
125
  end
126
126
 
127
- def self.createable_fields(keys, context)
127
+ def self.createable_fields(context)
128
128
  super - [:full_name]
129
129
  end
130
130
  end
@@ -330,6 +330,49 @@ class AuthorResource < JSONAPI::Resource
330
330
  end
331
331
  ```
332
332
 
333
+ #### Callbacks
334
+
335
+ `ActiveSupport::Callbacks` is used to provide callback functionality, so the behavior is very similar to what you may be used to from `ActiveRecord`.
336
+
337
+ For example, you might use a callback to perform authorization on your resource before an action.
338
+
339
+ ```ruby
340
+ class BaseResource < JSONAPI::Resource
341
+ before_create :authorize_create
342
+
343
+ def authorize_create
344
+ # ...
345
+ end
346
+ end
347
+ ```
348
+
349
+ The types of supported callbacks are:
350
+ - `before`
351
+ - `after`
352
+ - `around`
353
+
354
+ ##### `JSONAPI::Resource` Callbacks
355
+
356
+ Callbacks can be defined for the following `JSONAPI::Resource` events:
357
+
358
+ - `:create`
359
+ - `:update`
360
+ - `:remove`
361
+ - `:save`
362
+ - `:create_has_many_link`
363
+ - `:replace_has_many_links`
364
+ - `:create_has_one_link`
365
+ - `:replace_has_one_link`
366
+ - `:remove_has_many_link`
367
+ - `:remove_has_one_link`
368
+ - `:replace_fields`
369
+
370
+ ##### `JSONAPI::OperationsProcessor` Callbacks
371
+
372
+ Callbacks can also be defined for `JSONAPI::OperationsProcessor` events:
373
+ - `:operations`: The set of operations.
374
+ - `:operation`: The individual operations.
375
+
333
376
  ### Controllers
334
377
 
335
378
  `JSONAPI::Resources` provides a class, `ResourceController`, that can be used as the base class for your controllers. `ResourceController` supports `index`, `show`, `create`, `update`, and `destroy` methods. Just deriving your controller from `ResourceController` will give you a fully functional controller.
@@ -0,0 +1,52 @@
1
+ require 'active_support/callbacks'
2
+
3
+ module JSONAPI
4
+ module Callbacks
5
+
6
+ def self.included(base)
7
+ base.class_eval do
8
+ include ActiveSupport::Callbacks
9
+ base.extend ClassMethods
10
+ end
11
+ end
12
+
13
+ module ClassMethods
14
+ def define_jsonapi_resources_callbacks(*callbacks)
15
+ options = callbacks.extract_options!
16
+ options = {
17
+ only: [:before, :around, :after]
18
+ }.merge!(options)
19
+
20
+ types = Array(options.delete(:only))
21
+
22
+ callbacks.each do |callback|
23
+ define_callbacks(callback, options)
24
+
25
+ types.each do |type|
26
+ send("_define_#{type}_callback", self, callback)
27
+ end
28
+ end
29
+ end
30
+
31
+ private
32
+
33
+ def _define_before_callback(klass, callback) #:nodoc:
34
+ klass.define_singleton_method("before_#{callback}") do |*args, &block|
35
+ set_callback(:"#{callback}", :before, *args, &block)
36
+ end
37
+ end
38
+
39
+ def _define_around_callback(klass, callback) #:nodoc:
40
+ klass.define_singleton_method("around_#{callback}") do |*args, &block|
41
+ set_callback(:"#{callback}", :around, *args, &block)
42
+ end
43
+ end
44
+
45
+ def _define_after_callback(klass, callback) #:nodoc:
46
+ klass.define_singleton_method("after_#{callback}") do |*args, &block|
47
+ set_callback(:"#{callback}", :after, *args, &block)
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -22,7 +22,6 @@ module JSONAPI
22
22
  def apply(context)
23
23
  resource = @resource_klass.create(context)
24
24
  resource.replace_fields(@values)
25
- resource.save
26
25
 
27
26
  return JSONAPI::OperationResult.new(:created, resource)
28
27
 
@@ -64,7 +63,6 @@ module JSONAPI
64
63
  def apply(context)
65
64
  resource = @resource_klass.find_by_key(@resource_id, context: context)
66
65
  resource.replace_fields(values)
67
- resource.save
68
66
 
69
67
  return JSONAPI::OperationResult.new(:ok, resource)
70
68
  end
@@ -83,7 +81,6 @@ module JSONAPI
83
81
  def apply(context)
84
82
  resource = @resource_klass.find_by_key(@resource_id, context: context)
85
83
  resource.create_has_one_link(@association_type, @key_value)
86
- resource.save
87
84
 
88
85
  return JSONAPI::OperationResult.new(:no_content)
89
86
  end
@@ -102,7 +99,6 @@ module JSONAPI
102
99
  def apply(context)
103
100
  resource = @resource_klass.find_by_key(@resource_id, context: context)
104
101
  resource.replace_has_one_link(@association_type, @key_value)
105
- resource.save
106
102
 
107
103
  return JSONAPI::OperationResult.new(:no_content)
108
104
  end
@@ -120,9 +116,7 @@ module JSONAPI
120
116
 
121
117
  def apply(context)
122
118
  resource = @resource_klass.find_by_key(@resource_id, context: context)
123
- @key_values.each do |value|
124
- resource.create_has_many_link(@association_type, value)
125
- end
119
+ resource.create_has_many_links(@association_type, @key_values)
126
120
 
127
121
  return JSONAPI::OperationResult.new(:no_content)
128
122
  end
@@ -141,7 +135,6 @@ module JSONAPI
141
135
  def apply(context)
142
136
  resource = @resource_klass.find_by_key(@resource_id, context: context)
143
137
  resource.replace_has_many_links(@association_type, @key_values)
144
- resource.save
145
138
 
146
139
  return JSONAPI::OperationResult.new(:no_content)
147
140
  end
@@ -180,7 +173,6 @@ module JSONAPI
180
173
  def apply(context)
181
174
  resource = @resource_klass.find_by_key(@resource_id, context: context)
182
175
  resource.remove_has_one_link(@association_type)
183
- resource.save
184
176
 
185
177
  return JSONAPI::OperationResult.new(:no_content)
186
178
  end
@@ -1,37 +1,35 @@
1
1
  require 'jsonapi/operation_result'
2
+ require 'jsonapi/callbacks'
2
3
 
3
4
  module JSONAPI
4
5
  class OperationsProcessor
6
+ include Callbacks
7
+ define_jsonapi_resources_callbacks :operation, :operations
5
8
 
6
9
  def process(request)
7
10
  @results = []
8
- @resources = []
9
-
10
- context = request.context
11
-
12
- transaction {
13
- request.operations.each do |operation|
14
- before_operation(context, operation)
15
-
16
- result = operation.apply(context)
17
-
18
- after_operation(context, result)
19
-
20
- @results.push(result)
21
- if result.has_errors?
22
- rollback
11
+ @request = request
12
+ @context = request.context
13
+ @operations = request.operations
14
+
15
+ run_callbacks :operations do
16
+ transaction do
17
+ @operations.each do |operation|
18
+ @operation = operation
19
+ @result = nil
20
+ run_callbacks :operation do
21
+ @result = @operation.apply(@context)
22
+ @results.push(@result)
23
+ if @result.has_errors?
24
+ rollback
25
+ end
26
+ end
23
27
  end
24
28
  end
25
- }
29
+ end
26
30
  @results
27
31
  end
28
32
 
29
- def before_operation(context, operation)
30
- end
31
-
32
- def after_operation(context, result)
33
- end
34
-
35
33
  private
36
34
 
37
35
  # The base OperationsProcessor provides no transaction support
@@ -1,49 +1,154 @@
1
1
  require 'jsonapi/configuration'
2
2
  require 'jsonapi/resource_for'
3
3
  require 'jsonapi/association'
4
+ require 'jsonapi/callbacks'
4
5
 
5
6
  module JSONAPI
6
7
  class Resource
7
8
  include ResourceFor
9
+ include Callbacks
8
10
 
9
11
  @@resource_types = {}
10
12
 
11
13
  attr :context
12
14
  attr_reader :model
13
15
 
16
+ define_jsonapi_resources_callbacks :create,
17
+ :update,
18
+ :remove,
19
+ :save,
20
+ :create_has_many_link,
21
+ :replace_has_many_links,
22
+ :create_has_one_link,
23
+ :replace_has_one_link,
24
+ :remove_has_many_link,
25
+ :remove_has_one_link,
26
+ :replace_fields
27
+
14
28
  def initialize(model, context = nil)
15
29
  @model = model
16
30
  @context = context
17
31
  end
18
32
 
19
- def remove
20
- @model.destroy
21
- end
22
-
23
33
  def id
24
34
  model.send(self.class._primary_key)
25
35
  end
26
36
 
27
- def create_has_many_link(association_type, association_key_value)
28
- association = self.class._associations[association_type]
29
- related_resource = self.class.resource_for(association.type).find_by_key(association_key_value, context: @context)
37
+ def is_new?
38
+ id.nil?
39
+ end
30
40
 
31
- # ToDo: Add option to skip relations that already exist instead of returning an error?
32
- relation = @model.send(association.type).where(association.primary_key => association_key_value).first
33
- if relation.nil?
34
- @model.send(association.type) << related_resource.model
41
+ def change(callback)
42
+ if @changing
43
+ run_callbacks callback do
44
+ yield
45
+ end
35
46
  else
36
- raise JSONAPI::Exceptions::HasManyRelationExists.new(association_key_value)
47
+ run_callbacks is_new? ? :create : :update do
48
+ @changing = true
49
+ run_callbacks callback do
50
+ yield
51
+ save if @save_needed
52
+ end
53
+ end
54
+ end
55
+ end
56
+
57
+ def remove
58
+ run_callbacks :remove do
59
+ _remove
60
+ end
61
+ end
62
+
63
+ def create_has_many_links(association_type, association_key_values)
64
+ change :create_has_many_link do
65
+ _create_has_many_links(association_type, association_key_values)
37
66
  end
38
67
  end
39
68
 
40
69
  def replace_has_many_links(association_type, association_key_values)
70
+ change :replace_has_many_links do
71
+ _replace_has_many_links(association_type, association_key_values)
72
+ end
73
+ end
74
+
75
+ def create_has_one_link(association_type, association_key_value)
76
+ change :create_has_one_link do
77
+ _create_has_one_link(association_type, association_key_value)
78
+ end
79
+ end
80
+
81
+ def replace_has_one_link(association_type, association_key_value)
82
+ change :replace_has_one_link do
83
+ _replace_has_one_link(association_type, association_key_value)
84
+ end
85
+ end
86
+
87
+ def remove_has_many_link(association_type, key)
88
+ change :remove_has_many_link do
89
+ _remove_has_many_link(association_type, key)
90
+ end
91
+ end
92
+
93
+ def remove_has_one_link(association_type)
94
+ change :remove_has_one_link do
95
+ _remove_has_one_link(association_type)
96
+ end
97
+ end
98
+
99
+ def replace_fields(field_data)
100
+ change :replace_fields do
101
+ _replace_fields(field_data)
102
+ end
103
+ end
104
+
105
+ # Override this on a resource instance to override the fetchable keys
106
+ def fetchable_fields
107
+ self.class.fields
108
+ end
109
+
110
+ private
111
+ def save
112
+ run_callbacks :save do
113
+ _save
114
+ end
115
+ end
116
+
117
+ def _save
118
+ @model.save!
119
+ @save_needed = false
120
+ rescue ActiveRecord::RecordInvalid => e
121
+ raise JSONAPI::Exceptions::ValidationErrors.new(e.record.errors.messages)
122
+ end
123
+
124
+ def _remove
125
+ @model.destroy
126
+ end
127
+
128
+ def _create_has_many_links(association_type, association_key_values)
129
+ association = self.class._associations[association_type]
130
+
131
+ association_key_values.each do |association_key_value|
132
+ related_resource = self.class.resource_for(association.type).find_by_key(association_key_value, context: @context)
133
+
134
+ # ToDo: Add option to skip relations that already exist instead of returning an error?
135
+ relation = @model.send(association.type).where(association.primary_key => association_key_value).first
136
+ if relation.nil?
137
+ @model.send(association.type) << related_resource.model
138
+ else
139
+ raise JSONAPI::Exceptions::HasManyRelationExists.new(association_key_value)
140
+ end
141
+ end
142
+ end
143
+
144
+ def _replace_has_many_links(association_type, association_key_values)
41
145
  association = self.class._associations[association_type]
42
146
 
43
147
  send("#{association.foreign_key}=", association_key_values)
148
+ @save_needed = true
44
149
  end
45
150
 
46
- def create_has_one_link(association_type, association_key_value)
151
+ def _create_has_one_link(association_type, association_key_value)
47
152
  association = self.class._associations[association_type]
48
153
 
49
154
  # ToDo: Add option to skip relations that already exist instead of returning an error?
@@ -53,30 +158,34 @@ module JSONAPI
53
158
  else
54
159
  raise JSONAPI::Exceptions::HasOneRelationExists.new
55
160
  end
161
+ @save_needed = true
56
162
  end
57
163
 
58
- def replace_has_one_link(association_type, association_key_value)
164
+ def _replace_has_one_link(association_type, association_key_value)
59
165
  association = self.class._associations[association_type]
60
166
 
61
167
  send("#{association.foreign_key}=", association_key_value)
168
+ @save_needed = true
62
169
  end
63
170
 
64
- def remove_has_many_link(association_type, key)
171
+ def _remove_has_many_link(association_type, key)
65
172
  association = self.class._associations[association_type]
66
173
 
67
174
  @model.send(association.type).delete(key)
68
175
  end
69
176
 
70
- def remove_has_one_link(association_type)
177
+ def _remove_has_one_link(association_type)
71
178
  association = self.class._associations[association_type]
72
179
 
73
180
  send("#{association.foreign_key}=", nil)
181
+ @save_needed = true
74
182
  end
75
183
 
76
- def replace_fields(field_data)
184
+ def _replace_fields(field_data)
77
185
  field_data[:attributes].each do |attribute, value|
78
186
  begin
79
187
  send "#{attribute}=", value
188
+ @save_needed = true
80
189
  rescue ArgumentError
81
190
  # :nocov: Will be thrown if an enum value isn't allowed for an enum. Currently not tested as enums are a rails 4.1 and higher feature
82
191
  raise JSONAPI::Exceptions::InvalidFieldValue.new(attribute, value)
@@ -97,17 +206,6 @@ module JSONAPI
97
206
  end if field_data[:has_many]
98
207
  end
99
208
 
100
- def save
101
- @model.save!
102
- rescue ActiveRecord::RecordInvalid => e
103
- raise JSONAPI::Exceptions::ValidationErrors.new(e.record.errors.messages)
104
- end
105
-
106
- # Override this on a resource instance to override the fetchable keys
107
- def fetchable_fields
108
- self.class.fields
109
- end
110
-
111
209
  class << self
112
210
  def inherited(base)
113
211
  base._attributes = (_attributes || {}).dup
@@ -1,5 +1,5 @@
1
1
  module JSONAPI
2
2
  module Resources
3
- VERSION = "0.0.16"
3
+ VERSION = "0.1.0"
4
4
  end
5
5
  end
@@ -19,7 +19,7 @@ module ActionDispatch
19
19
 
20
20
  def jsonapi_resource(*resources, &block)
21
21
  resource_type = resources.first
22
- res = JSONAPI::Resource.resource_for(resource_type)
22
+ res = JSONAPI::Resource.resource_for(resource_type_with_module_prefix(resources.first))
23
23
 
24
24
  options = resources.extract_options!.dup
25
25
  options[:controller] ||= resource_type
@@ -45,11 +45,7 @@ module ActionDispatch
45
45
 
46
46
  def jsonapi_resources(*resources, &block)
47
47
  resource_type = resources.first
48
- resource_type_with_module_prefix = [
49
- @scope[:module],
50
- resource_type
51
- ].compact.collect(&:to_s).join("/")
52
- res = JSONAPI::Resource.resource_for(resource_type_with_module_prefix)
48
+ res = JSONAPI::Resource.resource_for(resource_type_with_module_prefix(resources.first))
53
49
 
54
50
  options = resources.extract_options!.dup
55
51
  options[:controller] ||= resource_type
@@ -93,28 +89,28 @@ module ActionDispatch
93
89
  formatted_association_name = format_route(link_type)
94
90
  options = links.extract_options!.dup
95
91
 
96
- res = JSONAPI::Resource.resource_for(@scope[:jsonapi_resource])
92
+ res = JSONAPI::Resource.resource_for(resource_type_with_module_prefix)
97
93
 
98
94
  methods = links_methods(options)
99
95
 
100
96
  if methods.include?(:show)
101
97
  match "links/#{formatted_association_name}", controller: res._type.to_s,
102
- action: 'show_association', association: link_type.to_s, via: [:get]
98
+ action: 'show_association', association: link_type.to_s, via: [:get]
103
99
  end
104
100
 
105
101
  if methods.include?(:create)
106
102
  match "links/#{formatted_association_name}", controller: res._type.to_s,
107
- action: 'create_association', association: link_type.to_s, via: [:post]
103
+ action: 'create_association', association: link_type.to_s, via: [:post]
108
104
  end
109
105
 
110
106
  if methods.include?(:update)
111
107
  match "links/#{formatted_association_name}", controller: res._type.to_s,
112
- action: 'update_association', association: link_type.to_s, via: [:put]
108
+ action: 'update_association', association: link_type.to_s, via: [:put]
113
109
  end
114
110
 
115
111
  if methods.include?(:destroy)
116
112
  match "links/#{formatted_association_name}", controller: res._type.to_s,
117
- action: 'destroy_association', association: link_type.to_s, via: [:delete]
113
+ action: 'destroy_association', association: link_type.to_s, via: [:delete]
118
114
  end
119
115
  end
120
116
 
@@ -123,30 +119,35 @@ module ActionDispatch
123
119
  formatted_association_name = format_route(link_type)
124
120
  options = links.extract_options!.dup
125
121
 
126
- res = JSONAPI::Resource.resource_for(@scope[:jsonapi_resource])
122
+ res = JSONAPI::Resource.resource_for(resource_type_with_module_prefix)
127
123
 
128
124
  methods = links_methods(options)
129
125
 
130
126
  if methods.include?(:show)
131
127
  match "links/#{formatted_association_name}", controller: res._type.to_s,
132
- action: 'show_association', association: link_type.to_s, via: [:get]
128
+ action: 'show_association', association: link_type.to_s, via: [:get]
133
129
  end
134
130
 
135
131
  if methods.include?(:create)
136
132
  match "links/#{formatted_association_name}", controller: res._type.to_s,
137
- action: 'create_association', association: link_type.to_s, via: [:post]
133
+ action: 'create_association', association: link_type.to_s, via: [:post]
138
134
  end
139
135
 
140
136
  if methods.include?(:update) && res._association(link_type).acts_as_set
141
137
  match "links/#{formatted_association_name}", controller: res._type.to_s,
142
- action: 'update_association', association: link_type.to_s, via: [:put]
138
+ action: 'update_association', association: link_type.to_s, via: [:put]
143
139
  end
144
140
 
145
141
  if methods.include?(:destroy)
146
142
  match "links/#{formatted_association_name}/:keys", controller: res._type.to_s,
147
- action: 'destroy_association', association: link_type.to_s, via: [:delete]
143
+ action: 'destroy_association', association: link_type.to_s, via: [:delete]
148
144
  end
149
145
  end
146
+
147
+ def resource_type_with_module_prefix(resource = nil)
148
+ resource_name = resource || @scope[:jsonapi_resource]
149
+ [@scope[:module], resource_name].compact.collect(&:to_s).join("/")
150
+ end
150
151
  end
151
152
  end
152
153
  end
@@ -413,6 +413,39 @@ class PostResource < JSONAPI::Resource
413
413
  has_one :section
414
414
  has_many :tags, acts_as_set: true
415
415
  has_many :comments, acts_as_set: false
416
+
417
+ before_save do
418
+ msg = "Before save"
419
+ end
420
+
421
+ after_save do
422
+ msg = "After save"
423
+ end
424
+
425
+ before_update do
426
+ msg = "Before update"
427
+ end
428
+
429
+ after_update do
430
+ msg = "After update"
431
+ end
432
+
433
+ before_replace_fields do
434
+ msg = "Before replace_fields"
435
+ end
436
+
437
+ after_replace_fields do
438
+ msg = "After replace_fields"
439
+ end
440
+
441
+ around_update :around_update_check
442
+
443
+ def around_update_check
444
+ # do nothing
445
+ yield
446
+ # do nothing
447
+ end
448
+
416
449
  def subject
417
450
  @model.title
418
451
  end
@@ -606,6 +639,7 @@ end
606
639
  module Api
607
640
  module V3
608
641
  PostResource = PostResource.dup
642
+ PreferencesResource = PreferencesResource.dup
609
643
  end
610
644
  end
611
645
 
@@ -5,6 +5,56 @@ require 'jsonapi/operation'
5
5
  require 'jsonapi/operation_result'
6
6
  require 'jsonapi/operations_processor'
7
7
 
8
+ class TestOperationsProcessor < JSONAPI::OperationsProcessor
9
+ before_operation :log_before_operation
10
+
11
+ after_operation :log_after_operation
12
+
13
+ around_operation :log_around_operation
14
+
15
+ def log_before_operation
16
+ msg = "Before Operation"
17
+ # puts msg
18
+ end
19
+
20
+ def log_around_operation
21
+ msg = "Starting... #{@operation.class.name}"
22
+ # puts msg
23
+ yield
24
+ msg = "... Finishing #{@operation.class.name}"
25
+ # puts msg
26
+ end
27
+
28
+ def log_after_operation
29
+ msg = "After Operation"
30
+ # puts msg
31
+ end
32
+
33
+ before_operations :log_before_operations
34
+
35
+ after_operations :log_after_operations
36
+
37
+ around_operations :log_around_operations
38
+
39
+ def log_before_operations
40
+ msg = "Before #{@operations.count} Operation(s)"
41
+ # puts msg
42
+ end
43
+
44
+ def log_around_operations
45
+ msg = "Starting #{@operations.count} Operation(s)..."
46
+ # puts msg
47
+ yield
48
+ msg = "...Finishing Up Operations"
49
+ # puts msg
50
+ end
51
+
52
+ def log_after_operations
53
+ msg = "After Operations"
54
+ # puts msg
55
+ end
56
+ end
57
+
8
58
  class OperationsProcessorTest < MiniTest::Unit::TestCase
9
59
  def setup
10
60
  betax = Planet.find(5)
@@ -14,7 +64,7 @@ class OperationsProcessorTest < MiniTest::Unit::TestCase
14
64
  end
15
65
 
16
66
  def test_create_single_resource
17
- op = JSONAPI::OperationsProcessor.new()
67
+ op = TestOperationsProcessor.new()
18
68
 
19
69
  count = Planet.count
20
70
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jsonapi-resources
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.16
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dan Gebhardt
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-01-20 00:00:00.000000000 Z
12
+ date: 2015-01-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -128,6 +128,7 @@ files:
128
128
  - lib/jsonapi-resources.rb
129
129
  - lib/jsonapi/active_record_operations_processor.rb
130
130
  - lib/jsonapi/association.rb
131
+ - lib/jsonapi/callbacks.rb
131
132
  - lib/jsonapi/configuration.rb
132
133
  - lib/jsonapi/error.rb
133
134
  - lib/jsonapi/error_codes.rb