draper 0.17.0 → 1.0.0.beta1

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 (154) hide show
  1. data/.gitignore +3 -0
  2. data/.travis.yml +5 -0
  3. data/CHANGELOG.markdown +14 -0
  4. data/Gemfile +4 -0
  5. data/Rakefile +50 -31
  6. data/Readme.markdown +63 -92
  7. data/draper.gemspec +4 -2
  8. data/lib/draper/collection_decorator.rb +88 -0
  9. data/lib/draper/decoratable.rb +44 -0
  10. data/lib/draper/decorated_association.rb +55 -0
  11. data/lib/draper/decorator.rb +208 -0
  12. data/lib/draper/finders.rb +44 -0
  13. data/lib/draper/helper_proxy.rb +16 -0
  14. data/lib/draper/railtie.rb +17 -21
  15. data/lib/draper/security.rb +48 -0
  16. data/lib/draper/tasks/tu.rake +5 -0
  17. data/lib/draper/test/minitest_integration.rb +5 -24
  18. data/lib/draper/test/rspec_integration.rb +0 -6
  19. data/lib/draper/test/test_unit_integration.rb +9 -0
  20. data/lib/draper/version.rb +1 -1
  21. data/lib/draper/view_context.rb +24 -6
  22. data/lib/draper/view_helpers.rb +36 -0
  23. data/lib/draper.rb +42 -7
  24. data/lib/generators/decorator/decorator_generator.rb +1 -1
  25. data/lib/generators/decorator/templates/decorator.rb +0 -1
  26. data/lib/generators/rspec/decorator_generator.rb +1 -1
  27. data/lib/generators/test_unit/decorator_generator.rb +1 -1
  28. data/lib/generators/test_unit/templates/decorator_test.rb +0 -3
  29. data/spec/draper/collection_decorator_spec.rb +240 -0
  30. data/spec/draper/decoratable_spec.rb +164 -0
  31. data/spec/draper/decorated_association_spec.rb +130 -0
  32. data/spec/draper/decorator_spec.rb +497 -0
  33. data/spec/draper/finders_spec.rb +156 -0
  34. data/spec/draper/helper_proxy_spec.rb +12 -0
  35. data/spec/draper/security_spec.rb +158 -0
  36. data/spec/draper/view_helpers_spec.rb +41 -0
  37. data/spec/dummy/.rspec +2 -0
  38. data/spec/dummy/README.rdoc +261 -0
  39. data/spec/dummy/Rakefile +7 -0
  40. data/spec/dummy/app/controllers/application_controller.rb +4 -0
  41. data/spec/dummy/app/controllers/localized_urls.rb +5 -0
  42. data/spec/dummy/app/controllers/posts_controller.rb +17 -0
  43. data/spec/dummy/app/decorators/post_decorator.rb +25 -0
  44. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  45. data/spec/dummy/app/mailers/application_mailer.rb +3 -0
  46. data/spec/dummy/app/mailers/post_mailer.rb +9 -0
  47. data/spec/dummy/app/models/post.rb +3 -0
  48. data/spec/dummy/app/views/layouts/application.html.erb +11 -0
  49. data/spec/dummy/app/views/post_mailer/decorated_email.html.erb +1 -0
  50. data/spec/dummy/app/views/posts/_post.html.erb +19 -0
  51. data/spec/dummy/app/views/posts/show.html.erb +1 -0
  52. data/spec/dummy/config/application.rb +64 -0
  53. data/spec/dummy/config/boot.rb +10 -0
  54. data/spec/dummy/config/database.yml +25 -0
  55. data/spec/dummy/config/environment.rb +5 -0
  56. data/spec/dummy/config/environments/development.rb +34 -0
  57. data/spec/dummy/config/environments/production.rb +55 -0
  58. data/spec/dummy/config/environments/test.rb +32 -0
  59. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  60. data/spec/dummy/config/initializers/inflections.rb +15 -0
  61. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  62. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  63. data/spec/dummy/config/initializers/session_store.rb +8 -0
  64. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  65. data/spec/dummy/config/locales/en.yml +5 -0
  66. data/spec/dummy/config/routes.rb +7 -0
  67. data/spec/dummy/config.ru +4 -0
  68. data/spec/dummy/db/migrate/20121019115657_create_posts.rb +8 -0
  69. data/spec/dummy/db/schema.rb +21 -0
  70. data/spec/dummy/db/seeds.rb +2 -0
  71. data/spec/dummy/lib/tasks/spec.rake +5 -0
  72. data/spec/dummy/log/.gitkeep +0 -0
  73. data/spec/dummy/public/404.html +26 -0
  74. data/spec/dummy/public/422.html +26 -0
  75. data/spec/dummy/public/500.html +25 -0
  76. data/spec/dummy/public/favicon.ico +0 -0
  77. data/spec/dummy/script/rails +6 -0
  78. data/spec/dummy/spec/decorators/post_decorator_spec.rb +23 -0
  79. data/spec/dummy/spec/mailers/post_mailer_spec.rb +29 -0
  80. data/spec/dummy/spec/spec_helper.rb +9 -0
  81. data/spec/generators/decorator/decorator_generator_spec.rb +24 -5
  82. data/spec/integration/integration_spec.rb +33 -0
  83. data/spec/minitest-rails/spec_type_spec.rb +63 -0
  84. data/{performance → spec/performance}/decorators.rb +2 -4
  85. data/spec/spec_helper.rb +23 -26
  86. data/spec/support/action_controller.rb +12 -0
  87. data/spec/support/active_model.rb +7 -0
  88. data/spec/support/{samples/active_record.rb → active_record.rb} +5 -0
  89. data/spec/support/{samples → decorators}/decorator_with_application_helper.rb +1 -1
  90. data/spec/support/decorators/namespaced_product_decorator.rb +5 -0
  91. data/spec/support/decorators/non_active_model_product_decorator.rb +2 -0
  92. data/spec/support/decorators/product_decorator.rb +19 -0
  93. data/spec/support/decorators/products_decorator.rb +10 -0
  94. data/spec/support/decorators/some_thing_decorator.rb +2 -0
  95. data/spec/support/{samples → decorators}/specific_product_decorator.rb +0 -2
  96. data/spec/support/dummy_app.rb +84 -0
  97. data/spec/support/matchers/have_text.rb +50 -0
  98. data/spec/support/{samples → models}/namespaced_product.rb +1 -3
  99. data/spec/support/{samples → models}/non_active_model_product.rb +1 -0
  100. data/spec/support/{samples → models}/product.rb +13 -2
  101. data/spec/support/models/some_thing.rb +5 -0
  102. data/spec/support/models/uninferrable_decorator_model.rb +3 -0
  103. metadata +207 -98
  104. data/doc/ApplicationDecorator.html +0 -147
  105. data/doc/Draper/AllHelpers.html +0 -256
  106. data/doc/Draper/Base.html +0 -1222
  107. data/doc/Draper/DecoratorGenerator.html +0 -216
  108. data/doc/Draper/LazyHelpers.html +0 -174
  109. data/doc/Draper/ModelSupport.html +0 -164
  110. data/doc/Draper/System.html +0 -179
  111. data/doc/Draper.html +0 -123
  112. data/doc/_index.html +0 -172
  113. data/doc/class_list.html +0 -47
  114. data/doc/css/common.css +0 -1
  115. data/doc/css/full_list.css +0 -53
  116. data/doc/css/style.css +0 -320
  117. data/doc/file_list.html +0 -46
  118. data/doc/frames.html +0 -13
  119. data/doc/index.html +0 -172
  120. data/doc/js/app.js +0 -205
  121. data/doc/js/full_list.js +0 -150
  122. data/doc/js/jquery.js +0 -16
  123. data/doc/method_list.html +0 -174
  124. data/doc/top-level-namespace.html +0 -103
  125. data/lib/draper/active_model_support.rb +0 -27
  126. data/lib/draper/base.rb +0 -312
  127. data/lib/draper/decorated_enumerable_proxy.rb +0 -57
  128. data/lib/draper/model_support.rb +0 -17
  129. data/lib/draper/rspec_integration.rb +0 -2
  130. data/lib/draper/system.rb +0 -10
  131. data/lib/draper/test/view_context.rb +0 -12
  132. data/spec/draper/base_spec.rb +0 -863
  133. data/spec/draper/helper_support_spec.rb +0 -18
  134. data/spec/draper/model_support_spec.rb +0 -48
  135. data/spec/draper/view_context_spec.rb +0 -30
  136. data/spec/support/samples/active_model.rb +0 -9
  137. data/spec/support/samples/application_controller.rb +0 -42
  138. data/spec/support/samples/application_helper.rb +0 -8
  139. data/spec/support/samples/decorator.rb +0 -5
  140. data/spec/support/samples/decorator_with_allows.rb +0 -3
  141. data/spec/support/samples/decorator_with_denies.rb +0 -3
  142. data/spec/support/samples/decorator_with_denies_all.rb +0 -3
  143. data/spec/support/samples/decorator_with_multiple_allows.rb +0 -4
  144. data/spec/support/samples/decorator_with_special_methods.rb +0 -13
  145. data/spec/support/samples/namespaced_product_decorator.rb +0 -7
  146. data/spec/support/samples/product_decorator.rb +0 -7
  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/{performance → spec/performance}/active_record.rb +0 -0
  151. /data/{performance/bechmark.rb → spec/performance/benchmark.rb} +0 -0
  152. /data/{performance → spec/performance}/models.rb +0 -0
  153. /data/spec/support/{samples → decorators}/widget_decorator.rb +0 -0
  154. /data/spec/support/{samples → models}/widget.rb +0 -0
