masterview 0.2.5 → 0.3.0

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 (155) hide show
  1. data/CHANGELOG +31 -1
  2. data/README +70 -69
  3. data/RELEASE_NOTES +70 -64
  4. data/Rakefile +26 -27
  5. data/TODO +13 -29
  6. data/doc/about.html +246 -0
  7. data/doc/configuration.html +49 -36
  8. data/doc/developer.html +423 -41
  9. data/doc/directives.html +139 -51
  10. data/doc/guide.html +19 -9
  11. data/doc/index.html +90 -224
  12. data/doc/installation.html +36 -28
  13. data/doc/media_list.html +30 -20
  14. data/doc/simple_diagram.html +3 -5
  15. data/doc/stylesheets/masterview.css +16 -1
  16. data/examples/rails_app_config/masterview/settings.rb +2 -1
  17. data/init.rb +1 -1
  18. data/lib/#ChangeLog# +6 -0
  19. data/lib/masterview/analyzer.rb +48 -34
  20. data/lib/masterview/attr_string_parser.rb +5 -1
  21. data/lib/masterview/case_insensitive_hash.rb +69 -0
  22. data/lib/masterview/{pathname_extensions.rb → core_ext/pathname.rb} +0 -0
  23. data/lib/masterview/{string_extensions.rb → core_ext/string.rb} +0 -0
  24. data/lib/masterview/deprecated/directive_base.rb +362 -0
  25. data/lib/masterview/directive_base.rb +201 -179
  26. data/lib/masterview/directive_dsl.rb +457 -0
  27. data/lib/masterview/directive_helpers.rb +28 -141
  28. data/lib/masterview/directive_load_path.rb +388 -0
  29. data/lib/masterview/directive_metadata.rb +377 -0
  30. data/lib/masterview/directive_registry.rb +259 -69
  31. data/lib/masterview/directives/.metadata +16 -0
  32. data/lib/masterview/directives/attr.rb +9 -8
  33. data/lib/masterview/directives/block.rb +11 -14
  34. data/lib/masterview/directives/check_box.rb +13 -18
  35. data/lib/masterview/directives/collection_select.rb +15 -29
  36. data/lib/masterview/directives/content.rb +9 -3
  37. data/lib/masterview/directives/else.rb +15 -13
  38. data/lib/masterview/directives/elsif.rb +14 -13
  39. data/lib/masterview/directives/eval.rb +20 -0
  40. data/lib/masterview/directives/form.rb +56 -9
  41. data/lib/masterview/directives/form_remote.rb +26 -0
  42. data/lib/masterview/directives/global_inline_erb.rb +10 -14
  43. data/lib/masterview/directives/hidden_field.rb +11 -20
  44. data/lib/masterview/directives/if.rb +13 -12
  45. data/lib/masterview/directives/image_tag.rb +20 -28
  46. data/lib/masterview/directives/import.rb +5 -12
  47. data/lib/masterview/directives/import_render.rb +7 -19
  48. data/lib/masterview/directives/insert_generated_comment.rb +8 -11
  49. data/lib/masterview/directives/javascript_include.rb +21 -12
  50. data/lib/masterview/directives/link_to.rb +14 -8
  51. data/lib/masterview/directives/link_to_function.rb +22 -0
  52. data/lib/masterview/directives/link_to_if.rb +15 -13
  53. data/lib/masterview/directives/link_to_remote.rb +13 -8
  54. data/lib/masterview/directives/omit_tag.rb +32 -16
  55. data/lib/masterview/directives/password_field.rb +10 -22
  56. data/lib/masterview/directives/radio_button.rb +11 -22
  57. data/lib/masterview/directives/replace.rb +7 -8
  58. data/lib/masterview/directives/select.rb +11 -24
  59. data/lib/masterview/directives/stylesheet_link.rb +20 -12
  60. data/lib/masterview/directives/submit.rb +11 -5
  61. data/lib/masterview/directives/text_area.rb +10 -23
  62. data/lib/masterview/directives/text_field.rb +10 -22
  63. data/lib/masterview/exceptions.rb +21 -0
  64. data/lib/masterview/extras/app/controllers/masterview_controller.rb +102 -75
  65. data/lib/masterview/extras/app/views/layouts/masterview_admin.rhtml +24 -23
  66. data/lib/masterview/extras/app/views/layouts/masterview_admin_config.rhtml +81 -0
  67. data/lib/masterview/extras/app/views/masterview/admin/configuration.rhtml +5 -1
  68. data/lib/masterview/extras/app/views/masterview/admin/create.rhtml +2 -2
  69. data/lib/masterview/extras/app/views/masterview/admin/directives.rhtml +5 -0
  70. data/lib/masterview/extras/app/views/masterview/admin/features.rhtml +5 -79
  71. data/lib/masterview/extras/app/views/masterview/admin/interact.rhtml +5 -0
  72. data/lib/masterview/extras/app/views/masterview/admin/list.rhtml +3 -71
  73. data/lib/masterview/extras/init_mv_admin_pages.rb +42 -23
  74. data/lib/masterview/filter_helpers.rb +26 -0
  75. data/lib/masterview/initializer.rb +99 -53
  76. data/lib/masterview/io.rb +19 -15
  77. data/lib/masterview/keyword_expander.rb +7 -2
  78. data/lib/masterview/masterview_info.rb +229 -23
  79. data/lib/masterview/masterview_version.rb +2 -2
  80. data/lib/masterview/parser.rb +275 -105
  81. data/lib/masterview/parser_helpers.rb +54 -0
  82. data/lib/masterview/rails_ext/action_controller_erb_direct.rb +29 -0
  83. data/lib/masterview/rails_ext/action_controller_reparse_checking.rb +27 -0
  84. data/lib/masterview/{extras/init_rails_erb_mv_direct.rb → rails_ext/action_view_erb_direct.rb} +12 -59
  85. data/lib/masterview/template_spec.rb +3 -2
  86. data/lib/masterview.rb +21 -12
  87. data/lib/rexml/parsers/baseparser_with_doctype_fix.rb +473 -0
  88. data/lib/rexml/parsers/sax2parser_with_doctype_fix.rb +243 -0
  89. data/test/directive_test_helper.rb +135 -0
  90. data/test/fixtures/directives/id_check.rb +18 -0
  91. data/test/fixtures/directives/test_directive_events.rb +70 -0
  92. data/test/test_helper.rb +18 -5
  93. data/test/tmp/views/layouts/product.rhtml +10 -10
  94. data/test/tmp/views/product/_form.rhtml +4 -4
  95. data/test/tmp/views/product/_product.rhtml +3 -3
  96. data/test/tmp/views/product/destroy.rhtml +5 -5
  97. data/test/tmp/views/product/edit.rhtml +4 -4
  98. data/test/tmp/views/product/list.rhtml +3 -3
  99. data/test/tmp/views/product/new.rhtml +4 -4
  100. data/test/tmp/views/product/show.rhtml +2 -2
  101. data/test/unit/attr_string_parser_test.rb +105 -0
  102. data/test/unit/case_insensitive_hash_mod_test.rb +104 -0
  103. data/test/unit/config_settings_test.rb +13 -1
  104. data/test/unit/default_generate_mio_filter_test.rb +3 -3
  105. data/test/unit/deprecated_directive_base_test.rb +30 -0
  106. data/test/unit/directive_attr_test.rb +111 -35
  107. data/test/unit/directive_base_test.rb +520 -1
  108. data/test/unit/directive_block_test.rb +30 -22
  109. data/test/unit/directive_content_test.rb +24 -11
  110. data/test/unit/directive_else_test.rb +18 -15
  111. data/test/unit/directive_elsif_test.rb +17 -15
  112. data/test/unit/directive_form_remote_test.rb +59 -0
  113. data/test/unit/directive_form_test.rb +31 -39
  114. data/test/unit/directive_global_inline_erb_test.rb +28 -17
  115. data/test/unit/directive_grid_test_notready.rb +38 -0
  116. data/test/unit/directive_helpers_test.rb +39 -0
  117. data/test/unit/directive_hidden_field_test.rb +44 -29
  118. data/test/unit/directive_if_test.rb +10 -7
  119. data/test/unit/directive_image_tag_test.rb +69 -61
  120. data/test/unit/directive_import_render_test.rb +28 -38
  121. data/test/unit/directive_import_test.rb +16 -14
  122. data/test/unit/directive_insert_generated_comment_test.rb +32 -0
  123. data/test/unit/directive_javascript_include_test.rb +40 -43
  124. data/test/unit/directive_link_to_function_test.rb +40 -0
  125. data/test/unit/directive_link_to_if_test.rb +52 -12
  126. data/test/unit/directive_link_to_remote_test.rb +58 -0
  127. data/test/unit/directive_link_to_test.rb +46 -31
  128. data/test/unit/directive_load_path_test.rb +257 -0
  129. data/test/unit/directive_metadata_test.rb +313 -0
  130. data/test/unit/directive_omit_tag_test.rb +73 -21
  131. data/test/unit/directive_password_field_test.rb +44 -38
  132. data/test/unit/directive_registry_test.rb +44 -0
  133. data/test/unit/directive_replace_test.rb +28 -12
  134. data/test/unit/directive_stylesheet_link_test.rb +43 -36
  135. data/test/unit/directive_submit_test.rb +29 -30
  136. data/test/unit/directive_text_area_test.rb +40 -36
  137. data/test/unit/directive_text_field_test.rb +44 -38
  138. data/test/unit/example_directive_child_events_test.rb +41 -0
  139. data/test/unit/example_test.rb +31 -4
  140. data/test/unit/file_mio_test.rb +18 -13
  141. data/test/unit/filter_helpers_test.rb +10 -8
  142. data/test/unit/find_directive_parent_test.rb +174 -0
  143. data/test/unit/keyword_expander_test.rb +4 -2
  144. data/test/unit/mio_test.rb +18 -11
  145. data/test/unit/mtime_string_hash_mio_tree_test.rb +5 -1
  146. data/test/unit/parser_test.rb +41 -29
  147. data/test/unit/pathname_extensions_test.rb +1 -1
  148. data/test/unit/run_parser_test.rb +2 -2
  149. data/test/unit/simplified_directive_base_test.rb +256 -0
  150. data/test/unit/string_hash_mio_test.rb +5 -1
  151. data/test/unit/template_file_watcher_test.rb +2 -2
  152. data/test/unit/template_test.rb +221 -46
  153. metadata +86 -45
  154. data/lib/masterview/directives/testfilter.rb +0 -55
  155. data/lib/masterview/extras/init_rails_reparse_checking.rb +0 -62
