zafu 0.5.0 → 0.6.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.
@@ -1,34 +1,44 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class ZafuRubyLessTest < Test::Unit::TestCase
4
- include RubyLess::SafeClass
5
- include Zafu::Process::RubyLess
4
+ include RubyLess
5
+ def self.process_unknown(callback); end;
6
+ include Zafu::Process::RubyLessProcessing
6
7
  def helper; self.class; end
7
8
  safe_method :one => {:class => String, :method => "main_one"}
8
9
 
9
- context 'Parsing an attribute without dynamic strings' do
10
- should 'not alter string' do
11
- assert_equal '"this is a string"', rubyless_attr('this is a string')
10
+
11
+ context 'With a Markup' do
12
+ setup do
13
+ @markup = Zafu::Markup.new('p')
12
14
  end
13
- end
14
15
 
15
- context 'Parsing an attribute with dynamic content' do
16
- should 'use RubyLess to translate content' do
17
- assert_equal '"this #{main_one}"', rubyless_attr('this #{one}')
16
+ context 'parsing an attribute without dynamic strings' do
17
+ should 'not alter string' do
18
+ set_markup_attr(@markup, :name, 'this is a string')
19
+ assert_equal '<p name=\'this is a string\'>foo</p>', @markup.wrap('foo')
20
+ end
18
21
  end
19
22
 
20
- context 'with ruby errors' do
21
- should 'raise a RubyLess::Error' do
22
- assert_raises(::RubyLess::Error) do
23
- rubyless_attr('this #{one}}')
24
- end
23
+ context 'parsing an attribute with dynamic content' do
24
+ should 'use RubyLess to translate content' do
25
+ set_markup_attr(@markup, :name, 'this #{one}')
26
+ assert_equal '<p name=\'<%= "this #{main_one}" %>\'>foo</p>', @markup.wrap('foo')
25
27
  end
26
28
 
27
- should 'produce an error message with the original attribute' do
28
- begin
29
- rubyless_attr('this #{one}}')
30
- rescue ::RubyLess::Error => err
31
- assert_equal 'Error parsing string "this #{one}}": parse error on value "}" (tRCURLY)', err.message
29
+ context 'with ruby errors' do
30
+ should 'raise a RubyLess::SyntaxError' do
31
+ assert_raises(RubyLess::SyntaxError) do
32
+ set_markup_attr(@markup, :name, 'this #{one}}')
33
+ end
34
+ end
35
+
36
+ should 'produce an error message with the original attribute' do
37
+ begin
38
+ set_markup_attr(@markup, :name, 'this #{one}}')
39
+ rescue RubyLess::Error => err
40
+ assert_match %r{parse error on value "\}" \(tRCURLY\)}, err.message
41
+ end
32
42
  end
33
43
  end
34
44
  end
data/test/test_helper.rb CHANGED
@@ -2,8 +2,9 @@ require 'rubygems'
2
2
  require 'stringio'
3
3
  require 'test/unit'
4
4
  require 'shoulda'
5
+ require 'yamltest'
5
6
  require 'zafu'
6
7
  require 'zafu/test_helper'
