hobo 0.8.3 → 0.8.4

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 (80) hide show
  1. data/CHANGES.txt +330 -0
  2. data/Manifest +12 -4
  3. data/Rakefile +4 -6
  4. data/dryml_generators/rapid/cards.dryml.erb +5 -1
  5. data/dryml_generators/rapid/forms.dryml.erb +8 -10
  6. data/dryml_generators/rapid/pages.dryml.erb +65 -36
  7. data/hobo.gemspec +28 -15
  8. data/lib/active_record/association_collection.rb +3 -22
  9. data/lib/hobo.rb +25 -258
  10. data/lib/hobo/accessible_associations.rb +131 -0
  11. data/lib/hobo/authentication_support.rb +15 -9
  12. data/lib/hobo/composite_model.rb +1 -1
  13. data/lib/hobo/controller.rb +7 -8
  14. data/lib/hobo/dryml.rb +9 -10
  15. data/lib/hobo/dryml/dryml_builder.rb +7 -1
  16. data/lib/hobo/dryml/dryml_doc.rb +161 -0
  17. data/lib/hobo/dryml/dryml_generator.rb +18 -9
  18. data/lib/hobo/dryml/part_context.rb +76 -42
  19. data/lib/hobo/dryml/tag_parameters.rb +1 -0
  20. data/lib/hobo/dryml/taglib.rb +2 -1
  21. data/lib/hobo/dryml/template.rb +39 -29
  22. data/lib/hobo/dryml/template_environment.rb +79 -37
  23. data/lib/hobo/dryml/template_handler.rb +66 -21
  24. data/lib/hobo/guest.rb +2 -10
  25. data/lib/hobo/hobo_helper.rb +125 -53
  26. data/lib/hobo/include_in_save.rb +0 -1
  27. data/lib/hobo/lifecycles.rb +54 -24
  28. data/lib/hobo/lifecycles/actions.rb +95 -31
  29. data/lib/hobo/lifecycles/creator.rb +18 -23
  30. data/lib/hobo/lifecycles/lifecycle.rb +86 -62
  31. data/lib/hobo/lifecycles/state.rb +1 -2
  32. data/lib/hobo/lifecycles/transition.rb +22 -28
  33. data/lib/hobo/model.rb +64 -176
  34. data/lib/hobo/model_controller.rb +67 -54
  35. data/lib/hobo/model_router.rb +5 -2
  36. data/lib/hobo/permissions.rb +397 -0
  37. data/lib/hobo/permissions/associations.rb +167 -0
  38. data/lib/hobo/scopes.rb +15 -38
  39. data/lib/hobo/scopes/association_proxy_extensions.rb +15 -5
  40. data/lib/hobo/scopes/automatic_scopes.rb +43 -18
  41. data/lib/hobo/scopes/named_scope_extensions.rb +2 -2
  42. data/lib/hobo/user.rb +10 -4
  43. data/lib/hobo/user_controller.rb +6 -5
  44. data/lib/hobo/view_hints.rb +58 -0
  45. data/rails_generators/hobo/hobo_generator.rb +7 -3
  46. data/rails_generators/hobo/templates/guest.rb +1 -13
  47. data/rails_generators/hobo_front_controller/hobo_front_controller_generator.rb +1 -1
  48. data/rails_generators/hobo_model/hobo_model_generator.rb +4 -2
  49. data/rails_generators/hobo_model/templates/hints.rb +4 -0
  50. data/rails_generators/hobo_model/templates/model.rb +8 -8
  51. data/rails_generators/hobo_model_controller/hobo_model_controller_generator.rb +10 -0
  52. data/rails_generators/hobo_model_controller/templates/controller.rb +1 -1
  53. data/rails_generators/hobo_rapid/templates/hobo-rapid.js +91 -56
  54. data/rails_generators/hobo_rapid/templates/lowpro.js +15 -15
  55. data/rails_generators/hobo_rapid/templates/reset.css +36 -3
  56. data/rails_generators/hobo_rapid/templates/themes/clean/public/stylesheets/clean.css +13 -17
  57. data/rails_generators/hobo_user_controller/templates/controller.rb +1 -1
  58. data/rails_generators/hobo_user_model/templates/model.rb +18 -16
  59. data/taglibs/core.dryml +60 -18
  60. data/taglibs/rapid.dryml +8 -401
  61. data/taglibs/rapid_core.dryml +586 -0
  62. data/taglibs/rapid_document_tags.dryml +28 -10
  63. data/taglibs/rapid_editing.dryml +92 -55
  64. data/taglibs/rapid_forms.dryml +406 -87
  65. data/taglibs/rapid_generics.dryml +1 -1
  66. data/taglibs/rapid_navigation.dryml +2 -1
  67. data/taglibs/rapid_pages.dryml +7 -16
  68. data/taglibs/rapid_plus.dryml +39 -14
  69. data/taglibs/rapid_support.dryml +1 -1
  70. data/taglibs/rapid_user_pages.dryml +14 -4
  71. data/tasks/{generate_tag_reference.rb → generate_tag_reference.rake} +49 -18
  72. data/tasks/hobo_tasks.rake +16 -0
  73. data/test/permissions/models/models.rb +134 -0
  74. data/test/permissions/models/schema.rb +55 -0
  75. data/test/permissions/models/test.sqlite3 +0 -0
  76. data/test/permissions/test_permissions.rb +436 -0
  77. metadata +27 -14
  78. data/lib/hobo/mass_assignment.rb +0 -64
  79. data/rails_generators/hobo/templates/patch_routing.rb +0 -30
  80. data/uninstall.rb +0 -1