data/spec/spec_helper.rb CHANGED
@@ -3,34 +3,31 @@ require 'ammeter/init'
3
3
  require 'rails'
4
4
 
5
5
  require 'action_view'
6
- require './spec/support/samples/application_controller'
6
+ require 'action_controller'
7
+ require 'action_controller/test_case'
7
8
 
8
9
  Bundler.require
9
10
 
10
- require './spec/support/samples/active_model'
11
- require './spec/support/samples/active_record'
12
- require './spec/support/samples/application_helper'
13
- require './spec/support/samples/decorator'
14
- require './spec/support/samples/decorator_with_allows'
15
- require './spec/support/samples/decorator_with_multiple_allows'
16
- require './spec/support/samples/decorator_with_application_helper'
17
- require './spec/support/samples/decorator_with_denies'
18
- require './spec/support/samples/decorator_with_denies_all'
19
- require './spec/support/samples/decorator_with_special_methods'
20
- require './spec/support/samples/namespaced_product'
21
- require './spec/support/samples/namespaced_product_decorator'
22
- require './spec/support/samples/non_active_model_product'
23
- require './spec/support/samples/product'
24
- require './spec/support/samples/product_decorator'
25
- require './spec/support/samples/sequel_product'
26
- require './spec/support/samples/specific_product_decorator'
27
- require './spec/support/samples/some_thing'
28
- require './spec/support/samples/some_thing_decorator'
29
- require './spec/support/samples/widget'
30
- require './spec/support/samples/widget_decorator'
11
+ require './spec/support/active_model'
12
+ require './spec/support/active_record'
13
+ require './spec/support/action_controller'
31
14
 