7
- require 'mock/params'
8
-
9
- TestCompiler = Zafu.parser_with_rules(Zafu::All, Mock::Params)
8
+ require 'zafu/ordered_hash'
9
+ require 'mock/test_compiler'
10
+ require 'mock/core_ext'
@@ -0,0 +1,7 @@
1
+ store_block:
2
+ src: "TODO"
3
+ tem: "TODO"
4
+
5
+ use_root_in_template_url:
6
+ src: "TODO"
7
+ tem: "TODO"
@@ -0,0 +1,3 @@
1
+ should_parse_script_tags_and_keep_params:
2
+ src: "<script type='text/javascript'>alert('hello');</script>"
3
+ tem: "<script type='text/javascript'>alert('hello');</script>"
@@ -0,0 +1,3 @@
1
+ out_post:
2
+ src: "<r:link post_string='Monday'/>"
3
+ tem: "<%= make_link(@node) %>Monday"
@@ -0,0 +1,4 @@
1
+
2
+ double_do_should_not_propagate_markup:
3
+ src: "<div id='top' do='root' do='link'/>"
4
+ tem: "<% if var1 = @node.root -%><div id='top'><%= make_link(var1) %></div><% end -%>"
@@ -0,0 +1,8 @@
1
+ some_template:
2
+ src: "<div id='a'>a</div><div id='b'>b</div>"
3
+ tem: "<div id='a'>a</div><div id='b'>b</div>"
4
+
5
+ include_with_part:
6
+ # part 'a' is moved around
7
+ src: "<r:include template='/some/template'><r:with part='a'/><r:with part='b'>new b:<r:include template='/some/template' part='a'/></r:with></r:include>"
8
+ tem: "<div id='b'>new b:<div id='a'>a</div></div>"
@@ -0,0 +1,19 @@
1
+ nasty_erb:
2
+ src: "this <% puts \"could be\" %> nasty"
3
+ tem: "this &lt;% puts \"could be\" %&gt; nasty"
4
+
5
+ never_end_erb:
6
+ src: "never ending erb <%= puts "
7
+ tem: "never ending erb &lt;%= puts "
8
+
9
+ nasty_evil_erb:
10
+ src: "this <% puts <% puts 'could be' %> %> nasty"
11
+ tem: "this &lt;% puts &lt;% puts 'could be' %&gt; %&gt; nasty"
12
+
13
+ trick_erb:
14
+ src: "this <<r:void/>% puts 'is bad' %>"
15
+ tem: "this <<r:void/>% puts 'is bad' %&gt;"
16
+
17
+ include_erb:
18
+ src: "include: <r:include template='/nasty_erb'/>"
19
+ tem: "include: this &lt;% puts \"could be\" %&gt; nasty"
data/test/zafu_test.rb CHANGED
@@ -7,12 +7,12 @@ class String
7
7
  end
8
8
 
9
9
  class ZafuTest < Test::Unit::TestCase
10
- include RubyLess::SafeClass
10
+ include RubyLess
11
11
  include Zafu::TestHelper
12
12
  safe_method :one => {:class => String, :method => "main_one"}
13
-
13
+
14
14
  class Dummy
15
- include RubyLess::SafeClass
15
+ include RubyLess
16
16
  safe_method :hello => String
17
17
  safe_method :one => {:class => String, :method => "dummy_one"}
18
18
  end
@@ -42,16 +42,33 @@ class ZafuTest < Test::Unit::TestCase
42
42
  end
43
43
  end
44
44
  end
45
-
46
- context 'a custom compiler' do
47
- setup do
48
- @compiler = TestCompiler
49
- end
50
-
51
- should 'execute before_process callbacks' do
52
- res = zafu_erb("<p class='simple' do='one' class='foo\#{dum.one}'/>", self, @compiler)
53
- assert_match %r{class='simple <%= "foo\#\{dum.dummy_one\}"}, res
45
+
46
+ # ========== YAML TESTS
47
+
48
+ yamltest
49
+
50
+ def get_template_text(path, base_path)
51
+ folder = base_path.blank? ? [] : base_path.split('/')
52
+ url = (folder + path[1..-1].split('/'))
53
+
54
+
55
+ file = url.shift
56
+ test_name = url.join('_')
57
+
58
+ if test = @@test_strings[file][test_name]
59
+ # text, absolute_url, base_path
60
+ [test['src'], (file + test_name), file]
61
+ else
62
+ nil
54
63
  end
55
64
  end
56
65
 
66
+ def yt_do_test(file, test)
67
+ url = "/#{file}/#{test}"
68
+ tem = @@test_strings[file][test]['tem']
69
+ ast = TestCompiler.new_with_url(url, :helper => self)
70
+ yt_assert tem, ast.to_erb(:node => Zafu::NodeContext.new('@node', Page), :helper => self)
71
+ end
72
+
73
+ yt_make
57
74
  end
data/zafu.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{zafu}
8
- s.version = "0.5.0"
8
+ s.version = "0.6.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Gaspard Bucher"]
12
- s.date = %q{2010-03-21}
12
+ s.date = %q{2010-05-27}
13
13
  s.description = %q{Provides a powerful templating language based on xhtml for rails}
14
14
  s.email = %q{gaspard@teti.ch}