@@ -4,29 +4,45 @@ module MasterView
4
4
  # omit tag if attr_value is empty or if at runtime the condition evaluates to true
5
5
  # mv:omit_tag="" will not render the tag,
6
6
  # mv:omit_tag="true" will not render the tag,
7
- # mv:omit_tag="false" will render the tag
8
- class Omit_tag < MasterView::DirectiveBase
9
- def priority
10
- DirectivePriorities::UltraLow
7
+ # mv:omit_tag="false" will render the tag unconditionally
8
+ # mv:omit_tag="expression" will conditionally render the tag subject to the expression
9
+ class OmitTag < MasterView::DirectiveBase
10
+
11
+ metadata :priority => 'UltraLow',
12
+ :category => 'general',
13
+ :description => 'Omits the element\'s tag from the generated output if the value is empty or evaluates to true'
14
+
15
+ event :before_stag do
16
+ # determine whether tag is omitted or included and if latter whether conditional
17
+ spec = attr_value.strip()
18
+ @omit_tag = spec.empty? || spec == 'true'
19
+ @tag_condition = (@omit_tag || spec == 'false' ) ? nil : spec
11
20
  end
12
21
 
13
- def stag(dcs)
14
- ret = []
15
- unless attr_value.empty?
16
- ret << erb('if '+attr_value)
17
- ret << dcs.render
18
- ret << erb('end')
22
+ event :stag do
23
+ if @omit_tag
24
+ render :nothing
25
+ elsif @tag_condition.nil?
26
+ render render_result
27
+ else # had something we need to evaluate so wrap tag in condition
28
+ render erb_eval( 'if', @tag_condition )
29
+ render render_result
30
+ render erb_eval( 'end' )
19
31
  end
