draper 0.18.0 → 1.1.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.
Files changed (155) hide show
  1. data/.gitignore +3 -0
  2. data/.travis.yml +11 -0
  3. data/.yardopts +1 -1
  4. data/CHANGELOG.md +164 -0
  5. data/CONTRIBUTING.md +15 -0
  6. data/Gemfile +34 -0
  7. data/LICENSE +7 -0
  8. data/README.md +416 -0
  9. data/Rakefile +53 -31
  10. data/draper.gemspec +11 -9
  11. data/lib/draper/automatic_delegation.rb +50 -0
  12. data/lib/draper/collection_decorator.rb +107 -0
  13. data/lib/draper/decoratable/equality.rb +14 -0
  14. data/lib/draper/decoratable.rb +79 -0
  15. data/lib/draper/decorated_association.rb +74 -0
  16. data/lib/draper/decorator.rb +235 -0
  17. data/lib/draper/delegation.rb +13 -0
  18. data/lib/draper/finders.rb +37 -0
  19. data/lib/draper/helper_proxy.rb +36 -0
  20. data/lib/draper/lazy_helpers.rb +10 -6
  21. data/lib/draper/railtie.rb +27 -21
  22. data/lib/draper/tasks/test.rake +22 -0
  23. data/lib/draper/test/devise_helper.rb +30 -0
  24. data/lib/draper/test/minitest_integration.rb +2 -3
  25. data/lib/draper/test/rspec_integration.rb +7 -13
  26. data/lib/draper/test_case.rb +53 -0
  27. data/lib/draper/version.rb +1 -1
  28. data/lib/draper/view_context/build_strategy.rb +48 -0
  29. data/lib/draper/view_context.rb +81 -24
  30. data/lib/draper/view_helpers.rb +37 -0
  31. data/lib/draper.rb +50 -8
  32. data/lib/generators/decorator/decorator_generator.rb +10 -2
  33. data/lib/generators/decorator/templates/decorator.rb +12 -27
  34. data/lib/generators/mini_test/decorator_generator.rb +20 -0
  35. data/lib/generators/mini_test/templates/decorator_spec.rb +4 -0
  36. data/lib/generators/mini_test/templates/decorator_test.rb +4 -0
  37. data/lib/generators/test_unit/templates/decorator_test.rb +1 -1
  38. data/spec/draper/collection_decorator_spec.rb +259 -0
  39. data/spec/draper/decoratable/equality_spec.rb +10 -0
  40. data/spec/draper/decoratable_spec.rb +167 -0
  41. data/spec/draper/decorated_association_spec.rb +145 -0
  42. data/spec/draper/decorator_spec.rb +598 -0
  43. data/spec/draper/finders_spec.rb +166 -0
  44. data/spec/draper/helper_proxy_spec.rb +42 -0
  45. data/spec/draper/view_context/build_strategy_spec.rb +116 -0
  46. data/spec/draper/view_context_spec.rb +154 -0
  47. data/spec/draper/view_helpers_spec.rb +8 -0
  48. data/spec/dummy/.rspec +2 -0
  49. data/spec/dummy/Rakefile +7 -0
  50. data/spec/dummy/app/controllers/application_controller.rb +4 -0
  51. data/spec/dummy/app/controllers/localized_urls.rb +5 -0
  52. data/spec/dummy/app/controllers/posts_controller.rb +18 -0
  53. data/spec/dummy/app/decorators/post_decorator.rb +56 -0
  54. data/spec/dummy/app/helpers/application_helper.rb +5 -0
  55. data/spec/dummy/app/mailers/application_mailer.rb +3 -0
  56. data/spec/dummy/app/mailers/post_mailer.rb +19 -0
  57. data/spec/dummy/app/models/admin.rb +5 -0
  58. data/spec/dummy/app/models/mongoid_post.rb +5 -0
  59. data/spec/dummy/app/models/post.rb +3 -0
  60. data/spec/dummy/app/models/user.rb +5 -0
  61. data/spec/dummy/app/views/layouts/application.html.erb +11 -0
  62. data/spec/dummy/app/views/post_mailer/decorated_email.html.erb +1 -0
  63. data/spec/dummy/app/views/posts/_post.html.erb +34 -0
  64. data/spec/dummy/app/views/posts/show.html.erb +1 -0
  65. data/spec/dummy/bin/rails +4 -0
  66. data/spec/dummy/config/application.rb +70 -0
  67. data/spec/dummy/config/boot.rb +5 -0
  68. data/spec/dummy/config/database.yml +25 -0
  69. data/spec/dummy/config/environment.rb +5 -0
  70. data/spec/dummy/config/environments/development.rb +33 -0
  71. data/spec/dummy/config/environments/production.rb +57 -0
  72. data/spec/dummy/config/environments/test.rb +31 -0
  73. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  74. data/spec/dummy/config/initializers/inflections.rb +15 -0
  75. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  76. data/spec/dummy/config/initializers/secret_token.rb +8 -0
  77. data/spec/dummy/config/initializers/session_store.rb +8 -0
  78. data/spec/dummy/config/locales/en.yml +5 -0
  79. data/spec/dummy/config/mongoid.yml +80 -0
  80. data/spec/dummy/config/routes.rb +9 -0
  81. data/spec/dummy/config.ru +4 -0
  82. data/spec/dummy/db/migrate/20121019115657_create_posts.rb +8 -0
  83. data/spec/dummy/db/schema.rb +21 -0
  84. data/spec/dummy/db/seeds.rb +2 -0
  85. data/spec/dummy/fast_spec/post_decorator_spec.rb +38 -0
  86. data/spec/dummy/lib/tasks/test.rake +16 -0
  87. data/spec/dummy/log/.gitkeep +0 -0
  88. data/spec/dummy/public/404.html +26 -0
  89. data/spec/dummy/public/422.html +26 -0
  90. data/spec/dummy/public/500.html +25 -0
  91. data/spec/dummy/public/favicon.ico +0 -0
  92. data/spec/dummy/script/rails +6 -0
  93. data/spec/dummy/spec/decorators/devise_spec.rb +64 -0
  94. data/spec/dummy/spec/decorators/helpers_spec.rb +21 -0
  95. data/spec/dummy/spec/decorators/post_decorator_spec.rb +46 -0
  96. data/spec/dummy/spec/decorators/spec_type_spec.rb +7 -0
  97. data/spec/dummy/spec/decorators/view_context_spec.rb +22 -0
  98. data/spec/dummy/spec/mailers/post_mailer_spec.rb +33 -0
  99. data/spec/dummy/spec/models/mongoid_post_spec.rb +10 -0
  100. data/spec/dummy/spec/models/post_spec.rb +14 -0
  101. data/spec/dummy/spec/spec_helper.rb +9 -0
  102. data/spec/dummy/test/decorators/minitest/devise_test.rb +64 -0
  103. data/spec/dummy/test/decorators/minitest/helpers_test.rb +21 -0
  104. data/spec/dummy/test/decorators/minitest/spec_type_test.rb +52 -0
  105. data/spec/dummy/test/decorators/minitest/view_context_test.rb +24 -0
  106. data/spec/dummy/test/decorators/test_unit/devise_test.rb +64 -0
  107. data/spec/dummy/test/decorators/test_unit/helpers_test.rb +21 -0
  108. data/spec/dummy/test/decorators/test_unit/view_context_test.rb +24 -0
  109. data/spec/dummy/test/minitest_helper.rb +4 -0
  110. data/spec/dummy/test/test_helper.rb +3 -0
  111. data/spec/generators/decorator/decorator_generator_spec.rb +48 -7
  112. data/spec/integration/integration_spec.rb +58 -0
  113. data/{performance → spec/performance}/decorators.rb +2 -4
  114. data/spec/spec_helper.rb +25 -43
  115. data/spec/support/dummy_app.rb +85 -0
  116. data/spec/support/matchers/have_text.rb +50 -0
  117. data/spec/support/shared_examples/decoratable_equality.rb +40 -0
  118. data/spec/support/shared_examples/view_helpers.rb +39 -0
  119. metadata +253 -87
  120. data/CHANGELOG.markdown +0 -57
  121. data/Readme.markdown +0 -387
  122. data/lib/draper/active_model_support.rb +0 -27
  123. data/lib/draper/base.rb +0 -312
  124. data/lib/draper/decorated_enumerable_proxy.rb +0 -90
  125. data/lib/draper/model_support.rb +0 -25
  126. data/lib/draper/rspec_integration.rb +0 -2
  127. data/lib/draper/system.rb +0 -18
  128. data/spec/draper/base_spec.rb +0 -873
  129. data/spec/draper/decorated_enumerable_proxy_spec.rb +0 -45
  130. data/spec/draper/model_support_spec.rb +0 -48
  131. data/spec/minitest-rails/spec_type_spec.rb +0 -63
  132. data/spec/support/samples/active_record.rb +0 -17
  133. data/spec/support/samples/decorator.rb +0 -5
  134. data/spec/support/samples/decorator_with_allows.rb +0 -3
  135. data/spec/support/samples/decorator_with_application_helper.rb +0 -25
  136. data/spec/support/samples/decorator_with_denies.rb +0 -3
  137. data/spec/support/samples/decorator_with_denies_all.rb +0 -3
  138. data/spec/support/samples/decorator_with_multiple_allows.rb +0 -4
  139. data/spec/support/samples/decorator_with_special_methods.rb +0 -13
  140. data/spec/support/samples/enumerable_proxy.rb +0 -3
  141. data/spec/support/samples/namespaced_product.rb +0 -51
  142. data/spec/support/samples/namespaced_product_decorator.rb +0 -7
  143. data/spec/support/samples/non_active_model_product.rb +0 -2
  144. data/spec/support/samples/product.rb +0 -80
  145. data/spec/support/samples/product_decorator.rb +0 -7
  146. data/spec/support/samples/products_decorator.rb +0 -10
  147. data/spec/support/samples/sequel_product.rb +0 -13
  148. data/spec/support/samples/some_thing.rb +0 -2
  149. data/spec/support/samples/some_thing_decorator.rb +0 -3
  150. data/spec/support/samples/specific_product_decorator.rb +0 -4
  151. data/spec/support/samples/widget.rb +0 -2
  152. data/spec/support/samples/widget_decorator.rb +0 -2
  153. /data/{performance → spec/performance}/active_record.rb +0 -0
  154. /data/{performance/bechmark.rb → spec/performance/benchmark.rb} +0 -0
  155. /data/{performance → spec/performance}/models.rb +0 -0