15
15
  s.extra_rdoc_files = [
@@ -29,24 +29,38 @@ Gem::Specification.new do |s|
29
29
  "lib/zafu/markup.rb",
30
30
  "lib/zafu/mock_helper.rb",
31
31
  "lib/zafu/node_context.rb",
32
+ "lib/zafu/ordered_hash.rb",
32
33
  "lib/zafu/parser.rb",
33
34
  "lib/zafu/parsing_rules.rb",
34
35
  "lib/zafu/process/ajax.rb",
35
36
  "lib/zafu/process/conditional.rb",
36
37
  "lib/zafu/process/context.rb",
38
+ "lib/zafu/process/forms.rb",
37
39
  "lib/zafu/process/html.rb",
38
- "lib/zafu/process/ruby_less.rb",
40
+ "lib/zafu/process/ruby_less_processing.rb",
39
41
  "lib/zafu/template.rb",
40
42
  "lib/zafu/test_helper.rb",
43
+ "lib/zafu/view_methods.rb",
41
44
  "rails/init.rb",
42
45
  "script/console",
43
46
  "script/destroy",
44
47
  "script/generate",
45
48
  "test/markup_test.rb",
49
+ "test/mock/classes.rb",
50
+ "test/mock/core_ext.rb",
46
51
  "test/mock/params.rb",
52
+ "test/mock/process.rb",
53
+ "test/mock/test_compiler.rb",
47
54
  "test/node_context_test.rb",
55
+ "test/ordered_hash_test.rb",
48
56
  "test/ruby_less_test.rb",
49
57
  "test/test_helper.rb",
58
+ "test/zafu/ajax.yml",
59
+ "test/zafu/asset.yml",
60
+ "test/zafu/basic.yml",
61
+ "test/zafu/markup.yml",
62
+ "test/zafu/meta.yml",
63
+ "test/zafu/security.yml",
50
64
  "test/zafu_test.rb",
51
65
  "zafu.gemspec"
52
66
  ]
@@ -57,8 +71,13 @@ Gem::Specification.new do |s|
57
71
  s.summary = %q{Provides a powerful templating language based on xhtml for rails}
