draper 2.1.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +16 -0
  3. data/.github/PULL_REQUEST_TEMPLATE.md +24 -0
  4. data/.gitignore +3 -1
  5. data/.rubocop.yml +11 -0
  6. data/.travis.yml +3 -7
  7. data/CHANGELOG.md +26 -0
  8. data/Gemfile +4 -5
  9. data/Guardfile +5 -5
  10. data/README.md +61 -11
  11. data/Rakefile +1 -1
  12. data/draper.gemspec +12 -10
  13. data/lib/draper.rb +8 -3
  14. data/lib/draper/automatic_delegation.rb +5 -3
  15. data/lib/draper/collection_decorator.rb +1 -11
  16. data/lib/draper/compatibility/api_only.rb +23 -0
  17. data/lib/draper/configuration.rb +15 -0
  18. data/lib/draper/decoratable.rb +3 -4
  19. data/lib/draper/decorator.rb +4 -24
  20. data/lib/draper/finders.rb +0 -0
  21. data/lib/draper/helper_proxy.rb +1 -8
  22. data/lib/draper/railtie.rb +12 -21
  23. data/lib/draper/tasks/test.rake +2 -15
  24. data/lib/draper/test/devise_helper.rb +1 -8
  25. data/lib/draper/test/minitest_integration.rb +0 -0
  26. data/lib/draper/test/rspec_integration.rb +1 -5
  27. data/lib/draper/test_case.rb +4 -8
  28. data/lib/draper/undecorate.rb +8 -0
  29. data/lib/draper/version.rb +1 -1
  30. data/lib/draper/view_context.rb +3 -19
  31. data/lib/draper/view_context/build_strategy.rb +11 -2
  32. data/lib/generators/controller_override.rb +2 -2
  33. data/lib/generators/draper/install_generator.rb +14 -0
  34. data/lib/generators/draper/templates/application_decorator.rb +8 -0
  35. data/lib/generators/mini_test/decorator_generator.rb +1 -1
  36. data/lib/generators/rails/decorator_generator.rb +1 -8
  37. data/lib/generators/rspec/templates/decorator_spec.rb +2 -2
  38. data/spec/draper/collection_decorator_spec.rb +11 -26
  39. data/spec/draper/configuration_spec.rb +25 -0
  40. data/spec/draper/decoratable_spec.rb +29 -16
  41. data/spec/draper/decorated_association_spec.rb +9 -9
  42. data/spec/draper/decorates_assigned_spec.rb +6 -6
  43. data/spec/draper/decorator_spec.rb +112 -89
  44. data/spec/draper/draper_spec.rb +24 -0
  45. data/spec/draper/factory_spec.rb +26 -26
  46. data/spec/draper/finders_spec.rb +21 -21
  47. data/spec/draper/helper_proxy_spec.rb +3 -3
  48. data/spec/draper/lazy_helpers_spec.rb +2 -2
  49. data/spec/draper/undecorate_chain_spec.rb +20 -0
  50. data/spec/draper/view_context/build_strategy_spec.rb +26 -10
  51. data/spec/draper/view_context_spec.rb +49 -21
  52. data/spec/dummy/app/controllers/base_controller.rb +4 -0
  53. data/spec/dummy/app/controllers/posts_controller.rb +2 -2
  54. data/spec/dummy/app/decorators/post_decorator.rb +0 -0
  55. data/spec/dummy/app/views/posts/_post.html.erb +8 -6
  56. data/spec/dummy/config/boot.rb +1 -1
  57. data/spec/dummy/config/initializers/draper.rb +3 -0
  58. data/spec/dummy/config/mongoid.yml +104 -41
  59. data/spec/dummy/db/schema.rb +4 -4
  60. data/spec/dummy/fast_spec/post_decorator_spec.rb +1 -1
  61. data/spec/dummy/lib/tasks/test.rake +1 -1
  62. data/spec/dummy/spec/decorators/active_model_serializers_spec.rb +4 -8
  63. data/spec/dummy/spec/decorators/devise_spec.rb +0 -9
  64. data/spec/dummy/spec/decorators/post_decorator_spec.rb +2 -4
  65. data/spec/dummy/spec/mailers/post_mailer_spec.rb +0 -8
  66. data/spec/dummy/spec/shared_examples/decoratable.rb +0 -2
  67. data/spec/dummy/test/decorators/minitest/devise_test.rb +0 -9
  68. data/spec/dummy/test/decorators/minitest/view_context_test.rb +3 -3
  69. data/spec/dummy/test/decorators/test_unit/devise_test.rb +0 -9
  70. data/spec/dummy/test/decorators/test_unit/view_context_test.rb +1 -1
  71. data/spec/generators/controller/controller_generator_spec.rb +3 -3
  72. data/spec/generators/decorator/decorator_generator_spec.rb +14 -12
  73. data/spec/generators/install/install_generator_spec.rb +19 -0
  74. data/spec/integration/integration_spec.rb +11 -8
  75. data/spec/performance/benchmark.rb +1 -1
  76. data/spec/spec_helper.rb +4 -4
  77. data/spec/support/matchers/have_text.rb +2 -2
  78. data/spec/support/shared_examples/view_helpers.rb +8 -8
  79. metadata +71 -29
  80. data/gemfiles/4.0.gemfile +0 -3
  81. data/gemfiles/4.1.gemfile +0 -3
  82. data/gemfiles/4.2.gemfile +0 -3
  83. data/spec/dummy/app/controllers/application_controller.rb +0 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b85cf531330b6947bd3bd6970e527ca62149975a
