cells-rails 0.0.2 → 0.0.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e1b105374e1d4806e75407a1f21a42c91684f527
4
- data.tar.gz: fd6284c358c047a3902a5853d6bc5e82d4dd1453
3
+ metadata.gz: 4702ce8ee285649f10ba8b66f422ef18de70de17
4
+ data.tar.gz: 4cf37c137a196505c9ce67e309bcd3667a2b20a7
5
5
  SHA512:
6
- metadata.gz: a1fd0680441e28d413d6e4d7f46c49f5c77bf515f9e0734451cf3fcb3ed1a4449177c899b4624f8651a0ecb1fcbdf5e482d4605e8988996af8becd39475a6467
7
- data.tar.gz: 8aa156d200e0ee1781b5ac451b7e610f3f29581cdaee41f015f8fb92dfd75e31755590d2c395f4b52bdc861b4c6b1331a11a5c73b6a845c6489d7fe2647c44c6
6
+ metadata.gz: 4607ac2a54c333168cd171470fe8c672421e78b3221a7c597b7380af86ee63ec7e0b854c43549451eb2d3a4cf0790ed6fce8c162e2b81666d4ed7dafb87dc7d5
7
+ data.tar.gz: e3e3d5d3ec884b042d9841cffe05f2e544336d898ce5aad826be10783747c42219b0bbce13fa51ea02d3711b3720933d8d99679112e94b2c37de5574f8705a0f
data/CHANGES.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## 0.0.3
2
+
3
+ * `Cell::Helper::AssetHelper` is now always included and fixes https://github.com/apotonick/cells/issues/214 (hopefully).
4
+
1
5
  ## 0.0.2
2
6
 
3
7
  * Moved all Rails files from `cells` to `cells-rails`.
data/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  * html_safe
8
8
  * controller in context
9
- * TODO: asset helpers
9
+ * asset helpers Cell::Helper::AssetHelper automatically included
10
10
 
11
11
 
12
12
  ## Installation
