draper 1.0.0.beta1 → 1.0.0.beta2

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.markdown CHANGED
@@ -1,5 +1,40 @@
1
1
  # Draper Changelog
2
2
 
3
+ ## 1.0.0.beta2
4
+
5
+ * `has_finders` is now `decorates_finders`. [https://github.com/haines/draper/commit/33f18aa062e0d3848443dbd81047f20d5665579f](https://github.com/haines/draper/commit/33f18aa062e0d3848443dbd81047f20d5665579f)
6
+
7
+ * If a finder method is used, and the source class is not set and cannot be inferred, an `UninferrableSourceError` is raised. [https://github.com/haines/draper/commit/8ef5bf2f02f7033e3cd4f1f5de7397b02c984fe3](https://github.com/haines/draper/commit/8ef5bf2f02f7033e3cd4f1f5de7397b02c984fe3)
8
+
9
+ * Class methods are now properly delegated again. [https://github.com/haines/draper/commit/731995a5feac4cd06cf9328d2892c0eca9992db6](https://github.com/haines/draper/commit/731995a5feac4cd06cf9328d2892c0eca9992db6)
10
+
11
+ * We no longer `respond_to?` private methods on the source. [https://github.com/haines/draper/commit/18ebac81533a6413aa20a3c26f23e91d0b12b031](https://github.com/haines/draper/commit/18ebac81533a6413aa20a3c26f23e91d0b12b031)
12
+
13
+ * Rails versioning relaxed to support Rails 4 [https://github.com/drapergem/draper/commit/8bfd393b5baa7aa1488076a5e2cb88648efaa815](https://github.com/drapergem/draper/commit/8bfd393b5baa7aa1488076a5e2cb88648efaa815)
14
+
15
+ ## 1.0.0.beta1
16
+
17
+ * Renaming `Draper::Base` to `Draper::Decorator`. This is the most significant
18
+ change you'll need to upgrade your application. [https://github.com/drapergem/draper/commit/025742cb3b295d259cf0ecf3669c24817d6f2df1](https://github.com/drapergem/draper/commit/025742cb3b295d259cf0ecf3669c24817d6f2df1)
19
+ * Added an internal Rails application for integration tests. This won't affect
20
+ your application, but we're now running a set of Cucumber tests inside of a
21
+ Rails app in both development and production mode to help ensure that we
22
+ don't make changes that break Draper. [https://github.com/drapergem/draper/commit/90a4859085cab158658d23d77cd3108b6037e36f](https://github.com/drapergem/draper/commit/90a4859085cab158658d23d77cd3108b6037e36f)
23
+ * Add `#decorated?` method. This gives us a free RSpec matcher,
24
+ `is_decorated?`. [https://github.com/drapergem/draper/commit/834a6fd1f24b5646c333a04a99fe9846a58965d6](https://github.com/drapergem/draper/commit/834a6fd1f24b5646c333a04a99fe9846a58965d6)
25
+ * `#decorates` is no longer needed inside your models, and should be removed.
26
+ Decorators automatically infer the class they decorate. [https://github.com/drapergem/draper/commit/e1214d97b62f2cab45227cc650029734160dcdfe](https://github.com/drapergem/draper/commit/e1214d97b62f2cab45227cc650029734160dcdfe)
27
+ * Decorators do not automatically come with 'finders' by default. If you'd like
28
+ to use `SomeDecorator.find(1)`, for example, simply add `#has_finders` to
29
+ the decorator to include them. [https://github.com/drapergem/draper/commit/42b6f78fda4f51845dab4d35da68880f1989d178](https://github.com/drapergem/draper/commit/42b6f78fda4f51845dab4d35da68880f1989d178)
30
+ * To refer to the object being decorated, `#source` is now the preferred
31
+ method. [https://github.com/drapergem/draper/commit/1e84fcb4a0eab0d12f5feda6886ce1caa239cb16](https://github.com/drapergem/draper/commit/1e84fcb4a0eab0d12f5feda6886ce1caa239cb16)
32
+ * `ActiveModel::Serialization` is included in Decorators if you've requred
33
+ `ActiveModel::Serializers`, so that decorators can be serialized. [https://github.com/drapergem/draper/commit/c4b352799067506849abcbf14963ea36abda301c](https://github.com/drapergem/draper/commit/c4b352799067506849abcbf14963ea36abda301c)
34
+ * Properly support Test::Unit [https://github.com/drapergem/draper/commit/087e134ed0885ec11325ffabe8ab2bebef77a33a](https://github.com/drapergem/draper/commit/087e134ed0885ec11325ffabe8ab2bebef77a33a)
35
+
36
+ And many small bug fixes and refactorings.
37
+
3
38
  ## 0.18.0
4
39
 
5
40
  * [Adds the ability to decorate an enumerable proxy](https://github.com/drapergem/draper/commit/67c7125192740a7586a3a635acd735ae01b97837)
data/draper.gemspec CHANGED
@@ -16,8 +16,8 @@ Gem::Specification.new do |s|
16
16
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
17
17
  s.require_paths = ["lib"]
18
18
 
19
- s.add_dependency 'activesupport', '~> 3.2'
20
- s.add_dependency 'actionpack', '~> 3.2'
19
+ s.add_dependency 'activesupport', '>= 3.2'
20
+ s.add_dependency 'actionpack', '>= 3.2'
21
21
 
22
22
  s.add_development_dependency 'ammeter'
23
23
  s.add_development_dependency 'rake', '~> 0.9.2'
data/lib/draper.rb CHANGED
@@ -48,4 +48,10 @@ module Draper
48
48
  super("Could not infer a decorator for #{klass}.")
49
49
  end
50
50
  end
51
+
52
+ class UninferrableSourceError < NameError
53
+ def initialize(klass)
54
+ super("Could not infer a source for #{klass}.")
55
+ end
56
+ end
51
57
  end
@@ -34,18 +34,36 @@ module Draper
34
34
  alias_method :decorate, :new
35
35
  end
36
36
 
37
- # Adds ActiveRecord finder methods to the decorator class. The
38
- # methods return decorated models, so that you can use
39
- # `ProductDecorator.find(id)` instead of
37
+ # Specify the class that this class decorates.
38
+ #
39
+ # @param [String, Symbol, Class] Class or name of class to decorate.
40
+ def self.decorates(klass)
41
+ @source_class = klass.to_s.classify.constantize
42
+ end
43
+
44
+ # @return [Class] The source class corresponding to this
45
+ # decorator class
46
+ def self.source_class
47
+ @source_class ||= inferred_source_class
48
+ end
49
+
50
+ # Checks whether this decorator class has a corresponding
51
+ # source class
52
+ def self.source_class?
53
+ source_class
54
+ rescue Draper::UninferrableSourceError
55
+ false
56
+ end
57
+
58
+ # Automatically decorates ActiveRecord finder methods, so that
59
+ # you can use `ProductDecorator.find(id)` instead of
40
60
  # `ProductDecorator.decorate(Product.find(id))`.
41
61
  #
42
- # If the `:for` option is not supplied, the model class will be
43
- # inferred from the decorator class.
62
+ # The model class to be found is defined by `decorates` or
63
+ # inferred from the decorator class name.
44
64
  #
45
- # @option options [Class, Symbol] :for The model class to find
46
- def self.has_finders(options = {})
65
+ def self.decorates_finders
47
66
  extend Draper::Finders
48
- self.finder_class = options[:for] || name.chomp("Decorator")
49
67
  end
50
68
 
51
69
  # Typically called within a decorator definition, this method causes
@@ -145,10 +163,6 @@ module Draper
145
163
  end
146
164
  alias_method :is_a?, :kind_of?
147
165
 
148
- def respond_to?(method, include_private = false)
149
- super || (allow?(method) && source.respond_to?(method, include_private))
150
- end
151
-
152
166
  # We always want to delegate present, in case we decorate a nil object.
153
167
  #
154
168
  # I don't like the idea of decorating a nil object, but we'll deal with
@@ -157,8 +171,18 @@ module Draper
157
171
  source.present?
158
172
  end
159
173
 
174
+ # For ActiveModel compatibilty
175
+ def to_model
176
+ self
177
+ end
178
+
179
+ # For ActiveModel compatibility
180
+ def to_param
181
+ source.to_param
182
+ end
183
+
160
184
  def method_missing(method, *args, &block)
161
- if allow?(method) && source.respond_to?(method)
185
+ if delegatable_method?(method)
162
186
  self.class.define_proxy(method)
163
187
  send(method, *args, &block)
164
188
  else
@@ -166,18 +190,46 @@ module Draper
166
190
  end
167
191
  end
168
192
 
169
- # For ActiveModel compatibilty
170
- def to_model
171
- self
193
+ def respond_to?(method, include_private = false)
194
+ super || delegatable_method?(method)
172
195
  end
173
196
 
174
- # For ActiveModel compatibility
175
- def to_param
176
- source.to_param
197
+ def self.method_missing(method, *args, &block)
198
+ if delegatable_method?(method)
199
+ source_class.send(method, *args, &block)
200
+ else
201
+ super
202
+ end
203
+ end
204
+
205
+ def self.respond_to?(method, include_private = false)
206
+ super || delegatable_method?(method)
177
207
  end
178
208
 
179
209
  private
180
210
 
211
+ def delegatable_method?(method)
212
+ allow?(method) && source.respond_to?(method)
213
+ end
214
+
215
+ def self.delegatable_method?(method)
216
+ source_class? && source_class.respond_to?(method)
217
+ end
218
+
219
+ def self.inferred_source_class
220
+ uninferrable_source if name.nil? || name.demodulize !~ /.+Decorator$/
221
+
222
+ begin
223
+ name.chomp("Decorator").constantize
224
+ rescue NameError
225
+ uninferrable_source
226
+ end
227
+ end
228
+
229
+ def self.uninferrable_source
230
+ raise Draper::UninferrableSourceError.new(self)
231
+ end
232
+
181
233
  def self.define_proxy(method)
182
234
  define_method(method) do |*args, &block|
183
235
  source.send(method, *args, &block)
@@ -1,29 +1,24 @@
1
1
  module Draper
2
2
  module Finders
3
3
 
4
- attr_reader :finder_class
5
- def finder_class=(klass)
6
- @finder_class = klass.to_s.camelize.constantize
7
- end
8
-
9
4
  def find(id, options = {})
10
- decorate(finder_class.find(id), options)
5
+ decorate(source_class.find(id), options)
11
6
  end
12
7
 
13
8
  def all(options = {})
14
- decorate_collection(finder_class.all, options)
9
+ decorate_collection(source_class.all, options)
15
10
  end
16
11
 
17
12
  def first(options = {})
18
- decorate(finder_class.first, options)
13
+ decorate(source_class.first, options)
19
14
  end
20
15
 
21
16
  def last(options = {})
22
- decorate(finder_class.last, options)
17
+ decorate(source_class.last, options)
23
18
  end
24
19
 
25
20
  def method_missing(method, *args, &block)
26
- result = finder_class.send(method, *args, &block)
21
+ result = super
27
22
  options = args.extract_options!
28
23
 
29
24
  case method.to_s
@@ -35,10 +30,5 @@ module Draper
35
30
  result
36
31
  end
37
32
  end
38
-
39
- def respond_to?(method, include_private = false)
40
- super || finder_class.respond_to?(method)
41
- end
42
-
43
33
  end
44
34
  end
@@ -1,3 +1,3 @@
1
1
  module Draper
2
- VERSION = "1.0.0.beta1"
2
+ VERSION = "1.0.0.beta2"
3
3
  end
@@ -125,6 +125,97 @@ describe Draper::Decorator do
125
125
  end
126
126
  end
127
127
 
128
+ describe ".decorates" do
129
+ subject { Class.new(Draper::Decorator) }
130
+
131
+ context "with a symbol" do
132
+ it "sets .source_class" do
133
+ subject.decorates :product
134
+ subject.source_class.should be Product
135
+ end
136
+ end
137
+
138
+ context "with a string" do
139
+ it "sets .source_class" do
140
+ subject.decorates "product"
141
+ subject.source_class.should be Product
142
+ end
143
+ end
144
+
145
+ context "with a class" do
146
+ it "sets .source_class" do
147
+ subject.decorates Product
148
+ subject.source_class.should be Product
149
+ end
150
+ end
151
+ end
152
+
153
+ describe ".source_class" do
154
+ context "when not set by .decorates" do
155
+ context "for an anonymous decorator" do
156
+ subject { Class.new(Draper::Decorator) }
157
+
158
+ it "raises an UninferrableSourceError" do
159
+ expect{subject.source_class}.to raise_error Draper::UninferrableSourceError
160
+ end
161
+ end
162
+
163
+ context "for a decorator without a corresponding source" do
164
+ subject { SpecificProductDecorator }
165
+
166
+ it "raises an UninferrableSourceError" do
167
+ expect{subject.source_class}.to raise_error Draper::UninferrableSourceError
168
+ end
169
+ end
170
+
171
+ context "for a decorator called Decorator" do
172
+ subject { Draper::Decorator }
173
+
174
+ it "raises an UninferrableSourceError" do
175
+ expect{subject.source_class}.to raise_error Draper::UninferrableSourceError
176
+ end
177
+ end
178
+
179
+ context "for a decorator with a name not ending in Decorator" do
180
+ subject { DecoratorWithApplicationHelper }
181
+
182
+ it "raises an UninferrableSourceError" do
183
+ expect{subject.source_class}.to raise_error Draper::UninferrableSourceError
184
+ end
185
+ end
186
+
187
+ context "for an inferrable source" do
188
+ subject { ProductDecorator }
189
+
190
+ it "infers the source" do
191
+ subject.source_class.should be Product
192
+ end
193
+ end
194
+
195
+ context "for a namespaced inferrable source" do
196
+ subject { Namespace::ProductDecorator }
197
+
198
+ it "infers the namespaced source" do
199
+ subject.source_class.should be Namespace::Product
200
+ end
201
+ end
202
+ end
203
+ end
204
+
205
+ describe ".source_class?" do
206
+ subject { Class.new(Draper::Decorator) }
207
+
208
+ it "returns truthy when .source_class is set" do
209
+ subject.stub(:source_class).and_return(Product)
210
+ subject.source_class?.should be_true
211
+ end
212
+
213
+ it "returns false when .source_class is not inferrable" do
214
+ subject.stub(:source_class).and_raise(Draper::UninferrableSourceError.new(subject))
215
+ subject.source_class?.should be_false
216
+ end
217
+ end
218
+
128
219
  describe ".decorates_association" do
129
220
  let(:decorator_class) { Class.new(ProductDecorator) }
130
221
  before { decorator_class.decorates_association :similar_products, with: ProductDecorator }
@@ -298,8 +389,8 @@ describe Draper::Decorator do
298
389
  subject.respond_to?(:awesome_private_title, true).should be_true
299
390
  end
300
391
 
301
- it "returns true for the source's private methods" do
302
- subject.respond_to?(:private_title, true).should be_true
392
+ it "returns false for the source's private methods" do
393
+ subject.respond_to?(:private_title, true).should be_false
303
394
  end
304
395
  end
305
396
 
@@ -327,63 +418,110 @@ describe Draper::Decorator do
327
418
  end
328
419
  end
329
420
 
330
- describe "method proxying" do
331
- let(:decorator_class) { Class.new(ProductDecorator) }
421
+ describe ".respond_to?" do
422
+ subject { Class.new(ProductDecorator) }
332
423
 
333
- it "does not proxy methods that are defined on the decorator" do
334
- subject.overridable.should be :overridden
335
- end
424
+ context "without a source class" do
425
+ it "returns true for its own class methods" do
426
+ subject.should respond_to :my_class_method
427
+ end
336
428
 
337
- it "does not proxy methods inherited from Object" do
338
- subject.inspect.should_not be source.inspect
429
+ it "returns false for other class methods" do
430
+ subject.should_not respond_to :sample_class_method
431
+ end
339
432
  end
340
433
 
341
- it "proxies missing methods that exist on the source" do
342
- source.stub(:hello_world).and_return(:proxied)
343
- subject.hello_world.should be :proxied
344
- end
434
+ context "with a source_class" do
435
+ before { subject.decorates :product }
345
436
 
346
- it "adds proxied methods to the decorator when they are used" do
347
- subject.methods.should_not include :hello_world
348
- subject.hello_world
349
- subject.methods.should include :hello_world
350
- end
437
+ it "returns true for its own class methods" do
438
+ subject.should respond_to :my_class_method
439
+ end
351
440
 
352
- it "passes blocks to proxied methods" do
353
- subject.block{"marker"}.should == "marker"
441
+ it "returns true for the source's class methods" do
442
+ subject.should respond_to :sample_class_method
443
+ end
354
444
  end
445
+ end
355
446
 
356
- it "does not confuse Kernel#Array" do
357
- Array(subject).should be_a Array
358
- end
447
+ describe "proxying" do
448
+ context "instance methods" do
449
+ let(:decorator_class) { Class.new(ProductDecorator) }
359
450
 
360
- it "proxies delegated methods" do
361
- subject.delegated_method.should == "Yay, delegation"
362
- end
451
+ it "does not proxy methods that are defined on the decorator" do
452
+ subject.overridable.should be :overridden
453
+ end
363
454
 
364
- context "with method security" do
365
- it "respects allows" do
366
- source.stub(:hello_world, :goodnight_moon).and_return(:proxied)
367
- subject.class.allows :hello_world
455
+ it "does not proxy methods inherited from Object" do
456
+ subject.inspect.should_not be source.inspect
457
+ end
368
458
 
459
+ it "proxies missing methods that exist on the source" do
460
+ source.stub(:hello_world).and_return(:proxied)
369
461
  subject.hello_world.should be :proxied
370
- expect{subject.goodnight_moon}.to raise_error NameError
371
462
  end
372
463
 
373
- it "respects denies" do
374
- source.stub(:hello_world, :goodnight_moon).and_return(:proxied)
375
- subject.class.denies :goodnight_moon
464
+ it "adds proxied methods to the decorator when they are used" do
465
+ subject.methods.should_not include :hello_world
466
+ subject.hello_world
467
+ subject.methods.should include :hello_world
468
+ end
376
469
 
377
- subject.hello_world.should be :proxied
378
- expect{subject.goodnight_moon}.to raise_error NameError
470
+ it "passes blocks to proxied methods" do
471
+ subject.block{"marker"}.should == "marker"
379
472
  end
380
473
 
381
- it "respects denies_all" do
382
- source.stub(:hello_world, :goodnight_moon).and_return(:proxied)
383
- subject.class.denies_all
474
+ it "does not confuse Kernel#Array" do
475
+ Array(subject).should be_a Array
476
+ end
477
+
478
+ it "proxies delegated methods" do
479
+ subject.delegated_method.should == "Yay, delegation"
480
+ end
481
+
482
+ it "does not proxy private methods" do
483
+ expect{subject.private_title}.to raise_error NoMethodError
484
+ end
485
+
486
+ context "with method security" do
487
+ it "respects allows" do
488
+ source.stub(:hello_world, :goodnight_moon).and_return(:proxied)
489
+ subject.class.allows :hello_world
490
+
491
+ subject.hello_world.should be :proxied
492
+ expect{subject.goodnight_moon}.to raise_error NameError
493
+ end
494
+
495
+ it "respects denies" do
496
+ source.stub(:hello_world, :goodnight_moon).and_return(:proxied)
497
+ subject.class.denies :goodnight_moon
498
+
499
+ subject.hello_world.should be :proxied
500
+ expect{subject.goodnight_moon}.to raise_error NameError
501
+ end
502
+
503
+ it "respects denies_all" do
504
+ source.stub(:hello_world, :goodnight_moon).and_return(:proxied)
505
+ subject.class.denies_all
506
+
507
+ expect{subject.hello_world}.to raise_error NameError
508
+ expect{subject.goodnight_moon}.to raise_error NameError
509
+ end
510
+ end
511
+ end
384
512
 
385
- expect{subject.hello_world}.to raise_error NameError
386
- expect{subject.goodnight_moon}.to raise_error NameError
513
+ context "class methods" do
514
+ subject { Class.new(ProductDecorator) }
515
+ let(:source_class) { Product }
516
+ before { subject.decorates source_class }
517
+
518
+ it "does not proxy methods that are defined on the decorator" do
519
+ subject.overridable.should be :overridden
520
+ end
521
+
522
+ it "proxies missing methods that exist on the source" do
523
+ source_class.stub(:hello_world).and_return(:proxied)
524
+ subject.hello_world.should be :proxied
387
525
  end
388
526
  end
389
527
  end
@@ -421,7 +559,7 @@ describe Draper::Decorator do
421
559
  end
422
560
 
423
561
  it "is able to use the link_to helper" do
424
- subject.sample_link.should == "<a href=\"/World\">Hello</a>"
562
+ subject.sample_link.should == %{<a href="/World">Hello</a>}
425
563
  end
426
564
 
427
565
  it "is able to use the truncate helper" do
@@ -443,55 +581,42 @@ describe Draper::Decorator do
443
581
  subject.is_a?(subject.class).should be_true
444
582
  end
445
583
 
446
- describe ".has_finders" do
584
+ describe ".decorates_finders" do
447
585
  it "extends the Finders module" do
448
586
  ProductDecorator.should be_a_kind_of Draper::Finders
449
587
  end
588
+ end
450
589
 
451
- context "with no options" do
452
- it "infers the finder class" do
453
- ProductDecorator.finder_class.should be Product
454
- end
590
+ describe "#serializable_hash" do
591
+ let(:decorator_class) { ProductDecorator }
455
592
 
456
- context "for a namespaced model" do
457
- it "infers the finder class" do
458
- Namespace::ProductDecorator.finder_class.should be Namespace::Product
459
- end
460
- end
593
+ it "serializes overridden attributes" do
594
+ subject.serializable_hash[:overridable].should be :overridden
461
595
  end
596
+ end
462
597
 
463
- context "with :for option" do
464
- subject { Class.new(Draper::Decorator) }
598
+ describe ".method_missing" do
599
+ context "when called on an anonymous decorator" do
600
+ subject { ->{ Class.new(Draper::Decorator).fizzbuzz } }
601
+ it { should raise_error NoMethodError }
602
+ end
465
603
 
466
- context "with a symbol" do
467
- it "sets the finder class" do
468
- subject.has_finders for: :product
469
- subject.finder_class.should be Product
470
- end
471
- end
604
+ context "when called on an uninferrable decorator" do
605
+ subject { ->{ SpecificProductDecorator.fizzbuzz } }
606
+ it { should raise_error NoMethodError }
607
+ end
472
608
 
473
- context "with a string" do
474
- it "sets the finder class" do
475
- subject.has_finders for: "some_thing"
476
- subject.finder_class.should be SomeThing
477
- end
609
+ context "when called on an inferrable decorator" do
610
+ context "for a method known to the inferred class" do
611
+ subject { ->{ ProductDecorator.model_name } }
612
+ it { should_not raise_error }
478
613
  end
479
614
 
480
- context "with a class" do
481
- it "sets the finder_class" do
482
- subject.has_finders for: Namespace::Product
483
- subject.finder_class.should be Namespace::Product
484
- end
615
+ context "for a method unknown to the inferred class" do
616
+ subject { ->{ ProductDecorator.fizzbuzz } }
617
+ it { should raise_error NoMethodError }
485
618
  end
486
619
  end
487
620
  end
488
621
 
489
- describe "#serializable_hash" do
490
- let(:decorator_class) { ProductDecorator }
491
-
492
- it "serializes overridden attributes" do
493
- subject.serializable_hash[:overridable].should be :overridden
494
- end
495
- end
496
-
497
622
  end
@@ -142,15 +142,4 @@ describe Draper::Finders do
142
142
  ProductDecorator.where(name: "apples").should be found
143
143
  end
144
144
  end
145
-
146
- describe ".respond_to?" do
147
- it "responds to the model's class methods" do
148
- ProductDecorator.should respond_to :sample_class_method
149
- end
150
-
151
- it "responds to its own methods" do
152
- ProductDecorator.should respond_to :my_class_method
153
- end
154
- end
155
-
156
145
  end
@@ -22,4 +22,8 @@ class PostDecorator < Draper::Decorator
22
22
  def url_with_id
23
23
  h.post_url(id: id)
24
24
  end
25
+
26
+ def link
27
+ h.link_to id.to_s, self
28
+ end
25
29
  end
@@ -20,4 +20,7 @@ describe PostDecorator do
20
20
  subject.url_with_id.should == "http://www.example.com/en/posts/#{source.id}"
21
21
  end
22
22
 
23
+ it "can be passed implicitly to url_for" do
24
+ subject.link.should == "<a href=\"/en/posts/#{source.id}\">#{source.id}</a>"
25
+ end
23
26
  end
@@ -30,7 +30,7 @@ describe Rails::Generators::DecoratorGenerator do
30
30
  end
31
31
 
32
32
  context 'parent decorator' do
33
- describe 'decorator inhereted from Draper::Decorator' do
33
+ describe 'decorator inherited from Draper::Decorator' do
34
34
  before { run_generator ["YourModel"] }
35
35
 
36
36
  subject { file('app/decorators/your_model_decorator.rb') }
@@ -38,7 +38,7 @@ describe Rails::Generators::DecoratorGenerator do
38
38
  it { should contain "class YourModelDecorator < Draper::Decorator" }
39
39
  end
40
40
 
41
- describe "decorator inhereted from ApplicationDecorator if it's present" do
41
+ describe "decorator inherited from ApplicationDecorator if it's present" do
42
42
  before do
43
43
  class ApplicationDecorator; end
44
44
  run_generator ["YourModel"]
@@ -1,5 +1,5 @@
1
1
  module Namespace
2
2
  class ProductDecorator < Draper::Decorator
3
- has_finders
3
+ decorates_finders
4
4
  end
5
5
  end
@@ -1,5 +1,5 @@
1
1
  class ProductDecorator < Draper::Decorator
2
- has_finders
2
+ decorates_finders
3
3
 
4
4
  def awesome_title
5
5
  "Awesome Title"
@@ -9,6 +9,10 @@ class ProductDecorator < Draper::Decorator
9
9
  :overridden
10
10
  end
11
11
 
12
+ def self.overridable
13
+ :overridden
14
+ end
15
+
12
16
  def self.my_class_method
13
17
  end
14
18
 
@@ -84,6 +84,10 @@ class Product < ActiveRecord::Base
84
84
  :overridable
85
85
  end
86
86
 
87
+ def self.overridable
88
+ :overridable
89
+ end
90
+
87
91
  private
88
92
 
89
93
  def private_title
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: draper
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.beta1
4
+ version: 1.0.0.beta2
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -10,14 +10,14 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-11-30 00:00:00.000000000 Z
13
+ date: 2012-12-03 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activesupport
17
17
  requirement: !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
- - - ~>
20
+ - - ! '>='
21
21
  - !ruby/object:Gem::Version
22
22
  version: '3.2'
23
23
  type: :runtime
@@ -25,7 +25,7 @@ dependencies:
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  none: false
27
27
  requirements:
28
- - - ~>
28
+ - - ! '>='
29
29
  - !ruby/object:Gem::Version
30
30
  version: '3.2'
31
31
  - !ruby/object:Gem::Dependency
@@ -33,7 +33,7 @@ dependencies:
33
33
  requirement: !ruby/object:Gem::Requirement
34
34
  none: false
35
35
  requirements:
36
- - - ~>
36
+ - - ! '>='
37
37
  - !ruby/object:Gem::Version
38
38
  version: '3.2'
39
39
  type: :runtime
@@ -41,7 +41,7 @@ dependencies:
41
41
  version_requirements: !ruby/object:Gem::Requirement
42
42
  none: false
43
43
  requirements:
44
- - - ~>
44
+ - - ! '>='
45
45
  - !ruby/object:Gem::Version
46
46
  version: '3.2'
47
47
  - !ruby/object:Gem::Dependency
@@ -276,7 +276,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
276
276
  version: '0'
277
277
  segments:
278
278
  - 0
279
- hash: -4120022348081627788
279
+ hash: 3275361325961868093
280
280
  required_rubygems_version: !ruby/object:Gem::Requirement
281
281
  none: false
282
282
  requirements: