sinatra_resource 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.0
1
+ 0.2.1
@@ -6,7 +6,8 @@ module DataCatalog
6
6
 
7
7
  # == Attributes
8
8
 
9
- key :name, String
9
+ key :name, String
10
+ key :log, String
10
11
  timestamps!
11
12
 
12
13
  # == Indices
@@ -14,6 +14,7 @@ module DataCatalog
14
14
  # == Properties
15
15
 
16
16
  property :name
17
+ property :log
17
18
 
18
19
  property :sources do |category|
19
20
  category.sources.map do |source|
@@ -25,6 +26,34 @@ module DataCatalog
25
26
  }
26
27
  end
27
28
  end
29
+
30
+ # == Callbacks
31
+
32
+ callback :before_create do |action|
33
+ action.params["log"] = "before_create"
34
+ end
35
+
36
+ callback :after_create do |action, category|
37
+ category.log += " after_create"
38
+ end
39
+
40
+ callback :before_update do |action|
41
+ action.params["log"] = "before_update"
42
+ end
43
+
44
+ callback :after_update do |action, category|
45
+ category.log += " after_update"
46
+ end
47
+
48
+ callback :before_destroy do |action|
49
+ action.headers 'X-Test-Callbacks' => 'before_destroy'
50
+ end
51
+
52
+ callback :after_destroy do |action, category|
53
+ x = action.response['X-Test-Callbacks']
54
+ action.headers 'X-Test-Callbacks' => "#{x} after_destroy"
55
+ end
56
+
28
57
  end
29
58
 
30
59
  Categories.build
@@ -94,6 +94,11 @@ class CategoriesDeleteResourceTest < ResourceTestCase
94
94
 
95
95
  use "return 204 No Content"
96
96
  use "one less category"
97
+
98
+ test "callbacks should work" do
99
+ actual = last_response.headers['X-Test-Callbacks']
100
+ assert_equal "before_destroy after_destroy", actual
101
+ end
97
102
  end
98
103
  end
99
104
 
@@ -54,7 +54,7 @@ class CategoriesGetManyResourceTest < ResourceTestCase
54
54
  assert_equal CATEGORIES, actual.sort
55
55
  end
56
56
 
57
- docs_properties %w(name sources id created_at updated_at)
57
+ docs_properties %w(name log sources id created_at updated_at)
58
58
  end
59
59
  end
60
60
 
@@ -57,7 +57,7 @@ class CategoriesGetOneResourceTest < ResourceTestCase
57
57
  end
58
58
 
59
59
  use "return 200 Ok"
60
- doc_properties %w(name id created_at updated_at sources)
60
+ doc_properties %w(name log id created_at updated_at sources)
61
61
 
62
62
  test "body should have correct sources" do