20
32
  end
21
33
 
22
- def etag(dcs)
23
- ret = []
24
- unless attr_value.empty?
25
- ret << erb('if '+attr_value)
26
- ret << dcs.render
27
- ret << erb('end')
34
+ event :etag do
35
+ if @omit_tag
36
+ render :nothing
37
+ elsif @tag_condition.nil?
38
+ render render_result
39
+ else # had something we need to evaluate so wrap tag in condition
40
+ render erb_eval( 'if', @tag_condition )
41
+ render render_result
42
+ render erb_eval( 'end' )
28
43
  end
29
44
  end
45
+
30
46
  end
31
47
  end
32
48
  end
@@ -1,31 +1,19 @@
1
1
  module MasterView
2
2
  module Directives
3
3
 
4
- class Password_field < MasterView::DirectiveBase
5
- def stag(dcs)
6
- #eat
7
- end
8
-
9
- def etag(dcs)
10
- args = parse_attr_value
11
- obj = args[0]
12
- method = args[1]
4
+ class PasswordField < MasterView::DirectiveBase
13
5
 
14
- obj = quote_if(obj)
15
- method = quote_if(method)
6
+ metadata :priority => :default,
7
+ :category => 'form',
8
+ :description => 'Replaces the element with a password input element using the Rails password_field helper',
9
+ :element_usage => 'input'
16
10
 