32
- module ActionController
33
- class Base
34
- Draper::System.setup(self)
35
- end
15
+ require './spec/support/models/product'
16
+ require './spec/support/models/namespaced_product'
17
+ require './spec/support/models/non_active_model_product'
18
+ require './spec/support/models/widget'
19
+ require './spec/support/models/some_thing'
20
+ require './spec/support/models/uninferrable_decorator_model'
21
+
22
+ require './spec/support/decorators/product_decorator'
23
+ require './spec/support/decorators/namespaced_product_decorator'
24
+ require './spec/support/decorators/non_active_model_product_decorator'
25
+ require './spec/support/decorators/widget_decorator'
26
+ require './spec/support/decorators/specific_product_decorator'
27
+ require './spec/support/decorators/products_decorator'
28
+ require './spec/support/decorators/some_thing_decorator'
29
+ require './spec/support/decorators/decorator_with_application_helper'
30
+
31
+ class << Rails
32
+ undef application # Avoid silly Rails bug: https://github.com/rails/rails/pull/6429
36
33
  end
@@ -0,0 +1,12 @@
1
+ module ActionController
2
+ class Base
3
+ Draper.setup_action_controller(self)
4
+ end
5
+ end
6
+
7
+ class ApplicationController < ActionController::Base
8
+ def hello_world
9
+ "Hello, World!"
10
+ end
11
+ helper_method :hello_world
12
+ end
@@ -0,0 +1,7 @@
1
+ module ActiveModel
2
+ module Serialization
3
+ def serializable_hash
4
+ {overridable: send(:overridable)}
5
+ end
6
+ end
7
+ end
@@ -15,3 +15,8 @@ module ActiveRecord
15
15
 
