draper 4.0.2 → 4.0.4

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.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +41 -25
  3. data/.rspec +1 -2
  4. data/CHANGELOG.md +18 -0
  5. data/Gemfile +27 -5
  6. data/README.md +23 -1
  7. data/draper.gemspec +3 -3
  8. data/lib/draper/automatic_delegation.rb +14 -4
  9. data/lib/draper/decoratable/collection_proxy.rb +15 -0
  10. data/lib/draper/decoratable.rb +2 -2
  11. data/lib/draper/query_methods.rb +1 -1
  12. data/lib/draper/railtie.rb +8 -4
  13. data/lib/draper/version.rb +1 -1
  14. data/lib/draper/view_context/build_strategy.rb +1 -9
  15. data/lib/draper.rb +0 -6
  16. data/spec/draper/decoratable_spec.rb +1 -1
  17. data/spec/draper/decorator_spec.rb +2 -2
  18. data/spec/draper/factory_spec.rb +8 -8
  19. data/spec/draper/query_methods_spec.rb +10 -0
  20. data/spec/draper/view_context/build_strategy_spec.rb +1 -18
  21. data/spec/dummy/.rspec +0 -1
  22. data/spec/dummy/app/decorators/comment_decorator.rb +13 -0
  23. data/spec/dummy/app/decorators/mongoid_post_decorator.rb +1 -3
  24. data/spec/dummy/app/models/admin.rb +2 -4
  25. data/spec/dummy/app/models/comment.rb +3 -0
  26. data/spec/dummy/app/models/mongoid_post.rb +2 -4
  27. data/spec/dummy/app/models/post.rb +4 -0
  28. data/spec/dummy/app/models/user.rb +2 -4
  29. data/spec/dummy/config/application.rb +22 -51
  30. data/spec/dummy/config/environments/development.rb +65 -22
  31. data/spec/dummy/config/environments/production.rb +76 -33
  32. data/spec/dummy/config/environments/test.rb +55 -21
  33. data/spec/dummy/config/initializers/draper.rb +4 -2
  34. data/spec/dummy/db/migrate/20240907041839_create_comments.rb +9 -0
  35. data/spec/dummy/db/schema.rb +16 -9
  36. data/spec/dummy/spec/decorators/active_model_serializers_spec.rb +1 -1
  37. data/spec/dummy/spec/decorators/post_decorator_spec.rb +1 -1
  38. data/spec/dummy/spec/jobs/publish_post_job_spec.rb +2 -0
  39. data/spec/dummy/spec/models/post_spec.rb +41 -5
  40. data/spec/dummy/spec/rails_helper.rb +69 -0
  41. data/spec/dummy/spec/spec_helper.rb +90 -5
  42. data/spec/performance/benchmark.rb +1 -1
  43. data/spec/support/dummy_app.rb +1 -1
  44. metadata +22 -13
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6b009279cf28737a6fcf4027fc26f3dc2a955741c7c5e5d2220c8dcb383490e3
4
- data.tar.gz: 22455a3a7126650483af269d6a0e432a5a4465a59c762518ce78f40bcecb4286
3
+ metadata.gz: 78c5e444690de191d46a5be87ed46a3f9be6ec0ffd59fed6dcd1d63e5d527b85
4
+ data.tar.gz: f92be8ee42d8ce2e48c1743077f758eef779296593fcbcdef9a82fd5937a03ae
5
5
  SHA512:
6
- metadata.gz: 2fd6c0b87227c23320e9ee211b4b2001c81cbf76d103a12e5076f427954febdb2d0366d5182f16b27f5155717ad878f08671098f8b1f9986c137ec053e1637bf
7
- data.tar.gz: 260d4eccd57c623c966422cd256ab1485e1ce4bbaea05d2c6f615cdb644ab0147f00e8917b8165eba78651f279b66cde0a13da38b1c5cc9dc6a0e49822db2361
6
+ metadata.gz: 2b2d10594f175019d7cbee9b7af7f811c8978349abae3cdce746abd94f24501d81b519c9da9ae350658265dd5aa0b33cdd9b3f18e26df922363227df8f57c4a4
7
+ data.tar.gz: 81565fd7b8034294a41c49b557f48619e6cee814056d2d4bff4c0e6f17c024877b250b421d4a185310f6b6fa3dee14b51d954b6ee3cef39100d3cfb4c9582af7
@@ -2,21 +2,42 @@
2
2
  name: CI
3
3
 
4
4
  on:
5
- - push
6
- - pull_request
5
+ push:
6
+ branches:
7
+ - master
8
+ pull_request:
9
+
10
+ permissions:
11
+ contents: read
7
12
 
8
13
  jobs:
9
14
  rspec:
10
- runs-on: ubuntu-20.04
15
+ name: >-
16
+ rspec (${{ matrix.ruby }})
17
+
18
+ runs-on: ubuntu-latest
19
+
11
20
  strategy:
12
21
  fail-fast: false
13
22
  matrix:
14
23
  ruby:
15
- - '3.0'
16
- - '2.7'
17
- - '2.6'
18
- - '2.5'
19
- - '2.4'
24
+ - 3.3
25
+ - 3.2
26
+ - 3.1
27
+ rails:
28
+ - 7.2
29
+ include:
30
+ # Edge
31
+ - { ruby: 'head', rails: 'edge', allow-fail: true }
32
+ # Outdated
33
+ - { ruby: '3.0', rails: '7.1' }
34
+ - { ruby: '2.7', rails: '6' } # RSpec AR Expectations support Rails 7.1 since Ruby 3.0
35
+ - { ruby: '2.6', rails: '6' }
36
+ - { ruby: '2.5', rails: '6' }
37
+ - { ruby: '2.4', rails: '5' }
38
+
39
+ env:
40
+ RAILS_VERSION: "${{ matrix.rails }}"
20
41
 
21
42
  services:
22
43
  mongodb:
@@ -25,31 +46,26 @@ jobs:
25
46
  - 27017:27017
26
47
 
27
48
  steps:
28
- - name: Checkout
29
- uses: actions/checkout@v2
49
+ - uses: actions/checkout@v4
30
50
 
31
51
  - name: Setup Ruby
32
52
  uses: ruby/setup-ruby@v1
33
53
  with:
34
54
  ruby-version: ${{ matrix.ruby }}
35
-
36
- - name: Setup Ruby cache
37
- uses: actions/cache@v2
38
- with:
39
- path: vendor/bundle
40
- key: ${{ runner.os }}-gems-${{ matrix.ruby }}-${{ hashFiles('**/Gemfile.lock') }}
41
- restore-keys: |
42
- ${{ runner.os }}-gems-${{ matrix.ruby }}-
43
-
44
- - name: Bundle
45
- run: |
46
- gem install bundler
47
- bundle config path vendor/bundle
48
- bundle install --jobs 4 --retry 3
55
+ rubygems: latest
56
+ bundler-cache: true
49
57
 
50
58
  - name: RSpec & publish code coverage
51
- uses: paambaati/codeclimate-action@v2.7.5
59
+ uses: paambaati/codeclimate-action@v8
52
60
  env:
53
61
  CC_TEST_REPORTER_ID: b7ba588af2a540fa96c267b3655a2afe31ea29976dc25905a668dd28d5e88915
54
62
  with:
55
63
  coverageCommand: bin/rake
64
+ continue-on-error: ${{ matrix.allow-fail }}
65
+ id: test
66
+
67
+ - name: >-
68
+ Test ${{ steps.test.outcome }}
69
+ run: |
70
+ echo Ruby ${{ matrix.ruby }}
71
+ echo Rails ${{ matrix.rails }}
data/.rspec CHANGED
@@ -1,2 +1 @@
1
- --color
2
- --order rand
1
+ --format progress
data/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # Draper Changelog
2
2
 