17
- options = {}
18
- options[:size] = attrs_lck['size'].to_i if attrs_lck['size']
19
- options[:maxlength] = attrs_lck['maxlength'].to_i if attrs_lck['maxlength']
20
- options.merge! common_html_options(attrs_lck)
21
- remove_strings_from_attr_value!
22
- merge_hash_attr_value!(0, options)
11
+ attr_arg :name, :quote => true
12
+ attr_arg :method, :quote => true
13
+ attr_arg :options, :append_element_attrs => [:common_html]
23
14
 
24
- a = []
25
- a << 'password_field '+ obj
26
- a << method
27
- a << attr_value unless attr_value.strip.empty?
28
- erb_content(a.join(', '))
15
+ event :element do
16
+ render erb_content( 'password_field', :name, :method, :options )
29
17
  end
30
18
 
31
19
  end
@@ -3,31 +3,20 @@ module MasterView
3
3
 
4
4
  # create radio_button helper, quoting object and method if necessary
5
5
  # merging in any html options specified
6
- class Radio_button < MasterView::DirectiveBase
7
- def stag(dcs)
8
- #eat
9
- end
10
-
11
- def etag(dcs)
12
- args = parse_attr_value
13
- obj = args[0]
14
- method = args[1]
15
- tag_value = args[2]
6
+ class RadioButton < MasterView::DirectiveBase
16
7
 
17
- obj = quote_if(obj)
18
- method = quote_if(method)
8
+ metadata :priority => :default,
9
+ :category => 'form',
10
+ :description => 'Replaces the element with a Rails radio_button helper.',
11
+ :element_usage => 'input'
19
12
 
20
- options = {}
21
- options.merge! common_html_options(attrs_lck)
22
- remove_strings_from_attr_value!
23
- merge_hash_attr_value!(0, options)
13
+ attr_arg :name, :quote => true
14
+ attr_arg :method, :quote => true
15
+ attr_arg :value
16
+ attr_arg :options, :append_element_attrs => [:common_html]
24
17
 
25
- a = []
26
- a << 'radio_button '+ obj
27
- a << method
28
- a << tag_value
29
- a << attr_value unless attr_value.strip.empty?
30
- erb_content(a.join(', '))
18
+ event :element do
19
+ render erb_content( 'radio_button', :name, :method, :value, :options )
31
20
  end
32
21
 
33
22
  end
@@ -2,17 +2,16 @@ module MasterView
2
2
  module Directives
3
3
 
4
4
  class Replace < MasterView::DirectiveBase
5
- def priority
6
- DirectivePriorities::MediumLow
7
- end
8
5
 
9
- def stag(directive_call_stack)
10
- end
6
+ metadata :priority => 'MediumLow',
7
+ :category => 'general',
8
+ :description => 'Replaces the element and its content with the value of the expression'
11
9
 
12
- def etag(directive_call_stack)
13
- self.content=''
14
- erb_content(attr_value) unless attr_value.blank?
10
+ # replace the entire element with <%= attr_value %>
11
+ event :element do
12
+ render erb_content( attr_value )
15
13
  end
