draper 4.0.4 → 4.0.5

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 (129) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -0
  3. data/README.md +3 -6
  4. data/lib/draper/collection_decorator.rb +0 -6
  5. data/lib/draper/compatibility/broadcastable.rb +24 -0
  6. data/lib/draper/compatibility/global_id.rb +9 -5
  7. data/lib/draper/decoratable.rb +5 -0
  8. data/lib/draper/decorator.rb +2 -18
  9. data/lib/draper/railtie.rb +6 -1
  10. data/lib/draper/version.rb +1 -1
  11. metadata +4 -232
  12. data/.github/PULL_REQUEST_TEMPLATE.md +0 -24
  13. data/.github/workflows/ci.yml +0 -71
  14. data/.gitignore +0 -18
  15. data/Gemfile +0 -46
  16. data/bin/bundle +0 -114
  17. data/bin/rake +0 -29
  18. data/draper.gemspec +0 -34
  19. data/spec/draper/collection_decorator_spec.rb +0 -291
  20. data/spec/draper/configuration_spec.rb +0 -49
  21. data/spec/draper/decoratable/equality_spec.rb +0 -10
  22. data/spec/draper/decoratable_spec.rb +0 -235
  23. data/spec/draper/decorated_association_spec.rb +0 -82
  24. data/spec/draper/decorates_assigned_spec.rb +0 -71
  25. data/spec/draper/decorator_spec.rb +0 -872
  26. data/spec/draper/draper_spec.rb +0 -25
  27. data/spec/draper/factory_spec.rb +0 -247
  28. data/spec/draper/finders_spec.rb +0 -166
  29. data/spec/draper/helper_proxy_spec.rb +0 -61
  30. data/spec/draper/lazy_helpers_spec.rb +0 -21
  31. data/spec/draper/query_methods/load_strategy_spec.rb +0 -26
  32. data/spec/draper/query_methods_spec.rb +0 -80
  33. data/spec/draper/undecorate_chain_spec.rb +0 -20
  34. data/spec/draper/undecorate_spec.rb +0 -19
  35. data/spec/draper/view_context/build_strategy_spec.rb +0 -115
  36. data/spec/draper/view_context_spec.rb +0 -182
  37. data/spec/draper/view_helpers_spec.rb +0 -8
  38. data/spec/dummy/.rspec +0 -1
  39. data/spec/dummy/Rakefile +0 -7
  40. data/spec/dummy/app/assets/config/manifest.js +0 -3
  41. data/spec/dummy/app/controllers/application_controller.rb +0 -2
  42. data/spec/dummy/app/controllers/base_controller.rb +0 -4
  43. data/spec/dummy/app/controllers/localized_urls.rb +0 -5
  44. data/spec/dummy/app/controllers/posts_controller.rb +0 -20
  45. data/spec/dummy/app/decorators/comment_decorator.rb +0 -13
  46. data/spec/dummy/app/decorators/mongoid_post_decorator.rb +0 -2
  47. data/spec/dummy/app/decorators/post_decorator.rb +0 -60
  48. data/spec/dummy/app/helpers/application_helper.rb +0 -5
  49. data/spec/dummy/app/jobs/publish_post_job.rb +0 -7
  50. data/spec/dummy/app/mailers/application_mailer.rb +0 -3
  51. data/spec/dummy/app/mailers/post_mailer.rb +0 -19
  52. data/spec/dummy/app/models/admin.rb +0 -3
  53. data/spec/dummy/app/models/application_record.rb +0 -3
  54. data/spec/dummy/app/models/comment.rb +0 -3
  55. data/spec/dummy/app/models/mongoid_post.rb +0 -3
  56. data/spec/dummy/app/models/post.rb +0 -7
  57. data/spec/dummy/app/models/user.rb +0 -3
  58. data/spec/dummy/app/views/layouts/application.html.erb +0 -11
  59. data/spec/dummy/app/views/post_mailer/decorated_email.html.erb +0 -1
  60. data/spec/dummy/app/views/posts/_post.html.erb +0 -42
  61. data/spec/dummy/app/views/posts/show.html.erb +0 -1
  62. data/spec/dummy/bin/rails +0 -4
  63. data/spec/dummy/config/application.rb +0 -39
  64. data/spec/dummy/config/boot.rb +0 -5
  65. data/spec/dummy/config/database.yml +0 -25
  66. data/spec/dummy/config/environment.rb +0 -5
  67. data/spec/dummy/config/environments/development.rb +0 -78
  68. data/spec/dummy/config/environments/production.rb +0 -102
  69. data/spec/dummy/config/environments/test.rb +0 -69
  70. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
  71. data/spec/dummy/config/initializers/draper.rb +0 -5
  72. data/spec/dummy/config/initializers/filter_parameter_logging.rb +0 -4
  73. data/spec/dummy/config/initializers/inflections.rb +0 -15
  74. data/spec/dummy/config/initializers/mime_types.rb +0 -5
  75. data/spec/dummy/config/initializers/secret_token.rb +0 -8
  76. data/spec/dummy/config/initializers/session_store.rb +0 -8
  77. data/spec/dummy/config/locales/en.yml +0 -5
  78. data/spec/dummy/config/mongoid.yml +0 -142
  79. data/spec/dummy/config/routes.rb +0 -9
  80. data/spec/dummy/config/storage.yml +0 -7
  81. data/spec/dummy/config.ru +0 -4
  82. data/spec/dummy/db/migrate/20121019115657_create_posts.rb +0 -8
  83. data/spec/dummy/db/migrate/20240907041839_create_comments.rb +0 -9
  84. data/spec/dummy/db/schema.rb +0 -28
  85. data/spec/dummy/db/seeds.rb +0 -2
  86. data/spec/dummy/fast_spec/post_decorator_spec.rb +0 -37
  87. data/spec/dummy/lib/tasks/test.rake +0 -16
  88. data/spec/dummy/log/.gitkeep +0 -0
  89. data/spec/dummy/public/404.html +0 -26
  90. data/spec/dummy/public/422.html +0 -26
  91. data/spec/dummy/public/500.html +0 -25
  92. data/spec/dummy/public/favicon.ico +0 -0
  93. data/spec/dummy/script/rails +0 -6
  94. data/spec/dummy/spec/decorators/active_model_serializers_spec.rb +0 -12
  95. data/spec/dummy/spec/decorators/devise_spec.rb +0 -55
  96. data/spec/dummy/spec/decorators/helpers_spec.rb +0 -21
  97. data/spec/dummy/spec/decorators/post_decorator_spec.rb +0 -64
  98. data/spec/dummy/spec/decorators/spec_type_spec.rb +0 -7
  99. data/spec/dummy/spec/decorators/view_context_spec.rb +0 -22
  100. data/spec/dummy/spec/jobs/publish_post_job_spec.rb +0 -11
  101. data/spec/dummy/spec/mailers/post_mailer_spec.rb +0 -25
  102. data/spec/dummy/spec/models/application_spec.rb +0 -7
  103. data/spec/dummy/spec/models/mongoid_post_spec.rb +0 -8
  104. data/spec/dummy/spec/models/post_spec.rb +0 -51
  105. data/spec/dummy/spec/rails_helper.rb +0 -69
  106. data/spec/dummy/spec/shared_examples/decoratable.rb +0 -22
  107. data/spec/dummy/spec/spec_helper.rb +0 -93
  108. data/spec/dummy/test/decorators/minitest/devise_test.rb +0 -55
  109. data/spec/dummy/test/decorators/minitest/helpers_test.rb +0 -21
  110. data/spec/dummy/test/decorators/minitest/spec_type_test.rb +0 -52
  111. data/spec/dummy/test/decorators/minitest/view_context_test.rb +0 -24
  112. data/spec/dummy/test/decorators/test_unit/devise_test.rb +0 -55
  113. data/spec/dummy/test/decorators/test_unit/helpers_test.rb +0 -21
  114. data/spec/dummy/test/decorators/test_unit/view_context_test.rb +0 -24
  115. data/spec/dummy/test/minitest_helper.rb +0 -2
  116. data/spec/dummy/test/test_helper.rb +0 -3
  117. data/spec/generators/controller/controller_generator_spec.rb +0 -23
  118. data/spec/generators/decorator/decorator_generator_spec.rb +0 -93
  119. data/spec/generators/install/install_generator_spec.rb +0 -19
  120. data/spec/integration/integration_spec.rb +0 -70
  121. data/spec/performance/active_record.rb +0 -4
  122. data/spec/performance/benchmark.rb +0 -55
  123. data/spec/performance/decorators.rb +0 -45
  124. data/spec/performance/models.rb +0 -20
  125. data/spec/spec_helper.rb +0 -50
  126. data/spec/support/dummy_app.rb +0 -85
  127. data/spec/support/matchers/have_text.rb +0 -50
  128. data/spec/support/shared_examples/decoratable_equality.rb +0 -40
  129. data/spec/support/shared_examples/view_helpers.rb +0 -39