63
63
  expected = [
@@ -66,8 +66,7 @@ class CategoriesPostResourceTest < ResourceTestCase
66
66
  end
67
67
  end
68
68
 
69
- %w(curator).each do |role|
70
- # %w(curator admin).each do |role|
69
+ %w(curator admin).each do |role|
71
70
  [:name].each do |missing|
72
71
  context "#{role} : post / but missing #{missing}" do
73
72
  before do
@@ -104,7 +103,7 @@ class CategoriesPostResourceTest < ResourceTestCase
104
103
  use "return 201 Created"
105
104
  location_header "categories"
106
105
  use "one new category"
107
- doc_properties %w(name id created_at updated_at sources)
106
+ doc_properties %w(name log id created_at updated_at sources)
108
107
 
109
108
  test "should set all fields in database" do
110
109
  category = Category.find_by_id(parsed_response_body["id"])
@@ -113,6 +112,10 @@ class CategoriesPostResourceTest < ResourceTestCase
113
112
  assert_equal value, category[key]
114
113
  end
115
114
  end
115
+
116
+ test "callbacks should work" do
117
+ assert_equal "before_create after_create", parsed_response_body["log"]
118
+ end
116
119
  end
117
120
  end
118
121
 
@@ -120,7 +120,7 @@ class CategoriesPutResourceTest < ResourceTestCase
120
120
  end
121
121
 
122
122
  use "return 200 Ok"
123
- doc_properties %w(name id created_at updated_at sources)
123
+ doc_properties %w(name log id created_at updated_at sources)
124
124
 
125
125
  test "should change all fields in database" do
126
126
  category = Category.find_by_id(@category.id)
@@ -128,6 +128,10 @@ class CategoriesPutResourceTest < ResourceTestCase
128
128
  assert_equal value, category[key]
129
129
  end
130
130
  end
131
+
132
+ test "callbacks should work" do
133
+ assert_equal "before_update after_update", parsed_response_body["log"]
134
+ end
131
135
  end
132
136
  end
133
137
 
@@ -28,10 +28,12 @@ module SinatraResource
28
28
  def document_for_post(role, model, resource_config, leaf, parent_document, association)
29
29
  check_permission(:create, role, resource_config)
30
30
  check_params(:create, role, resource_config, leaf)
31
+ do_callback(:before_create, resource_config, nil)
31
32
  document = create_document!(model)
32
33
  if resource_config[:parent]
33
34
  make_related(parent_document, document, resource_config)
34
35
  end
36
+ do_callback(:after_create, resource_config, document)
35
37
  document
36
38
  end
37
39
 
@@ -41,7 +43,10 @@ module SinatraResource
41
43
  check_related?(parent_document, association, id)
42
44
  end
43
45
  check_params(:update, role, resource_config, leaf)
44
- update_document!(model, id)
46
+ do_callback(:before_update, resource_config, nil)
47
+ document = update_document!(model, id)
48
+ do_callback(:after_update, resource_config, document)
49
+ document
45
50
  end
46
51
 
47
52
  def document_for_delete(role, model, resource_config, leaf, id, parent_document, association)
@@ -50,7 +55,10 @@ module SinatraResource
50
55
  check_related?(parent_document, association, id)
51
56
  end
52
57
  check_params(:delete, role, resource_config, leaf)
53
- delete_document!(model, id)
58
+ do_callback(:before_destroy, resource_config, nil)
59
+ document = delete_document!(model, id)
60
+ do_callback(:after_destroy, resource_config, document)
61
+ document
54
62
  end
55
63
 
56
64
  end
@@ -111,6 +111,16 @@ module SinatraResource
111
111
  end
112
112
  convert(object)
113
113
  end
114
+
115
+ def do_callback(name, resource_config, document)
116
+ proc = resource_config[:callbacks][name]
117
+ return unless proc
118
+ if document
119
+ proc.call(self, document)
120
+ else
121
+ proc.call(self)
122
+ end
123
+ end
114
124
 
115
125
  # Convert a path to a full URI.
116
126
  #
data/lib/resource.rb CHANGED
@@ -14,6 +14,22 @@ module SinatraResource
14
14
 
15
15
  attr_reader :resource_config
16
16
 
17
+ # Specify a callback.
18
+ #
19
+ # @param [Symbol] method
20
+ # A symbol that refers to a method on the parent.
21
+ #
22
+ # @return [undefined]
23
+ def callback(name, &block)
24
+ unless @resource_config[:callbacks].include?(name)
25
+ raise DefinitionError, "callback #{name.inspect} is not supported #{self}"
26
+ end
27
+ if @resource_config[:callbacks][name]
28
+ raise DefinitionError, "callback #{name.inspect} already declared in #{self}"
29
+ end
30
+ @resource_config[:callbacks][name] = block
31
+ end
32
+
17
33
  # Specify the association +method+ on +parent+ that points to the
18
34
  # current (child) +model+.
19
35
  #
@@ -188,13 +204,24 @@ module SinatraResource
188
204
  # For internal use. Initializes internal data structure.
189
205
  def setup
190
206
  @resource_config = {
207
+ :callbacks => {
208
+ :before_create => nil,
209
+ :after_create => nil,
210
+ :before_update => nil,
211
+ :after_update => nil,
212
+ :before_destroy => nil,
213
+ :after_destroy => nil,
214
+ },
191
215
  :child_association => nil,
192
216
  :model => nil,
193
217
  :parent => nil,
194
218
  :path => nil, # default_path,
195
219
  :permission => {},
196
220
  :properties => {},
197
- :relation => { :create => nil, :delete => nil },
221
+ :relation => {
222
+ :create => nil,
223
+ :delete => nil,
224
+ },
198
225
  :roles => nil,
199
226
  }
200
227
  end
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{sinatra_resource}
8
- s.version = "0.2.0"
8
+ s.version = "0.2.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["David James"]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sinatra_resource
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - David James