cells 3.11.3 → 4.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 (204) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -1
  3. data/.travis.yml +15 -13
  4. data/Appraisals +23 -0
  5. data/CHANGES.md +20 -3
  6. data/Gemfile +5 -7
  7. data/README.md +317 -236
  8. data/Rakefile +1 -1
  9. data/TODO.md +3 -0
  10. data/cells.gemspec +19 -28
  11. data/gemfiles/rails3.2.gemfile +14 -0
  12. data/gemfiles/rails4.0.gemfile +14 -0
  13. data/gemfiles/rails4.1.gemfile +15 -0
  14. data/gemfiles/rails4.2.gemfile +14 -0
  15. data/lib/cell.rb +28 -21
  16. data/lib/cell/caching.rb +10 -22
  17. data/lib/cell/caching/notification.rb +15 -0
  18. data/lib/cell/concept.rb +4 -69
  19. data/lib/cell/development.rb +11 -0
  20. data/lib/{cells → cell}/engines.rb +1 -1
  21. data/lib/cell/layout.rb +20 -0
  22. data/lib/cell/partial.rb +17 -0
  23. data/lib/cell/{base/prefixes.rb → prefixes.rb} +1 -1
  24. data/lib/cell/rails.rb +58 -50
  25. data/lib/cell/railtie.rb +60 -0
  26. data/lib/cell/{base/self_contained.rb → self_contained.rb} +1 -1
  27. data/lib/cell/templates.rb +60 -0
  28. data/lib/cell/test_case.rb +4 -162
  29. data/lib/cell/testing.rb +15 -0
  30. data/lib/cell/twin.rb +11 -29
  31. data/lib/cell/version.rb +10 -0
  32. data/lib/cell/view_model.rb +196 -88
  33. data/lib/cells.rb +1 -20
  34. data/lib/rails/generators/cell/cell_generator.rb +43 -0
  35. data/lib/rails/generators/cell/templates/cell.rb.erb +8 -0
  36. data/lib/{generators/templates/concept → rails/generators/cell/templates}/view.erb +0 -0
  37. data/lib/{generators/templates/concept → rails/generators/cell/templates}/view.haml +0 -0
  38. data/lib/rails/generators/cell/templates/view.slim +2 -0
  39. data/lib/rails/generators/concept/concept_generator.rb +38 -0
  40. data/lib/{generators/templates/concept/cell.rb → rails/generators/concept/templates/concept.rb.erb} +2 -2
  41. data/lib/{generators → rails/generators/concept}/templates/view.erb +0 -0
  42. data/lib/{generators → rails/generators/concept}/templates/view.haml +0 -0
  43. data/lib/rails/generators/concept/templates/view.slim +2 -0
  44. data/lib/rails/generators/test_unit/cell/cell_generator.rb +21 -0
  45. data/lib/{generators/templates/cell_test.rb → rails/generators/test_unit/cell/templates/unit_test.rb.erb} +3 -3
  46. data/lib/rails/generators/test_unit/concept/concept_generator.rb +21 -0
  47. data/lib/rails/generators/test_unit/concept/templates/unit_test.rb.erb +11 -0
  48. data/lib/{cells → tasks}/cells.rake +0 -0
  49. data/test/builder_test.rb +58 -0
  50. data/test/caching_test.rb +298 -0
  51. data/test/cell_benchmark.rb +32 -0
  52. data/test/cell_generator_test.rb +51 -82
  53. data/test/cell_test.rb +8 -23
  54. data/test/concept_generator_test.rb +22 -13
  55. data/test/concept_test.rb +41 -75
  56. data/test/dummy/app/views/musician/hamlet.html.erb +1 -0
  57. data/test/dummy/config/application.rb +21 -8
  58. data/test/{app/cells/bassist/play.html.erb → fixtures/bassist/play.erb} +0 -0
  59. data/test/fixtures/concepts/record/views/layout.erb +1 -0
  60. data/test/{app → fixtures}/concepts/record/views/show.erb +0 -0
  61. data/test/{app → fixtures}/concepts/record/views/song.erb +0 -0
  62. data/test/fixtures/inherit_views_test/popper/tap.erb +1 -0
  63. data/test/fixtures/inherit_views_test/tapper/play.erb +1 -0
  64. data/test/fixtures/inherit_views_test/tapper/tap.erb +1 -0
  65. data/test/fixtures/partial_test/with_partial/show.erb +1 -0
  66. data/test/fixtures/partials/_show.html.erb +1 -0
  67. data/test/fixtures/partials/_show.xml.erb +1 -0
  68. data/test/fixtures/song/ivar.erb +1 -0
  69. data/test/fixtures/song/show.erb +1 -0
  70. data/test/fixtures/song/with_erb.erb +4 -0
  71. data/test/fixtures/song/with_html.erb +1 -0
  72. data/test/fixtures/song/with_locals.erb +2 -0
  73. data/test/fixtures/song_with_layout/happy.erb +1 -0
  74. data/test/fixtures/song_with_layout/merry.erb +1 -0
  75. data/test/fixtures/song_with_layout/show.erb +1 -0
  76. data/test/fixtures/song_with_layout/show_with_layout.erb +1 -0
  77. data/test/fixtures/templates_caching_test/song/show.erb +1 -0
  78. data/test/fixtures/url_helper_test/song/edit.erb +8 -0
  79. data/test/fixtures/url_helper_test/song/with_block.erb +2 -0
  80. data/test/fixtures/url_helper_test/song/with_capture.erb +4 -0
  81. data/test/fixtures/url_helper_test/song/with_content_tag.erb +6 -0
  82. data/test/fixtures/url_helper_test/song/with_form_for_block.erb +3 -0
  83. data/test/fixtures/url_helper_test/song/with_link_to.erb +3 -0
  84. data/test/layout_test.rb +57 -0
  85. data/test/partial_test.rb +27 -0
  86. data/test/prefixes_test.rb +36 -10
  87. data/test/public_test.rb +42 -0
  88. data/test/rails_extensions_test.rb +51 -0
  89. data/test/render_test.rb +103 -0
  90. data/test/templates_test.rb +45 -0
  91. data/test/test_case_test.rb +21 -122
  92. data/test/test_helper.rb +37 -33
  93. data/test/twin_test.rb +3 -7
  94. data/test/url_helper_test.rb +89 -0
  95. metadata +92 -357
  96. data/gemfiles/Gemfile.rails3-0 +0 -7
  97. data/gemfiles/Gemfile.rails3-1 +0 -7
  98. data/gemfiles/Gemfile.rails3-2 +0 -7
  99. data/gemfiles/Gemfile.rails4-0 +0 -12
  100. data/gemfiles/Gemfile.rails4-1 +0 -12
  101. data/lib/cell/base.rb +0 -82
  102. data/lib/cell/base/view.rb +0 -15
  103. data/lib/cell/builder.rb +0 -71
  104. data/lib/cell/deprecations.rb +0 -41
  105. data/lib/cell/dsl.rb +0 -7
  106. data/lib/cell/rack.rb +0 -32
  107. data/lib/cell/rails/helper_api.rb +0 -37
  108. data/lib/cell/rails/view_model.rb +0 -159
  109. data/lib/cell/rails3_0_strategy.rb +0 -82
  110. data/lib/cell/rails3_1_strategy.rb +0 -40
  111. data/lib/cell/rails4_0_strategy.rb +0 -39
  112. data/lib/cell/rails4_1_strategy.rb +0 -40
  113. data/lib/cell/rendering.rb +0 -109
  114. data/lib/cells/rails.rb +0 -86
  115. data/lib/cells/railtie.rb +0 -38
  116. data/lib/cells/version.rb +0 -3
  117. data/lib/generators/USAGE +0 -30
  118. data/lib/generators/cells/base.rb +0 -22
  119. data/lib/generators/cells/cell_generator.rb +0 -15
  120. data/lib/generators/cells/view_generator.rb +0 -18
  121. data/lib/generators/erb/cell_generator.rb +0 -15
  122. data/lib/generators/erb/concept_generator.rb +0 -17
  123. data/lib/generators/haml/cell_generator.rb +0 -17
  124. data/lib/generators/haml/concept_generator.rb +0 -17
  125. data/lib/generators/rails/cell_generator.rb +0 -16
  126. data/lib/generators/rails/concept_generator.rb +0 -16
  127. data/lib/generators/slim/cell_generator.rb +0 -17
  128. data/lib/generators/templates/cell.rb +0 -9
  129. data/lib/generators/templates/view.slim +0 -4
  130. data/lib/generators/test_unit/cell_generator.rb +0 -14
  131. data/lib/generators/trailblazer/base.rb +0 -21
  132. data/lib/generators/trailblazer/view_generator.rb +0 -18
  133. data/test/app/cells/album/views/cover.haml +0 -1
  134. data/test/app/cells/bad_guitarist/_dii.html.erb +0 -1
  135. data/test/app/cells/bad_guitarist_cell.rb +0 -2
  136. data/test/app/cells/bassist/_dii.html.erb +0 -1
  137. data/test/app/cells/bassist/ahem.html.erb +0 -1
  138. data/test/app/cells/bassist/compose.html.erb +0 -1
  139. data/test/app/cells/bassist/contact_form.html.erb +0 -1
  140. data/test/app/cells/bassist/form_for.erb +0 -3
  141. data/test/app/cells/bassist/form_for_in_haml.haml +0 -2
  142. data/test/app/cells/bassist/jam.html.erb +0 -3
  143. data/test/app/cells/bassist/play.js.erb +0 -1
  144. data/test/app/cells/bassist/pose.html.erb +0 -1
  145. data/test/app/cells/bassist/promote.html.erb +0 -1
  146. data/test/app/cells/bassist/provoke.html.erb +0 -1
  147. data/test/app/cells/bassist/shout.html.erb +0 -1
  148. data/test/app/cells/bassist/sing.html.haml +0 -1
  149. data/test/app/cells/bassist/slap.html.erb +0 -1
  150. data/test/app/cells/bassist/yell.en.html.erb +0 -1
  151. data/test/app/cells/bassist_cell.rb +0 -25
  152. data/test/app/cells/club_security.rb +0 -2
  153. data/test/app/cells/club_security/guard/help.html.erb +0 -1
  154. data/test/app/cells/club_security/guard_cell.rb +0 -6
  155. data/test/app/cells/club_security/medic/help.html.erb +0 -1
  156. data/test/app/cells/club_security/medic_cell.rb +0 -8
  157. data/test/app/cells/layouts/b.erb +0 -1
  158. data/test/app/cells/layouts/metal.html.erb +0 -1
  159. data/test/app/cells/rails_helper_api_test/bassist/edit.html.erb +0 -5
  160. data/test/app/cells/shouter/sing.html.erb +0 -1
  161. data/test/app/cells/song/dashboard.haml +0 -7
  162. data/test/app/cells/song/details.html.haml +0 -1
  163. data/test/app/cells/song/info.html.haml +0 -1
  164. data/test/app/cells/song/lyrics.html.haml +0 -6
  165. data/test/app/cells/song/plays.haml +0 -1
  166. data/test/app/cells/song/scale.haml +0 -1
  167. data/test/app/cells/song/show.html.haml +0 -3
  168. data/test/app/cells/song/title.html.haml +0 -1
  169. data/test/app/cells/trumpeter/promote.html.erb +0 -1
  170. data/test/app/cells/trumpeter_cell.rb +0 -8
  171. data/test/app/cells/view_model_test/comments/show.haml +0 -7
  172. data/test/app/concepts/record/views/layout.haml +0 -2
  173. data/test/app/views/shared/_dong.html.erb +0 -1
  174. data/test/cell_module_test.rb +0 -170
  175. data/test/cells_module_test.rb +0 -27
  176. data/test/deprecations_test.rb +0 -101
  177. data/test/dummy/app/helpers/application_helper.rb +0 -2
  178. data/test/dummy/app/views/musician/hamlet.html.haml +0 -1
  179. data/test/dummy/config/environments/development.rb +0 -16
  180. data/test/dummy/config/environments/production.rb +0 -46
  181. data/test/dummy/config/environments/test.rb +0 -33
  182. data/test/dummy/db/test.sqlite3 +0 -0
  183. data/test/dummy/label/app/cells/label/show.erb +0 -1
  184. data/test/dummy/label/app/cells/label_cell.rb +0 -5
  185. data/test/dummy/label/label.gemspec +0 -20
  186. data/test/dummy/label/lib/label.rb +0 -4
  187. data/test/dummy/label/lib/label/version.rb +0 -3
  188. data/test/dummy/public/404.html +0 -26
  189. data/test/dummy/public/422.html +0 -26
  190. data/test/dummy/public/500.html +0 -26
  191. data/test/dummy/public/favicon.ico +0 -0
  192. data/test/dummy/public/stylesheets/.gitkeep +0 -0
  193. data/test/helper_test.rb +0 -81
  194. data/test/rack_test.rb +0 -32
  195. data/test/rails/asset_pipeline_test.rb +0 -20
  196. data/test/rails/caching_test.rb +0 -456
  197. data/test/rails/cells_test.rb +0 -119
  198. data/test/rails/forms_test.rb +0 -75
  199. data/test/rails/integration_test.rb +0 -299
  200. data/test/rails/render_test.rb +0 -189
  201. data/test/rails/view_model_test.rb +0 -226
  202. data/test/rails/view_test.rb +0 -49
  203. data/test/rails_helper_api_test.rb +0 -58
  204. data/test/self_contained_test.rb +0 -31
