erector 0.8.2 → 0.8.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.
- data/README.txt +0 -4
- data/VERSION.yml +1 -1
- data/lib/erector.rb +2 -4
- data/lib/erector/abstract_widget.rb +2 -1
- data/lib/erector/erect/erect.rb +17 -14
- data/lib/erector/erect/rhtml.treetop +18 -10
- data/lib/erector/externals.rb +7 -1
- data/lib/erector/html.rb +30 -39
- data/lib/erector/rails.rb +6 -26
- data/lib/erector/rails/form_builder.rb +36 -0
- data/lib/erector/rails/railtie.rb +11 -0
- data/lib/erector/rails/template_handler.rb +16 -0
- data/lib/erector/rails/widget_renderer.rb +6 -0
- data/lib/erector/rails2.rb +27 -0
- data/lib/erector/{rails → rails2}/extensions/action_controller.rb +1 -1
- data/lib/erector/{rails → rails2}/extensions/rails_helpers.rb +17 -4
- data/lib/erector/{rails → rails2}/extensions/rails_widget.rb +6 -3
- data/lib/erector/{rails → rails2}/rails_form_builder.rb +0 -0
- data/lib/erector/rails2/rails_version.rb +6 -0
- data/lib/erector/{rails → rails2}/template_handlers/ert_handler.rb +0 -0
- data/lib/erector/{rails → rails2}/template_handlers/rb_handler.rb +2 -2
- data/lib/erector/rails3.rb +208 -0
- data/lib/erector/raw_string.rb +4 -0
- data/lib/erector/widgets/external_renderer.rb +8 -0
- data/spec/erect/erect_rails_spec.rb +34 -49
- data/spec/erect/erected_spec.rb +11 -0
- data/spec/rails2/erect_rails_spec.rb +114 -0
- data/spec/rails2/rails_app/Gemfile +12 -0
- data/spec/rails2/rails_app/Gemfile.lock +89 -0
- data/spec/rails2/rails_app/README +243 -0
- data/spec/rails2/rails_app/Rakefile +19 -0
- data/spec/rails2/rails_app/app/controllers/application_controller.rb +10 -0
- data/spec/rails2/rails_app/app/helpers/application_helper.rb +3 -0
- data/spec/rails2/rails_app/app/views/test/_erb.erb +1 -0
- data/spec/rails2/rails_app/app/views/test/_erector.rb +5 -0
- data/spec/rails2/rails_app/app/views/test/_partial_with_locals.rb +7 -0
- data/spec/rails2/rails_app/app/views/test/bare.rb +5 -0
- data/spec/rails2/rails_app/app/views/test/erb_from_erector.html.rb +5 -0
- data/spec/rails2/rails_app/app/views/test/erector_from_erb.html.erb +1 -0
- data/spec/rails2/rails_app/app/views/test/erector_with_locals_from_erb.html.erb +6 -0
- data/spec/rails2/rails_app/app/views/test/implicit_assigns.html.rb +5 -0
- data/spec/rails2/rails_app/app/views/test/needs.html.rb +7 -0
- data/spec/rails2/rails_app/app/views/test/needs_subclass.html.rb +5 -0
- data/spec/rails2/rails_app/app/views/test/protected_instance_variable.html.rb +5 -0
- data/spec/rails2/rails_app/app/views/test/render_default.html.rb +5 -0
- data/spec/rails2/rails_app/app/views/test/render_partial.html.rb +5 -0
- data/spec/rails2/rails_app/config/boot.rb +114 -0
- data/spec/rails2/rails_app/config/database.yml +16 -0
- data/spec/rails2/rails_app/config/environment.rb +42 -0
- data/spec/rails2/rails_app/config/environments/development.rb +17 -0
- data/spec/rails2/rails_app/config/environments/production.rb +28 -0
- data/spec/rails2/rails_app/config/environments/test.rb +28 -0
- data/spec/rails2/rails_app/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/rails2/rails_app/config/initializers/cookie_verification_secret.rb +7 -0
- data/spec/rails2/rails_app/config/initializers/inflections.rb +10 -0
- data/spec/rails2/rails_app/config/initializers/mime_types.rb +5 -0
- data/spec/rails2/rails_app/config/initializers/new_rails_defaults.rb +21 -0
- data/spec/rails2/rails_app/config/initializers/session_store.rb +15 -0
- data/spec/rails2/rails_app/config/locales/en.yml +5 -0
- data/spec/rails2/rails_app/config/routes.rb +43 -0
- data/spec/rails2/rails_app/db/development.sqlite3 +0 -0
- data/spec/rails2/rails_app/db/schema.rb +14 -0
- data/spec/rails2/rails_app/db/seeds.rb +7 -0
- data/spec/rails2/rails_app/doc/README_FOR_APP +2 -0
- data/spec/rails2/rails_app/log/development.log +76 -0
- data/spec/rails2/rails_app/log/production.log +0 -0
- data/spec/rails2/rails_app/log/server.log +0 -0
- data/spec/rails2/rails_app/log/test.log +4158 -0
- data/spec/rails2/rails_app/public/404.html +30 -0
- data/spec/rails2/rails_app/public/422.html +30 -0
- data/spec/rails2/rails_app/public/500.html +30 -0
- data/spec/rails2/rails_app/public/favicon.ico +0 -0
- data/spec/rails2/rails_app/public/images/rails.png +0 -0
- data/spec/rails2/rails_app/public/index.html +275 -0
- data/spec/rails2/rails_app/public/javascripts/application.js +2 -0
- data/spec/rails2/rails_app/public/javascripts/controls.js +963 -0
- data/spec/rails2/rails_app/public/javascripts/dragdrop.js +973 -0
- data/spec/rails2/rails_app/public/javascripts/effects.js +1128 -0
- data/spec/rails2/rails_app/public/javascripts/prototype.js +4320 -0
- data/spec/rails2/rails_app/public/robots.txt +5 -0
- data/spec/rails2/rails_app/script/about +4 -0
- data/spec/rails2/rails_app/script/console +3 -0
- data/spec/rails2/rails_app/script/dbconsole +3 -0
- data/spec/rails2/rails_app/script/destroy +3 -0
- data/spec/rails2/rails_app/script/generate +3 -0
- data/spec/rails2/rails_app/script/performance/benchmarker +3 -0
- data/spec/rails2/rails_app/script/performance/profiler +3 -0
- data/spec/rails2/rails_app/script/plugin +3 -0
- data/spec/rails2/rails_app/script/runner +3 -0
- data/spec/rails2/rails_app/script/server +3 -0
- data/spec/rails2/rails_app/spec/rails_helpers_spec.rb +255 -0
- data/spec/rails2/rails_app/spec/rails_spec_helper.rb +34 -0
- data/spec/rails2/rails_app/spec/rails_widget_spec.rb +83 -0
- data/spec/rails2/rails_app/spec/render_spec.rb +324 -0
- data/spec/rails2/rails_app/test/performance/browsing_test.rb +9 -0
- data/spec/rails2/rails_app/test/test_helper.rb +38 -0
- data/spec/rails2/rails_app/vendor/plugins/rails_xss/MIT-LICENSE +20 -0
- data/spec/rails2/rails_app/vendor/plugins/rails_xss/README.markdown +90 -0
- data/spec/rails2/rails_app/vendor/plugins/rails_xss/Rakefile +23 -0
- data/spec/rails2/rails_app/vendor/plugins/rails_xss/init.rb +7 -0
- data/spec/rails2/rails_app/vendor/plugins/rails_xss/lib/rails_xss.rb +3 -0
- data/spec/rails2/rails_app/vendor/plugins/rails_xss/lib/rails_xss/action_view.rb +87 -0
- data/spec/rails2/rails_app/vendor/plugins/rails_xss/lib/rails_xss/erubis.rb +33 -0
- data/spec/rails2/rails_app/vendor/plugins/rails_xss/lib/rails_xss/string_ext.rb +52 -0
- data/spec/rails2/rails_app/vendor/plugins/rails_xss/lib/tasks/rails_xss_tasks.rake +4 -0
- data/spec/rails2/rails_app/vendor/plugins/rails_xss/test/active_record_helper_test.rb +74 -0
- data/spec/rails2/rails_app/vendor/plugins/rails_xss/test/asset_tag_helper_test.rb +49 -0
- data/spec/rails2/rails_app/vendor/plugins/rails_xss/test/caching_test.rb +43 -0
- data/spec/rails2/rails_app/vendor/plugins/rails_xss/test/date_helper_test.rb +29 -0
- data/spec/rails2/rails_app/vendor/plugins/rails_xss/test/deprecated_output_safety_test.rb +112 -0
- data/spec/rails2/rails_app/vendor/plugins/rails_xss/test/erb_util_test.rb +36 -0
- data/spec/rails2/rails_app/vendor/plugins/rails_xss/test/form_helper_test.rb +1447 -0
- data/spec/rails2/rails_app/vendor/plugins/rails_xss/test/form_tag_helper_test.rb +354 -0
- data/spec/rails2/rails_app/vendor/plugins/rails_xss/test/output_safety_test.rb +115 -0
- data/spec/rails2/rails_app/vendor/plugins/rails_xss/test/rails_xss_test.rb +23 -0
- data/spec/rails2/rails_app/vendor/plugins/rails_xss/test/test_helper.rb +5 -0
- data/spec/rails2/rails_app/vendor/plugins/rails_xss/test/text_helper_test.rb +17 -0
- data/spec/spec_helper.rb +2 -6
- metadata +348 -23
- data/lib/erector/errors.rb +0 -12
- data/lib/erector/extensions/hash.rb +0 -21
- data/lib/erector/extensions/object.rb +0 -18
- data/lib/erector/rails/rails_version.rb +0 -6
- data/rails/init.rb +0 -4
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
module Erector
|
|
2
|
+
class Railtie < ::Rails::Railtie
|
|
3
|
+
# config.generators.template_engine :rb
|
|
4
|
+
|
|
5
|
+
# TODO: automatically add app directory to app.config.autoload_paths,
|
|
6
|
+
# so that Views::Foo::Bar autoloads, and 'require "views/foo/bar.html"'
|
|
7
|
+
# works. For now, you must add the following to config/application.rb:
|
|
8
|
+
#
|
|
9
|
+
# config.autoload_paths += %W(#{config.root}/app)
|
|
10
|
+
end
|
|
11
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module Erector
|
|
2
|
+
module Rails
|
|
3
|
+
class TemplateHandler
|
|
4
|
+
def call(template)
|
|
5
|
+
require_dependency template.identifier
|
|
6
|
+
widget_class_name = "views/#{template.identifier =~ %r(views/([^.]*)(\..*)?\.rb) && $1}".camelize
|
|
7
|
+
is_partial = File.basename(template.identifier) =~ /^_/
|
|
8
|
+
<<-SRC
|
|
9
|
+
Erector::Rails.render(#{widget_class_name}, self, local_assigns, #{!!is_partial})
|
|
10
|
+
SRC
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
ActionView::Template.register_template_handler :rb, Erector::Rails::TemplateHandler.new
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
require "action_controller"
|
|
2
|
+
require "erector/rails2/rails_version"
|
|
3
|
+
require "erector/rails2/rails_form_builder"
|
|
4
|
+
require "erector/rails2/extensions/action_controller"
|
|
5
|
+
require "erector/rails2/extensions/rails_helpers"
|
|
6
|
+
require "erector/rails2/extensions/rails_widget"
|
|
7
|
+
require "erector/rails2/template_handlers/rb_handler"
|
|
8
|
+
require "erector/rails2/template_handlers/ert_handler"
|
|
9
|
+
|
|
10
|
+
module Erector
|
|
11
|
+
def self.init_rails(binding)
|
|
12
|
+
# Rails defaults do not include app/views in the eager load path.
|
|
13
|
+
# It needs to be there, because erector views are .rb files.
|
|
14
|
+
if config = eval("config if defined? config", binding)
|
|
15
|
+
view_path = config.view_path
|
|
16
|
+
config.load_paths << view_path unless config.load_paths.include?(view_path)
|
|
17
|
+
config.eager_load_paths << view_path unless config.eager_load_paths.include?(view_path)
|
|
18
|
+
|
|
19
|
+
# Rails probably already ran Initializer#set_load_path and
|
|
20
|
+
# #set_autoload_paths by the time we got here.
|
|
21
|
+
$LOAD_PATH.unshift(view_path) unless $LOAD_PATH.include?(view_path)
|
|
22
|
+
unless ActiveSupport::Dependencies.load_paths.include?(view_path)
|
|
23
|
+
ActiveSupport::Dependencies.load_paths << view_path
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -13,6 +13,7 @@ module Erector
|
|
|
13
13
|
def self.def_simple_rails_helper(method_name)
|
|
14
14
|
module_eval(<<-METHOD_DEF, __FILE__, __LINE__+1)
|
|
15
15
|
def #{method_name}(*args, &block)
|
|
16
|
+
# i wonder why this is text and not rawtext
|
|
16
17
|
text parent.#{method_name}(*args, &block)
|
|
17
18
|
end
|
|
18
19
|
METHOD_DEF
|
|
@@ -93,20 +94,32 @@ module Erector
|
|
|
93
94
|
if block_given?
|
|
94
95
|
parent.#{method_name}(*args, &block)
|
|
95
96
|
else
|
|
96
|
-
|
|
97
|
+
rails_helper_output = parent.#{method_name}(*args, &block)
|
|
98
|
+
# i wonder why this is text and not rawtext
|
|
99
|
+
text rails_helper_output
|
|
97
100
|
end
|
|
98
101
|
end
|
|
99
102
|
METHOD_DEF
|
|
100
103
|
end
|
|
101
104
|
|
|
102
|
-
[:
|
|
103
|
-
:form_tag,
|
|
105
|
+
[:form_tag,
|
|
104
106
|
:field_set_tag,
|
|
105
107
|
:form_remote_tag,
|
|
106
108
|
:javascript_tag].each do |method_name|
|
|
107
109
|
def_block_rails_helper(method_name)
|
|
108
110
|
end
|
|
109
111
|
|
|
112
|
+
def link_to(*args, &block)
|
|
113
|
+
if block_given?
|
|
114
|
+
parent.link_to(*args, &block)
|
|
115
|
+
else
|
|
116
|
+
args[0] = CGI.escapeHTML(args[0])
|
|
117
|
+
rails_helper_output = parent.link_to(*args, &block)
|
|
118
|
+
# i wonder why this is text and not rawtext
|
|
119
|
+
text rails_helper_output
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
110
123
|
# Delegate to non-markup producing helpers via method_missing,
|
|
111
124
|
# returning their result directly.
|
|
112
125
|
def method_missing(name, *args, &block)
|
|
@@ -144,7 +157,7 @@ module Erector
|
|
|
144
157
|
args.push(options)
|
|
145
158
|
parent.fields_for(record_or_name_or_array, *args, &proc)
|
|
146
159
|
end
|
|
147
|
-
|
|
160
|
+
|
|
148
161
|
def flash
|
|
149
162
|
parent.controller.send(:flash)
|
|
150
163
|
end
|
|
@@ -43,11 +43,14 @@ module Erector
|
|
|
43
43
|
|
|
44
44
|
view.send(:_evaluate_assigns_and_ivars)
|
|
45
45
|
|
|
46
|
-
view.with_output_buffer do
|
|
46
|
+
output_buffer = view.with_output_buffer do
|
|
47
47
|
# Set parent to the view and use Rails's output buffer.
|
|
48
|
+
new_output = Output.new { view.output_buffer }
|
|
48
49
|
widget.to_html(options.merge(:parent => view,
|
|
49
|
-
:output =>
|
|
50
|
+
:output => new_output))
|
|
50
51
|
end
|
|
52
|
+
output_buffer
|
|
53
|
+
|
|
51
54
|
end
|
|
52
55
|
|
|
53
56
|
module WidgetExtensions
|
|
@@ -100,7 +103,7 @@ module Erector
|
|
|
100
103
|
@controller_assigns_propagate_to_partials = (new_value ? :true : :false)
|
|
101
104
|
end
|
|
102
105
|
end
|
|
103
|
-
|
|
106
|
+
|
|
104
107
|
def self.included(base)
|
|
105
108
|
base.extend(ClassMethods)
|
|
106
109
|
end
|
|
File without changes
|
|
File without changes
|
|
@@ -18,7 +18,7 @@ end
|
|
|
18
18
|
|
|
19
19
|
# Out of the box, the Cells plugin for Rails (http://cells.rubyforge.org/)
|
|
20
20
|
# does not work with Erector, because Erector tries to grab instance variables
|
|
21
|
-
# off the controller, rather than the cell itself.
|
|
21
|
+
# off the controller, rather than the cell itself.
|
|
22
22
|
#
|
|
23
23
|
# This code patches up Cell::View to make it work, but only if the Cells plugin
|
|
24
24
|
# is installed. (That's the bare "Cell::View" at the top, and rescue NameError
|
|
@@ -28,7 +28,7 @@ end
|
|
|
28
28
|
# loaded at all.
|
|
29
29
|
begin
|
|
30
30
|
Cell::View
|
|
31
|
-
|
|
31
|
+
|
|
32
32
|
class Cell::View < ActionView::Base
|
|
33
33
|
def instance_variables_for_widget_assignment
|
|
34
34
|
instance_variables_for_widget_assignment_for(cell)
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
require "erector/rails/template_handler"
|
|
2
|
+
require "erector/rails/railtie"
|
|
3
|
+
require "erector/rails/widget_renderer"
|
|
4
|
+
require "erector/rails/form_builder"
|
|
5
|
+
|
|
6
|
+
module Erector
|
|
7
|
+
module Rails
|
|
8
|
+
class << self
|
|
9
|
+
def should_assign?(name, widget_class, is_partial)
|
|
10
|
+
(!widget_class.ignore_extra_controller_assigns || widget_class.needs?(name)) &&
|
|
11
|
+
(!is_partial || widget_class.controller_assigns_propagate_to_partials)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def assigns_for(widget_class, view, local_assigns, is_partial)
|
|
15
|
+
assigns = {}
|
|
16
|
+
|
|
17
|
+
view.assigns.each do |name, value|
|
|
18
|
+
name = name.to_sym
|
|
19
|
+
assigns[name] = value if should_assign?(name, widget_class, is_partial)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
assigns.merge!(filter_local_assigns_for_partial(widget_class, local_assigns)) if is_partial
|
|
23
|
+
|
|
24
|
+
assigns
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def filter_local_assigns_for_partial(widget_class, local_assigns)
|
|
28
|
+
widget_class_variable_name = widget_class.name.underscore
|
|
29
|
+
widget_class_variable_name = $1 if widget_class_variable_name =~ %r{.*/(.*?)$}
|
|
30
|
+
|
|
31
|
+
local_assigns.reject do |name, value|
|
|
32
|
+
name == :object || name == widget_class_variable_name.to_sym
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def render(widget, view, local_assigns = {}, is_partial = false, options = {})
|
|
37
|
+
widget = widget.new(assigns_for(widget, view, local_assigns, is_partial)) if widget.is_a?(Class)
|
|
38
|
+
view.with_output_buffer do
|
|
39
|
+
# Set parent and helpers to the view and use Rails's output buffer.
|
|
40
|
+
widget.to_html(options.merge(:helpers => view,
|
|
41
|
+
:parent => view,
|
|
42
|
+
:output => Output.new { view.output_buffer }))
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Wrappers for rails helpers that produce markup. Erector needs to
|
|
47
|
+
# manually emit their result.
|
|
48
|
+
def def_simple_rails_helper(method_name)
|
|
49
|
+
module_eval <<-METHOD_DEF, __FILE__, __LINE__+1
|
|
50
|
+
def #{method_name}(*args, &block)
|
|
51
|
+
text helpers.#{method_name}(*args, &block)
|
|
52
|
+
end
|
|
53
|
+
METHOD_DEF
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def def_rails_form_helper(method_name)
|
|
57
|
+
module_eval <<-METHOD_DEF, __FILE__, __LINE__+1
|
|
58
|
+
def #{method_name}(*args, &block)
|
|
59
|
+
options = args.extract_options!
|
|
60
|
+
args << options.merge(:builder => FormBuilder.wrapping(options[:builder]))
|
|
61
|
+
text helpers.#{method_name}(*args, &block)
|
|
62
|
+
end
|
|
63
|
+
METHOD_DEF
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
extend ActiveSupport::Concern
|
|
68
|
+
|
|
69
|
+
included do
|
|
70
|
+
# Often, large Rails applications will assign many controller instance variables.
|
|
71
|
+
# Sometimes these aren't used by a view: ApplicationController might assign
|
|
72
|
+
# variables that are used by many, but not all, views; and various other things
|
|
73
|
+
# may accumulate, especially if you've been using templating systems that are
|
|
74
|
+
# more forgiving than Erector. If you then migrate to Erector, you're stuck using
|
|
75
|
+
# no "needs" declaration at all, because it needs to contain every assigned
|
|
76
|
+
# variable, or Erector will raise an exception.
|
|
77
|
+
#
|
|
78
|
+
# If you set this to true (and it's inherited through to subclasses), however,
|
|
79
|
+
# then "needs" declarations on the widget will cause excess controller variables
|
|
80
|
+
# to be ignored -- they'll be unavailable to the widget (so 'needs' still means
|
|
81
|
+
# something), but they won't cause widget instantiation to fail, either. This
|
|
82
|
+
# can let a large Rails project transition to Erector more smoothly.
|
|
83
|
+
class_attribute :ignore_extra_controller_assigns
|
|
84
|
+
self.ignore_extra_controller_assigns = true
|
|
85
|
+
|
|
86
|
+
# In ERb templates, controller instance variables are available to any partial
|
|
87
|
+
# that gets rendered by the view, no matter how deeply-nested. This effectively
|
|
88
|
+
# makes controller instance variables "globals". In small view hierarchies this
|
|
89
|
+
# probably isn't an issue, but in large ones it can make debugging and
|
|
90
|
+
# reasoning about the code very difficult.
|
|
91
|
+
#
|
|
92
|
+
# If you set this to true (and it's inherited through to subclasses), then any
|
|
93
|
+
# widget that's getting rendered as a partial will only have access to locals
|
|
94
|
+
# explicitly passed to it (render :partial => ..., :locals => ...). (This
|
|
95
|
+
# doesn't change the behavior of widgets that are explicitly rendered, as they
|
|
96
|
+
# don't have this issue.) This can allow for cleaner encapsulation of partials,
|
|
97
|
+
# as they must be passed everything they use and can't rely on controller
|
|
98
|
+
# instance variables.
|
|
99
|
+
class_attribute :controller_assigns_propagate_to_partials
|
|
100
|
+
self.controller_assigns_propagate_to_partials = true
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# We need to delegate #capture to helpers.capture, so that when
|
|
104
|
+
# the captured block is executed, both erector and Rails output
|
|
105
|
+
# from within the block go to the appropriate buffer.
|
|
106
|
+
def capture(&block)
|
|
107
|
+
if helpers.respond_to?(:capture)
|
|
108
|
+
raw(helpers.capture(&block).to_s)
|
|
109
|
+
else
|
|
110
|
+
super
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def render(*args, &block)
|
|
115
|
+
captured = helpers.capture do
|
|
116
|
+
helpers.concat(helpers.render(*args, &block))
|
|
117
|
+
helpers.output_buffer.to_s
|
|
118
|
+
end
|
|
119
|
+
rawtext(captured)
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# Delegate to non-markup producing helpers via method_missing,
|
|
123
|
+
# returning their result directly.
|
|
124
|
+
def method_missing(name, *args, &block)
|
|
125
|
+
if helpers.respond_to?(name)
|
|
126
|
+
helpers.send(name, *args, &block)
|
|
127
|
+
else
|
|
128
|
+
super
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
# Since we delegate method_missing to helpers, we need to delegate
|
|
133
|
+
# respond_to? as well.
|
|
134
|
+
def respond_to?(name)
|
|
135
|
+
super || helpers.respond_to?(name)
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
[
|
|
139
|
+
# UrlHelper
|
|
140
|
+
:link_to,
|
|
141
|
+
:button_to,
|
|
142
|
+
:link_to_unless_current,
|
|
143
|
+
:link_to_unless,
|
|
144
|
+
:link_to_if,
|
|
145
|
+
:mail_to,
|
|
146
|
+
|
|
147
|
+
# FormTagHelper
|
|
148
|
+
:form_tag,
|
|
149
|
+
:select_tag,
|
|
150
|
+
:text_field_tag,
|
|
151
|
+
:label_tag,
|
|
152
|
+
:hidden_field_tag,
|
|
153
|
+
:file_field_tag,
|
|
154
|
+
:password_field_tag,
|
|
155
|
+
:text_area_tag,
|
|
156
|
+
:check_box_tag,
|
|
157
|
+
:radio_button_tag,
|
|
158
|
+
:submit_tag,
|
|
159
|
+
:image_submit_tag,
|
|
160
|
+
:field_set_tag,
|
|
161
|
+
|
|
162
|
+
# FormHelper
|
|
163
|
+
:form_for,
|
|
164
|
+
:text_field,
|
|
165
|
+
:password_field,
|
|
166
|
+
:hidden_field,
|
|
167
|
+
:file_field,
|
|
168
|
+
:text_area,
|
|
169
|
+
:check_box,
|
|
170
|
+
:radio_button,
|
|
171
|
+
|
|
172
|
+
# AssetTagHelper
|
|
173
|
+
:auto_discovery_link_tag,
|
|
174
|
+
:javascript_include_tag,
|
|
175
|
+
:stylesheet_link_tag,
|
|
176
|
+
:image_tag,
|
|
177
|
+
|
|
178
|
+
# ScriptaculousHelper
|
|
179
|
+
:sortable_element,
|
|
180
|
+
:sortable_element_js,
|
|
181
|
+
:text_field_with_auto_complete,
|
|
182
|
+
:draggable_element,
|
|
183
|
+
:drop_receiving_element,
|
|
184
|
+
|
|
185
|
+
# PrototypeHelper
|
|
186
|
+
:link_to_remote,
|
|
187
|
+
:button_to_remote,
|
|
188
|
+
:periodically_call_remote,
|
|
189
|
+
:form_remote_tag,
|
|
190
|
+
:submit_to_remote,
|
|
191
|
+
:update_page_tag,
|
|
192
|
+
|
|
193
|
+
# JavaScriptHelper
|
|
194
|
+
:javascript_tag,
|
|
195
|
+
|
|
196
|
+
# CsrfHelper
|
|
197
|
+
:csrf_meta_tag
|
|
198
|
+
].each do |method_name|
|
|
199
|
+
def_simple_rails_helper(method_name)
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
[:form_for, :fields_for].each do |method_name|
|
|
203
|
+
def_rails_form_helper(method_name)
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
Erector::Widget.send :include, self
|
|
207
|
+
end
|
|
208
|
+
end
|
data/lib/erector/raw_string.rb
CHANGED
|
@@ -33,6 +33,14 @@ class ExternalRenderer < Erector::Widget
|
|
|
33
33
|
rawtext external.text
|
|
34
34
|
end
|
|
35
35
|
end
|
|
36
|
+
|
|
37
|
+
if Object.const_defined?(:Sass)
|
|
38
|
+
rendered_externals(:scss).each do |external|
|
|
39
|
+
style({:type => "text/css", 'xml:space' => 'preserve'}.merge(external.options)) do
|
|
40
|
+
rawtext Sass.compile(external.text)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
36
44
|
end
|
|
37
45
|
|
|
38
46
|
def inline_scripts
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
require File.expand_path("
|
|
2
|
-
require "erector/rails"
|
|
3
|
-
require "rails/version"
|
|
1
|
+
require File.expand_path("../../spec_helper", __FILE__)
|
|
4
2
|
|
|
5
3
|
# backport mktmpdir so this test will work on Ruby 1.8.6
|
|
6
4
|
unless Dir.respond_to?(:mktmpdir)
|
|
@@ -49,60 +47,47 @@ end
|
|
|
49
47
|
# converter tool on a newly generated scaffold app (like we brag about in the
|
|
50
48
|
# user guide).
|
|
51
49
|
#
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
50
|
+
describe "the 'erector' command" do
|
|
51
|
+
def run(cmd)
|
|
52
|
+
stderr_file = Dir.tmpdir + "/stderr.txt"
|
|
53
|
+
stdout = IO.popen(cmd + " 2>#{stderr_file}") do |pipe|
|
|
54
|
+
pipe.read
|
|
56
55
|
end
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
end
|
|
65
|
-
stderr = File.open(stderr_file) {|f| f.read}
|
|
66
|
-
FileUtils.rm_f(stderr_file)
|
|
67
|
-
if $?.exitstatus != 0
|
|
68
|
-
raise "Command #{cmd} failed\nDIR:\n #{Dir.getwd}\nSTDOUT:\n#{indent stdout}\nSTDERR:\n#{indent stderr}"
|
|
69
|
-
else
|
|
70
|
-
return stdout
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
def indent(s)
|
|
75
|
-
s.gsub(/^/, ' ')
|
|
56
|
+
stderr = File.open(stderr_file) {|f| f.read}
|
|
57
|
+
FileUtils.rm_f(stderr_file)
|
|
58
|
+
if $?.exitstatus != 0 || stdout =~ /\berror\b/
|
|
59
|
+
run_info = "Command #{cmd} failed\nDIR:\n #{Dir.getwd}\nSTDOUT:\n#{indent stdout}\nSTDERR:\n#{indent stderr}"
|
|
60
|
+
raise run_info
|
|
61
|
+
else
|
|
62
|
+
return stdout
|
|
76
63
|
end
|
|
64
|
+
end
|
|
77
65
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
# We add the paths to our vendored copy of rails to the load paths, so
|
|
82
|
-
# that this spec can be run without having a version of Rails (which may
|
|
83
|
-
# not match the version we wish to test against) installed.
|
|
84
|
-
rails_libs_argument = "-I'#{RAILS_LOAD_PATHS.join("':'")}'"
|
|
85
|
-
|
|
86
|
-
Dir.mktmpdir do |app_dir|
|
|
87
|
-
run "ruby #{rails_libs_argument} '#{VENDOR_RAILS}/railties/bin/rails' '#{app_dir}'"
|
|
88
|
-
|
|
89
|
-
FileUtils.cp_r(VENDOR_RAILS, "#{app_dir}/vendor/rails")
|
|
66
|
+
def indent(s)
|
|
67
|
+
s.gsub(/^/, ' ')
|
|
68
|
+
end
|
|
90
69
|
|
|
91
|
-
|
|
92
|
-
|
|
70
|
+
it "works like we say it does in the user guide" do
|
|
71
|
+
erector_dir = File.expand_path("../../..", __FILE__)
|
|
72
|
+
Dir.mktmpdir do |app_dir|
|
|
73
|
+
FileUtils.cd(app_dir) do
|
|
74
|
+
run "bundle exec rails new dummy"
|
|
93
75
|
|
|
94
|
-
|
|
95
|
-
|
|
76
|
+
File.open('dummy/Gemfile', 'a+') do |gemfile|
|
|
77
|
+
require 'rails/version'
|
|
78
|
+
gemfile.write <<-GEMFILE.strip
|
|
79
|
+
gem "erector", :path => "#{erector_dir}"
|
|
80
|
+
GEMFILE
|
|
81
|
+
end
|
|
96
82
|
|
|
97
|
-
|
|
98
|
-
#
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
run "
|
|
102
|
-
"-e \"require 'rubygems'; load '#{erector_dir}/bin/erector'\" app/views/posts"
|
|
83
|
+
FileUtils.cd('dummy') do
|
|
84
|
+
# puts File.read("./Gemfile")
|
|
85
|
+
run "BUNDLE_GEMFILE=./Gemfile bundle install"
|
|
86
|
+
run "BUNDLE_GEMFILE=./Gemfile bundle exec rails generate scaffold post title:string body:text published:boolean"
|
|
87
|
+
run "BUNDLE_GEMFILE=./Gemfile bundle exec #{erector_dir}/bin/erector ./app/views/posts"
|
|
103
88
|
|
|
104
89
|
FileUtils.rm_f("app/views/posts/*.erb")
|
|
105
|
-
run "rake --trace db:migrate"
|
|
90
|
+
run "BUNDLE_GEMFILE=./Gemfile bundle exec rake --trace db:migrate"
|
|
106
91
|
|
|
107
92
|
# run "script/server" # todo: launch in background; use mechanize or something to crawl it; then kill it
|
|
108
93
|
# perhaps use open4?
|