@@ -1,235 +0,0 @@
1
- require 'spec_helper'
2
- require 'support/shared_examples/decoratable_equality'
3
-
4
- module Draper
5
- describe Decoratable do
6
- describe "#decorate" do
7
- it "returns a decorator for self" do
8
- product = Product.new
9
- decorator = product.decorate
10
-
11
- expect(decorator).to be_a ProductDecorator
12
- expect(decorator.object).to be product
13
- end
14
-
15
- it "accepts context" do
16
- context = {some: "context"}
17
- decorator = Product.new.decorate(context: context)
18
-
19
- expect(decorator.context).to be context
20
- end
21
-
22
- it "uses the #decorator_class" do
23
- product = Product.new
24
- allow(product).to receive_messages decorator_class: OtherDecorator
25
-
26
- expect(product.decorate).to be_an_instance_of OtherDecorator
27
- end
28
- end
29
-
30
- describe "#applied_decorators" do
31
- it "returns an empty list" do
32
- expect(Product.new.applied_decorators).to eq []
33
- end
34
- end
35
-
36
- describe "#decorated_with?" do
37
- it "returns false" do
38
- expect(Product.new).not_to be_decorated_with Decorator
39
- end
40
- end
41
-
42
- describe "#decorated?" do
43
- it "returns false" do
44
- expect(Product.new).not_to be_decorated
45
- end
46
- end
47
-
48
- describe "#decorator_class?" do
49
- it "returns true for decoratable model" do
50
- expect(Product.new.decorator_class?).to be_truthy
51
- end
52
-
53
- it "returns false for non-decoratable model" do
54
- expect(Model.new.decorator_class?).to be_falsey
55
- end
56
- end
57
-
58
- describe ".decorator_class?" do
59
- it "returns true for decoratable model" do
60
- expect(Product.decorator_class?).to be_truthy
61
- end
62
-
63
- it "returns false for non-decoratable model" do
64
- expect(Model.decorator_class?).to be_falsey
65
- end
66
- end
67
-
68
- describe "#decorator_class" do
69
- it "delegates to .decorator_class" do
70
- product = Product.new
71
-
72
- expect(Product).to receive(:decorator_class).and_return(:some_decorator)
73
- expect(product.decorator_class).to be :some_decorator
74
- end
75
-
76
- it "specifies the class that #decorator_class was first called on (superclass)" do
77
- person = Person.new
78
- expect { person.decorator_class }.to raise_error(Draper::UninferrableDecoratorError, 'Could not infer a decorator for Person.')
79
- end
80
-
81
- it "specifies the class that #decorator_class was first called on (subclass)" do
82
- child = Child.new
83
- expect { child.decorator_class }.to raise_error(Draper::UninferrableDecoratorError, 'Could not infer a decorator for Child.')
84
- end
85
- end
86
-
87
- describe "#==" do
88
- it_behaves_like "decoration-aware #==", Product.new
89
- end
90
-
91
- describe "#===" do
92
- it "is true when #== is true" do
93
- product = Product.new
94
-
95
- expect(product).to receive(:==).and_return(true)
96
- expect(product === :anything).to be_truthy
97
- end
98
-
99
- it "is false when #== is false" do
100
- product = Product.new
101
-
102
- expect(product).to receive(:==).and_return(false)
103
- expect(product === :anything).to be_falsey
104
- end
105
- end
106
-
107
- describe ".====" do
108
- it "is true for an instance" do
109
- expect(Product === Product.new).to be_truthy
110
- end
111
-
112
- it "is true for a derived instance" do
113
- expect(Product === Class.new(Product).new).to be_truthy
114
- end
115
-
116
- it "is false for an unrelated instance" do
117
- expect(Product === Model.new).to be_falsey
118
- end
119
-
120
- it "is true for a decorated instance" do
121
- decorator = Product.new.decorate
122
-
123
- expect(Product === decorator).to be_truthy
124
- end
125
-
126
- it "is true for a decorated derived instance" do
127
- decorator = Class.new(Product).new.decorate
128
-
129
- expect(Product === decorator).to be_truthy
130
- end
131
-
132
- it "is false for a decorated unrelated instance" do
133
- decorator = Other.new.decorate
134
-
135
- expect(Product === decorator).to be_falsey
136
- end
137
-
138
- it "is false for a non-decorator which happens to respond to object" do
139
- decorator = double(object: Product.new)
140
-
141
- expect(Product === decorator).to be_falsey
142
- end
143
- end
144
-
145
- describe ".decorate" do
146
- it "calls #decorate_collection on .decorator_class" do
147
- scoped = [Product.new]
148
- allow(Product).to receive(:all).and_return(scoped)
149
-
150
- expect(Product.decorator_class).to receive(:decorate_collection).with(scoped, {with: nil}).and_return(:decorated_collection)
151
- expect(Product.decorate).to be :decorated_collection
152
- end
153
-
154
- it "accepts options" do
155
- options = {with: ProductDecorator, context: {some: "context"}}
156
- allow(Product).to receive(:all).and_return([])
157
-
158
- expect(Product.decorator_class).to receive(:decorate_collection).with([], options)
159
- Product.decorate(options)
160
- end
161
- end
162
-
163
- describe ".decorator_class" do
164
- context "for classes" do
165
- it "infers the decorator from the class" do
166
- expect(Product.decorator_class).to be ProductDecorator
167
- end
168
-
169
- context "without a decorator on its own" do
170
- it "infers the decorator from a superclass" do
171
- expect(SpecialProduct.decorator_class).to be ProductDecorator
172
- end
173
- end
174
- end
175
-
176
- context "for ActiveModel classes" do
177
- it "infers the decorator from the model name" do
178
- allow(Product).to receive(:model_name){"Other"}
179
-
180
- expect(Product.decorator_class).to be OtherDecorator
181
- end
182
- end
183
-
184
- context "in a namespace" do
185
- context "for classes" do
186
- it "infers the decorator from the class" do
187
- expect(Namespaced::Product.decorator_class).to be Namespaced::ProductDecorator
188
- end
189
- end
190
-
191
- context "for ActiveModel classes" do
192
- it "infers the decorator from the model name" do
193
- allow(Namespaced::Product).to receive(:model_name).and_return("Namespaced::Other")
194
-
195
- expect(Namespaced::Product.decorator_class).to be Namespaced::OtherDecorator
196
- end
197
- end
198
- end
199
-
200
- context "when the decorator contains name error" do
201
- it "throws an NameError" do
202
- # We imitate ActiveSupport::Autoload behavior here in order to cause lazy NameError exception raising
203
- allow_any_instance_of(Module).to receive(:const_missing) { Class.new { any_nonexisting_method_name } }
204
-
205
- expect{Model.decorator_class}.to raise_error { |error| expect(error).to be_an_instance_of(NameError) }
206
- end
207
- end
208
-
209
- context "when the decorator can't be inferred" do
210
- it "throws an UninferrableDecoratorError" do
211
- expect{Model.decorator_class}.to raise_error UninferrableDecoratorError
212
- end
213
- end
214
-
215
- context "when an unrelated NameError is thrown" do
216
- it "re-raises that error" do
217
- # Not related to safe_constantize behavior, we just want to raise a NameError inside the function
218
- allow_any_instance_of(String).to receive(:safe_constantize) { Draper::Base }
219
- expect{Product.decorator_class}.to raise_error NameError, /Draper::Base/
220
- end
221
- end
222
-
223
- context "when an anonymous class is given" do
224
- it "infers the decorator from a superclass" do
225
- anonymous_class = Class.new(Product) do
226
- def self.name
227
- to_s
228
- end
229
- end
230
- expect(anonymous_class.decorator_class).to be ProductDecorator
231
- end
232
- end
233
- end
234
- end
235
- end
@@ -1,82 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Draper
4
- describe DecoratedAssociation do
5
- describe "#initialize" do
6
- it "accepts valid options" do
7
- valid_options = {with: Decorator, scope: :foo, context: {}}
8
- expect{DecoratedAssociation.new(Decorator.new(Model.new), :association, valid_options)}.not_to raise_error
9
- end
10
-
11
- it "rejects invalid options" do
12
- expect{DecoratedAssociation.new(Decorator.new(Model.new), :association, foo: "bar")}.to raise_error ArgumentError, /Unknown key/
13
- end
14
-
15
- it "creates a factory" do
16
- options = {with: Decorator, context: {foo: "bar"}}
17
-
18
- expect(Factory).to receive(:new).with(options)
19
- DecoratedAssociation.new(double, :association, options)
20
- end
21
-
22
- describe ":with option" do
23
- it "defaults to nil" do
24
- expect(Factory).to receive(:new).with(with: nil, context: anything())
25
- DecoratedAssociation.new(double, :association, {})
26
- end
27
- end
28
-
29
- describe ":context option" do
30
- it "defaults to the identity function" do
31
- expect(Factory).to receive(:new) do |options|
32
- options[:context].call(:anything) == :anything
33
- end
34
- DecoratedAssociation.new(double, :association, {})
35
- end
36
- end
37
- end
38
-
39
- describe "#call" do
40
- it "calls the factory" do
41
- factory = double
42
- allow(Factory).to receive_messages(new: factory)
43
- associated = double
44
- owner_context = {foo: "bar"}
45
- object = double(association: associated)
46
- owner = double(object: object, context: owner_context)
47
- decorated_association = DecoratedAssociation.new(owner, :association, {})
48
- decorated = double
49
-
50
- expect(factory).to receive(:decorate).with(associated, context_args: owner_context).and_return(decorated)
51
- expect(decorated_association.call).to be decorated
52
- end
53
-
54
- it "memoizes" do
55
- factory = double
56
- allow(Factory).to receive_messages(new: factory)
57
- owner = double(object: double(association: double), context: {})
58
- decorated_association = DecoratedAssociation.new(owner, :association, {})
59
- decorated = double
60
-
61
- expect(factory).to receive(:decorate).once.and_return(decorated)
62
- expect(decorated_association.call).to be decorated
63
- expect(decorated_association.call).to be decorated
64
- end
65
-
66
- context "when the :scope option was given" do
67
- it "applies the scope before decoration" do
68
- factory = double
69
- allow(Factory).to receive_messages(new: factory)
70
- scoped = double
71
- object = double(association: double(applied_scope: scoped))
72
- owner = double(object: object, context: {})
73
- decorated_association = DecoratedAssociation.new(owner, :association, scope: :applied_scope)
74
- decorated = double
75
-
76
- expect(factory).to receive(:decorate).with(scoped, anything()).and_return(decorated)
77
- expect(decorated_association.call).to be decorated
78
- end
79
- end
80
- end
81
- end
82
- end
@@ -1,71 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Draper
4
- describe DecoratesAssigned do
5
- let(:controller_class) do
6
- Class.new do
7
- extend DecoratesAssigned
8
-
9
- def self.helper_method(method)
10
- helper_methods << method
11
- end
12
-
13
- def self.helper_methods
14
- @helper_methods ||= []
15
- end
16
- end
17
- end
18
-
19
- describe ".decorates_assigned" do
20
- it "adds helper methods" do
21
- controller_class.decorates_assigned :article, :author
22
-
23
- expect(controller_class.instance_methods).to include :article
24
- expect(controller_class.instance_methods).to include :author
25
-
26
- expect(controller_class.helper_methods).to include :article
27
- expect(controller_class.helper_methods).to include :author
28
- end
29
-
30
- it "creates a factory" do
31
- allow(Factory).to receive(:new).once
32
- controller_class.decorates_assigned :article, :author
33
- end
34
-
35
- it "passes options to the factory" do
36
- options = {foo: "bar"}
37
-
38
- allow(Factory).to receive(:new).with(options)
39
- controller_class.decorates_assigned :article, :author, options
40
- end
41
-
42
- describe "the generated method" do
43
- it "decorates the instance variable" do
44
- object = double
45
- factory = double
46
- allow(Factory).to receive_messages(new: factory)
47
-
48
- controller_class.decorates_assigned :article
49
- controller = controller_class.new
50
- controller.instance_variable_set "@article", object
51
-
52
- expect(factory).to receive(:decorate).with(object, context_args: controller).and_return(:decorated)
53
- expect(controller.article).to be :decorated
54
- end
55
-
56
- it "memoizes" do
57
- factory = double
58
- allow(Factory).to receive_messages(new: factory)
59
-
60
- controller_class.decorates_assigned :article
61
- controller = controller_class.new
62
-
63
- expect(factory).to receive(:decorate).once
64
- controller.article
65
- controller.article
66
- end
67
- end
68
- end
69
-
70
- end
71
- end