4
- data.tar.gz: e063ca4cd9757a4bfc7ad5eb3970b852fa62f1f8
3
+ metadata.gz: 6f2c896cc71e7e4e654a5d65907dd0ec4cefed7f
4
+ data.tar.gz: ce50051cf161e9416483a40797d38ae2d2da3384
5
5
  SHA512:
6
- metadata.gz: d51ffa67dbb810f7d093bf2bf7c7b0c216cc03231150dbec62b0915fc098ac7bd28b8975541ac99abe3fcdae541d98133d3e7fc176335f16615c6cd6169111bb
7
- data.tar.gz: 0006c748a474980dcc613530ed51fa1b9b469e3bbf63eb5ed3eb72d06ab2d5c692c439d5cc43cc139c00ce0032329ac77518600efc351c10b0b1c5b6fa81af51
6
+ metadata.gz: 527adb1c71ce28f23bb9be4186fe857c543a26edd8d20404f1e2a6db51e819143dd9c7973f7735746457c2a8a392e7a6d5b8a79232d26a1694035e09441a98f4
7
+ data.tar.gz: 0ed34d19d3b0300ea733392aab2c4cceaa1b284efc71e84452331fea4c9c11c68c7dc00baa7802a864d60f69bfb42beb8f5cecf959ed5ebf01b8a24c7e676f3f
data/.codeclimate.yml ADDED
@@ -0,0 +1,16 @@
1
+ ---
2
+ engines:
3
+ duplication:
4
+ enabled: true
5
+ config:
6
+ languages:
7
+ - ruby
8
+ fixme:
9
+ enabled: true
10
+ rubocop:
11
+ enabled: true
12
+ ratings:
13
+ paths:
14
+ - "**.rb"
15
+ exclude_paths:
16
+ - spec/
@@ -0,0 +1,24 @@
1
+ ## Description
2
+ Detail your changes here.
3
+ A few sentences describing the overall goals of the pull request's commits will suffice.
4
+ Some questions you might answer:
5
+
6
+ * Why was this change required?
7
+ * Did you have any tough decisions to make? Which one(s) did you go with and why?
8
+ * Are there any deployment impacts to this change?
9
+ * Is there something you aren't happy with or that needs extra attention?
10
+
11
+ ## Testing
12
+ Outline steps to test your changes.
13
+
14
+ 1. Go here.
15
+ 1. Click this.
16
+ 1. See that.
17
+
18
+ ## To-Dos
19
+ - [ ] tests
20
+ - [ ] documentation
21
+
22
+ ## References
23
+ * [GitHub Issue ####](https://github.com/drapergem/draper/issues/####)
24
+ * [GitHub Pull Request ####](https://github.com/drapergem/draper/pull/####)
data/.gitignore CHANGED
@@ -1,5 +1,7 @@
1
1
  *.gem
2
- *.rvmrc
2
+ .rvmrc
3
+ .ruby-version
4
+ .ruby-gemset
3
5
  .bundle
4
6
  Gemfile.lock
5
7
  pkg/*
data/.rubocop.yml ADDED
@@ -0,0 +1,11 @@
1
+ AllCops:
2
+ TargetRubyVersion: 2.4
3
+ DisplayCopNames: true
4
+ Exclude:
5
+ - 'spec/dummy/**/*'
6
+
7
+ Style/StringLiterals:
8
+ Enabled: false
9
+
10
+ Metrics/LineLength:
11
+ Max: 100
data/.travis.yml CHANGED
@@ -4,10 +4,6 @@ services:
4
4
  - mongodb
5
5
 
6
6
  rvm:
7
- - 2.1.5
8
- - 2.2.1
9
-
10
- env:
11
- - "RAILS_VERSION=4.0"
12
- - "RAILS_VERSION=4.1"
13
- - "RAILS_VERSION=4.2"
7
+ - 2.2.6
8
+ - 2.3.3
9
+ - 2.4.1
data/CHANGELOG.md CHANGED
@@ -1,5 +1,31 @@
1
1
  # Draper Changelog
2
2
 
3
+ ## 3.0.0 - 2017
4
+
5
+ ### Breaking Changes
6
+ * Rename UninferrableSourceError to UninferrableObjectError [#768](https://github.com/drapergem/draper/pull/768)
7
+ * Remove conflicting source aliases: `source`, `to_source`, `source_class` and `source_class?` [#786](https://github.com/drapergem/draper/pull/786)
8
+
9
+ ### New Features
10
+ * Generator for creating `ApplicationDecorator` that other decorators inherit from [#796](https://github.com/drapergem/draper/pull/796)
11
+ * Draper configuration with ability to customize the controller Draper uses [#788](https://github.com/drapergem/draper/pull/788)
12
+ * Added support for Rails 5 API-only applications [#793](https://github.com/drapergem/draper/pull/793)
13
+ * Added support for Rails runner [#739](https://github.com/drapergem/draper/pull/739)
14
+
15
+ ### Other Changes
16
+ * Clear view context when the controller changes [#799](https://github.com/drapergem/draper/pull/799)
17
+ * Removed previously deprecated functionality [#785](https://github.com/drapergem/draper/pull/785)
18
+ * Only delegate === if other is an instance of a class that inherits from `Decorator` [#720](https://github.com/drapergem/draper/pull/720)
19
+ * Always default to `CollectionDecorator` when `NameError` is raised [#795](https://github.com/drapergem/draper/pull/795)
20
+ * Fixed issues in order to support Rails 5.1
21
+ * Fixed a bug where helpers were used inside a decorator and this decorator was used outside of controller context
22
+
23
+ ## 3.0.0.pre1 - 2016-07-10
24
+
25
+ * Added support for Rails 5, dropped 4.0 - 4.2
26
+ * Ruby >= 2.2 is required, matching Rails 5
27
+ * Dropped support for ActiveModelSerializers 0.8
28
+
3
29
  ## 2.1.0 - 2015-03-26
4
30
 
5
31
  * Cleared most issues and merged a few PRs
data/Gemfile CHANGED
@@ -7,10 +7,9 @@ platforms :ruby do
7
7
  end
8
8
 
9
9
  platforms :jruby do
10
- gem "minitest", ">= 3.0"
11
- gem "activerecord-jdbcsqlite3-adapter", ">= 1.3.0.beta2"
10
+ gem "minitest"
11
+ gem "activerecord-jdbcsqlite3-adapter"
12
12
  end
13
13
 
14
- version = ENV["RAILS_VERSION"] || "4.1"
15
-
16
- eval_gemfile File.expand_path("../gemfiles/#{version}.gemfile", __FILE__)
14
+ gem "rails", "~> 5.0"
15
+ gem "mongoid", github: "mongodb/mongoid"
data/Guardfile CHANGED
@@ -1,25 +1,25 @@
1
1
  def rspec_guard(options = {}, &block)
2
2
  options = {
3
- :version => 2,
4
- :notification => false
3
+ version: 2,
4
+ notification: false
5
5
  }.merge(options)
6
6
 
7
7
  guard 'rspec', options, &block
8
8
  end
9
9
 
10
- rspec_guard :spec_paths => %w{spec/draper spec/generators} do
10
+ rspec_guard spec_paths: %w{spec/draper spec/generators} do
11
11
  watch(%r{^spec/.+_spec\.rb$})
12
12
  watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
13
13
  watch('spec/spec_helper.rb') { "spec" }
14
14
  end
15
15
 
16
- rspec_guard :spec_paths => 'spec/integration', :env => {'RAILS_ENV' => 'development'} do
16
+ rspec_guard spec_paths: 'spec/integration', env: {'RAILS_ENV' => 'development'} do
17
17
  watch(%r{^spec/.+_spec\.rb$})
18
18
  watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
19
19
  watch('spec/spec_helper.rb') { "spec" }
20
20
  end
21
21
 
22
- rspec_guard :spec_paths => 'spec/integration', :env => {'RAILS_ENV' => 'production'} do
22
+ rspec_guard spec_paths: 'spec/integration', env: {'RAILS_ENV' => 'production'} do
23
23
  watch(%r{^spec/.+_spec\.rb$})
24
24
  watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
25
25
  watch('spec/spec_helper.rb') { "spec" }
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # Draper: View Models for Rails
2
2
 
3
3
  [![TravisCI Build Status](https://travis-ci.org/drapergem/draper.svg?branch=master)](http://travis-ci.org/drapergem/draper)
4
- [![Code Climate](https://codeclimate.com/github/drapergem/draper.png)](https://codeclimate.com/github/drapergem/draper)
5
- [![Inline docs](http://inch-ci.org/github/drapergem/draper.png?branch=master)](http://inch-ci.org/github/drapergem/draper)
4
+ [![Code Climate](https://codeclimate.com/github/drapergem/draper.svg)](https://codeclimate.com/github/drapergem/draper)
5
+ [![Inline docs](http://inch-ci.org/github/drapergem/draper.svg?branch=master)](http://inch-ci.org/github/drapergem/draper)
6
6
 
7
7
  Draper adds an object-oriented layer of presentation logic to your Rails
8
8
  application.
@@ -48,7 +48,7 @@ end
48
48
  But it makes you a little uncomfortable. `publication_status` lives in a
49
49
  nebulous namespace spread across all controllers and view. Down the road, you
50
50
  might want to display the publication status of a `Book`. And, of course, your
51
- design calls for a slighly different formatting to the date for a `Book`.
51
+ design calls for a slightly different formatting to the date for a `Book`.
52
52
 
53
53
  Now your helper method can either switch based on the input class type (poor
54
54
  Ruby style), or you break it out into two methods, `book_publication_status` and
@@ -107,13 +107,13 @@ Decorators are the ideal place to:
107
107
 
108
108
  ## Installation
109
109
 
110
- Add Draper to your Gemfile:
110
+ As of version 3.0.0, Draper is only compatible with Rails 5 / Ruby 2.2 and later. Add Draper to your Gemfile.
111
111
 
112
112
  ```ruby
113
- gem 'draper', '~> 1.3'
113
+ gem 'draper'
114
114
  ```
115
115
 
116
- And run `bundle install` within your app's directory.
116
+ After that, run `bundle install` within your app's directory.
117
117
 
118
118
  If you're upgrading from a 0.x release, the major changes are outlined [in the
119
119
  wiki](https://github.com/drapergem/draper/wiki/Upgrading-to-1.0).
@@ -132,6 +132,12 @@ end
132
132
 
133
133
  ### Generators
134
134
 
135
+ To create an `ApplicationDecorator` that all generated decorators inherit from, run...
136
+
137
+ ```
138
+ rails generate draper:install
139
+ ```
140
+
135
141
  When you have Draper installed and generate a controller...
136
142
 
137
143
  ```
@@ -276,6 +282,19 @@ omitted.
276
282
  delegate :current_page, :per_page, :offset, :total_entries, :total_pages
277
283
  ```
278
284
 
285
+ If needed, you can then set the collection_decorator_class of your CustomDecorator as follows:
286
+ ```ruby
287
+ class ArticleDecorator < Draper::Decorator
288
+ def self.collection_decorator_class
289
+ PaginatingDecorator
290
+ end
291
+ end
292
+
293
+ ArticleDecorator.decorate_collection(@articles.paginate)
294
+ # => Collection decorated by PaginatingDecorator
295
+ # => Members decorated by ArticleDecorator
296
+ ```
297
+
279
298
  ### Decorating Associated Objects
280
299
 
281
300
  You can automatically decorate associated models when the primary model is
@@ -348,6 +367,18 @@ you'll have access to an ArticleDecorator object instead. In your controller you
348
367
  can continue to use the `@article` instance variable to manipulate the model -
349
368
  for example, `@article.comments.build` to add a new blank comment for a form.
350
369
 
370
+ ## Configuration
371
+ Draper works out the box well, but also provides a hook for you to configure its
372
+ default functionality. For example, Draper assumes you have a base `ApplicationController`.
373
+ If your base controller is named something different (e.g. `BaseController`),
374
+ you can tell Draper to use it by adding the following to an initializer:
375
+
376
+ ```ruby
377
+ Draper.configure do |config|
378
+ config.default_controller = BaseController
379
+ end
380
+ ```
381
+
351
382
  ## Testing
352
383
 
353
384
  Draper supports RSpec, MiniTest::Rails, and Test::Unit, and will add the
@@ -379,6 +410,15 @@ In your `Spork.prefork` block of `spec_helper.rb`, add this:
379
410
  require 'draper/test/rspec_integration'
380
411
  ```
381
412
 
413
+ #### Custom Draper Controller ViewContext
414
+ If running tests in an engine setting with a controller other than "ApplicationController," set a custom controller in `spec_helper.rb`
415
+
416
+ ```ruby
417
+ config.before(:each, type: :decorator) do |example|
418
+ Draper::ViewContext.controller = ExampleEngine::CustomRootController.new
419
+ end
420
+ ```
421
+
382
422
  ### Isolated Tests
383
423
 
384
424
  In tests, Draper needs to build a view context to access helper methods. By
@@ -455,7 +495,10 @@ end
455
495
 
456
496
  When your decorator calls `delegate_all`, any method called on the decorator not
457
497
  defined in the decorator itself will be delegated to the decorated object. This
458
- is a very permissive interface.
498
+ includes calling `super` from within the decorator. A call to `super` from within
499
+ the decorator will first try to call the method on the parent decorator class. If
500
+ the method does not exist on the parent decorator class, it will then try to call
501
+ the method on the decorated `object`. This is a very permissive interface.
459
502
 
460
503
  If you want to strictly control which methods are called within views, you can
461
504
  choose to only delegate certain methods from the decorator to the source model:
@@ -564,13 +607,15 @@ end
564
607
 
565
608
  This is only necessary when proxying class methods.
566
609
 
610
+ Once this association between the decorator and the model is set up, you can call
611
+ `SomeModel.decorator_class` to access class methods defined in the decorator.
612
+ If necessary, you can check if your model is decorated with `SomeModel.decorator_class?`.
613
+
567
614
  ### Making Models Decoratable
568
615
 
569
616
  Models get their `decorate` method from the `Draper::Decoratable` module, which
570
617
  is included in `ActiveRecord::Base` and `Mongoid::Document` by default. If
571
- you're [using another
572
- ORM](https://github.com/drapergem/draper/wiki/Using-other-ORMs) (including
573
- versions of Mongoid prior to 3.0), or want to decorate plain old Ruby objects,
618
+ you're using another ORM, or want to decorate plain old Ruby objects,
574
619
  you can include this module manually.
575
620
 
576
621
  ## Contributors
@@ -579,9 +624,14 @@ Draper was conceived by Jeff Casimir and heavily refined by Steve Klabnik and a
579
624
  great community of open source
580
625
  [contributors](https://github.com/drapergem/draper/contributors).
581
626
 
582
- ### Core Team
627
+ ### Current maintainers
628
+
629
+ * Cliff Braton (cliff.braton@gmail.com)
630
+
631
+ ### Historical maintainers
583
632
 
584
633
  * Jeff Casimir (jeff@jumpstartlab.com)
585
634
  * Steve Klabnik (steve@jumpstartlab.com)
586
635
  * Vasiliy Ermolovich
587
636
  * Andrew Haines
637
+ * Sean Linsley
data/Rakefile CHANGED
@@ -64,6 +64,6 @@ namespace "db" do
64
64
  run_in_dummy_app "rm -f db/*.sqlite3"
65
65
  run_in_dummy_app "RAILS_ENV=development rake db:schema:load db:seed"
66
66
  run_in_dummy_app "RAILS_ENV=production rake db:schema:load db:seed"
67
- run_in_dummy_app "RAILS_ENV=test rake db:schema:load"
67
+ run_in_dummy_app "RAILS_ENV=test rake db:environment:set db:schema:load"
68
68
  end
69
69
  end
data/draper.gemspec CHANGED
@@ -1,6 +1,4 @@
1
- # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path("../lib", __FILE__)
3
- require "draper/version"
1
+ require File.join(__dir__, "lib", "draper", "version")
4
2
 
5
3
  Gem::Specification.new do |s|
6
4
  s.name = "draper"
@@ -17,15 +15,19 @@ Gem::Specification.new do |s|
17
15
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
18
16
  s.require_paths = ["lib"]
19
17
 
20
- s.add_dependency 'activesupport', '>= 3.0'
21
- s.add_dependency 'actionpack', '>= 3.0'
18
+ s.required_ruby_version = '>= 2.2.2'
19
+
20
+ s.add_dependency 'activesupport', '~> 5.0'
21
+ s.add_dependency 'actionpack', '~> 5.0'
22
22
  s.add_dependency 'request_store', '~> 1.0'
23
- s.add_dependency 'activemodel', '>= 3.0'
23
+ s.add_dependency 'activemodel', '~> 5.0'
24
+ s.add_dependency 'activemodel-serializers-xml', '~> 1.0'
24
25
 
25
26
  s.add_development_dependency 'ammeter'
26
- s.add_development_dependency 'rake', '>= 0.9.2'
27
- s.add_development_dependency 'rspec-rails', '~> 3.2'
28
- s.add_development_dependency 'minitest-rails', '>= 1.0'
27
+ s.add_development_dependency 'rake'
28
+ s.add_development_dependency 'rspec-rails'
29
+ s.add_development_dependency 'minitest-rails'
29
30
  s.add_development_dependency 'capybara'
30
- s.add_development_dependency 'active_model_serializers'
31
+ s.add_development_dependency 'active_model_serializers', '~> 0.10'
32
+ s.add_development_dependency 'rubocop'
31
33
  end
data/lib/draper.rb CHANGED
@@ -9,7 +9,9 @@ require 'active_support/core_ext/hash/reverse_merge'
9
9
  require 'active_support/core_ext/name_error'
10
10
 
11
11
  require 'draper/version'
12
+ require 'draper/configuration'
12
13
  require 'draper/view_helpers'
14
+ require 'draper/compatibility/api_only'
13
15
  require 'draper/delegation'
14
16
  require 'draper/automatic_delegation'
15
17
  require 'draper/finders'
@@ -27,13 +29,16 @@ require 'draper/decorates_assigned'
27
29
  require 'draper/railtie' if defined?(Rails)
28
30
 
29
31
  module Draper
32
+ extend Draper::Configuration
33
+
30
34
  def self.setup_action_controller(base)
31
35
  base.class_eval do
36
+ include Draper::Compatibility::ApiOnly if base == ActionController::API
32
37
  include Draper::ViewContext
33
38
  extend Draper::HelperSupport
34
39
  extend Draper::DecoratesAssigned
35
40
 
36
- before_filter :activate_draper
41
+ before_action :activate_draper
37
42
  end
38
43
  end
39
44
 
@@ -55,9 +60,9 @@ module Draper
55
60
  end
56
61
  end
57
62
 
58
- class UninferrableSourceError < NameError
63
+ class UninferrableObjectError < NameError
59
64
  def initialize(klass)
60
- super("Could not infer a source for #{klass}.")
65
+ super("Could not infer an object for #{klass}.")
61
66
  end
62
67
  end
63
68
  end
@@ -2,12 +2,14 @@ module Draper
2
2
  module AutomaticDelegation
3
3
  extend ActiveSupport::Concern
4
4
 
5
- # Delegates missing instance methods to the source object.
5
+ # Delegates missing instance methods to the source object. Note: This will delegate `super`
6
+ # method calls to `object` as well. Calling `super` will first try to call the method on
7
+ # the parent decorator class. If no method exists on the parent class, it will then try
8
+ # to call the method on the `object`.
6
9
  def method_missing(method, *args, &block)
7
10
  return super unless delegatable?(method)
8
11
 
9
- self.class.delegate method
10
- send(method, *args, &block)
12
+ object.send(method, *args, &block)
11
13
  end
12
14
 
13
15
  # Checks if the decorator responds to an instance method, or is able to
@@ -42,17 +42,7 @@ module Draper
42
42
  @decorated_collection ||= object.map{|item| decorate_item(item)}
43
43
  end
44
44
 
45
- # Delegated to the decorated collection when using the block form
46
- # (`Enumerable#find`) or to the decorator class if not
47
- # (`ActiveRecord::FinderMethods#find`)
48
- def find(*args, &block)
49
- if block_given?
50
- decorated_collection.find(*args, &block)
51
- else
52
- ActiveSupport::Deprecation.warn("Using ActiveRecord's `find` on a CollectionDecorator is deprecated. Call `find` on a model, and then decorate the result", caller)
53
- decorate_item(object.find(*args))
54
- end
55
- end
45
+ delegate :find, to: :decorated_collection
56
46
 
57
47
  def to_s
58
48
  "#<#{self.class.name} of #{decorator_class || "inferred decorators"} for #{object.inspect}>"