14
+
16
15
  end
17
16
  end
18
17
  end
@@ -4,33 +4,20 @@ module MasterView
4
4
  # creates a select helper. quotes object and method if necessary, merges
5
5
  # html options specfied on element into any html options in attr_value
6
6
  class Select < MasterView::DirectiveBase
7
- def stag(dcs)
8
- #eat
9
- end
10
-
11
- def etag(dcs)
12
- args = parse_attr_value
13
- obj = args[0]
14
- method = args[1]
15
- choices = args[2]
16
-
17
- obj = quote_if(obj)
18
- method = quote_if(method)
19
7
 
20
- options = {}
21
- options[:size] = attrs_lck['size'].to_i if attrs_lck['size']
22
- options.merge! common_html_options(attrs_lck)
23
- remove_strings_from_attr_value!
24
- merge_hash_attr_value!(1, options)
8
+ metadata :priority => :default,
9
+ :category => 'form',
10
+ :description => 'Replaces the element with a Rails select helper.',
11
+ :element_usage => 'select'
25
12
 
26
- a = []
27
- a << 'select '+ obj
28
- a << method
29
- a << choices
30
- a << attr_value unless attr_value.strip.empty?
13
+ attr_arg :obj, :quote => true
14
+ attr_arg :method, :quote => true
15
+ attr_arg :choices, :default => []
16
+ attr_arg :options, :default => {}
17
+ attr_arg :html_options, :append_element_attrs => [:common_html]
31
18
 
32
- self.content = ''
33
- erb_content(a.join(', '))
19
+ event :element do
20
+ render erb_content( 'select', :obj, :method, :choices, :options, :html_options )
34
21
  end
35
22
 
36
23
  end
@@ -2,24 +2,32 @@ module MasterView
2
2
  module Directives
3
3
 
4
4
  #creates a link_to
5
- class Stylesheet_link < MasterView::DirectiveBase
5
+ class StylesheetLink < MasterView::DirectiveBase
6
6
 
7
7
  # /public\/stylesheets\/(.*)/
8
- STYLESHEET_SRC_EXTRACT_REGEX = MasterView::ConfigSettings.template_asset_base_ref_pattern[:stylesheets]
8
+ STYLESHEET_SRC_EXTRACT_REGEX = MasterView::ConfigSettings.template_asset_base_ref_pattern[:stylesheets]
9
9
 
10
- def stag(dcs)
11
- end
10
+ metadata :priority => :default,
11
+ :category => 'asset',
12
+ :description => 'Replaces the element using the Rails stylesheet_link_tag helper',
13
+ :element_usage => 'link'
14
+
15
+ attr_arg :src, :varargs => true
12
16
 
13
- def etag(dcs)
14
- src = attrs_lck['src']
15
- if attr_value.empty? && src
16
- match = STYLESHEET_SRC_EXTRACT_REGEX.match(src)
17
- ss_loc = (match) ? match[1] : src
18
- else
19
- ss_loc = attr_value
17
+ event :element do
18
+ if @src.nil? or @src.empty?
19
+ if src_attr = element_attrs[:src]
20
+ if match = STYLESHEET_SRC_EXTRACT_REGEX.match(src_attr)
21
+ @src = [match[1]]
22
+ else
23
+ @src = [src_attr]
24
+ end
25
+ end
20
26
  end
21
- erb_content('stylesheet_link_tag ' + quote(ss_loc))
27
+ @src.collect! { |x| quote(x) }
28
+ render erb_content('stylesheet_link_tag', :src)
22
29
  end
30
+
23
31
  end
24
32
 
25
33
  end
@@ -2,13 +2,19 @@ module MasterView
2
2
  module Directives
3
3
 
4
4
  class Submit < MasterView::DirectiveBase
5
- def stag(directive_call_stack); end
6
5
 