@@ -1,7 +0,0 @@
1
- source "http://rubygems.org"
2
-
3
- # Specify your gem's dependencies in cells.gemspec
4
- gemspec path: '../'
5
-
6
- gem 'railties', '3.0.20'
7
- gem 'minitest', '4.7.5'
@@ -1,7 +0,0 @@
1
- source "http://rubygems.org"
2
-
3
- # Specify your gem's dependencies in cells.gemspec
4
- gemspec path: '../'
5
-
6
- gem 'railties', '~> 3.1.0'
7
- gem 'minitest', '4.7.5'
@@ -1,7 +0,0 @@
1
- source "http://rubygems.org"
2
-
3
- # Specify your gem's dependencies in cells.gemspec
4
- gemspec path: '../'
5
-
6
- gem 'railties', '~> 3.2.0'
7
- gem 'minitest', '4.7.5'
@@ -1,12 +0,0 @@
1
- source "http://rubygems.org"
2
-
3
- # Specify your gem's dependencies in cells.gemspec
4
- gemspec path: '../'
5
-
6
- gem 'railties', '4.0.2'
7
- gem 'activemodel', '4.0.2'
8
- gem 'minitest', '4.7.5'
9
- gem 'sprockets', '~> 2.1'
10
- gem 'sprockets-rails', '~> 2.1.3', :require => 'sprockets/railtie'
11
-
12
- gem 'label', :path => "../test/dummy/label"
@@ -1,12 +0,0 @@
1
- source "http://rubygems.org"
2
-
3
- # Specify your gem's dependencies in cells.gemspec
4
- gemspec path: '../'
5
-
6
- gem 'railties', '4.1.1'
7
- gem 'activemodel', '4.1.1'
8
- gem 'minitest', '5.2.0'
9
- gem 'sprockets', '~> 2.1'
10
- gem 'sprockets-rails', '~> 2.1.3', :require => 'sprockets/railtie'
11
-
12
- gem 'label', :path => "../test/dummy/label", :require => 'label'
@@ -1,82 +0,0 @@
1
- require 'abstract_controller'
2
- require 'cell/builder'
3
- require 'cell/caching'
4
- require 'cell/rendering'
5
- require 'cell/dsl'
6
-
7
- module Cell
8
- require 'uber/version'
9
- def self.rails_version
10
- Uber::Version.new(::ActionPack::VERSION::STRING)
11
- end
12
-
13
-
14
- class Base < AbstractController::Base
15
- # TODO: deprecate Base in favour of Cell.
16
- abstract!
17
-
18
- include AbstractController
19
- include AbstractController::Rendering, Helpers, Callbacks, Translation, Logger
20
-
21
- self.view_paths = "app/cells"
22
-
23
-
24
- require 'cell/rails3_0_strategy' if Cell.rails_version.~ "3.0"
25
- require 'cell/rails3_1_strategy' if Cell.rails_version.~( "3.1", "3.2")
26
- require 'cell/rails4_0_strategy' if Cell.rails_version.~ "4.0"
27
- require 'cell/rails4_1_strategy' if Cell.rails_version >= "4.1"
28
- include VersionStrategy
29
- include Layouts
30
- include Rendering
31
- include Caching
32
- include Cell::DSL
33
-
34
- extend Builder::ClassMethods # ::build DSL method and ::builders.
35
-
36
-
37
- def initialize(*args)
38
- super() # AbC::Base.
39
- process_args(*args)
40
- end
41
-
42
- def self.class_from_cell_name(name)
43
- "#{name}_cell".classify.constantize
44
- end
45
-
46
-
47
- class << self
48
- # Main entry point for instantiating cells.
49
- def cell_for(name, *args)
50
- Builder.new(class_from_cell_name(name), self).call(*args)
51
- end
52
-
53
- alias_method :create_cell_for, :cell_for # TODO: remove us in 3.12.
54
- ActiveSupport::Deprecation.deprecate_methods(self, :create_cell_for => :cell_for)
55
- end
56
-
57
- private
58
- def process_args(*)
59
- end
60
-
61
-
62
- def self.view_context_class # DISCUSS: this is only needed for non-vm cells.
63
- @view_context_class ||= begin
64
- Cell::Base::View.prepare(helper_modules)
65
- end
66
- end
67
-
68
- def self.controller_path
69
- @controller_path ||= name.sub(/Cell$/, '').underscore unless anonymous?
70
- end
71
-
72
-
73
- require 'cell/base/view'
74
- require 'cell/base/prefixes'
75
- include Prefixes
76
- require 'cell/base/self_contained'
77
- extend SelfContained
78
- end
79
-
80
- autoload :ViewModel, 'cell/view_model'
81
- autoload :Concept, 'cell/concept'
82
- end
@@ -1,15 +0,0 @@
1
- class Cell::Base::View < ActionView::Base
2
- def self.prepare(modules)
3
- # TODO: remove for 4.0 if PR https://github.com/rails/rails/pull/6826 is merged.
4
- Class.new(self) do # DISCUSS: why are we mixing that stuff into this _anonymous_ class at all? that makes things super complicated.
5
- include *modules.reverse
6
- end
7
- end
8
-
9
- def render(*args, &block)
10
- options = args.first.is_a?(::Hash) ? args.first : {} # this is copied from #render by intention.
11
-
12
- return controller.render(*args, &block) if options[:state] or options[:view]
13
- super
14
- end
15
- end
@@ -1,71 +0,0 @@
1
- module Cell
2
- # Contains all methods for dynamically building a cell instance by using decider blocks.
3
- #
4
- # Design notes:
5
- # * totally generic, doesn't know about parent_controller etc.
6
- # * only dependency: constant.builders (I wanted to hide this from Cell::Base)
7
- # * can easily be replaced or removed.
8
- class Builder
9
- def initialize(constant, exec_context) # TODO: evaluate usage of builders and implement using Uber::Options::Value.
10
- @constant = constant
11
- @exec_context = exec_context
12
- @builders = @constant.builders # only dependency, must be a Cell::Base subclass.
13
- end
14
-
15
- # Creates a cell instance. Note that this method calls builders which were attached to the
16
- # class with Cell::Base.build - this might lead to a different cell being returned.
17
- def call(*args)
18
- build_class_for(*args).
19
- new(*args)
20
- end
21
-
22
- private
23
- def build_class_for(*args)
24
- @builders.each do |blk|
25
- klass = run_builder_block(blk, *args) and return klass
26
- end
27
- @constant
28
- end
29
-
30
- def run_builder_block(block, *args)
31
- @exec_context.instance_exec(*args, &block)
32
- end
33
-
34
-
35
- module ClassMethods
36
- # Adds a builder to the cell class. Builders are used in #render_cell to find out the concrete
37
- # class for rendering. This is helpful if you frequently want to render subclasses according
38
- # to different circumstances (e.g. login situations) and you don't want to place these deciders in
39
- # your view code.
40
- #
41
- # Passes the opts hash from #render_cell into the block. The block is executed in controller context.
42
- # Multiple build blocks are ORed, if no builder matches the building cell is used.
43
- #
44
- # Example:
45
- #
46
- # Consider two different user box cells in your app.
47
- #
48
- # class AuthorizedUserBox < UserInfoBox
49
- # end
50
- #
51
- # class AdminUserBox < UserInfoBox
52
- # end
53
- #
54
- # Now you don't want to have deciders all over your views - use a declarative builder.
55
- #
56
- # UserInfoBox.build do |opts|
57
- # AuthorizedUserBox if user_signed_in?
58
- # AdminUserBox if admin_signed_in?
59
- # end
60
- #
61
- # In your view #render_cell will instantiate the right cell for you now.
62
- def build(&block)
63
- builders << block
64
- end
65
-
66
- def builders
67
- @builders ||= []
68
- end
69
- end # ClassMethods
70
- end
71
- end
@@ -1,41 +0,0 @@
1
- module Cell
2
- # Makes #options available in Cells 3.7, which was removed in favor of state-args.
3
- # Note that Deprecations are only available for Cell::Rails.
4
- module Deprecations
5
- extend ActiveSupport::Concern
6
-
7
- included do
8
- attr_reader :options
9
- end
10
-
11
-
12
- module ClassMethods
13
- def build_for(controller, *args)
14
- build_class_for(controller, *args).
15
- new(controller, *args)
16
- end
17
- end
18
-
19
-
20
- def initialize(parent_controller, *args)
21
- super(parent_controller) # the real Rails.new.
22
- setup_backwardibility(*args)
23
- end
24
-
25
- # Some people still like #options and assume it's a hash.
26
- def setup_backwardibility(*args)
27
- @_options = (args.first.is_a?(Hash) and args.size == 1) ? args.first : args
28
- @options = ActiveSupport::Deprecation::DeprecatedObjectProxy.new(@_options, "#options is deprecated and was removed in Cells 3.7. Please use state-args.")
29
- end
30
-
31
- def render_state(state, *args)
32
- return super(state, *args) if state_accepts_args?(state)
33
- super(state) # backward-compat.
34
- end
35
-
36
- def state_accepts_args?(state)
37
- method(state).arity != 0
38
- end
39
-
40
- end
41
- end
@@ -1,7 +0,0 @@
1
- module Cell
2
- module DSL
3
- def cell(*args)
4
- Base.cell_for(*args)
5
- end
6
- end
7
- end
@@ -1,32 +0,0 @@
1
- require 'cell/base'
2
-
3
- module Cell
4
- # Use Cell::Rack to mount your cell to a rack-route with a working +session+ and +params+ reference
5
- # in the cell. This is especially useful when using gems like devise with your cell, without the
6
- # entire Cell::Rails overhead.
7
- #
8
- # The only dependency these kinds of cells have is a Rack-compatible request object.
9
- #
10
- # Example:
11
- #
12
- # match "/dashboard/comments" => proc { |env|
13
- # request = ActionDispatch::Request.new(env)
14
- # [ 200, {}, [ Cell::Rack.render_cell_for(:comments, :show, request) ]]
15
- # }
16
- class Rack < Base
17
- attr_reader :request
18
- delegate :session, :params, :to => :request
19
-
20
- class << self
21
- # DISCUSS: i don't like these class methods. maybe a RenderingStrategy?
22
- def render_cell_state(cell, state, request, *args) # defined in Rendering.
23
- super(cell, state, *args)
24
- end
25
- end
26
-
27
- def initialize(request, *args)
28
- super(*args)
29
- @request = request
30
- end
31
- end
32
- end
@@ -1,37 +0,0 @@
1
- module Cell
2
- # Allows using many Rails gem in your cells outside of a Rails environment.
3
- class Rails
4
- module HelperAPI
5
- module InternalHelpers
6
- def protect_against_forgery? # used in form_tag_helper.rb:651
7
- false
8
- end
9
-
10
- def _routes # FIXME: where is this set in rails?
11
- self.class._routes
12
- end
13
- end
14
-
15
- extend ActiveSupport::Concern
16
-
17
- module ClassMethods
18
- attr_accessor :_routes
19
-
20
- def helper_modules
21
- [_helpers, InternalHelpers]
22
- end
23
-
24
- def view_context_class
25
- super
26
- @view_context_class._routes = _routes
27
- @view_context_class
28
- end
29
-
30
- def action_methods
31
- # DISCUSS: we have to overwrite this to avoid a stupid dependency in AbstractController::UrlFor where _routes.named_routes.helper_names is accessed.
32
- public_instance_methods(true).map { |x| x.to_s }
33
- end
34
- end
35
- end
36
- end
37
- end
@@ -1,159 +0,0 @@
1
- # no helper_method calls
2
- # no instance variables
3
- # no locals
4
- # options are automatically made instance methods via constructor.
5
- # call "helpers" in class
6
-
7
- # TODO: warn when using ::property but not passing in model in constructor.
8
-
9
- class Cell::Rails
10
- module ViewModel
11
- include Cell::OptionsConstructor
12
- #include ActionView::Helpers::UrlHelper
13
- include ActionView::Context # this includes CompiledTemplates, too.
14
- # properties :title, :body
15
- attr_reader :model
16
-
17
-
18
- def self.included(*)
19
- ActiveSupport::Deprecation.warn("The Cell::Rails::ViewModel module is deprecated and will be removed in Cells 4.0. Please inherit: `class SongCell < Cell::ViewModel`. Thanks and don't forget to smile.")
20
- super
21
- end
22
-
23
-
24
-
25
- module Helpers
26
- # DISCUSS: highest level API method. add #cell here.
27
- def collection(name, controller, array, method=:show, builder=Cell::Rails)
28
- # FIXME: this is the problem in Concept cells, we don't wanna call Cell::Rails.cell_for here.
29
- array.collect { |model| builder.cell_for(name, controller, model).call(method) }.join("\n").html_safe
30
- end
31
-
32
- # TODO: this should be in Helper or something. this should be the only entry point from controller/view.
33
- def cell(name, controller, *args, &block) # classic Rails fuzzy API.
34
- if args.first.is_a?(Hash) and array = args.first[:collection]
35
- return collection(name, controller, array)
36
- end
37
-
38
- Cell::Rails.cell_for(name, controller, *args, &block)
39
- end
40
- end
41
- extend Helpers # FIXME: do we really need ViewModel::cell/::collection ?
42
-
43
-
44
- module ClassMethods
45
- def property(*names)
46
- delegate *names, :to => :model
47
- end
48
-
49
- include Helpers
50
- end
51
- extend ActiveSupport::Concern
52
-
53
-
54
- def cell(name, *args)
55
- self.class.cell(name, parent_controller, *args)
56
- end
57
-
58
-
59
- def initialize(*args)
60
- super
61
- _prepare_context # happens in AV::Base at the bottom.
62
- end
63
-
64
- def render(options={})
65
- if options.is_a?(Hash)
66
- options.reverse_merge!(:view => state_for_implicit_render)
67
- else
68
- options = {:view => options.to_s}
69
- end
70
-
71
- super
72
- end
73
-
74
- def call(state=:show)
75
- # it is ok to call to_s.html_safe here as #call is a defined rendering method.
76
- # DISCUSS: IN CONCEPT: render( view: implicit_state)
77
- render_state(state).to_s.html_safe
78
- end
79
-
80
- private
81
- def view_context
82
- self
83
- end
84
-
85
- def state_for_implicit_render()
86
- caller[1].match(/`(\w+)/)[1]
87
- end
88
-
89
- # def implicit_state
90
- # controller_path.split("/").last
91
- # end
92
- end
93
-
94
-
95
- # FIXME: this module is to fix a design flaw in Rails 4.0. the problem is that AV::UrlHelper mixes in the wrong #url_for.
96
- # if we could mix in everything else from the helper except for the #url_for, it would be fine.
97
- module LinkToHelper
98
- include ActionView::Helpers::TagHelper
99
-
100
- def link_to(name = nil, options = nil, html_options = nil, &block)
101
- html_options, options, name = options, name, block if block_given?
102
- options ||= {}
103
-
104
- html_options = convert_options_to_data_attributes(options, html_options)
105
-
106
- url = url_for(options)
107
- html_options['href'] ||= url
108
-
109
- content_tag(:a, name || url, html_options, &block)
110
- end
111
-
112
- def convert_options_to_data_attributes(options, html_options)
113
- if html_options
114
- html_options = html_options.stringify_keys
115
- html_options['data-remote'] = 'true' if link_to_remote_options?(options) || link_to_remote_options?(html_options)
116
-
117
- disable_with = html_options.delete("disable_with")
118
- confirm = html_options.delete('confirm')
119
- method = html_options.delete('method')
120
-
121
- if confirm
122
- message = ":confirm option is deprecated and will be removed from Rails 4.1. " \
123
- "Use 'data: { confirm: \'Text\' }' instead."
124
- ActiveSupport::Deprecation.warn message
125
-
126
- html_options["data-confirm"] = confirm
127
- end
128
-
129
- add_method_to_attributes!(html_options, method) if method
130
-
131
- if disable_with
132
- message = ":disable_with option is deprecated and will be removed from Rails 4.1. " \
133
- "Use 'data: { disable_with: \'Text\' }' instead."
134
- ActiveSupport::Deprecation.warn message
135
-
136
- html_options["data-disable-with"] = disable_with
137
- end
138
-
139
- html_options
140
- else
141
- link_to_remote_options?(options) ? {'data-remote' => 'true'} : {}
142
- end
143
- end
144
-
145
- def link_to_remote_options?(options)
146
- if options.is_a?(Hash)
147
- options.delete('remote') || options.delete(:remote)
148
- end
149
- end
150
- end
151
-
152
- # FIXME: fix that in rails core.
153
- if Cell.rails_version.~("4.0", "4.1")
154
- include LinkToHelper
155
- else
156
- include ActionView::Helpers::UrlHelper
157
- end
158
-
159
- end