@@ -24,6 +24,7 @@ module Hobo
24
24
 
25
25
  undef_method :default
26
26
 
27
+ # Question: does this do anything? -Tom
27
28
  def [](param_name)
28
29
  fetch(param_name, nil)
29
30
  end
@@ -46,7 +46,8 @@ module Hobo
46
46
  "#{RAILS_ROOT}/#{options[:template_dir].gsub(/^\//, '')}" # remove leading / if there is one
47
47
  end
48
48
 
49
- filename = "#{base}/#{options[:src]}.dryml"
49
+ src = options[:src] || plugin
50
+ filename = "#{base}/#{src}.dryml"
50
51
  raise DrymlException, "No such taglib: #{base} #{options.inspect} #{filename}" unless File.exists?(filename)
51
52
  filename
52
53
  end
@@ -102,7 +102,7 @@ module Hobo::Dryml
102
102
 
103
103
 
104
104
  def children_to_erb(nodes)
105
- nodes.map{|x| node_to_erb(x)}.join
105
+ nodes.map { |x| node_to_erb(x) }.join
106
106
  end
107
107
 
108
108
 
@@ -443,7 +443,7 @@ module Hobo::Dryml
443
443
  @builder.add_part(part_name, restore_erb_scriptlets(part_src), element_line_num(el))
444
444
 
445
445
  newlines = "\n" * part_src.count("\n")
446
- args = [attribute_to_ruby(dom_id), ":#{part_name}", "nil", part_locals].compact
446
+ args = [attribute_to_ruby(dom_id), ":#{part_name}", part_locals].compact
447
447
  "<%= call_part(#{args * ', '}) #{newlines} %>"
448
448
  end
449
449
 
@@ -523,7 +523,8 @@ module Hobo::Dryml
523
523
  elsif t =~ /^[A-Z]/
524
524
  t
525
525
  elsif t =~ /^[a-z]/ && defined? HoboFields.to_class
526
- "Hobo.to_class(:#{t})"
526
+ klass = HoboFields.to_class(t)
527
+ klass.name
527
528
  elsif is_code_attribute?(t)
528
529
  t[1..-1]
529
530
  else
@@ -610,9 +611,9 @@ module Hobo::Dryml
610
611
  when nil
611
612
  call_type = is_parameter_tag ? :named_params : :default_param_only
612
613
  when :named_params
613
- dryml_exception("mixed parameter tags and non-parameter tags", el) unless is_parameter_tag
614
+ dryml_exception("mixed parameter tags and non-parameter tags (did you forget a ':'?)", el) unless is_parameter_tag
614
615
  when :default_param_only
615
- dryml_exception("mixed parameter tags and non-parameter tags", el) if is_parameter_tag
616
+ dryml_exception("mixed parameter tags and non-parameter tags (did you forget a ':'?)", el) if is_parameter_tag
616
617
  end
617
618
 
618
619
  if is_parameter_tag
@@ -639,7 +640,7 @@ module Hobo::Dryml
639
640
  merge_param_names = merge_params.split(/\s*,\s*/).*.gsub("-", "_")
640
641
  "all_parameters & #{merge_param_names.inspect}"
641
642
  end
642
- "{#{param_items}}.merge((#{extra_params}) || {})"
643
+ "merge_parameter_hashes({#{param_items}}, (#{extra_params}) || {})"
643
644
  else
