her 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.
data/Rakefile CHANGED
@@ -1,6 +1,5 @@
1
1
  require "bundler"
2
2
  require "rake"
3
- require "yard"
4
3
  require "bundler/gem_tasks"
5
4
  require "rspec/core/rake_task"
6
5
 
@@ -10,18 +9,3 @@ desc "Run all specs"
10
9
  RSpec::Core::RakeTask.new(:spec) do |task|
11
10
  task.pattern = "spec/**/*_spec.rb"
12
11
  end
13
-
14
- desc "Generate YARD Documentation"
15
- YARD::Rake::YardocTask.new do |task|
16
- task.options = [
17
- "-o", File.expand_path("../doc", __FILE__),
18
- "--readme=README.md",
19
- "--markup=markdown",
20
- "--markup-provider=redcarpet",
21
- "--no-private",
22
- "--no-cache",
23
- "--protected",
24
- "--title=Her",
25
- ]
26
- task.files = ["lib/**/*.rb"]
27
- end
File without changes
@@ -1,3 +1,5 @@
1
+ # Upgrade Her
2
+
1
3
  Here is a list of backward-incompatible changes that were introduced while Her is pre-1.0. After reaching 1.0, it will follow the [Semantic Versioning](http://semver.org/) system.
2
4
 
3
5
  ## 0.2.4
data/her.gemspec CHANGED
@@ -18,16 +18,10 @@ Gem::Specification.new do |s|
18
18
  s.require_paths = ["lib"]
19
19
 
20
20
  s.add_development_dependency "rake", "~> 10.0"
21
- s.add_development_dependency "rspec", "~> 2.11"
22
- s.add_development_dependency "yard", "~> 0.8"
23
- s.add_development_dependency "redcarpet", "~> 2.1"
24
- s.add_development_dependency "mocha", "~> 0.12"
25
- s.add_development_dependency "guard", "~> 1.2"
26
- s.add_development_dependency "guard-rspec", "~> 2.3"
27
- s.add_development_dependency "rb-fsevent", "~> 0.9"
28
- s.add_development_dependency "growl", "~> 1.0"
21
+ s.add_development_dependency "rspec", "~> 2.12"
22
+ s.add_development_dependency "mocha", "~> 0.13"
29
23
 
30
24
  s.add_runtime_dependency "activesupport", ">= 3.0.0"
31
25
  s.add_runtime_dependency "faraday", "~> 0.8"
32
- s.add_runtime_dependency "multi_json", "~> 1.3"
26
+ s.add_runtime_dependency "multi_json", "~> 1.5"
33
27
  end
data/lib/her/api.rb CHANGED
@@ -53,7 +53,7 @@ module Her
53
53
  attrs[:url] = attrs.delete(:base_uri) if attrs.include?(:base_uri) # Support legacy :base_uri option
54
54
  @base_uri = attrs[:url]
55
55
  @options = attrs
56
- @connection = Faraday.new(attrs.slice(:url, :ssl)) do |connection|
56
+ @connection = Faraday.new(@options) do |connection|
57
57
  yield connection if block_given?
58
58
  end
59
59
  end
@@ -35,6 +35,9 @@ module Her
35
35
  # @param [Symbol, &block] method A method or a block to be called
36
36
  def before_destroy(method=nil, &block); set_hook(:before, :destroy, method || block); end
37
37
 
38
+ # Do not add a *before find* callback. Only *after find* is supported.
39
+ def before_find(method=nil, &block); raise NoMethodError, "undefined method `before_find' for #{self}"; end
40
+
38
41
  # Add a *after save* callback. Triggered after a resource is created or updated.
39
42
  # @param [Symbol, &block] method A method or a block to be called
40
43
  def after_save(method=nil, &block); set_hook(:after, :save, method || block); end
@@ -51,11 +54,15 @@ module Her
51
54
  # @param [Symbol, &block] method A method or a block to be called
52
55
  def after_destroy(method=nil, &block); set_hook(:after, :destroy, method || block); end
53
56
 
57
+ # Add a *after find* callback. Triggered after a resource is found.
58
+ # @param [Symbol, &block] method A method or a block to be called
59
+ def after_find(method=nil, &block); set_hook(:after, :find, method || block); end
60
+
54
61
  # Wrap a block between “before” and “after” hooks
55
62
  # @private
56
63
  def wrap_in_hooks(resource, *hooks)
57
64
  perform_before_hooks(resource, *hooks)
58
- yield(resource, resource.class)
65
+ yield(resource, resource.class) if block_given?
59
66
  perform_after_hooks(resource, *hooks.reverse)
60
67
  end
61
68
 
@@ -12,7 +12,7 @@ module Her
12
12
  # @user = User.find(1)
13
13
  # p @user # => #<User(/users/1) id=1 name="Tobias Fünke">
14
14
  def inspect
15
- "#<#{self.class}(#{request_path}) #{@data.inject([]) { |memo, item| key, value = item; memo << "#{key}=#{attribute_for_inspect(value)}"}.join(" ")}>"
15
+ "#<#{self.class}(#{request_path}) #{@data.keys.map { |k| "#{k}=#{attribute_for_inspect(send(k))}" }.join(" ")}>"
16
16
  end
17
17
 
18
18
  private
data/lib/her/model/orm.rb CHANGED
@@ -23,7 +23,11 @@ module Her
23
23
  # Initialize a collection of resources
24
24
  # @private
25
25
  def self.initialize_collection(klass, parsed_data={})
26
- collection_data = parsed_data[:data].map { |item_data| klass.new(item_data) }
26
+ collection_data = parsed_data[:data].map do |item_data|
27
+ resource = klass.new(item_data)
28
+ klass.wrap_in_hooks(resource, :find)
29
+ resource
30
+ end
27
31
  Her::Collection.new(collection_data, parsed_data[:metadata], parsed_data[:errors])
28
32
  end
29
33
 
@@ -204,9 +208,12 @@ module Her
204
208
  def find(*ids)
205
209
  params = ids.last.is_a?(Hash) ? ids.pop : {}
206
210
  results = ids.flatten.compact.uniq.map do |id|
211
+ resource = nil
207
212
  request(params.merge(:_method => :get, :_path => "#{build_request_path(params.merge(:id => id))}")) do |parsed_data|
208
- new(parsed_data[:data].merge :_metadata => parsed_data[:data], :_errors => parsed_data[:errors])
213
+ resource = new(parsed_data[:data].merge :_metadata => parsed_data[:data], :_errors => parsed_data[:errors])
214
+ wrap_in_hooks(resource, :find)
209
215
  end
216
+ resource
210
217
  end
211
218
  if ids.length > 1 || ids.first.kind_of?(Array)
212
219
  results
data/lib/her/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Her
2
- VERSION = "0.3.7"
2
+ VERSION = "0.3.8"
3
3
  end
data/spec/api_spec.rb CHANGED
@@ -17,6 +17,12 @@ describe Her::API do
17
17
  @api.base_uri.should == "https://api.example.com"
18
18
  end
19
19
 
20
+ it "supports the base_uri legacy option" do
21
+ @api = Her::API.new
22
+ @api.setup :base_uri => "https://api.example.com"
23
+ @api.base_uri.should == "https://api.example.com"
24
+ end
25
+
20
26
  it "sets custom middleware with #use" do
21
27
  class Foo; end;
22
28
  class Bar; end;
@@ -32,6 +32,12 @@ describe Her::Model::Hooks do
32
32
  Foo::User.hooks[:before_destroy].first.class.should == Symbol
33
33
  end
34
34
 
35
+ it "does not handle “before find” method hooks" do
36
+ expect {
37
+ Foo::User.before_find :set_internal_id
38
+ }.should raise_error(NoMethodError)
39
+ end
40
+
35
41
  it "handles “after save” method hooks" do
36
42
  Foo::User.after_save :set_internal_id
37
43
  Foo::User.hooks[:after_save].length.should == 1
@@ -55,6 +61,12 @@ describe Her::Model::Hooks do
55
61
  Foo::User.hooks[:after_destroy].length.should == 1
56
62
  Foo::User.hooks[:after_destroy].first.class.should == Symbol
57
63
  end
64
+
65
+ it "handles “after find” method hooks" do
66
+ Foo::User.after_find :set_internal_id
67
+ Foo::User.hooks[:after_find].length.should == 1
68
+ Foo::User.hooks[:after_find].first.class.should == Symbol
69
+ end
58
70
  end
59
71
 
60
72
  describe "block hooks" do
@@ -82,6 +94,12 @@ describe Her::Model::Hooks do
82
94
  Foo::User.hooks[:before_destroy].first.class.should == Proc
83
95
  end
84
96
 
97
+ it "does not handle “before find” block hooks" do
98
+ expect {
99
+ Foo::User.before_find :set_internal_id
100
+ }.should raise_error(NoMethodError)
101
+ end
102
+
85
103
  it "handles “after save” block hooks" do
86
104
  Foo::User.after_save { |record| record.internal_id = 42 }
87
105
  Foo::User.hooks[:after_save].length.should == 1
@@ -105,6 +123,12 @@ describe Her::Model::Hooks do
105
123
  Foo::User.hooks[:after_destroy].length.should == 1
106
124
  Foo::User.hooks[:after_destroy].first.class.should == Proc
107
125
  end
126
+
127
+ it "handles “after find” block hooks" do
128
+ Foo::User.after_find { |record| record.internal_id = 42 }
129
+ Foo::User.hooks[:after_find].length.should == 1
130
+ Foo::User.hooks[:after_find].first.class.should == Proc
131
+ end
108
132
  end
109
133
 
110
134
  context "inheriting hooks from a superclass" do
@@ -125,8 +149,10 @@ describe Her::Model::Hooks do
125
149
  builder.use Her::Middleware::FirstLevelParseJSON
126
150
  builder.use Faraday::Request::UrlEncoded
127
151
  builder.adapter :test do |stub|
152
+ stub.get("/users") { |env| [200, {}, [{ :id => 1, :name => "Tobias Fünke" }, { :id => 2, :name => "Lindsay Fünke" }].to_json] }
128
153
  stub.post("/users") { |env| [200, {}, { :id => 1, :name => "Tobias Fünke" }.to_json] }
129
154
  stub.get("/users/1") { |env| [200, {}, { :id => 1, :name => "Tobias Fünke" }.to_json] }
155
+ stub.get("/users/2") { |env| [200, {}, { :id => 2, :name => "Lindsay Fünke" }.to_json] }
130
156
  stub.put("/users/1") { |env| [200, {}, { :id => 1, :name => "Tobias Fünke" }.to_json] }
131
157
  stub.delete("/users/1") { |env| [200, {}, { :id => 1, :name => "Tobias Fünke" }.to_json] }
132
158
  end
@@ -135,6 +161,7 @@ describe Her::Model::Hooks do
135
161
  spawn_model "Foo::User" do
136
162
  attr_accessor :internal_save_id, :internal_create_id, :internal_update_id, :internal_destroy_id
137
163
  attr_accessor :internal_after_save_id, :internal_after_create_id, :internal_after_update_id, :internal_after_destroy_id
164
+ attr_accessor :internal_after_find_id
138
165
 
139
166
  def change_internal_save_id; @internal_save_id = 100; end
140
167
  def change_internal_create_id; @internal_create_id = 101; end
@@ -145,6 +172,8 @@ describe Her::Model::Hooks do
145
172
  def change_internal_after_create_id; @internal_after_create_id = 101; end
146
173
  def change_internal_after_update_id; @internal_after_update_id = 102; end
147
174
  def change_internal_after_destroy_id; @internal_after_destroy_id = 103; end
175
+
176
+ def change_internal_after_find_id; @internal_after_find_id = 104; end
148
177
  end
149
178
  end
150
179
 
@@ -159,6 +188,8 @@ describe Her::Model::Hooks do
159
188
  Foo::User.after_update :change_internal_after_update_id
160
189
  Foo::User.after_create :change_internal_after_create_id
161
190
  Foo::User.after_destroy :change_internal_after_destroy_id
191
+
192
+ Foo::User.after_find :change_internal_after_find_id
162
193
  end
163
194
 
164
195
  it "perform “before save” “before create” method hook on Model#save without an ID" do
@@ -167,6 +198,7 @@ describe Her::Model::Hooks do
167
198
  @user.internal_save_id.should == 100
168
199
  @user.internal_create_id.should == 101
169
200
  @user.internal_update_id.should == nil
201
+ @user.internal_after_find_id.should == nil
170
202
  end
171
203
 
172
204
  it "perform “before save” and “before update” method hook on Model#save with an ID" do
@@ -175,6 +207,7 @@ describe Her::Model::Hooks do
175
207
  @user.internal_save_id.should == 100
176
208
  @user.internal_create_id.should == nil
177
209
  @user.internal_update_id.should == 102
210
+ @user.internal_after_find_id.should == 104
178
211
  end
179
212
 
180
213
  it "perform “before destroy” method hook on Model#destroy" do
@@ -184,6 +217,7 @@ describe Her::Model::Hooks do
184
217
  @user.internal_create_id.should == nil
185
218
  @user.internal_update_id.should == nil
186
219
  @user.internal_destroy_id.should == 103
220
+ @user.internal_after_find_id.should == 104
187
221
  end
188
222
 
189
223
  it "perform “after save” “after create” method hook on Model#save without an ID" do
@@ -192,6 +226,7 @@ describe Her::Model::Hooks do
192
226
  @user.internal_after_save_id.should == 100
193
227
  @user.internal_after_create_id.should == 101
194
228
  @user.internal_after_update_id.should == nil
229
+ @user.internal_after_find_id.should == nil
195
230
  end
196
231
 
197
232
  it "perform “after save” “after update” method hook on Model#save with an ID" do
@@ -200,6 +235,7 @@ describe Her::Model::Hooks do
200
235
  @user.internal_after_save_id.should == 100
201
236
  @user.internal_after_create_id.should == nil
202
237
  @user.internal_after_update_id.should == 102
238
+ @user.internal_after_find_id.should == 104
203
239
  end
204
240
 
205
241
  it "perform “after save” “after update” method hook on Model.save_existing" do
@@ -207,6 +243,7 @@ describe Her::Model::Hooks do
207
243
  @user.internal_after_save_id.should == 100
208
244
  @user.internal_after_create_id.should == nil
209
245
  @user.internal_after_update_id.should == 102
246
+ @user.internal_after_find_id.should == nil
210
247
  end
211
248
 
212
249
  it "perform “after save” “after create” method hook on Model.create" do
@@ -214,6 +251,38 @@ describe Her::Model::Hooks do
214
251
  @user.internal_after_save_id.should == 100
215
252
  @user.internal_after_create_id.should == 101
216
253
  @user.internal_after_update_id.should == nil
254
+ @user.internal_after_find_id.should == nil
255
+ end
256
+
257
+ it "perform “after find” method hook on Model.find" do
258
+ @user = Foo::User.find(1)
259
+ @user.internal_after_find_id.should == 104
260
+ @user.internal_save_id.should == nil
261
+ @user.internal_create_id.should == nil
262
+ @user.internal_update_id.should == nil
263
+ @user.internal_destroy_id.should == nil
264
+ end
265
+
266
+ it "perform “after find” method hook on Model#find with IDs" do
267
+ @users = Foo::User.find([1,2])
268
+ @users.each do |user|
269
+ user.internal_after_find_id.should == 104
270
+ user.internal_save_id.should == nil
271
+ user.internal_create_id.should == nil
272
+ user.internal_update_id.should == nil
273
+ user.internal_destroy_id.should == nil
274
+ end
275
+ end
276
+
277
+ it "perform “after find” method hook on Model.all" do
278
+ @users = Foo::User.all
279
+ @users.each do |user|
280
+ user.internal_after_find_id.should == 104
281
+ user.internal_save_id.should == nil
282
+ user.internal_create_id.should == nil
283
+ user.internal_update_id.should == nil
284
+ user.internal_destroy_id.should == nil
285
+ end
217
286
  end
218
287
  end
219
288
 
@@ -228,6 +297,7 @@ describe Her::Model::Hooks do
228
297
  Foo::User.after_create { |record| record.internal_after_create_id = 201 }
229
298
  Foo::User.after_update { |record| record.internal_after_update_id = 202 }
230
299
  Foo::User.after_destroy { |record| record.internal_after_destroy_id = 203 }
300
+ Foo::User.after_find { |record| record.internal_after_find_id = 204 }
231
301
  end
232
302
 
233
303
  it "perform “before save” and “before create” block hook on Model#save without an ID" do
@@ -236,6 +306,7 @@ describe Her::Model::Hooks do
236
306
  @user.internal_save_id.should == 200
237
307
  @user.internal_create_id.should == 201
238
308
  @user.internal_update_id.should == nil
309
+ @user.internal_after_find_id.should == nil
239
310
  end
240
311
 
241
312
  it "perform “before save” and “before update” block hook on Model#save with an ID" do
@@ -244,6 +315,7 @@ describe Her::Model::Hooks do
244
315
  @user.internal_save_id.should == 200
245
316
  @user.internal_create_id.should == nil
246
317
  @user.internal_update_id.should == 202
318
+ @user.internal_after_find_id.should == 204
247
319
  end
248
320
 
249
321
  it "perform “before destroy” block hook on Model#destroy" do
@@ -253,6 +325,7 @@ describe Her::Model::Hooks do
253
325
  @user.internal_create_id.should == nil
254
326
  @user.internal_update_id.should == nil
255
327
  @user.internal_destroy_id.should == 203
328
+ @user.internal_after_find_id.should == 204
256
329
  end
257
330
 
258
331
  it "perform “after save” “after create” block hook on Model#save without an ID" do
@@ -261,15 +334,73 @@ describe Her::Model::Hooks do
261
334
  @user.internal_after_save_id.should == 200
262
335
  @user.internal_after_create_id.should == 201
263
336
  @user.internal_after_update_id.should == nil
337
+ @user.internal_after_find_id.should == nil
264
338
  end
265
339
 
266
340
  it "perform “after save” “after update” block hook on Model#save with an ID" do
267
341
  @user = Foo::User.find(1)
268
342
  @user.save
343
+ @user.internal_after_find_id.should == 204
269
344
  @user.internal_after_save_id.should == 200
270
345
  @user.internal_after_create_id.should == nil
271
346
  @user.internal_after_update_id.should == 202
272
347
  end
348
+
349
+ it "perform “after find” block hook on Model#find" do
350
+ @user = Foo::User.find(1)
351
+ @user.internal_after_find_id.should == 204
352
+ @user.internal_save_id.should == nil
353
+ @user.internal_create_id.should == nil
354
+ @user.internal_update_id.should == nil
355
+ end
356
+
357
+ it "perform “after find” method hook on Model#find with IDs" do
358
+ @users = Foo::User.find([1,2])
359
+ @users.each do |user|
360
+ user.internal_after_find_id.should == 204
361
+ user.internal_save_id.should == nil
362
+ user.internal_create_id.should == nil
363
+ user.internal_update_id.should == nil
364
+ end
365
+ end
366
+
367
+ it "perform “after find” method hook on Model.all" do
368
+ @users = Foo::User.all
369
+ @users.each do |user|
370
+ user.internal_after_find_id.should == 204
371
+ user.internal_save_id.should == nil
372
+ user.internal_create_id.should == nil
373
+ user.internal_update_id.should == nil
374
+ end
375
+ end
376
+
377
+ it "perform “after find” block hook on Model#find" do
378
+ @user = Foo::User.find(1)
379
+ @user.internal_after_find_id.should == 204
380
+ @user.internal_save_id.should == nil
381
+ @user.internal_create_id.should == nil
382
+ @user.internal_update_id.should == nil
383
+ end
384
+
385
+ it "perform “after find” method hook on Model#find with IDs" do
386
+ @users = Foo::User.find([1,2])
387
+ @users.each do |user|
388
+ user.internal_after_find_id.should == 204
389
+ user.internal_save_id.should == nil
390
+ user.internal_create_id.should == nil
391
+ user.internal_update_id.should == nil
392
+ end
393
+ end
394
+
395
+ it "perform “after find” method hook on Model.all" do
396
+ @users = Foo::User.all
397
+ @users.each do |user|
398
+ user.internal_after_find_id.should == 204
399
+ user.internal_save_id.should == nil
400
+ user.internal_create_id.should == nil
401
+ user.internal_update_id.should == nil
402
+ end
403
+ end
273
404
  end
274
405
  end
275
406
  end
@@ -19,15 +19,23 @@ describe Her::Model::Introspection do
19
19
  end
20
20
 
21
21
  describe "#inspect" do
22
- it "outputs resource attributs for an existing resource" do
22
+ it "outputs resource attributes for an existing resource" do
23
23
  @user = Foo::User.find(1)
24
24
  ["#<Foo::User(users/1) name=\"Tobias Funke\" id=1>", "#<Foo::User(users/1) id=1 name=\"Tobias Funke\">"].should include(@user.inspect)
25
25
  end
26
26
 
27
- it "outputs resource attributs for an not-saved-yet resource" do
27
+ it "outputs resource attributes for an not-saved-yet resource" do
28
28
  @user = Foo::User.new(:name => "Tobias Funke")
29
29
  @user.inspect.should == "#<Foo::User(users) name=\"Tobias Funke\">"
30
30
  end
31
+
32
+ it "outputs resource attributes using getters" do
33
+ @user = Foo::User.new(:name => "Tobias Funke", :password => "Funke")
34
+ @user.instance_eval {def password; 'filtered'; end}
35
+ @user.inspect.should include("name=\"Tobias Funke\"")
36
+ @user.inspect.should include("password=\"filtered\"")
37
+ @user.inspect.should_not include("password=\"Funke\"")
38
+ end
31
39
  end
32
40
  end
33
41