draper 0.16.0 → 0.17.0
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/CHANGELOG.markdown +51 -0
- data/lib/draper/base.rb +16 -1
- data/lib/draper/decorated_enumerable_proxy.rb +11 -0
- data/lib/draper/version.rb +1 -1
- data/lib/draper/view_context.rb +1 -1
- data/spec/draper/base_spec.rb +80 -0
- data/spec/draper/view_context_spec.rb +14 -0
- data/spec/spec_helper.rb +1 -0
- data/spec/support/samples/decorator_with_denies_all.rb +3 -0
- metadata +7 -5
- data/CHANGELOG.txt +0 -70
data/CHANGELOG.markdown
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
# Draper Changelog
|
2
|
+
|
3
|
+
## 0.16.0
|
4
|
+
|
5
|
+
* [Automatically prime `view_context`](https://github.com/jcasimir/draper/commit/057ab4e8)
|
6
|
+
* [Fixed bug where rspec eq matchers didn't work]((https://github.com/jcasimir/draper/commit/57617b)
|
7
|
+
* [Sequel ORM support](https://github.com/jcasimir/draper/commit/7d4942)
|
8
|
+
* Fixed issues with newer minitest
|
9
|
+
* [Changed the way the `view_context` gets set](https://github.com/jcasimir/draper/commit/0b03d9c)
|
10
|
+
|
11
|
+
## 0.15.0
|
12
|
+
|
13
|
+
* Proper minitest integration
|
14
|
+
* [We can properly decorate scoped associations](https://github.com/jcasimir/draper/issues/223)
|
15
|
+
* [Fixed awkward eager loading](https://github.com/jcasimir/draper/commit/7dc3510b)
|
16
|
+
|
17
|
+
## 0.14.0
|
18
|
+
|
19
|
+
* [Properly prime the view context in Rails Console](https://github.com/jcasimir/draper/commit/738074f)
|
20
|
+
* Make more gems development requirements only
|
21
|
+
|
22
|
+
## 0.13.0
|
23
|
+
|
24
|
+
* Upgraded all dependencies
|
25
|
+
* Dropped support for Rubies < 1.9.3
|
26
|
+
* `#to_model` has been renamed to `#wrapped_object`
|
27
|
+
* Allow proper overriding of special `ActiveModel` methods
|
28
|
+
|
29
|
+
## 0.12.3
|
30
|
+
|
31
|
+
* [Fix i18n issue](https://github.com/jcasimir/draper/issues/202)
|
32
|
+
|
33
|
+
## 0.12.2
|
34
|
+
|
35
|
+
* Fix bug with initializing ammeter
|
36
|
+
* Some gems are now development only in the gemspec
|
37
|
+
* Fix bug where generated models were still inheriting from `ApplicationDecorator`
|
38
|
+
|
39
|
+
## 0.12.0
|
40
|
+
|
41
|
+
* Added Changelog
|
42
|
+
* [Prevented double decoration](https://github.com/jcasimir/draper/issues/173)
|
43
|
+
* [`ActiveModel::Errors` support](https://github.com/jcasimir/draper/commit/19496f0c)
|
44
|
+
* [Fixed autoloading issue](https://github.com/jcasimir/draper/issues/188)
|
45
|
+
* [Re-did generators](https://github.com/jcasimir/draper/commit/9155e58f)
|
46
|
+
* [Added capybara integration](https://github.com/jcasimir/draper/commit/57c8678e)
|
47
|
+
* Fixed a few bugs with the `DecoratedEnumerableProxy`
|
48
|
+
|
49
|
+
## 0.11.1
|
50
|
+
|
51
|
+
* [Fixed regression, we don't want to introduce a hard dependency on Rails](https://github.com/jcasimir/draper/issues/107)
|
data/lib/draper/base.rb
CHANGED
@@ -64,6 +64,7 @@ module Draper
|
|
64
64
|
orig_association = model.send(association_symbol)
|
65
65
|
|
66
66
|
return orig_association if orig_association.nil?
|
67
|
+
return decorated_associations[association_symbol] if decorated_associations[association_symbol]
|
67
68
|
|
68
69
|
orig_association = orig_association.send(options[:scope]) if options[:scope]
|
69
70
|
|
@@ -79,7 +80,7 @@ module Draper
|
|
79
80
|
orig_association.class
|
80
81
|
end
|
81
82
|
|
82
|
-
"#{klass}Decorator".constantize.decorate(orig_association, options)
|
83
|
+
decorated_associations[association_symbol] = "#{klass}Decorator".constantize.decorate(orig_association, options)
|
83
84
|
end
|
84
85
|
end
|
85
86
|
|
@@ -105,6 +106,16 @@ module Draper
|
|
105
106
|
self.denied += input_denied
|
106
107
|
end
|
107
108
|
|
109
|
+
# Specifies that all methods may *not* be proxied to
|
110
|
+
# to the wrapped object.
|
111
|
+
#
|
112
|
+
# Do not use `.allows` and `.denies` in combination with '.denies_all'
|
113
|
+
def self.denies_all
|
114
|
+
raise ArgumentError, "Use either 'allows' or 'denies', but not both." unless ((self.allowed == DEFAULT_ALLOWED && self.denied == DEFAULT_DENIED) || (self.allowed != DEFAULT_ALLOWED && self.denied != DEFAULT_DENIED))
|
115
|
+
self.denied += [nil] # Add dummy value to denied to prevent calls to #allows. Hacky???
|
116
|
+
self.allowed += [nil] # Add dummy value to allowed to prevent calls to #denies
|
117
|
+
end
|
118
|
+
|
108
119
|
# Specifies a white list of methods which *may* be proxied to
|
109
120
|
# to the wrapped object. When `allows` is used, only the listed
|
110
121
|
# methods and methods defined in the decorator itself will be
|
@@ -293,5 +304,9 @@ module Draper
|
|
293
304
|
model.class.reflect_on_association(association)
|
294
305
|
end
|
295
306
|
end
|
307
|
+
|
308
|
+
def decorated_associations
|
309
|
+
@decorated_associations ||= {}
|
310
|
+
end
|
296
311
|
end
|
297
312
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'active_support/core_ext/object/blank'
|
1
2
|
module Draper
|
2
3
|
class DecoratedEnumerableProxy
|
3
4
|
include Enumerable
|
@@ -13,6 +14,16 @@ module Draper
|
|
13
14
|
end
|
14
15
|
alias_method :to_ary, :decorated_collection
|
15
16
|
|
17
|
+
def find(ifnone_or_id = nil, &blk)
|
18
|
+
if block_given?
|
19
|
+
source.find(ifnone_or_id, &blk)
|
20
|
+
else
|
21
|
+
obj = decorated_collection.first
|
22
|
+
return nil if obj.blank?
|
23
|
+
obj.class.find(ifnone_or_id)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
16
27
|
def method_missing (method, *args, &block)
|
17
28
|
@wrapped_collection.send(method, *args, &block)
|
18
29
|
end
|
data/lib/draper/version.rb
CHANGED
data/lib/draper/view_context.rb
CHANGED
data/spec/draper/base_spec.rb
CHANGED
@@ -178,6 +178,23 @@ describe Draper::Base do
|
|
178
178
|
subject.previous_version.should be_nil
|
179
179
|
end
|
180
180
|
end
|
181
|
+
|
182
|
+
context "#find" do
|
183
|
+
before(:each){ subject.class_eval{ decorates_association :similar_products } }
|
184
|
+
context "with a block" do
|
185
|
+
it "delegates to #each" do
|
186
|
+
subject.similar_products.source.should_receive :find
|
187
|
+
subject.similar_products.find {|p| p.title == "title" }
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
context "without a block" do
|
192
|
+
it "calls a finder method" do
|
193
|
+
subject.similar_products.source.should_not_receive :find
|
194
|
+
subject.similar_products.find 1
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|
181
198
|
end
|
182
199
|
|
183
200
|
context('.decorates_associations') do
|
@@ -693,6 +710,69 @@ describe Draper::Base do
|
|
693
710
|
end
|
694
711
|
end
|
695
712
|
|
713
|
+
describe "a sample usage with denies_all" do
|
714
|
+
let(:subject_with_denies_all){ DecoratorWithDeniesAll.new(source) }
|
715
|
+
|
716
|
+
[:goodnight_moon, :hello_world, :title].each do |method|
|
717
|
+
it "does echo #{method} method" do
|
718
|
+
subject_with_denies_all.should_not respond_to(method)
|
719
|
+
end
|
720
|
+
end
|
721
|
+
|
722
|
+
let(:using_denies_all_then_denies_all) {
|
723
|
+
class DecoratorWithDeniesAllAndDeniesAll < Draper::Base
|
724
|
+
denies_all
|
725
|
+
denies_all
|
726
|
+
end
|
727
|
+
}
|
728
|
+
|
729
|
+
it "allows multple calls to .denies_all" do
|
730
|
+
expect { using_denies_all_then_denies_all }.to_not raise_error(ArgumentError)
|
731
|
+
end
|
732
|
+
end
|
733
|
+
|
734
|
+
describe "invalid usages of denies_all" do
|
735
|
+
let(:using_allows_then_denies_all) {
|
736
|
+
class DecoratorWithAllowsAndDeniesAll < Draper::Base
|
737
|
+
allows :hello_world
|
738
|
+
denies_all
|
739
|
+
end
|
740
|
+
}
|
741
|
+
let(:using_denies_then_denies_all) {
|
742
|
+
class DecoratorWithDeniesAndDeniesAll < Draper::Base
|
743
|
+
denies :goodnight_moon
|
744
|
+
denies_all
|
745
|
+
end
|
746
|
+
}
|
747
|
+
let(:using_denies_all_then_allows) {
|
748
|
+
class DecoratorWithDeniesAllAndAllows < Draper::Base
|
749
|
+
denies_all
|
750
|
+
allows :hello_world
|
751
|
+
end
|
752
|
+
}
|
753
|
+
let(:using_denies_all_then_denies) {
|
754
|
+
class DecoratorWithDeniesAllAndDenies < Draper::Base
|
755
|
+
denies_all
|
756
|
+
denies :goodnight_moon
|
757
|
+
end
|
758
|
+
}
|
759
|
+
it "raises an exception when calling allows then denies_all" do
|
760
|
+
expect {using_allows_then_denies_all}.to raise_error(ArgumentError)
|
761
|
+
end
|
762
|
+
|
763
|
+
it "raises an exception when calling denies then denies_all" do
|
764
|
+
expect {using_denies_then_denies_all}.to raise_error(ArgumentError)
|
765
|
+
end
|
766
|
+
|
767
|
+
it "raises an exception when calling denies_all then allows" do
|
768
|
+
expect {using_denies_all_then_allows}.to raise_error(ArgumentError)
|
769
|
+
end
|
770
|
+
|
771
|
+
it "raises an exception when calling denies_all then denies" do
|
772
|
+
expect {using_denies_all_then_denies}.to raise_error(ArgumentError)
|
773
|
+
end
|
774
|
+
end
|
775
|
+
|
696
776
|
context "in a Rails application" do
|
697
777
|
let(:decorator){ DecoratorWithApplicationHelper.decorate(Object.new) }
|
698
778
|
|
@@ -2,6 +2,10 @@ require 'spec_helper'
|
|
2
2
|
require 'draper/test/view_context'
|
3
3
|
|
4
4
|
describe Draper::ViewContext do
|
5
|
+
before(:each) do
|
6
|
+
Thread.current[:current_view_context] = nil
|
7
|
+
end
|
8
|
+
|
5
9
|
let(:app_controller) { ApplicationController }
|
6
10
|
let(:app_controller_instance) { app_controller.new }
|
7
11
|
|
@@ -13,4 +17,14 @@ describe Draper::ViewContext do
|
|
13
17
|
ctx = app_controller_instance.view_context
|
14
18
|
Draper::ViewContext.current.should == ctx
|
15
19
|
end
|
20
|
+
|
21
|
+
describe "view_context priming" do
|
22
|
+
let(:app_controller_instance) { double(ApplicationController, :view_context => view_context) }
|
23
|
+
let(:view_context) { double("ApplicationController#view_context") }
|
24
|
+
|
25
|
+
it "primes the view_context when nil" do
|
26
|
+
app_controller.should_receive(:new).and_return(app_controller_instance)
|
27
|
+
Draper::ViewContext.current.should == view_context
|
28
|
+
end
|
29
|
+
end
|
16
30
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -15,6 +15,7 @@ require './spec/support/samples/decorator_with_allows'
|
|
15
15
|
require './spec/support/samples/decorator_with_multiple_allows'
|
16
16
|
require './spec/support/samples/decorator_with_application_helper'
|
17
17
|
require './spec/support/samples/decorator_with_denies'
|
18
|
+
require './spec/support/samples/decorator_with_denies_all'
|
18
19
|
require './spec/support/samples/decorator_with_special_methods'
|
19
20
|
require './spec/support/samples/namespaced_product'
|
20
21
|
require './spec/support/samples/namespaced_product_decorator'
|
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: 0.
|
4
|
+
version: 0.17.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-08-
|
13
|
+
date: 2012-08-21 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activesupport
|
@@ -120,7 +120,7 @@ files:
|
|
120
120
|
- .rspec
|
121
121
|
- .travis.yml
|
122
122
|
- .yardopts
|
123
|
-
- CHANGELOG.
|
123
|
+
- CHANGELOG.markdown
|
124
124
|
- Gemfile
|
125
125
|
- Guardfile
|
126
126
|
- Rakefile
|
@@ -187,6 +187,7 @@ files:
|
|
187
187
|
- spec/support/samples/decorator_with_allows.rb
|
188
188
|
- spec/support/samples/decorator_with_application_helper.rb
|
189
189
|
- spec/support/samples/decorator_with_denies.rb
|
190
|
+
- spec/support/samples/decorator_with_denies_all.rb
|
190
191
|
- spec/support/samples/decorator_with_multiple_allows.rb
|
191
192
|
- spec/support/samples/decorator_with_special_methods.rb
|
192
193
|
- spec/support/samples/namespaced_product.rb
|
@@ -214,7 +215,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
214
215
|
version: '0'
|
215
216
|
segments:
|
216
217
|
- 0
|
217
|
-
hash:
|
218
|
+
hash: 26927068821793701
|
218
219
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
219
220
|
none: false
|
220
221
|
requirements:
|
@@ -223,7 +224,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
223
224
|
version: '0'
|
224
225
|
segments:
|
225
226
|
- 0
|
226
|
-
hash:
|
227
|
+
hash: 26927068821793701
|
227
228
|
requirements: []
|
228
229
|
rubyforge_project: draper
|
229
230
|
rubygems_version: 1.8.24
|
@@ -245,6 +246,7 @@ test_files:
|
|
245
246
|
- spec/support/samples/decorator_with_allows.rb
|
246
247
|
- spec/support/samples/decorator_with_application_helper.rb
|
247
248
|
- spec/support/samples/decorator_with_denies.rb
|
249
|
+
- spec/support/samples/decorator_with_denies_all.rb
|
248
250
|
- spec/support/samples/decorator_with_multiple_allows.rb
|
249
251
|
- spec/support/samples/decorator_with_special_methods.rb
|
250
252
|
- spec/support/samples/namespaced_product.rb
|
data/CHANGELOG.txt
DELETED
@@ -1,70 +0,0 @@
|
|
1
|
-
= Draper Changelog
|
2
|
-
|
3
|
-
= 0.16.0
|
4
|
-
|
5
|
-
* Automatically prime view_context, see 057ab4
|
6
|
-
|
7
|
-
* Fixed bug where rspec eq matchers didn't work, see 57617b
|
8
|
-
|
9
|
-
* Sequel ORM support, see 7d4942
|
10
|
-
|
11
|
-
* Fixed issues with newer minitest
|
12
|
-
|
13
|
-
* changed the way the view_context gets set. See 0b039c
|
14
|
-
|
15
|
-
= 0.15.0
|
16
|
-
|
17
|
-
* Proper minitest integration
|
18
|
-
|
19
|
-
* We can properly decorate scoped associations, see #223
|
20
|
-
|
21
|
-
* Fixed awkward eager loading, see 7dc3510b
|
22
|
-
|
23
|
-
= 0.14.0
|
24
|
-
|
25
|
-
* Properly prime the view context in Rails Console 738074f
|
26
|
-
|
27
|
-
* Make more gems development requirements only
|
28
|
-
|
29
|
-
= 0.13.0
|
30
|
-
|
31
|
-
* Upgraded all dependencies
|
32
|
-
|
33
|
-
* Dropped support for Rubies < 1.9.3
|
34
|
-
|
35
|
-
* #to_model has been renamed to #wrapped_object
|
36
|
-
|
37
|
-
* Allow proper overriding of special ActiveModel methods
|
38
|
-
|
39
|
-
== v0.12.3
|
40
|
-
|
41
|
-
* Fix i18n issue, see #202
|
42
|
-
|
43
|
-
== 0.12.2
|
44
|
-
|
45
|
-
* Fix bug with initializing ammeter
|
46
|
-
|
47
|
-
* Some gems are now development only in the gemspec
|
48
|
-
|
49
|
-
* Fix bug where generated models were still inheriting from
|
50
|
-
ApplicationDecorator
|
51
|
-
|
52
|
-
== 0.12.0
|
53
|
-
|
54
|
-
* Added Changelog
|
55
|
-
|
56
|
-
* Prevented double decoration, see #173
|
57
|
-
|
58
|
-
* ActiveModel::Errors support, 19496f0c
|
59
|
-
|
60
|
-
* Fixed autoloading issue, see #188
|
61
|
-
|
62
|
-
* Re-did generators, see 9155e58f
|
63
|
-
|
64
|
-
* Added capybara integration, see 57c8678e
|
65
|
-
|
66
|
-
* Fixed a few bugs with the DecoratedEnumerableProxy
|
67
|
-
|
68
|
-
== 0.11.1
|
69
|
-
|
70
|
-
* Fixed regression, we don't want to introduce a hard dependency on Rails. #107
|