644
645
  "{#{param_items}}"
645
646
  end
@@ -763,8 +764,8 @@ module Hobo::Dryml
763
764
  def maybe_make_part_call(el, call)
764
765
  part_name = el.attributes['part']
765
766
  if part_name
766
- part_id = part_name && "<%= #{attribute_to_ruby(el.attributes['id'] || part_name)} %>"
767
- "<div class='part-wrapper' id='#{part_id}'>" + part_element(el, call) + "</div>"
767
+ part_id = el.attributes['id'] || part_name
768
+ "<div class='part-wrapper' id='<%= #{attribute_to_ruby part_id} %>'>#{part_element(el, call)}</div>"
768
769
  else
769
770
  call
770
771
  end
@@ -781,30 +782,40 @@ module Hobo::Dryml
781
782
  items = attributes.map do |n,v|
782
783
  dryml_exception("invalid attribute name '#{n}'", el) unless n =~ DRYML_NAME_RX
783
784
 
784
- unless n.in?(SPECIAL_ATTRIBUTES) || n =~ /^without-/
785
- ":#{ruby_name n} => #{attribute_to_ruby(v)}"
786
- end
785
+ next if n.in?(SPECIAL_ATTRIBUTES) || n =~ /^without-/
786
+ next if el.attributes['part'] && n == 'id' # The id is rendered on the <div class="part-wrapper"> instead
787
+
788
+ ":#{ruby_name n} => #{attribute_to_ruby(v)}"
787
789
  end.compact
788
790
 
789
791
  # if there's a ':' el.name is just the part after the ':'
790
792
  items << ":field => \"#{ruby_name el.name}\"" if field_shorthand_element?(el)
791
793
 
792
- items = items.join(", ")
793
-
794
- merge_attrs = attributes['merge-attrs'] || merge_attribute(el)
795
- if merge_attrs
796
- extra_attributes = if merge_attrs == "&true"
797
- "attributes"
798
- elsif is_code_attribute?(merge_attrs)
799
- merge_attrs[1..-1]
800
- else
801
- dryml_exception("invalid merge-attrs", el)
802
- end
803
- "merge_attrs({#{items}},(#{extra_attributes}) || {})"
794
+ hash = "{#{items.join(", ")}}"
795
+
796
+ if merge_attribute(el)
797
+ "merge_attrs(#{hash}, attributes)"
798
+ elsif el.attributes['merge-attrs']
799
+ merge_attrs = compile_merge_attrs(el)
800
+ "merge_attrs(#{hash}, #{merge_attrs} || {})"
801
+ else
802
+ hash
803
+ end
804
+ end
805
+
806
+
807
+ def compile_merge_attrs(el)
808
+ merge_attrs = el.attributes['merge-attrs']
809
+ if merge_attrs == "&true"
810
+ "attributes"
811
+ elsif is_code_attribute?(merge_attrs)
812
+ "(#{merge_attrs[1..-1]})"
804
813
  else
805
- "{#{items}}"
814
+ merge_attr_names = merge_attrs.split(/\s*,\s*/).*.gsub("-", "_").*.to_sym
815
+ "(all_attributes & #{merge_attr_names.inspect})"
806
816
  end
807
817
  end
818
+
808
819
 
809
820
  def static_tag_to_method_call(el)
810
821
  part = el.attributes["part"]
@@ -821,11 +832,9 @@ module Hobo::Dryml
821
832
 
822
833
  # Convert the attributes hash to a call to merge_attrs if
823
834
  # there's a merge-attrs attribute
824
- attrs = if (merge_attrs = el.attributes['merge-attrs'])
825
- dryml_exception("merge-attrs was given a string", el) unless is_code_attribute?(merge_attrs)
826
-
827
- "merge_attrs({#{attrs * ', '}}, " +
828
- "((__merge_attrs__ = (#{merge_attrs[1..-1]})) == true ? attributes : __merge_attrs__))"
835
+ attrs = if el.attributes['merge-attrs']
836
+ merge_attrs = compile_merge_attrs(el)
837
+ "merge_attrs({#{attrs * ', '}}, #{merge_attrs} || {})"
829
838
  else
830
839
  "{" + attrs.join(', ') + "}"
831
840
  end
@@ -888,6 +897,7 @@ module Hobo::Dryml
888
897
  elsif is_code_attribute?(val)
889
898
  "#{val[1..-1]}"
890
899
  else
900
+ val.gsub!('-', '_')
891
901
  attr == "repeat" ? %("#{val}") : "this.#{val}"