@@ -0,0 +1,54 @@
1
+ module Cell
2
+ module Helper
3
+ # Delegate all asset-related helpers to the global helpers instance.
4
+ # This is the cleanest solution to leverage Rails' asset management and
5
+ # doesn't pollute your cell with weird asset modules from Rails.
6
+ module AssetHelper
7
+ # Extend if we forgot anything.
8
+ # This delegates asset helpers to the global Rails helper instance.
9
+
10
+ # http://api.rubyonrails.org/classes/ActionView/Helpers/AssetUrlHelper.html
11
+ %w{
12
+ javascript_include_tag
13
+ stylesheet_link_tag
14
+
15
+ asset_path
16
+ asset_url
17
+ image_tag
18
+ audio_path
19
+ audio_url
20
+ compute_asset_extname
21
+ compute_asset_host
22
+ compute_asset_path
23
+ font_path
24
+ font_url
25
+ image_path
26
+ image_url
27
+ javascript_path
28
+ javascript_url
29
+ path_to_asset
30
+ path_to_audio
31
+ path_to_font
32
+ path_to_image
33
+ path_to_javascript
34
+ path_to_stylesheet
35
+ path_to_video
36
+ stylesheet_path
37
+ stylesheet_url
38
+ url_to_asset
39
+ url_to_audio
40
+ url_to_font
41
+ url_to_image
42
+ url_to_javascript
43
+ url_to_stylesheet
44
+ url_to_video
45
+ video_path
46
+ video_url
47
+ }.each do |method|
48
+ define_method(method) do |*args|
49
+ ::ActionController::Base.helpers.send(method, *args)
50
+ end
51
+ end
52
+ end # AssetHelper
53
+ end
54
+ end
@@ -0,0 +1,110 @@
1
+ module Cell
2
+ def self.rails_version
3
+ Gem::Version.new(ActionPack::VERSION::STRING)
4
+ end
5
+
6
+ # These methods are automatically added to all controllers and views.
7
+ module RailsExtensions
8
+ module ActionController
9
+ def cell(name, model=nil, options={}, constant=::Cell::ViewModel, &block)
10
+ options[:context] ||= {}
11
+ options[:context][:controller] = self
12
+
13
+ constant.cell(name, model, options, &block)
14
+ end
15
+
16
+ def concept(name, model=nil, options={}, &block)
17
+ cell(name, model, options, ::Cell::Concept, &block)
18
+ end
19
+ end
20
+
21
+ module ActionView
22
+ # Returns the cell instance for +name+. You may pass arbitrary options to your
23
+ # cell.
24
+ #
25
+ # = cell(:song, title: "Creeping Out Sara").(:show)
26
+ def cell(name, *args, &block)
27
+ controller.cell(name, *args, &block)
28
+ end
29
+
30
+ # # See Cells::Rails::ActionController#render_cell.
31
+ # def render_cell(name, state, *args, &block)
32
+ # ::Cell::Rails.render_cell(name, state, controller, *args, &block)
33
+ # end
34
+
35
+ def concept(name, *args, &block)
36
+ controller.concept(name, *args, &block)
37
+ end
38
+ end
39
+
40
+ # Gets included into Cell::ViewModel in a Rails environment.
41
+ module ViewModel
42
+ extend ActiveSupport::Concern
43
+
44
+ # DISCUSS: who actually uses forgery protection with cells? it is not working since 4, anyway?
45
+ # include ActionController::RequestForgeryProtection
46
+ included do
47
+ extend Uber::Delegates
48
+ delegates :parent_controller, :session, :params, :request, :config, :env, :url_options
49
+ # forgery protection.
50
+ delegates :parent_controller, :protect_against_forgery?, :form_authenticity_token, :request_forgery_protection_token
51
+ end
52
+
53
+ def call(*)
54
+ super.html_safe
55
+ end
56
+
57
+ def parent_controller
58
+ context[:controller]
59
+ end
60
+ alias_method :controller, :parent_controller
61
+
62
+ def perform_caching?
63
+ ::ActionController::Base.perform_caching
64
+ end
65
+
66
+ def cache_store # we want to use DI to set a cache store in cell/rails.
67
+ ::ActionController::Base.cache_store
68
+ end
69
+
70
+ module ClassMethods
71
+ def expand_cache_key(key)
72
+ ::ActiveSupport::Cache.expand_cache_key(key, :cells)
73
+ end
74
+ end
75
+ end
76
+
77
+ # In Rails, there are about 10 different implementations of #url_for. Rails doesn't like the idea of objects, so they
78
+ # have helpers in modules. Those module are now included sequentially into other modules and/or classes. While they
79
+ # get included, they might or might not include methods, depending on the including module/class
80
+ # (example here: https://github.com/rails/rails/blob/cad20f720c4c6e04584253cd0a23f22b3d43ab0f/actionpack/lib/action_dispatch/routing/url_for.rb#L87).
81
+ #
82
+ # The outcome is that several module override #url_for, and if you're lucky, this works. If you're not, then #url_for breaks
83
+ # due to a raise in one of its basic implementations, introduced in 3.x, fixed in 4.0 and then re-introduced in 4.2
84
+ #
85
+ # This is extremely frustrating as no one in Rails core seems to tackle this problem and introduces a url object instead
86
+ # of this module madness. I have to constantly test and fix it in Cells. With the module below, I'll stop doing this.
87
+ #
88
+ # Either Rails works with Cells and we fix this in form of a URL object that gets passed into the cell (I'm happy with
89
+ # a global object here, too! Wow!) or URL helpers will stop working in Cells and a lot of people will be unhappy.
90
+ #
91
+ # Anyway, this is the reason we need this patch module. If you have trouble with URLs in Cells, then please ask Rails to
92
+ # fix their implementation. Thank you.
93
+ module HelpersAreShit
94
+ def url_for(options = nil) # from ActionDispatch:R:UrlFor.
95
+ case options
96
+ when nil
97
+ _routes.url_for(url_options.symbolize_keys)
98
+ when Hash
99
+ _routes.url_for(options.symbolize_keys.reverse_merge!(url_options))
100
+ when String
101
+ options
102
+ when Array
103
+ polymorphic_url(options, options.extract_options!)
104
+ else
105
+ polymorphic_url(options)
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,78 @@
1
+ require "rails/railtie"
2
+ require "cell/rails"
3
+
4
+ module Cell
5
+ class Railtie < Rails::Railtie
6
+
7
+ config.cells = ActiveSupport::OrderedOptions.new
8
+
9
+ initializer("cells.attach_router") do |app|
10
+ ViewModel.class_eval do
11
+ include app.routes.url_helpers # TODO: i hate this, make it better in Rails.
12
+ end
13
+ end
14
+
15
+ # ruthlessly stolen from the zurb-foundation gem.
16
+ initializer "cells.update_asset_paths" do |app|
17
+ Array(app.config.cells.with_assets).each do |cell_class|
18
+ # puts "@@@@@ #{cell_class.camelize.constantize.prefixes}"
19
+ app.config.assets.paths += cell_class.camelize.constantize.prefixes # Song::Cell.prefixes
20
+ end
21
+ end
22
+
23
+ initializer "cells.rails_extensions" do |app|
24
+ ActiveSupport.on_load(:action_controller) do
25
+ self.class_eval do
26
+ include ::Cell::RailsExtensions::ActionController
27
+ end
28
+ end
29
+
30
+ ActiveSupport.on_load(:action_view) do
31
+ self.class_eval do
32
+ include ::Cell::RailsExtensions::ActionView
33
+ end
34
+ end
35
+
36
+ require "cell/rails/collection"
37
+ require "cell/rails/constant_for"
38
+
39
+ Cell::Collection.send :include, Cell::RailsExtension::Collection
40
+ Cell::ViewModel.send :include, Cell::RailsExtension::ConstantFor
41
+ end
42
+
43
+ initializer "cells.include_default_helpers" do
44
+ # include asset helpers (image_path, font_path, ect)
45
+ ViewModel.class_eval do
46
+ include ActionView::Helpers::FormHelper # includes ActionView::Helpers::UrlHelper, ActionView::Helpers::FormTagHelper
47
+ include ::Cell::RailsExtensions::HelpersAreShit
48
+
49
+ require "cell/helper/asset_helper"
50
+ include Cell::Helper::AssetHelper
51
+
52
+ # set VM#cache_store, etc.
53
+ include RailsExtensions::ViewModel
54
+ end
55
+ end
56
+
57
+ # TODO: allow to turn off this.
58
+ initializer "cells.include_template_module", after: "cells.include_default_helpers" do
59
+ # yepp, this is happening. saves me a lot of coding in each extension.
60
+ ViewModel.send(:include, Cell::Erb) if Cell.const_defined?(:Erb, false)
61
+ ViewModel.send(:include, Cell::Haml) if Cell.const_defined?(:Haml, false)
62
+ ViewModel.send(:include, Cell::Hamlit) if Cell.const_defined?(:Hamlit, false)
63
+ ViewModel.send(:include, Cell::Slim) if Cell.const_defined?(:Slim, false)
64
+ end
65
+ # ViewModel.template_engine = app.config.app_generators.rails.fetch(:template_engine, "erb").to_s
66
+
67
+ initializer("cells.development") do |app|
68
+ if Rails.env == "development"
69
+ require "cell/development"
70
+ ViewModel.send(:include, Development)
71
+ end
72
+ end
73
+
74
+ rake_tasks do
75
+ load "tasks/cells.rake"
76
+ end
77
+ end
78
+ end
@@ -1,13 +1,8 @@
1
1
  require "cells/rails/version"