16
16
  end
17
17
  end
18
+
19
+ module ActiveRecord
20
+ class Relation
21
+ end
22
+ end
@@ -1,4 +1,4 @@
1
- class DecoratorWithApplicationHelper < Draper::Base
1
+ class DecoratorWithApplicationHelper < Draper::Decorator
2
2
  def uses_hello_world
3
3
  h.hello_world
4
4
  end
@@ -0,0 +1,5 @@
1
+ module Namespace
2
+ class ProductDecorator < Draper::Decorator
3
+ has_finders
4
+ end
5
+ end
@@ -0,0 +1,2 @@
1
+ class NonActiveModelProductDecorator
2
+ end
@@ -0,0 +1,19 @@
1
+ class ProductDecorator < Draper::Decorator
2
+ has_finders
3
+
4
+ def awesome_title
5
+ "Awesome Title"
6
+ end
7
+
8
+ def overridable
9
+ :overridden
10
+ end
11
+
12
+ def self.my_class_method
13
+ end
14
+
15
+ private
16
+
17
+ def awesome_private_title
18
+ end
19
+ end
@@ -0,0 +1,10 @@
1
+ class ProductsDecorator < Draper::CollectionDecorator
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
@@ -0,0 +1,2 @@
1
+ class SomeThingDecorator < Draper::Decorator
2
+ end
@@ -1,4 +1,2 @@
1
- require './spec/support/samples/product_decorator'
2
-
3
1
  class SpecificProductDecorator < ProductDecorator
4
2
  end