892
902
  end
893
903
 
@@ -1,7 +1,7 @@
1
1
  module Hobo::Dryml
2
2
 
3
3
  class TemplateEnvironment
4
-
4
+
5
5
  class << self
6
6
  def inherited(subclass)
7
7
  subclass.compiled_local_names = []
@@ -22,10 +22,9 @@ module Hobo::Dryml
22
22
  alias_method :delayed_alias_method_chain, :alias_method_chain
23
23
 
24
24
  end
25
+
26
+ include ActionView::Helpers
25
27
 
26
- for mod in ActionView::Helpers.constants.grep(/Helper$/).map {|m| ActionView::Helpers.const_get(m)}
27
- include mod
28
- end
29
28
 
30
29
  def initialize(view_name=nil, view=nil)
31
30
  unless view_name.nil? && view.nil?
@@ -34,6 +33,7 @@ module Hobo::Dryml
34
33
  @_erb_binding = binding
35
34
  @_part_contexts = {}
36
35
  @_scoped_variables = ScopedVariables.new
36
+ @_polymorphic_tag_cache = {}
37
37
 
38
38
  # Make sure the "assigns" from the controller are available (instance variables)
39
39
  if view
@@ -51,11 +51,11 @@ module Hobo::Dryml
51
51
 
52
52
  for attr in [:erb_binding, :part_contexts, :view_name,
53
53
  :this, :this_parent, :this_field, :this_key,
54
- :form_this, :form_field_names]
54
+ :form_this, :form_field_path, :form_field_names]
55
55
  class_eval "def #{attr}; @_#{attr}; end"
56
56
  end
57
57
 
58
- def form_field_path
58
+ def path_for_form_field
59
59
  @_form_field_path.nil? and raise Hobo::Dryml::DrymlException,
60
60
  "DRYML cannot provide the correct form-field name here (this_field = #{this_field.inspect}, this = #{this.inspect})"
61
61
  @_form_field_path
@@ -133,7 +133,7 @@ module Hobo::Dryml
133
133
  end
134
134
 
135
135
 
136
- def dom_id(object=nil, attribute=nil)
136
+ def typed_id(object=nil, attribute=nil)
137
137
  if object.nil?
138
138
  # nothing passed -- use context
139
139
  if this_parent && this_field && !this_parent.respond_to?(:member_class)
@@ -143,29 +143,51 @@ module Hobo::Dryml
143
143
  end
144
144
  end
145
145
 
146
- if (id = object.try.typed_id)
147
- attribute ? "#{id}_#{attribute}" : id
148
- else
149
- "nil"
150
- end
151
- end
146
+ id = if (typed_id = object.try.typed_id)
147
+ typed_id
148
+ elsif object == @this
149
+ "this"
150
+ end
151
+ attribute ? "#{id}:#{attribute}" : id
152
+ end
152
153
 
153
154
 
154
- def call_part(part_node_id, part_name, part_this=nil, *locals)
155
+ def call_part(part_node_id, part_name, *locals)
155
156
  res = ''
156
- if part_this
157
- new_object_context(part_this) do
158
- @_part_contexts[part_node_id] = PartContext.new(part_name, dom_id, locals)
159
- res = send("#{part_name}_part", *locals)
160
- end
161
- else
162
- new_context do
163
- @_part_contexts[part_node_id] = PartContext.new(part_name, dom_id, locals)
164
- res = send("#{part_name}_part", *locals)
165
- end
157
+ new_context do
158
+ @_part_contexts[part_node_id] = PartContext.for_call(part_name, self, locals)
159
+ res = send("#{part_name}_part", *locals)
166
160
  end
167
161
  res
168
162
  end
163
+
164
+
165
+ def refresh_part(encoded_context, session, dom_id)
166
+ context = Hobo::Dryml::PartContext.for_refresh(encoded_context, @this, session)
167
+
168
+ with_part_context(context) do
169
+ send("#{context.part_name}_part", *context.locals)
170
+ end
171
+ end
172
+
173
+
174
+ def with_part_context(context, &block)
175
+ this, this_field = context.this, context.this_field
176
+
177
+ b = if context.form_field_path
178
+ proc { with_form_context(:unknown, context.form_field_path, &block) }
179
+ else
180
+ block
181
+ end
182
+
183
+ if this && this_field
184
+ new_object_context(this) { new_field_context(this_field, &b) }
185
+ elsif this
186
+ new_object_context(this, &b)
187
+ else
188
+ new_context(&b)
189
+ end
190
+ end
169
191
 