58
72
  s.test_files = [
59
73
  "test/markup_test.rb",
74
+ "test/mock/classes.rb",
75
+ "test/mock/core_ext.rb",
60
76
  "test/mock/params.rb",
77
+ "test/mock/process.rb",
78
+ "test/mock/test_compiler.rb",
61
79
  "test/node_context_test.rb",
80
+ "test/ordered_hash_test.rb",
62
81
  "test/ruby_less_test.rb",
63
82
  "test/test_helper.rb",
64
83
  "test/zafu_test.rb"
@@ -70,14 +89,17 @@ Gem::Specification.new do |s|
70
89
 
71
90
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
72
91
  s.add_development_dependency(%q<shoulda>, [">= 0"])
73
- s.add_runtime_dependency(%q<rubyless>, [">= 0.4.0"])
92
+ s.add_development_dependency(%q<yamltest>, [">= 0.5.0"])
93
+ s.add_runtime_dependency(%q<rubyless>, [">= 0.5.0"])
74
94
  else
75
95
  s.add_dependency(%q<shoulda>, [">= 0"])
76
- s.add_dependency(%q<rubyless>, [">= 0.4.0"])
96
+ s.add_dependency(%q<yamltest>, [">= 0.5.0"])
97
+ s.add_dependency(%q<rubyless>, [">= 0.5.0"])
77
98
  end
78
99
  else
79
100
  s.add_dependency(%q<shoulda>, [">= 0"])
80
- s.add_dependency(%q<rubyless>, [">= 0.4.0"])
101
+ s.add_dependency(%q<yamltest>, [">= 0.5.0"])
102
+ s.add_dependency(%q<rubyless>, [">= 0.5.0"])
81
103
  end
82
104
  end
83
105
 
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 5
7
+ - 6
8
8
  - 0
9
- version: 0.5.0
9
+ version: 0.6.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Gaspard Bucher
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-03-21 00:00:00 +01:00
17
+ date: 2010-05-27 00:00:00 +02:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -30,7 +30,7 @@ dependencies:
30
30
  type: :development
31
31
  version_requirements: *id001
32
32
  - !ruby/object:Gem::Dependency
33
- name: rubyless
33
+ name: yamltest
34
34
  prerelease: false
35
35
  requirement: &id002 !ruby/object:Gem::Requirement
36
36
  requirements:
@@ -38,11 +38,25 @@ dependencies:
38
38
  - !ruby/object:Gem::Version
39
39
  segments:
40
40
  - 0
41
- - 4
41
+ - 5
42
42
  - 0
43
- version: 0.4.0
44
- type: :runtime
43
+ version: 0.5.0
44
+ type: :development
45
45
  version_requirements: *id002
46
+ - !ruby/object:Gem::Dependency
47
+ name: rubyless
48
+ prerelease: false
49
+ requirement: &id003 !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ segments:
54
+ - 0
55
+ - 5
56
+ - 0
57
+ version: 0.5.0
58
+ type: :runtime
59
+ version_requirements: *id003
46
60
  description: Provides a powerful templating language based on xhtml for rails
47
61
  email: gaspard@teti.ch
48
62
  executables: []
@@ -65,24 +79,38 @@ files:
65
79
  - lib/zafu/markup.rb
66
80
  - lib/zafu/mock_helper.rb
67
81
  - lib/zafu/node_context.rb
82
+ - lib/zafu/ordered_hash.rb
68
83
  - lib/zafu/parser.rb
69
84
  - lib/zafu/parsing_rules.rb
70
85
  - lib/zafu/process/ajax.rb
71
86
  - lib/zafu/process/conditional.rb
72
87
  - lib/zafu/process/context.rb
88
+ - lib/zafu/process/forms.rb
73
89
  - lib/zafu/process/html.rb
74
- - lib/zafu/process/ruby_less.rb
90
+ - lib/zafu/process/ruby_less_processing.rb
75
91
  - lib/zafu/template.rb
76
92
  - lib/zafu/test_helper.rb
93
+ - lib/zafu/view_methods.rb
77
94
  - rails/init.rb
78
95
  - script/console
79
96
  - script/destroy
80
97
  - script/generate
81
98
  - test/markup_test.rb
99
+ - test/mock/classes.rb
100
+ - test/mock/core_ext.rb
82
101
  - test/mock/params.rb
102
+ - test/mock/process.rb
103
+ - test/mock/test_compiler.rb
83
104
  - test/node_context_test.rb
105
+ - test/ordered_hash_test.rb
84
106
  - test/ruby_less_test.rb
85
107
  - test/test_helper.rb
108
+ - test/zafu/ajax.yml
109
+ - test/zafu/asset.yml
110
+ - test/zafu/basic.yml
111
+ - test/zafu/markup.yml
112
+ - test/zafu/meta.yml
113
+ - test/zafu/security.yml
86
114
  - test/zafu_test.rb
87
115
  - zafu.gemspec
88
116
  has_rdoc: true
@@ -117,8 +145,13 @@ specification_version: 3
117
145
  summary: Provides a powerful templating language based on xhtml for rails
118
146
  test_files:
119
147
  - test/markup_test.rb
148
+ - test/mock/classes.rb
149
+ - test/mock/core_ext.rb
120
150
  - test/mock/params.rb
151
+ - test/mock/process.rb
152
+ - test/mock/test_compiler.rb
121
153
  - test/node_context_test.rb
154
+ - test/ordered_hash_test.rb
122
155
  - test/ruby_less_test.rb
123
156
  - test/test_helper.rb
124
157
  - test/zafu_test.rb
@@ -1,145 +0,0 @@
1
- require 'rubyless'
2
-
3
- module Zafu
4
- module Process
5
- module RubyLess
6
- include ::RubyLess::SafeClass
7
- # Actual method resolution. The lookup first starts in the current helper. If nothing is found there, it
8
- # searches inside a 'helpers' module and finally looks into the current node_context.
9
- # If nothing is found at this stage, we prepend the method with the current node and start over again.
10
- def safe_method_type(signature)
11
- get_method_type(signature, false)
12
- end
13
-
14
- # Resolve unknown methods by using RubyLess in the current compilation context (the
15
- # translate method in RubyLess will call 'safe_method_type' in this module).
16
- def r_unknown
17
- rubyless_render(@method, @params)
18
- rescue ::RubyLess::NoMethodError => err
19
- parser_error("#{err.error_message} <span class='type'>#{err.method_with_arguments}</span>", err.receiver_with_class)
20
- rescue ::RubyLess::Error => err
21
- parser_error(err.message)
22
- end
23
-
24
- # Print documentation on the current node type.
25
- def r_m
26
- if @params[:helper] == 'true'
27
- klass = helper.class
28
- else
29
- klass = node.klass
30
- end
31
-
32
- out "<div class='rubyless-m'><h3>Documentation for <b>#{klass}</b></h3>"
33
- out "<ul>"
34
- ::RubyLess::SafeClass.safe_methods_for(klass).each do |signature, opts|
35
- opts = opts.dup
36
- opts.delete(:method)
37
- if opts.keys == [:class]
38
- opts = opts[:class]
39
- end
40
- out "<li>#{signature.inspect} => #{opts.inspect}</li>"
41
- end
42
- out "</ul></div>"
43
- end
44
-
45
- # TEMPORARY METHOD DURING HACKING...
46
- def r_erb
47
- "<pre><%= @erb.gsub('<','&lt;').gsub('>','&gt;') %></pre>"
48
- end
49
-
50
- def rubyless_render(method, params)
51
- rubyless_expand(::RubyLess.translate(method_with_arguments(method, params), self))
52
- end
53
-
54
- def rubyless_attr(val)
55
- ::RubyLess.translate_string(val, self)
56
- end
57
-
58
- private
59
- def get_method_type(signature, added_options = false)
60
- if type = node_context_from_signature(signature)
61
- # Resolve @page, @node
62
- type
63
- elsif type = safe_method_from(helper, signature)
64
- # Resolve template helper methods
65
- type
66
- elsif helper.respond_to?(:helpers) && type = safe_method_from(helper.helpers, signature)
67
- # Resolve by looking at the included helpers
68
- type
69
- elsif node && node.klass.kind_of?(Class) && type = safe_method_from(node.klass, signature)
70
- # Resolve node context methods (xxx.foo, xxx.bar)
71
- type.merge(:method => "#{node.name}.#{type[:method]}")
72
- elsif node && !added_options
73
- # Try prepending current node before arguments: link("foo") becomse link(var1, "foo")
74
- signature_with_node = signature.dup
75
- signature_with_node.insert(1, node.klass)
76
- if type = get_method_type(signature_with_node, added_options = true)
77
- type = type.merge(:prepend_args => ::RubyLess::TypedString.new(node.name, :class => node.klass))
78
- type
79
- else
80
- nil
81
- end
82
- else
83
- nil
84
- end
85
- end
86
-
87
- def method_with_arguments(method, params)
88
- hash_arguments = {}
89
- arguments = []
90
- keys = params.keys.map {|k| k.to_s}
91
- keys.sort.each do |k|
92
- if k.to_s =~ /\A_/
93
- arguments << params[k.to_sym]
94
- else
95
- hash_arguments[k.to_s] = params[k.to_sym]
96
- end
97
- end
98
-
99
- arguments += [hash_arguments] if hash_arguments != {}
100
- if arguments != [] && method[-1..-1] =~ /\w/
101
- "#{method}(#{arguments.inspect[1..-2]})"
102
- else
103
- method
104
- end
105
- end
106
-
107
- def rubyless_expand(res)
108
- if res.klass == String && @blocks.map {|b| b.kind_of?(String) ? nil : b.method}.compact.empty?
109
- out "<%= #{res} %>"
110
- elsif res.could_be_nil?
111
- out "<% if #{var} = #{res} -%>"
112
- out @markup.wrap(expand_with_node(var, res.klass))
113
- out "<% end -%>"
114
- else
115
- out "<% #{var} = #{res} -%>"
116
- out @markup.wrap(expand_with_node(var, res.klass))
117
- end
118
- end
119
-
120
- # This is used to resolve '@node' as NodeContext with class Node, '@page' as first NodeContext
121
- # of type Page, etc.
122
- def node_context_from_signature(signature)
123
- return nil unless signature.size == 1
124
- ivar = signature.first
125
- return nil unless ivar[0..0] == '@'
126
- begin
127
- klass = Module.const_get(ivar[1..-1].capitalize)
128
- context = node(klass)
129
- rescue NameError
130
- return nil
131
- end
132
- {:class => context.klass, :method => context.name}
133
- end
134
-
135
- def safe_method_from(context, signature)
136
- if context.respond_to?(:safe_method_type)
137
- context.safe_method_type(signature)
138
- else
139
- ::RubyLess::SafeClass.safe_method_type_for(context, signature)
140
- end
141
- end
142
-
143
- end # RubyLess
144
- end # Process
145
- end # Zafu