3
+ ## 4.0.4 - 2025-01-28
4
+
5
+ ### Fixes
6
+ * Fix a `LoadError` caused by a cherry-pick issue in version 4.0.3
7
+
8
+ ## 4.0.3 - 2025-01-27
9
+
10
+ Added support for latest Ruby (upto 3.4) and Rails (upto 8) versions.
11
+
12
+ ### Fixes
13
+ * Fix `CollectionDecorator#respond_to?` for non-ORM collections [#920](https://github.com/drapergem/draper/pull/920)
14
+ * Fix issues with using Draper outside of controller scope [#927](https://github.com/drapergem/draper/pull/927)
15
+ * Fix decoration of AR associations [#932](https://github.com/drapergem/draper/pull/932)
16
+
17
+ ### Other Changes
18
+ * Improve performance of delegation via `delegate_all` [#911](https://github.com/drapergem/draper/pull/911)
19
+ * Improve README [#878](https://github.com/drapergem/draper/pull/878), [#922](https://github.com/drapergem/draper/pull/922), [#934](https://github.com/drapergem/draper/pull/934)
20
+
3
21
  ## 4.0.2 - 2021-05-27
4
22
 
5
23
  ### Fixes
data/Gemfile CHANGED
@@ -2,6 +2,8 @@ source "https://rubygems.org"
2
2
 
3
3
  gemspec
4
4
 
5
+ gem 'puma'
6
+
5
7
  platforms :ruby do
6
8
  if RUBY_VERSION >= "2.5.0"
7
9
  gem 'sqlite3'
@@ -15,10 +17,30 @@ platforms :jruby do
15
17
  gem "activerecord-jdbcsqlite3-adapter"
16
18
  end
17
19
 
18
- if RUBY_VERSION >= "2.5.0"
19
- gem "rails", "~> 6.0"
20
- gem 'webrick'
20
+ case rails_version = ENV['RAILS_VERSION']
21
+ when nil
22
+ gem 'rails'
23
+ when 'edge'
24
+ gem 'rails', github: 'rails/rails'
21
25
  else
22
- gem "rails", "~> 5.0"
26
+ gem 'rails', "~> #{rails_version}.0"
27
+ end
28
+
29
+ gem 'mongoid' unless
30
+ rails_version == 'edge'
31
+ gem 'active_model_serializers'
32
+
33
+ case RUBY_VERSION
34
+ when '2.6'...'3.0'
35
+ gem "turbo-rails", "<= 2.0.7"
36
+ gem "redis", "~> 4.0"
37
+ when '3.0'...'4'
38
+ gem 'turbo-rails'
39
+ gem 'redis', '~> 4.0'
40
+ end
41
+
42
+ if RUBY_VERSION < "2.5.0"
43
+ gem 'rspec-activerecord-expectations', '~> 1.2.0'
44
+ gem 'simplecov', '0.17.1'
45
+ gem "loofah", "< 2.21.0" # Workaround for `uninitialized constant Nokogiri::HTML4`
23
46
  end
24
- gem "mongoid", github: "mongodb/mongoid"
data/README.md CHANGED
@@ -131,6 +131,17 @@ class ArticleDecorator < Draper::Decorator
131
131
  end
132
132
  ```
133
133
 
134
+
135
+ To decorate a model in a namespace e.g. `Admin::Catalogue` place the decorator under the
136
+ directory `app/decorators/admin` in the same way you would with views and models.
137
+
138
+ ```ruby
139
+ # app/decorators/admin/catalogue_decorator.rb
140
+ class Admin::CatalogueDecorator < Draper::Decorator
141
+ # ...
142
+ end
143
+ ```
144
+
134
145
  ### Generators
135
146
 
136
147
  To create an `ApplicationDecorator` that all generated decorators inherit from, run...
@@ -155,6 +166,15 @@ rails generate decorator Article
155
166
 
156
167
  ...to create the `ArticleDecorator`.
157
168
 
169
+ If you don't want Rails to generate decorator files when generating a new controller,
170
+ you can add the following configuration to your `config/application.rb` file:
171
+
172
+ ```ruby
173
+ config.generators do |g|
174
+ g.decorator false
175
+ end
176
+ ```
177
+
158
178
  ### Accessing Helpers
159
179
 
160
180
  Normal Rails helpers are still useful for lots of tasks. Both Rails' provided
@@ -664,7 +684,8 @@ great community of open source
664
684
 
665
685
  ### Current maintainers
666
686
 
667
- * Cliff Braton (cliff.braton@gmail.com)
687
+ * Alexander Senko (Alexander.Senko@gmail.com)
688
+ * Yuji Yaginuma (yuuji.yaginuma@gmail.com)
668
689
 
669
690
  ### Historical maintainers
670
691
 
@@ -673,3 +694,4 @@ great community of open source
673
694
  * Vasiliy Ermolovich
674
695
  * Andrew Haines
675
696
  * Sean Linsley
697
+ * Cliff Braton (cliff.braton@gmail.com)
data/draper.gemspec CHANGED
@@ -5,7 +5,7 @@ Gem::Specification.new do |s|
5
5
  s.version = Draper::VERSION
6
6
  s.authors = ["Jeff Casimir", "Steve Klabnik"]
7
7
  s.email = ["jeff@casimircreative.com", "steve@steveklabnik.com"]
8
- s.homepage = "http://github.com/drapergem/draper"
8
+ s.homepage = "https://github.com/drapergem/draper"
9
9
  s.summary = "View Models for Rails"
10
10
  s.description = "Draper adds an object-oriented layer of presentation logic to your Rails apps."
11
11
  s.license = "MIT"
@@ -26,9 +26,9 @@ Gem::Specification.new do |s|
26
26
  s.add_development_dependency 'ammeter'
27
27
  s.add_development_dependency 'rake'
28
28
  s.add_development_dependency 'rspec-rails'
29
+ s.add_development_dependency 'rspec-activerecord-expectations'
29
30
  s.add_development_dependency 'minitest-rails'
30
31
  s.add_development_dependency 'capybara'
31
- s.add_development_dependency 'active_model_serializers', '>= 0.10'
32
32
  s.add_development_dependency 'rubocop'
33
- s.add_development_dependency 'simplecov', '0.17.1'
33
+ s.add_development_dependency 'simplecov'
34
34
  end
@@ -18,11 +18,21 @@ module Draper
18
18
  super || delegatable?(method)
19
19
  end
20
20
 
21
- # @private
22
- def delegatable?(method)
23
- return if private_methods(false).include?(method)
21
+ # The inherit argument for `private_method_defined?` is supported since Ruby 2.6.
22
+ if RUBY_VERSION >= "2.6"
23
+ # @private
24
+ def delegatable?(method)
25
+ return if self.class.private_method_defined?(method, false)
24
26
 
25
- object.respond_to?(method)
27
+ object.respond_to?(method)
28
+ end
29
+ else
30
+ # @private
31
+ def delegatable?(method)
32
+ return if private_methods(false).include?(method)
33
+
34
+ object.respond_to?(method)
35
+ end
26
36
  end
27
37
 
28
38
  module ClassMethods
@@ -0,0 +1,15 @@
1
+ module Draper
2
+ module Decoratable
3
+ module CollectionProxy
4
+ # Decorates a collection of objects. Used at the end of a scope chain.
5
+ #
6
+ # @example
7
+ # company.products.popular.decorate
8
+ # @param [Hash] options
9
+ # see {Decorator.decorate_collection}.
10
+ def decorate(options = {})
11
+ decorator_class.decorate_collection(load_target, options.reverse_merge(with: nil))
12
+ end
13
+ end
14
+ end
15
+ end
@@ -11,6 +11,8 @@ module Draper
11
11
  extend ActiveSupport::Concern
12
12
  include Draper::Decoratable::Equality
13
13
 
14
+ autoload :CollectionProxy, 'draper/decoratable/collection_proxy'
15
+
14
16
  # Decorates the object using the inferred {#decorator_class}.
15
17
  # @param [Hash] options
16
18
  # see {Decorator#initialize}
@@ -87,8 +89,6 @@ module Draper
87
89
  def ===(other)
88
90
  super || (other.is_a?(Draper::Decorator) && super(other.object))
89
91
  end
90
-
91
92
  end
92
-
93
93
  end
94
94
  end
@@ -10,7 +10,7 @@ module Draper
10
10
  end
11
11
 
12
12
  def respond_to_missing?(method, include_private = false)
13
- strategy.allowed?(method) || super
13
+ object.respond_to?(method) && strategy.allowed?(method) || super
14
14
  end
15
15
 
16
16
  private
@@ -33,10 +33,14 @@ module Draper
33
33
  end
34
34
 
35
35
  initializer 'draper.setup_orm' do
36
- [:active_record, :mongoid].each do |orm|
37
- ActiveSupport.on_load orm do
38
- Draper.setup_orm self
39
- end
36
+ ActiveSupport.on_load :active_record do
37
+ include Draper::Decoratable
38
+
39
+ ActiveRecord::Associations::CollectionProxy.include Draper::Decoratable::CollectionProxy
40
+ end
41
+
42
+ ActiveSupport.on_load :mongoid do
43
+ include Draper::Decoratable
40
44
  end
41
45
  end
42
46
 
@@ -1,3 +1,3 @@
1
1
  module Draper
2
- VERSION = '4.0.2'
2
+ VERSION = '4.0.4'
3
3
  end
@@ -38,17 +38,9 @@ module Draper
38
38
  def controller
39
39
  Draper::ViewContext.controller ||= Draper.default_controller.new
40
40
  Draper::ViewContext.controller.tap do |controller|
41
- controller.request ||= new_test_request controller if defined?(ActionController::TestRequest)
41
+ controller.request ||= ActionDispatch::TestRequest.create
42
42
  end
43
43
  end
44
-
45
- def new_test_request(controller)
46
- is_above_rails_5_1 ? ActionController::TestRequest.create(controller) : ActionController::TestRequest.create
47
- end
48
-
49
- def is_above_rails_5_1
50
- ActionController::TestRequest.method(:create).parameters.first == [:req, :controller_class]
51
- end
52
44
  end
53
45
  end
54
46
  end
data/lib/draper.rb CHANGED
@@ -51,12 +51,6 @@ module Draper
51
51
  end
52
52
  end
53
53
 
54
- def self.setup_orm(base)
55
- base.class_eval do
56
- include Draper::Decoratable
57
- end
58
- end
59
-
60
54
  class UninferrableDecoratorError < NameError
61
55
  def initialize(klass)
62
56
  super("Could not infer a decorator for #{klass}.")
@@ -147,7 +147,7 @@ module Draper
147
147
  scoped = [Product.new]
148
148
  allow(Product).to receive(:all).and_return(scoped)
149
149
 
150
- expect(Product.decorator_class).to receive(:decorate_collection).with(scoped, with: nil).and_return(:decorated_collection)
150
+ expect(Product.decorator_class).to receive(:decorate_collection).with(scoped, {with: nil}).and_return(:decorated_collection)
151
151
  expect(Product.decorate).to be :decorated_collection
152
152
  end
153
153
 
@@ -118,7 +118,7 @@ module Draper
118
118
  it "creates a CollectionDecorator using itself for each item" do
119
119
  object = [Model.new]
120
120
 
121
- expect(CollectionDecorator).to receive(:new).with(object, with: Decorator)
121
+ expect(CollectionDecorator).to receive(:new).with(object, {with: Decorator})
122
122
  Decorator.decorate_collection(object)
123
123
  end
124
124
 
@@ -134,7 +134,7 @@ module Draper
134
134
  it "creates a custom collection decorator using itself for each item" do
135
135
  object = [Model.new]
136
136
 
137
- expect(ProductsDecorator).to receive(:new).with(object, with: ProductDecorator)
137
+ expect(ProductsDecorator).to receive(:new).with(object, {with: ProductDecorator})
138
138
  ProductDecorator.decorate_collection(object)
139
139
  end
140
140
 
@@ -73,17 +73,17 @@ module Draper
73
73
  worker = ->(*){}
74
74
  allow(Factory::Worker).to receive_messages new: worker
75
75
 
76
- expect(worker).to receive(:call).with(baz: "qux", context: {foo: "bar"})
76
+ expect(worker).to receive(:call).with({baz: "qux", context: {foo: "bar"}})
77
77
  factory.decorate(double, {baz: "qux"})
78
78
  end
79
79
 
80
80
  it "is overridden by explicitly-specified context" do
81
- factory = Factory.new(context: {foo: "bar"})
81
+ factory = Factory.new({context: {foo: "bar"}})
82
82
  worker = ->(*){}
83
83
  allow(Factory::Worker).to receive_messages new: worker
84
84
 
85
- expect(worker).to receive(:call).with(context: {baz: "qux"})
86
- factory.decorate(double, context: {baz: "qux"})
85
+ expect(worker).to receive(:call).with({context: {baz: "qux"}})
86
+ factory.decorate(double, {context: {baz: "qux"}})
87
87
  end
88
88
  end
89
89
  end
@@ -109,7 +109,7 @@ module Draper
109
109
  allow(worker).to receive_messages decorator: decorator
110
110
  context = {foo: "bar"}
111
111
 
112
- expect(decorator).to receive(:call).with(anything(), context: context)
112
+ expect(decorator).to receive(:call).with(anything(), {context: context})
113
113
  worker.call(context: ->{ context })
114
114
  end
115
115
 
@@ -140,7 +140,7 @@ module Draper
140
140
  allow(worker).to receive_messages decorator: decorator
141
141
  context = {foo: "bar"}
142
142
 
143
- expect(decorator).to receive(:call).with(anything(), context: context)
143
+ expect(decorator).to receive(:call).with(anything(), {context: context})
144
144
  worker.call(context: context)
145
145
  end
146
146
  end
@@ -150,7 +150,7 @@ module Draper
150
150
  decorator = ->(*){}
151
151
  allow(worker).to receive_messages decorator: decorator
152
152
 
153
- expect(decorator).to receive(:call).with(anything(), foo: "bar")
153
+ expect(decorator).to receive(:call).with(anything(), {foo: "bar"})
154
154
  worker.call(foo: "bar", context_args: [])
155
155
  end
156
156
  end
@@ -228,7 +228,7 @@ module Draper
228
228
  allow(object).to receive(:decorate){ nil }
229
229
  worker = Factory::Worker.new(nil, object)
230
230
 
231
- expect(decorator_class).to receive(:decorate_collection).with(object, foo: "bar", with: nil).and_return(:decorated)
231
+ expect(decorator_class).to receive(:decorate_collection).with(object, {foo: "bar", with: nil}).and_return(:decorated)
232
232
  expect(worker.decorator.call(object, foo: "bar")).to be :decorated
233
233
  end
234
234
  end
@@ -53,14 +53,24 @@ module Draper
53
53
  context 'when strategy allows collection to call the method' do
54
54
  before do
55
55
  allow(fake_strategy).to receive(:allowed?).with(:some_query_method).and_return(true)
56
+ allow(collection).to receive(:respond_to?).with(:some_query_method).and_return(true)
56
57
  end
57
58
 
58
59
  it { is_expected.to eq(true) }
60
+
61
+ context 'and collection does not implement the method' do
62
+ before do
63
+ allow(collection).to receive(:respond_to?).with(:some_query_method).and_return(false)
64
+ end
65
+
66
+ it { is_expected.to eq(false) }
67
+ end
59
68
  end
60
69
 
61
70
  context 'when strategy does not allow collection to call the method' do
62
71
  before do
63
72
  allow(fake_strategy).to receive(:allowed?).with(:some_query_method).and_return(false)
73
+ allow(collection).to receive(:respond_to?).with(:some_query_method).and_return(true)
64
74
  end
65
75
 
66
76
  it { is_expected.to eq(false) }
@@ -37,7 +37,7 @@ module Draper
37
37
 
38
38
  expect(controller.request).to be_nil
39
39
  strategy.call
40
- expect(controller.request).to be_an ActionController::TestRequest
40
+ expect(controller.request).to be_an ActionDispatch::TestRequest
41
41
  expect(controller.params).to be_empty
42
42
 
43
43
  # sanity checks
@@ -45,23 +45,6 @@ module Draper
45
45
  expect(controller.view_context.params).to be controller.params
46
46
  end
47
47
 
48
- it "compatible with rails 5.1 change on ActionController::TestRequest.create method" do
49
- ActionController::TestRequest.class_eval do
50
- if ActionController::TestRequest.method(:create).parameters.first == []
51
- def create controller_class
52
- create
53
- end
54
- end
55
- end
56
- controller = Class.new(ActionController::Base).new
57
- allow(ViewContext).to receive_messages controller: controller
58
- strategy = ViewContext::BuildStrategy::Full.new
59
-
60
- expect(controller.request).to be_nil
61
- strategy.call
62
- expect(controller.request).to be_an ActionController::TestRequest
63
- end
64
-
65
48
  it "adds methods to the view context from the constructor block" do
66
49
  allow(ViewContext).to receive(:controller).and_return(fake_controller)
67
50
  strategy = ViewContext::BuildStrategy::Full.new do
data/spec/dummy/.rspec CHANGED
@@ -1,2 +1 @@
1
- --color
2
1
  --format progress
@@ -0,0 +1,13 @@
1
+ class CommentDecorator < Draper::Decorator
2
+ delegate_all
3
+
4
+ # Define presentation-specific methods here. Helpers are accessed through
5
+ # `helpers` (aka `h`). You can override attributes, for example:
6
+ #
7
+ # def created_at
8
+ # helpers.content_tag :span, class: 'time' do
9
+ # object.created_at.strftime("%a %m/%d/%y")
10
+ # end
11
+ # end
12
+
13
+ end
@@ -1,4 +1,2 @@
1
- if defined?(Mongoid)
2
- class MongoidPostDecorator < Draper::Decorator
3
- end
1
+ class MongoidPostDecorator < Draper::Decorator
4
2
  end
@@ -1,5 +1,3 @@
1
- if defined?(Devise)
2
- class Admin
3
- extend Devise::Models
4
- end
1
+ class Admin
2
+ extend Devise::Models if defined? Devise
5
3
  end
@@ -0,0 +1,3 @@
1
+ class Comment < ApplicationRecord
2
+ belongs_to :post
3
+ end
@@ -1,5 +1,3 @@
1
- if defined?(Mongoid)
2
- class MongoidPost
3
- include Mongoid::Document
4
- end
1
+ class MongoidPost
2
+ include Mongoid::Document if defined? Mongoid
5
3
  end
@@ -1,3 +1,7 @@
1
1
  class Post < ApplicationRecord
2
2
  # attr_accessible :title, :body
3
+
4
+ has_many :comments
5
+
6
+ broadcasts if defined? Turbo::Broadcastable
3
7
  end
@@ -1,5 +1,3 @@
1
- if defined?(Devise)
2
- class User
3
- extend Devise::Models
4
- end
1
+ class User
2
+ extend Devise::Models if defined? Devise
5
3
  end