170
192
 
171
193
  def call_polymorphic_tag(name, *args)
@@ -185,16 +207,22 @@ module Hobo::Dryml
185
207
  def find_polymorphic_tag(name, call_type=nil)
186
208
  call_type ||= (this.respond_to?(:member_class) && this.member_class) || this_type
187
209
 
188
- while true
189
- if respond_to?(poly_name = "#{name}__for_#{call_type.name.to_s.underscore.gsub('/', '__')}")
190
- return poly_name
191
- else
192
- if call_type == ActiveRecord::Base || call_type == Object
193
- return name
210
+ begin
211
+ found = nil
212
+ while true
213
+ if respond_to?(poly_name = "#{name}__for_#{call_type.name.to_s.underscore.gsub('/', '__')}")
214
+ found = poly_name
215
+ break
194
216
  else
195
- call_type = call_type.superclass
217
+ if call_type == ActiveRecord::Base || call_type == Object
218
+ found = name
219
+ break
220
+ else
221
+ call_type = call_type.superclass
222
+ end
196
223
  end
197
224
  end
225
+ found
198
226
  end
199
227
  end
200
228
 
@@ -313,10 +341,10 @@ module Hobo::Dryml
313
341
  end
314
342
 
315
343
 
316
- def with_form_context
317
- @_form_this = this
318
- @_form_field_path = []
319
- @_form_field_paths_by_object = { @_form_this => [] }
344
+ def with_form_context(form_this=this, form_field_path=[form_this.class.name.underscore])
345
+ @_form_this = form_this
346
+ @_form_field_path = form_field_path
347
+ @_form_field_paths_by_object = { form_this => form_field_path }
320
348
  res = scope.new_scope :in_form => true, :form_field_names => [] do
321
349
  yield
322
350
  end
@@ -453,7 +481,7 @@ module Hobo::Dryml
453
481
  end
454
482
 
455
483
 
456
- # This proc is used where 'param' is declared on a tag that is
484
+ # This method is used where 'param' is declared on a tag that is
457
485
  # itself a parameter tag. Takes two procs that each return a pair
458
486
  # of hashes (attributes and parameters). Returns a single proc
459
487
  # that also returns a pair of hashes - the merged atributes and
@@ -472,7 +500,7 @@ module Hobo::Dryml
472
500
 
473
501
  attrs = merge_attrs(general_attrs, overriding_attrs)
474
502
  overriding_default = overriding_parameters.delete(:default)
475
- params = general_parameters.merge(overriding_parameters)
503
+ params = merge_parameter_hashes(general_parameters, overriding_parameters)
476
504
 
477
505
  # The overrider should provide its :default as the new
478
506
  # 'default_content'
@@ -494,6 +522,20 @@ module Hobo::Dryml
494
522
  end
495
523
  end
496
524
  end
525
+
526
+
527
+ def merge_parameter_hashes(given_parameters, overriding_parameters)
528
+ to_merge = given_parameters.keys & overriding_parameters.keys
529
+ no_merge = overriding_parameters.keys - to_merge
530
+ result = given_parameters.dup
531
+
532
+ no_merge.each { |k| result[k] = overriding_parameters[k] }
533
+ to_merge.each { |k| result[k] = merge_tag_parameter(given_parameters[k], overriding_parameters[k])}
534
+
535
+ result
536
+ end
537
+
538
+
497
539
 
498
540
 
499
541
  def part_contexts_javascripts
@@ -1,21 +1,27 @@
1
1
  module Hobo::Dryml
2
2
 
3
3
  class TemplateHandler < ActionView::TemplateHandler
4
-
4
+
5
+ def compile(*args)
6
+ # Ignore - we handle compilation ourselves
7
+ end
8
+
9
+ # Pre Rails 2.2
5
10
  def render(template)
6
- renderer = Hobo::Dryml.page_renderer_for_template(@view, template)
11
+ renderer = Hobo::Dryml.page_renderer_for_template(@view, template.locals.keys, template)
7
12
  this = @view.instance_variable_set("@this", @view.controller.send(:dryml_context) || template.locals[:this])
8
13
  s = renderer.render_page(this, template.locals)
9
-
10
14
  # Important to strip whitespace, or the browser hangs around for ages (FF2)