2
2
  require "cells"
3
3
 
4
- require "cell/rails/collection"
5
- require "cell/rails/constant_for"
6
-
7
- Cell::Collection.send :include, Cell::RailsExtension::Collection
8
- Cell::ViewModel.send :include, Cell::RailsExtension::ConstantFor
9
-
10
4
  require "cell/caching/notification"
5
+ require "cell/rails"
11
6
  require "cell/railtie"
12
7
 
13
8
  module Cell
@@ -1,5 +1,5 @@
1
1
  module Cells
2
2
  module Rails
3
- VERSION = "0.0.2"
3
+ VERSION = "0.0.3"
4
4
  end
5
5
  end
@@ -0,0 +1,43 @@
1
+ module Rails
2
+ module Generators
3
+ class CellGenerator < NamedBase
4
+ source_root File.expand_path('../templates', __FILE__)
5
+
6
+ class_option :parent, type: :string, desc: 'The parent class for the generated cell'
7
+ class_option :e, type: :string, desc: 'The template engine'
8
+
9
+ check_class_collision suffix: 'Cell'
10
+
11
+ argument :actions, type: :array, default: [], banner: 'action action2'
12
+
13
+ def create_cell_file
14
+ template 'cell.rb.erb', File.join('app/cells', class_path, "#{file_name}_cell.rb")
15
+ end
16
+
17
+ def create_view_files
18
+ states.each do |state|
19
+ @state = state
20
+ @path = File.join('app/cells', class_path, file_name, "#{state}.#{template_engine}")
21
+ template "view.#{template_engine}", @path
22
+ end
23
+ end
24
+
25
+ hook_for :test_framework
26
+
27
+ private
28
+
29
+ def parent_class_name
30
+ options[:parent] || 'Cell::ViewModel'
31
+ end
32
+
33
+ # The show state is included by default
34
+ def states
35
+ (['show'] + actions).uniq
36
+ end
37
+
38
+ def template_engine
39
+ (options[:e] || Rails.application.config.app_generators.rails[:template_engine] || 'erb').to_s
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,8 @@
1
+ class <%= class_name %>Cell < <%= parent_class_name %>
2
+ <% states.each do |state| -%>
3
+ def <%= state %>
4
+ render
5
+ end
6
+
7
+ <% end -%>
8
+ end
@@ -0,0 +1,7 @@
1
+ <h1>
2
+ <%= class_name %>#<%= @state %>
3
+ </h1>
4
+
5
+ <p>
6
+ Find me in <%= @path %>
7
+ </p>
@@ -0,0 +1,4 @@
1
+ %h1
2
+ <%= class_name %>#<%= @state %>
3
+ %p
4
+ Find me in <%= @path %>
@@ -0,0 +1,2 @@
1
+ h1 <%= class_name %>#<%= @state %>
2
+ p Find me in <%= @path %>
@@ -0,0 +1,38 @@
1
+ module Rails
2
+ module Generators
3
+ class ConceptGenerator < NamedBase
4
+ source_root File.expand_path('../templates', __FILE__)
5
+
6
+ class_option :e, type: :string, desc: 'The template engine'
7
+ argument :actions, type: :array, default: [], banner: 'action action2'
8
+
9
+ check_class_collision suffix: 'Concept'
10
+
11
+
12
+ def create_concept
13
+ template 'concept.rb.erb', File.join('app/concepts', class_path, file_name, 'cell.rb')
14
+ end
15
+
16
+ def create_views
17
+ states.each do |state|
18
+ @state = state
19
+ @path = File.join('app/concepts', class_path, file_name, 'views', "#{state}.#{template_engine}")
20
+ template "view.#{template_engine}", @path
21
+ end
22
+ end
23
+
24
+ hook_for :test_framework
25
+
26
+ private
27
+
28
+ def template_engine
29
+ (options[:e] || Rails.application.config.app_generators.rails[:template_engine] || 'erb').to_s
30
+ end
31
+
32
+ # The show state is included by default
33
+ def states
34
+ (['show'] + actions).uniq
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,7 @@
1
+ class <%= class_name %>::Cell < Cell::Concept
2
+ <% states.each do |state| -%>
3
+ def <%= state %>
4
+ render
5
+ end
6
+ <% end -%>
7
+ end
@@ -0,0 +1,7 @@
1
+ <h1>
2
+ <%= class_name %>#<%= @state %>
3
+ </h1>
4
+
5
+ <p>
6
+ Find me in <%= @path %>
7
+ </p>
@@ -0,0 +1,4 @@
1
+ %h1
2
+ <%= class_name %>#<%= @state %>
3
+ %p
4
+ Find me in <%= @path %>
@@ -0,0 +1,2 @@
1
+ h1 <%= class_name %>#<%= @state %>
2
+ p Find me in <%= @path %>
@@ -0,0 +1,21 @@
1
+ require 'rails/generators/test_unit'
2
+
3
+ module TestUnit # :nodoc:
4
+ module Generators # :nodoc:
5
+ class CellGenerator < Base # :nodoc:
6
+ source_root File.expand_path('../templates', __FILE__)
7
+ argument :actions, type: :array, default: []
8
+ check_class_collision suffix: 'CellTest'
9
+
10
+ def create_test_file
11
+ template 'unit_test.rb.erb', File.join('test/cells', class_path, "#{file_name}_cell_test.rb")
12
+ end
13
+
14
+ private
15
+
16
+ def states
17
+ (['show'] + actions).uniq
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,11 @@
1
+ require 'test_helper'
2
+
3
+ class <%= class_name %>CellTest < Cell::TestCase
4
+ <% states.each do |state| -%>
5
+ test "<%= state %>" do
6
+ html = cell("<%= file_name %>").(:<%= state %>)
7
+ assert html.match /<p>/
8
+ end
9
+
10
+ <% end %>
11
+ end
@@ -0,0 +1,21 @@
1
+ require 'rails/generators/test_unit'
2
+
3
+ module TestUnit # :nodoc:
4
+ module Generators # :nodoc:
5
+ class ConceptGenerator < Base # :nodoc:
6
+ source_root File.expand_path('../templates', __FILE__)
7
+ argument :actions, type: :array, default: []
8
+ check_class_collision suffix: 'ConceptTest'
9
+
10
+ def create_test_file
11
+ template 'unit_test.rb.erb', File.join('test/concepts', class_path, file_name, 'cell_test.rb')
12
+ end
13
+
14
+ private
15
+
16
+ def states
17
+ (['show'] + actions).uniq
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,11 @@
1
+ require 'test_helper'
2
+
3
+ class <%= class_name %>ConceptTest < Cell::TestCase
4
+ <% states.each do |state| -%>
5
+ test "<%= state %>" do
6
+ html = concept("<%= file_name %>/cell").(:<%= state %>)
7
+ assert html.match /<p>/
8
+ end
9
+
10
+ <% end %>
11
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cells-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Sutterer
@@ -123,12 +123,29 @@ files:
123
123
  - Rakefile