@@ -1,45 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Draper::DecoratedEnumerableProxy do
4
- before(:each){ ApplicationController.new.view_context }
5
- subject{ ProductsDecorator.new(source, ProductDecorator) }
6
- let(:source){ Product.new }
7
- let(:non_active_model_source){ NonActiveModelProduct.new }
8
-
9
- context(".helpers") do
10
- it "have a valid view_context" do
11
- subject.helpers.should be
12
- end
13
-
14
- it "is aliased to .h" do
15
- subject.h.should == subject.helpers
16
- end
17
-
18
- it "build a new view context" do
19
- Thread.current[:current_view_context] = nil
20
- subject.helpers.should be
21
- end
22
- end
23
-
24
- context(".decorates") do
25
- it "sets the model for the decorated" do
26
- EnumerableProxy.new([source], ProductDecorator).first.model.should == source
27
- end
28
-
29
- it "decorates an empty array with the class" do
30
- EnumerableProxy.decorates([], class: ProductDecorator).should be
31
- end
32
-
33
- it "discerns collection items decorator by the name of the decorator" do
34
- ProductsDecorator.decorates([]).should be
35
- end
36
-
37
- it "methods in decorated empty array should work" do
38
- ProductsDecorator.decorates([]).some_method.should == "some method works"
39
- end
40
-
41
- it "raises when decorates an empty array without the klass" do
42
- lambda{EnumerableProxy.decorates([])}.should raise_error
43
- end
44
- end
45
- end
@@ -1,48 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Draper::ModelSupport do
4
- subject { Product.new }
5
-
6
- describe '#decorator' do
7
- its(:decorator) { should be_kind_of(ProductDecorator) }
8
- its(:decorator) { should be(subject.decorator) }
9
-
10
- it 'have abillity to pass block' do
11
- a = Product.new.decorator { |d| d.awesome_title }
12
- a.should eql "Awesome Title"
13
- end
14
-
15
- it 'is aliased to .decorate' do
16
- subject.decorator.model.should == subject.decorate.model
17
- end
18
- end
19
-
20
- describe Draper::ModelSupport::ClassMethods do
21
- shared_examples_for "a call to Draper::ModelSupport::ClassMethods#decorate" do
22
- subject { klass.limit }
23
-
24
- its(:decorate) { should be_kind_of(Draper::DecoratedEnumerableProxy) }
25
-
26
- it "decorate the collection" do
27
- subject.decorate.size.should == 1
28
- subject.decorate.to_ary[0].model.should be_a(klass)
29
- end
30
-
31
- it "return a new instance each time it is called" do
32
- subject.decorate.should_not == subject.decorate
33
- end
34
- end
35
-
36
- describe '#decorate - decorate collections of AR objects' do
37
- let(:klass) { Product }
38
-
39
- it_should_behave_like "a call to Draper::ModelSupport::ClassMethods#decorate"
40
- end
41
-
42
- describe '#decorate - decorate collections of namespaced AR objects' do
43
- let(:klass) { Namespace::Product }
44
-
45
- it_should_behave_like "a call to Draper::ModelSupport::ClassMethods#decorate"
46
- end
47
- end
48
- end
@@ -1,63 +0,0 @@
1
- require 'spec_helper'
2
- require 'minitest/rails/active_support'
3
- require 'draper/test/minitest_integration'
4
-
5
- describe "minitest-rails spec_type Lookup Integration" do
6
- context "ProductDecorator" do
7
- it "resolves constants" do
8
- klass = MiniTest::Spec.spec_type(ProductDecorator)
9
- klass.should == MiniTest::Rails::ActiveSupport::TestCase
10
- end
11
-
12
- it "resolves strings" do
13
- klass = MiniTest::Spec.spec_type("ProductDecorator")
14
- klass.should == MiniTest::Rails::ActiveSupport::TestCase
15
- end
16
- end
17
-
18
- context "WidgetDecorator" do
19
- it "resolves constants" do
20
- klass = MiniTest::Spec.spec_type(WidgetDecorator)
21
- klass.should == MiniTest::Rails::ActiveSupport::TestCase
22
- end
23
-
24
- it "resolves strings" do
25
- klass = MiniTest::Spec.spec_type("WidgetDecorator")
26
- klass.should == MiniTest::Rails::ActiveSupport::TestCase
27
- end
28
- end
29
-
30
- context "decorator strings" do
31
- it "resolves DoesNotExistDecorator" do
32
- klass = MiniTest::Spec.spec_type("DoesNotExistDecorator")
33
- klass.should == MiniTest::Rails::ActiveSupport::TestCase
34
- end
35
-
36
- it "resolves DoesNotExistDecoratorTest" do
37
- klass = MiniTest::Spec.spec_type("DoesNotExistDecoratorTest")
38
- klass.should == MiniTest::Rails::ActiveSupport::TestCase
39
- end
40
-
41
- it "resolves Does Not Exist Decorator" do
42
- klass = MiniTest::Spec.spec_type("Does Not Exist Decorator")
43
- klass.should == MiniTest::Rails::ActiveSupport::TestCase
44
- end
45
-
46
- it "resolves Does Not Exist Decorator Test" do
47
- klass = MiniTest::Spec.spec_type("Does Not Exist Decorator Test")
48
- klass.should == MiniTest::Rails::ActiveSupport::TestCase
49
- end
50
- end
51
-
52
- context "non-decorators" do
53
- it "doesn't resolve constants" do
54
- klass = MiniTest::Spec.spec_type(Draper::HelperSupport)
55
- klass.should == MiniTest::Spec
56
- end
57
-
58
- it "doesn't resolve strings" do
59
- klass = MiniTest::Spec.spec_type("Nothing to see here...")
60
- klass.should == MiniTest::Spec
61
- end
62
- end
63
- end
@@ -1,17 +0,0 @@
1
- module ActiveRecord
2
- class Base
3
- include ActiveModel::Validations
4
- include ActiveModel::Conversion
5
-
6
- attr_reader :errors, :to_model
7
-
8
- def initialize
9
- @errors = ActiveModel::Errors.new(self)
10
- end
11
-
12
- def self.limit
13
- self
14
- end
15
-
16
- end
17
- end
@@ -1,5 +0,0 @@
1
- class Decorator < Draper::Base
2
- def self.own_class_method
3
- "own class method"
4
- end
5
- end
@@ -1,3 +0,0 @@
1
- class DecoratorWithAllows < Draper::Base
2
- allows :goodnight_moon
3
- end
@@ -1,25 +0,0 @@
1
- class DecoratorWithApplicationHelper < Draper::Base
2
- def uses_hello_world
3
- h.hello_world
4
- end
5
-
6
- def sample_content
7
- h.content_tag :span, "Hello, World!"
8
- end
9
-
10
- def sample_link
11
- h.link_to "Hello", "/World"
12
- end
13
-
14
- def sample_truncate
15
- h.truncate("Once upon a time", :length => 7)
16
- end
17
-
18
- def length
19
- "overridden"
20
- end
21
-
22
- def sample_html_escaped_text
23
- h.html_escape '<script>danger</script>'
24
- end
25
- end
@@ -1,3 +0,0 @@
1
- class DecoratorWithDenies < Draper::Base
2
- denies :goodnight_moon, :title
3
- end
@@ -1,3 +0,0 @@
1
- class DecoratorWithDeniesAll < Draper::Base
2
- denies_all
3
- end
@@ -1,4 +0,0 @@
1
- class DecoratorWithMultipleAllows < Draper::Base
2
- allows :goodnight_moon
3
- allows :hello_world
4
- end
@@ -1,13 +0,0 @@
1
- class DecoratorWithSpecialMethods < Draper::Base
2
- def to_param
3
- "foo"
4
- end
5
-
6
- def id
7
- 1337
8
- end
9
-
10
- def errors
11
- ["omg errors!"]
12
- end
13
- end
@@ -1,3 +0,0 @@
1
- class EnumerableProxy < Draper::DecoratedEnumerableProxy
2
-
3
- end
@@ -1,51 +0,0 @@
1
- require './spec/support/samples/product'
2
-
3
- module Namespace
4
- class Product < ActiveRecord::Base
5
- include Draper::ModelSupport
6
-
7
- def self.first
8
- @@first ||= Namespace::Product.new
9
- end
10
-
11
- def self.last
12
- @@last ||= Namespace::Product.new
13
- end
14
-
15
- def self.all
16
- [Namespace::Product.new, Namespace::Product.new]
17
- end
18
-
19
- def self.scoped
20
- [Namespace::Product.new]
21
- end
22
-
23
- def self.model_name
24
- "Namespace::Product"
25
- end
26
-
27
- def self.find(id)
28
- return Namespace::Product.new
29
- end
30
-
31
- def self.sample_class_method
32
- "sample class method"
33
- end
34
-
35
- def hello_world
36
- "Hello, World"
37
- end
38
-
39
- def goodnight_moon
40
- "Goodnight, Moon"
41
- end
42
-
43
- def title
44
- "Sample Title"
45
- end
46
-
47
- def block
48
- yield
49
- end
50
- end
51
- end
@@ -1,7 +0,0 @@
1
- require './spec/support/samples/namespaced_product'
2
-
3
- module Namespace
4
- class ProductDecorator < Draper::Base
5
- decorates :product, :class => Namespace::Product
6
- end
7
- end
@@ -1,2 +0,0 @@
1
- class NonActiveModelProduct
2
- end
@@ -1,80 +0,0 @@
1
- class Product < ActiveRecord::Base
2
- include Draper::ModelSupport
3
-
4
- def self.find_by_name(name)
5
- @@dummy ||= Product.new
6
- end
7
-
8
- def self.first
9
- @@first ||= Product.new
10
- end
11
-
12
- def self.last
13
- @@last ||= Product.new
14
- end
15
-
16
- def self.all
17
- [Product.new, Product.new]
18
- end
19
-
20
- def self.scoped
21
- [Product.new]
22
- end
23
-
24
- def self.model_name
25
- "Product"
26
- end
27
-
28
- def self.find(id)
29
- return Product.new
30
- end
31
-
32
- def self.sample_class_method
33
- "sample class method"
34
- end
35
-
36
- def hello_world
37
- "Hello, World"
38
- end
39
-
40
- def goodnight_moon
41
- "Goodnight, Moon"
42
- end
43
-
44
- def title
45
- "Sample Title"
46
- end
47
-
48
- def some_action
49
- self.nonexistant_method
50
- end
51
-
52
- def block
53
- yield
54
- end
55
-
56
- def self.reflect_on_association(association_symbol)
57
- association_symbol.to_s.starts_with?("poro") ? nil : OpenStruct.new(:klass => self)
58
- end
59
-
60
- def similar_products
61
- [Product.new, Product.new]
62
- end
63
-
64
- def previous_version
65
- Product.new
66
- end
67
-
68
- def thing
69
- SomeThing.new
70
- end
71
-
72
- def poro_similar_products
73
- [Product.new, Product.new]
74
- end
75
-
76
- def poro_previous_version
77
- Product.new
78
- end
79
-
80
- end
@@ -1,7 +0,0 @@
1
- class ProductDecorator < Draper::Base
2
- decorates :product
3
-
4
- def awesome_title
5
- "Awesome Title"
6
- end
7
- end
@@ -1,10 +0,0 @@
1
- class ProductsDecorator < Draper::DecoratedEnumerableProxy
2
-
3
- def link_to
4
- h.link_to 'sample', "#"
5
- end
6
-
7
- def some_method
8
- "some method works"
9
- end
10
- end
@@ -1,13 +0,0 @@
1
- module Sequel
2
- class Model
3
- def each
4
- end
5
- end
6
- end
7
-
8
- class SequelProduct < Sequel::Model
9
- def some_attribute
10
- "hello"
11
- end
12
- end
13
-
@@ -1,2 +0,0 @@
1
- class SomeThing < Product
2
- end
@@ -1,3 +0,0 @@
1
- class SomeThingDecorator < Draper::Base
2
- decorates :some_thing
3
- end
@@ -1,4 +0,0 @@
1
- require './spec/support/samples/product_decorator'
2
-
3
- class SpecificProductDecorator < ProductDecorator
4
- end
@@ -1,2 +0,0 @@
1
- class Widget < Product
2
- end
@@ -1,2 +0,0 @@
1
- class WidgetDecorator < ProductDecorator
2
- end
File without changes
File without changes