11
- s = s.strip
15
+ s.strip
16
+ end
17
+
18
+ def render_for_rails22(template, view, local_assigns)
19
+ renderer = Hobo::Dryml.page_renderer_for_template(view, local_assigns.keys, template)
20
+ this = @view.instance_variable_set("@this", view.controller.send(:dryml_context) || local_assigns[:this])
21
+ s = renderer.render_page(this, local_assigns)
12
22
 
13
- # TODO: Temporary hack to get the dryml metadata comments in the right place
14
- if RAILS_ENV == "development"
15
- s.gsub(/^(.*?)(<!DOCTYPE.*?>).*?(<html.*?>)/m, "\\2\\3\\1")
16
- else
17
- s
18
- end
23
+ # Important to strip whitespace, or the browser hangs around for ages (FF2)
24
+ s.strip
19
25
  end
20
26
 
21
27
  end
@@ -36,7 +42,7 @@ module ActionController
36
42
 
37
43
 
38
44
  def call_dryml_tag(tag, options={})
39
- add_variables_to_assigns
45
+ @template.send(:_evaluate_assigns_and_ivars)
40
46
 
41
47
  # TODO: Figure out what this bit is all about :-)
42
48
  if options[:with]
@@ -50,23 +56,62 @@ module ActionController
50
56
 
51
57
 
52
58
  # TODO: This is namespace polution, should be called render_dryml_tag
53
- def render_tag(tag, options={}, render_options={})
54
- text = call_dryml_tag(tag, options)
55
- text && render({:text => text, :layout => false }.merge(render_options))
59
+ def render_tag(tag, attributes={}, options={})
60
+ text = call_dryml_tag(tag, attributes)
61
+ text && render({:text => text, :layout => false }.merge(options))
56
62
  end
57
63
 
58
- def render_for_file_with_dryml(template_path, *args)
59
- if template_path !~ /^([a-z]:)?\//i && # not an absolute path (e.g. an exception ERB template)
60
- !template_exists?(template_path) && # no template available in app/views
61
- tag_name = @dryml_fallback_tag || "#{File.basename(template_path).dasherize}-page"
62
64
 
63
- # The template was missing, try to use a DRYML <page> tag instead
64
- render_tag(tag_name) or raise ActionView::MissingTemplate, "Missing template #{template_path}.html.erb in view path #{RAILS_ROOT}/app/views"
65
+ # DRYML fallback tags -- monkey patch this method to attempt to render a tag if there's no template
66
+ def render_for_file_with_dryml(template_path, status = nil, layout = nil, locals = {})
67
+ render_for_file_without_dryml(template_path, status, layout, locals)
68
+ rescue ActionView::MissingTemplate => ex
69
+ # Try to use a DRYML <page> tag instead
70
+ tag_name = @dryml_fallback_tag || "#{File.basename(template_path).dasherize}-page"
71
+
72
+ text = call_dryml_tag(tag_name)
73
+ if text
74
+ render_for_text text, status
65
75
  else
66
- render_for_file_without_dryml(template_path, *args)
76
+ raise ex
67
77
  end
68
78
  end
69
79
  alias_method_chain :render_for_file, :dryml
70
80
 
71
81
  end
72
82
  end
83
+
84
+ class ActionView::Template
85
+
86
+ def render_with_dryml(view, local_assigns = {})
87
+ if handler == Hobo::Dryml::TemplateHandler
88
+ render_dryml(view, local_assigns)
89
+ else
90
+ render_without_dryml(view, local_assigns)
91
+ end
92
+ end
93
+ alias_method_chain :render, :dryml
94
+
95
+ # We've had to copy a bunch of logic from Renderable#render, because we need to prevent Rails
96
+ # from trying to compile our template. DRYML templates are each compiled as a class, not just a method,
97
+ # so the support for compiling templates that Rails provides is innadequate.
98
+ def render_dryml(view, local_assigns = {})
99
+ stack = view.instance_variable_get(:@_render_stack)
100
+ stack.push(self)
101
+
102
+ # This is only used for TestResponse to set rendered_template
103
+ unless is_a?(ActionView::InlineTemplate) || view.instance_variable_get(:@_first_render)
104
+ view.instance_variable_set(:@_first_render, self)
105
+ end
106
+
107
+ view.send(:_evaluate_assigns_and_ivars)
108
+ view.send(:_set_controller_content_type, mime_type) if respond_to?(:mime_type)
109
+
110
+ result = Hobo::Dryml::TemplateHandler.new.render_for_rails22(self, view, local_assigns)
111
+
112
+ stack.pop
113
+ result
114
+ end
115
+
116
+ end
117
+