124
124
  - cells-rails.gemspec
125
125
  - lib/cell/caching/notification.rb
126
+ - lib/cell/helper/asset_helper.rb
127
+ - lib/cell/rails.rb
126
128
  - lib/cell/rails/collection.rb
127
129
  - lib/cell/rails/constant_for.rb
130
+ - lib/cell/railtie.rb
128
131
  - lib/cell/test_case.rb
129
132
  - lib/cell/translation.rb
130
133
  - lib/cells/rails.rb
131
134
  - lib/cells/rails/version.rb
135
+ - lib/rails/generators/cell/cell_generator.rb
136
+ - lib/rails/generators/cell/templates/cell.rb.erb
137
+ - lib/rails/generators/cell/templates/view.erb
138
+ - lib/rails/generators/cell/templates/view.haml
139
+ - lib/rails/generators/cell/templates/view.slim
140
+ - lib/rails/generators/concept/concept_generator.rb
141
+ - lib/rails/generators/concept/templates/concept.rb.erb
142
+ - lib/rails/generators/concept/templates/view.erb
143
+ - lib/rails/generators/concept/templates/view.haml
144
+ - lib/rails/generators/concept/templates/view.slim
145
+ - lib/rails/generators/test_unit/cell/cell_generator.rb
146
+ - lib/rails/generators/test_unit/cell/templates/unit_test.rb.erb
147
+ - lib/rails/generators/test_unit/concept/concept_generator.rb
148
+ - lib/rails/generators/test_unit/concept/templates/unit_test.rb.erb
132
149
  homepage: http://trailblazer.to
133
150
  licenses: []
134
151
  metadata: {}