7
- def etag(directive_call_stack)
8
- remove_strings_from_attr_value!
9
- prepend_to_attr_value! quote( attrs_lck['value'] ) #prepend quoted submit button name
10
- erb_content('submit_tag ' + attr_value)
6
+ metadata :priority => :default,
7
+ :category => 'form',
8
+ :description => 'Replaces the element with a submit input element using the Rails submit_tag helper.',
9
+ :element_usage => 'input'
10
+
11
+ attr_arg :text do |x,args,inst| if (x and x.include?('=>')) : args.unshift(x); end; inst.quote(inst.element_attrs[:value]) end # if hash found push it back on, override with quoted element_attrs[:value]
12
+ attr_arg :options, :append_element_attrs => [:common_html]
13
+
14
+ event :element do
15
+ render erb_content( 'submit_tag', :text, :options )
11
16
  end
17
+
12
18
  end
13
19
  end
14
20
  end
@@ -1,32 +1,19 @@
1
1
  module MasterView
2
2
  module Directives
3
3
 
4
- class Text_area < MasterView::DirectiveBase
5
- def stag(dcs)
6
- #eat
7
- end
8
-
9
- def etag(dcs)
10
- args = parse_attr_value
11
- obj = args[0]
12
- method = args[1]
4
+ class TextArea < MasterView::DirectiveBase
13
5
 
14
- obj = quote_if(obj)
15
- method = quote_if(method)
6
+ metadata :priority => :default,
7
+ :category => 'form',
8
+ :description => 'Replaces the element with a textarea input element using the Rails text_area helper.',
9
+ :element_usage => 'textarea'
16
10
 
17
- options = {}
18
- options[:rows] = attrs_lck['rows'].to_i if attrs_lck['rows']
19
- options[:cols] = attrs_lck['cols'].to_i if attrs_lck['cols']
20
- options.merge! common_html_options(attrs_lck)
21
- remove_strings_from_attr_value!
22
- merge_hash_attr_value!(0, options)
11
+ attr_arg :obj, :quote => true
12
+ attr_arg :method, :quote => true
13
+ attr_arg :options, :append_element_attrs => [:common_html]
23
14
 
24
- a = []
25
- a << 'text_area '+ obj
26
- a << method
27
- a << attr_value unless attr_value.strip.empty?
28
- self.content=''
29
- erb_content(a.join(', '))
15
+ event :element do
16
+ render erb_content( 'text_area', :obj, :method, :options )
30
17
  end
31
18
 
32
19
  end
@@ -1,31 +1,19 @@
1
1
  module MasterView
2
2
  module Directives
3
3
 
4
- class Text_field < MasterView::DirectiveBase
5
- def stag(dcs)
6
- #eat
7
- end
8
-
9
- def etag(dcs)
10
- args = parse_attr_value
11
- obj = args[0]
12
- method = args[1]
4
+ class TextField < MasterView::DirectiveBase
13
5
 
14
- obj = quote_if(obj)
15
- method = quote_if(method)
6
+ metadata :priority => :default,
7
+ :category => 'form',
8
+ :description => 'Replaces the element with a text input element using the Rails text_field helper.',
9
+ :element_usage => 'textarea'
16
10
 
17
- options = {}
18
- options[:size] = attrs_lck['size'].to_i if attrs_lck['size']
19
- options[:maxlength] = attrs_lck['maxlength'].to_i if attrs_lck['maxlength']
20
- options.merge! common_html_options(attrs_lck)
21
- remove_strings_from_attr_value!
22
- merge_hash_attr_value!(0, options)
11
+ attr_arg :obj, :quote => true
12
+ attr_arg :method, :quote => true
13
+ attr_arg :options, :append_element_attrs => [:common_html]
23
14
 
24
- a = []
25
- a << 'text_field '+ obj
26
- a << method
27
- a << attr_value unless attr_value.strip.empty?
28
- erb_content(a.join(', '))
15
+ event :element do
16
+ render erb_content( 'text_field', :obj, :method, :options )
29
17
  end
30
18
 
31
19
  end
@@ -0,0 +1,21 @@
1
+ module MasterView
2
+
3
+ # Raised when an invalid path is encountered.
4
+ #
5
+ # Used by both directive loading and template IO processing.
6
+ #
7
+ class InvalidPathError < RuntimeError
8
+
9
+ # the file system path
10
+ def path
11
+ @path || nil
12
+ end
13
+
14
+ def initialize( path, err_msg)
15
+ super(err_msg)
16
+ @path = path.to_s
17
+ end
18
+
19
+ end
20
+
21
+ end