@@ -0,0 +1,84 @@
1
+ require 'socket'
2
+ require 'net/http'
3
+
4
+ # Adapted from code by Jon Leighton
5
+ # https://github.com/jonleighton/focused_controller/blob/ec7ccf1/test/acceptance/app_test.rb
6
+
7
+ class DummyApp
8
+
9
+ def initialize(environment)
10
+ raise ArgumentError, "Environment must be development or production" unless ["development", "production"].include?(environment.to_s)
11
+ @environment = environment
12
+ end
13
+
14
+ attr_reader :environment
15
+
16
+ def url
17
+ "http://#{localhost}:#{port}"
18
+ end
19
+
20
+ def get(path)
21
+ Net::HTTP.get(URI(url + path))
22
+ end
23
+
24
+ def within_app(&block)
25
+ Dir.chdir(root, &block)
26
+ end
27
+
28
+ def start_server
29
+ within_app do
30
+ IO.popen("bundle exec rails s -e #{@environment} -p #{port} 2>&1") do |out|
31
+ start = Time.now
32
+ started = false
33
+ output = ""
34
+ timeout = 60.0
35
+
36
+ while !started && !out.eof? && Time.now - start <= timeout
37
+ output << read_output(out)
38
+ sleep 0.1
39
+
40
+ begin
41
+ TCPSocket.new(localhost, port)
42
+ rescue Errno::ECONNREFUSED
43
+ else
44
+ started = true
45
+ end
46
+ end
47
+
48
+ raise "Server failed to start:\n#{output}" unless started
49
+
50
+ yield
51
+
52
+ Process.kill('KILL', out.pid)
53
+ end
54
+ end
55
+ end
56
+
57
+ private
58
+
59
+ def root
60
+ File.expand_path('../../dummy', __FILE__)
61
+ end
62
+
63
+ def localhost
64
+ '127.0.0.1'
65
+ end
66
+
67
+ def port
68
+ @port ||= begin
69
+ server = TCPServer.new(localhost, 0)
70
+ server.addr[1]
71
+ ensure
72
+ server.close if server
73
+ end
74
+ end
75
+
76
+ def read_output(stream)
77
+ read = IO.select([stream], [], [stream], 0.1)
78
+ output = ""
79
+ loop { output << stream.read_nonblock(1024) } if read
80
+ output
81
+ rescue Errno::EAGAIN, Errno::EWOULDBLOCK, EOFError
82
+ output
83
+ end
84
+ end
@@ -0,0 +1,50 @@
1
+ require 'capybara'
2
+
3
+ module HaveTextMatcher
4
+ def have_text(text)
5
+ HaveText.new(text)
6
+ end
7
+
8
+ class HaveText
9
+ def initialize(text)
10
+ @text = text
11
+ end
12
+
13
+ def in(css)
14
+ @css = css
15
+ self
16
+ end
17
+
18
+ def matches?(subject)
19
+ @subject = Capybara.string(subject)
20
+
21
+ @subject.has_css?(@css || "*", text: @text)
22
+ end
23
+
24
+ def failure_message_for_should
25
+ "expected to find #{@text.inspect} #{within}"
26
+ end
27
+
28
+ def failure_message_for_should_not
29
+ "expected not to find #{@text.inspect} #{within}"
30
+ end
31
+
32
+ private
33
+
34
+ def within
35
+ if @css && @subject.has_css?(@css)
36
+ "within\n#{@subject.find(@css).native}"
37
+ else
38
+ "#{inside} within\n#{@subject.native}"
39
+ end
40
+ end
41
+
42
+ def inside
43
+ @css ? "inside #{@css.inspect}" : "anywhere"
44
+ end
45
+ end
46
+ end
47
+
48
+ RSpec.configure do |config|
49
+ config.include HaveTextMatcher
50
+ end
@@ -1,8 +1,6 @@
1
- require './spec/support/samples/product'
2
-
3
1
  module Namespace
4
2
  class Product < ActiveRecord::Base
5
- include Draper::ModelSupport
3
+ include Draper::Decoratable
6
4
 
7
5
  def self.first
8
6
  @@first ||= Namespace::Product.new
@@ -1,2 +1,3 @@
1
1
  class NonActiveModelProduct
2
+ include Draper::Decoratable
2
3
  end
@@ -1,5 +1,8 @@
1
1
  class Product < ActiveRecord::Base
2
- include Draper::ModelSupport
2
+ include Draper::Decoratable
3
+ include ActiveModel::Serialization
4
+
5
+ delegate :delegated_method, to: :thing
3
6
 
4
7
  def self.find_by_name(name)
5
8
  @@dummy ||= Product.new
@@ -22,7 +25,7 @@ class Product < ActiveRecord::Base
22
25
  end
23
26
 
24
27
  def self.model_name
25
- "Product"
28
+ name
26
29
  end
27
30
 
28
31
  def self.find(id)
@@ -77,4 +80,12 @@ class Product < ActiveRecord::Base
77
80
  Product.new
78
81
  end
79
82
 
83
+ def overridable
84
+ :overridable
85
+ end
86
+
87
+ private
88
+
89
+ def private_title
90
+ end
80
91
  end
@@ -0,0 +1,5 @@
1
+ class SomeThing < Product
2
+ def delegated_method
3
+ 'Yay, delegation'
4
+ end
5
+ end
@@ -0,0 +1,3 @@
1
+ class UninferrableDecoratorModel
2
+ include Draper::Decoratable
3
+ end