erubis 2.1.0 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (118) hide show
  1. data/{ChangeLog → CHANGES} +139 -6
  2. data/MIT-LICENSE +20 -0
  3. data/README.txt +20 -5
  4. data/benchmark/erubybench.rb +465 -229
  5. data/benchmark/erubybench.rhtml +39 -15
  6. data/benchmark/erubybench.yaml +126 -46
  7. data/bin/erubis +2 -2
  8. data/bin/notext +3 -3
  9. data/contrib/action_view_base_rb.patch +23 -0
  10. data/contrib/erubis +466 -308
  11. data/contrib/inline-require +2 -2
  12. data/doc-api/classes/ERB.html +101 -0
  13. data/doc-api/classes/Erubis.html +59 -6
  14. data/doc-api/classes/Erubis/ArrayEnhancer.html +12 -12
  15. data/doc-api/classes/Erubis/Basic/Converter.html +61 -57
  16. data/doc-api/classes/Erubis/BiPatternEnhancer.html +14 -14
  17. data/doc-api/classes/Erubis/CGenerator.html +60 -60
  18. data/doc-api/classes/Erubis/Context.html +125 -29
  19. data/doc-api/classes/Erubis/Converter.html +73 -22
  20. data/doc-api/classes/Erubis/Engine.html +55 -39
  21. data/doc-api/classes/Erubis/EscapeEnhancer.html +6 -6
  22. data/doc-api/classes/Erubis/Evaluator.html +19 -19
  23. data/doc-api/classes/Erubis/Generator.html +16 -10
  24. data/doc-api/classes/Erubis/HeaderFooterEnhancer.html +14 -14
  25. data/doc-api/classes/Erubis/{Helper.html → Helpers.html} +5 -6
  26. data/doc-api/classes/Erubis/Helpers/RailsHelper.html +296 -0
  27. data/doc-api/classes/Erubis/JavaGenerator.html +54 -54
  28. data/doc-api/classes/Erubis/JavascriptGenerator.html +60 -60
  29. data/doc-api/classes/Erubis/Main.html +42 -30
  30. data/doc-api/classes/Erubis/NoCodeEnhancer.html +5 -5
  31. data/doc-api/classes/Erubis/NoTextEnhancer.html +7 -7
  32. data/doc-api/classes/Erubis/OptimizedEruby.html +6 -6
  33. data/doc-api/classes/Erubis/OptimizedGenerator.html +72 -72
  34. data/doc-api/classes/Erubis/OptimizedXmlEruby.html +6 -6
  35. data/doc-api/classes/Erubis/PI/Converter.html +28 -81
  36. data/doc-api/classes/Erubis/PI/Ec.html +6 -6
  37. data/doc-api/classes/Erubis/PI/Ejava.html +6 -6
  38. data/doc-api/classes/Erubis/PI/Ejavascript.html +6 -6
  39. data/doc-api/classes/Erubis/PI/Eperl.html +6 -6
  40. data/doc-api/classes/Erubis/PI/Ephp.html +6 -6
  41. data/doc-api/classes/Erubis/PI/Eruby.html +7 -7
  42. data/doc-api/classes/Erubis/PI/Escheme.html +6 -6
  43. data/doc-api/classes/Erubis/PI/TinyEruby.html +66 -79
  44. data/doc-api/classes/Erubis/PercentLineEnhancer.html +8 -8
  45. data/doc-api/classes/Erubis/PerlGenerator.html +54 -54
  46. data/doc-api/classes/Erubis/PhpGenerator.html +54 -54
  47. data/doc-api/classes/Erubis/PrintEnabledEnhancer.html +21 -21
  48. data/doc-api/classes/Erubis/PrintOutEnhancer.html +30 -30
  49. data/doc-api/classes/Erubis/RubyEvaluator.html +12 -12
  50. data/doc-api/classes/Erubis/RubyGenerator.html +9 -9
  51. data/doc-api/classes/Erubis/SimplifyEnhancer.html +7 -6
  52. data/doc-api/classes/Erubis/StdoutEnhancer.html +12 -12
  53. data/doc-api/classes/Erubis/StringBufferEnhancer.html +13 -13
  54. data/doc-api/classes/Erubis/TinyEruby.html +56 -68
  55. data/doc-api/classes/Erubis/XmlHelper.html +20 -23
  56. data/doc-api/created.rid +1 -1
  57. data/doc-api/files/{__/README_txt.html → README_txt.html} +35 -20
  58. data/doc-api/files/erubis/context_rb.html +2 -2
  59. data/doc-api/files/erubis/converter_rb.html +2 -2
  60. data/doc-api/files/erubis/engine/ec_rb.html +2 -2
  61. data/doc-api/files/erubis/engine/ejava_rb.html +2 -2
  62. data/doc-api/files/erubis/engine/ejavascript_rb.html +2 -2
  63. data/doc-api/files/erubis/engine/enhanced_rb.html +2 -2
  64. data/doc-api/files/erubis/engine/eperl_rb.html +2 -2
  65. data/doc-api/files/erubis/engine/ephp_rb.html +2 -2
  66. data/doc-api/files/erubis/engine/eruby_rb.html +2 -3
  67. data/doc-api/files/erubis/engine/escheme_rb.html +2 -2
  68. data/doc-api/files/erubis/engine/optimized_rb.html +2 -2
  69. data/doc-api/files/erubis/engine_rb.html +2 -2
  70. data/doc-api/files/erubis/enhancer_rb.html +2 -2
  71. data/doc-api/files/erubis/error_rb.html +2 -2
  72. data/doc-api/files/erubis/evaluator_rb.html +2 -2
  73. data/doc-api/files/erubis/generator_rb.html +2 -2
  74. data/doc-api/files/erubis/helper_rb.html +2 -2
  75. data/doc-api/files/erubis/{helper/rails_rb.html → helpers/rails_helper_rb.html} +6 -31
  76. data/doc-api/files/erubis/local-setting_rb.html +2 -2
  77. data/doc-api/files/erubis/main_rb.html +4 -2
  78. data/doc-api/files/erubis/tiny_rb.html +2 -2
  79. data/doc-api/files/erubis_rb.html +2 -2
  80. data/doc-api/fr_class_index.html +3 -3
  81. data/doc-api/fr_file_index.html +2 -2
  82. data/doc-api/fr_method_index.html +142 -147
  83. data/doc-api/index.html +1 -1
  84. data/doc/users-guide.html +387 -218
  85. data/lib/erubis.rb +21 -25
  86. data/lib/erubis/context.rb +34 -4
  87. data/lib/erubis/converter.rb +159 -115
  88. data/lib/erubis/engine.rb +29 -12
  89. data/lib/erubis/engine/ec.rb +2 -2
  90. data/lib/erubis/engine/ejava.rb +2 -2
  91. data/lib/erubis/engine/ejavascript.rb +2 -2
  92. data/lib/erubis/engine/enhanced.rb +2 -2
  93. data/lib/erubis/engine/eperl.rb +2 -2
  94. data/lib/erubis/engine/ephp.rb +2 -2
  95. data/lib/erubis/engine/eruby.rb +5 -6
  96. data/lib/erubis/engine/escheme.rb +2 -2
  97. data/lib/erubis/engine/optimized.rb +2 -2
  98. data/lib/erubis/enhancer.rb +33 -7
  99. data/lib/erubis/error.rb +2 -2
  100. data/lib/erubis/evaluator.rb +2 -2
  101. data/lib/erubis/generator.rb +6 -3
  102. data/lib/erubis/helper.rb +6 -23
  103. data/lib/erubis/helpers/rails_helper.rb +202 -0
  104. data/lib/erubis/local-setting.rb +4 -4
  105. data/lib/erubis/main.rb +90 -35
  106. data/lib/erubis/tiny.rb +57 -52
  107. data/test/assert-text-equal.rb +2 -2
  108. data/test/test-engines.rb +5 -5
  109. data/test/test-erubis.rb +173 -63
  110. data/test/test-main.rb +135 -27
  111. data/test/test-notext.rb +2 -2
  112. data/test/test.rb +2 -2
  113. data/test/testutil.rb +2 -2
  114. metadata +16 -16
  115. data/LGPL +0 -504
  116. data/doc-api/classes/Erubis/Helper/CachedRailsTemplate.html +0 -198
  117. data/doc-api/classes/Erubis/Helper/RailsTemplate.html +0 -366
  118. data/lib/erubis/helper/rails.rb +0 -159
@@ -1,12 +1,145 @@
1
- # $Rev: 39 $
2
- # $Release: 2.1.0 $
3
- # copyright(c) 2006 kuwata-lab all rights reserved.
1
+ # $Rev: 65 $
2
+ # $Release: 2.2.0 $
3
+ # copyright(c) 2006-2007 kuwata-lab all rights reserved.
4
+
5
+
6
+ #
7
+ - release: 2.2.0
8
+ date: 2007-02-11
9
+ enhancements:
10
+ - |
11
+ Performance tuned up. Release 2.2.0 works about 8 percent faster
12
+ than 2.1.0.
13
+ As a result, Erubis works more than 10 percent faster than eruby.
14
+ (eruby is the extension module of eRuby written in C.)
15
+
16
+ - |
17
+ Support of Ruby on Rails improved.
18
+ If you want to use Erubis with Ruby on Rails, add the following code
19
+ into your 'config/environment.rb' and restart web server.
20
+ This will set Erubis as eRuby compiler in Ruby on Rails instead of ERB.
21
+
22
+ --------------------
23
+ require 'erubis/helpers/rails_helper'
24
+ #Erubis::Helpers::RailsHelper.engine_class = Erubis::Eruby
25
+ #Erubis::Helpers::RailsHelper.init_properties = {}
26
+ #Erubis::Helpers::RailsHelper.show_src = true
27
+ --------------------
28
+
29
+ Methods 'capture()' and 'content_for()' of ActionView::Helpers::CaptureHelper
30
+ are available. Methd ActionView::Helpers::TextHelper#concat() is also available.
31
+
32
+ If Erubis::Helpers::RailsHelper.show_src is ture, Erubis prints converted
33
+ Ruby code into log file (such as 'log/development.log').
34
+
35
+ - |
36
+ Erubis::Engine.load_file(filename) creates cache file (filename +
37
+ '.cache') automatically if cache file is old or not exist.
38
+ Caching makes Erubis about 40-50 percent faster.
39
+
40
+ ex.
41
+ --------------------
42
+ require 'erubis'
43
+ eruby = Erubis::Eruby.load_file('example.rhtml')
44
+ ## cache file 'example.rhtml.cache' is created automatically
45
+ --------------------
46
+
47
+ - |
48
+ Command-line option '-f datafile' can take Ruby script ('*.rb')
49
+ as well as YAML file ('*.yaml' or '*.yml').
50
+
51
+ ex.
52
+ ====================
53
+ $ cat context.rb
54
+ @title = 'Example'
55
+ @list = %w[AAA BBB CCC]
56
+ $ cat example.rhtml
57
+ <h1><%= @title %></h1>
58
+ <ul>
59
+ <% for item in @list %>
60
+ <li><%= item %></li>
61
+ <% end %>
62
+ </ul>
63
+ $ erubis -f context.rb example.rhtml
64
+ <h1>Example</h1>
65
+ <ul>
66
+ <li>AAA</li>
67
+ <li>BBB</li>
68
+ <li>CCC</li>
69
+ </ul>
70
+ ====================
71
+
72
+ - |
73
+ New command-line option '-c context' support. It takes context string
74
+ in YAML inline style or Ruby code style.
75
+
76
+ ex. YAML inline style
77
+ ====================
78
+ $ erubis -c '{title: Example, list: [AAA, BBB, CCC]}' example.rhtml
79
+ ====================
80
+
81
+ ex. YAML inline style
82
+ ====================
83
+ $ erubis -c '@title="Example"; @list=%w[AAA BBB CCC]' example.rhtml
84
+ ====================
85
+
86
+ - |
87
+ New command-line option '-z' (syntax checking) support. It is similar
88
+ to 'erubis -x file.rhtml | ruby -wc', but it can take several filenames.
89
+
90
+ ex.
91
+ ====================
92
+ $ erubis -z app/views/*/*.rhtml
93
+ Syntax OK
94
+ ====================
95
+
96
+ - |
97
+ New constant Erubis::VERSION added.
98
+
99
+
100
+ changes:
101
+ - |
102
+ Class Erubis::Eruby changed to include Erubis::StringBufferEnhancer
103
+ instead of Erubis::ArrayBufferEnhancer.
104
+ This is for Ruby on Rails support.
105
+
106
+ ex.
107
+ ====================
108
+ $ cat example.rhtml
109
+ <ul>
110
+ <% for item in @list %>
111
+ <li><%= item %></li>
112
+ <% end %>
113
+ </ul>
114
+ $ erubis -x example.rhtml
115
+ _buf = ''; _buf << '<ul>
116
+ '; for item in @list
117
+ _buf << ' <li>'; _buf << ( item ).to_s; _buf << '</li>
118
+ '; end
119
+ _buf << '</ul>
120
+ ';
121
+ _buf.to_s
122
+ ====================
123
+
124
+ - |
125
+ Erubis::StringBufferEnhancer#add_postamble() prints "_buf.to_s"
126
+ instead of "_buf".
127
+ This is useful for 'erubis -x file.rhtml | ruby -wc'.
128
+
129
+ - |
130
+ Command-line option '-T' is removed. Use '--trim=false' instead.
131
+
132
+ - |
133
+ License is changed to MIT License.
134
+
135
+ - |
136
+ Embedded pattern '<%- -%>' can be handled.
4
137
 
5
138
 
6
139
  #
7
140
  - release: 2.1.0
8
141
  date: 2006-09-23
9
- enhances:
142
+ enhancements:
10
143
  - |
11
144
  Ruby on Rails support. Add the following code to
12
145
  your 'app/controllers/application.rb' and restart web server.
@@ -153,7 +286,7 @@
153
286
  - module 'FastEnhancer' and class 'FastEruby' is obsolete because they are integrated into Eruby class
154
287
  - Eruby#evaluate() calls instance_eval() instead of eval()
155
288
  - XmlEruby.escape_xml() is moved to XmlHelper.escape_xml()
156
- enhances:
289
+ enhancements:
157
290
  - multi programming language support (Ruby/PHP/C/Java/Scheme/Perl/Javascript)
158
291
  - class Eruby runs very fast because FastEnhancer module is integrated into Eruby by default
159
292
  - TinyEruby class (tiny.rb) is added
@@ -182,7 +315,7 @@
182
315
  #
183
316
  - release: 1.1.0
184
317
  date: 2006-03-05
185
- enhances:
318
+ enhancements:
186
319
  - '<%# ... %>' is supported
187
320
  - PrintEnhancer, PrintEruby, and PrintXmlEruby added
188
321
 
@@ -0,0 +1,20 @@
1
+ copyright(c) 2006-2007 kuwata-lab all rights reserved.
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.txt CHANGED
@@ -1,14 +1,14 @@
1
1
  = README
2
2
 
3
- release:: $Release: 2.1.0 $
4
- copyright:: copyright(c) 2006 kuwata-lab all rights reserved.
3
+ release:: $Release: 2.2.0 $
4
+ copyright:: copyright(c) 2006-2007 kuwata-lab all rights reserved.
5
5
 
6
6
 
7
7
 
8
8
  == About Erubis
9
9
 
10
10
  Erubis is an implementation of eRuby. It has the following features.
11
- * Very fast, almost three times faster than ERB and even faster than eruby
11
+ * Very fast, almost three times faster than ERB and even 10% faster than eruby
12
12
  * Multi-language support (Ruby/PHP/C/Java/Scheme/Perl/Javascript)
13
13
  * Auto escaping support
14
14
  * Auto trimming spaces around '<% %>'
@@ -53,6 +53,22 @@ See doc/users-guide.html for details.
53
53
 
54
54
 
55
55
 
56
+ == Ruby on Rails Support
57
+
58
+ Erubis supports Ruby on Rails.
59
+ All you have to do is to add the following code into your 'config/environment.rb'
60
+ and restart web server.
61
+
62
+ require 'erubis/helpers/rails_helper'
63
+ #Erubis::Helpers::RailsHelper.engine_class = Erubis::Eruby
64
+ #Erubis::Helpers::RailsHelper.init_properties = {}
65
+ #Erubis::Helpers::RailsHelper.show_src = false
66
+
67
+ If Erubis::Helpers::RailsHelper.show_src is ture, Erubis prints converted Ruby code
68
+ into log file ('log/development.log' or so). It is useful for debug.
69
+
70
+
71
+
56
72
  == Exploring Guide
57
73
 
58
74
  If you are exploring Eruby, see the following class at first.
@@ -76,9 +92,8 @@ Try 'ruby erubybenchmark.rb' in benchmark directory.
76
92
 
77
93
  == License
78
94
 
79
- LGPL version 2.1
95
+ MIT License
80
96
 
81
- If you need looser license, please suggest me.
82
97
 
83
98
 
84
99
  == Author
@@ -1,12 +1,21 @@
1
1
  ##
2
- ## $Rev: 21 $
3
- ## $Release: 2.1.0 $
4
- ## copyright(c) 2006 kuwata-lab all rights reserved.
2
+ ## $Rev: 64 $
3
+ ## $Release: 2.2.0 $
4
+ ## copyright(c) 2006-2007 kuwata-lab all rights reserved.
5
5
  ##
6
6
 
7
7
  require 'eruby'
8
8
  require 'erb'
9
9
  require 'stringio'
10
+ require 'cgi'
11
+ include ERB::Util
12
+ #module ERB::Util
13
+ # ESCAPE_TABLE = { '&'=>'&amp;', '<'=>'&lt;', '>'=>'&gt;', '"'=>'&quot;', "'"=>'&#039;', }
14
+ # def h(value)
15
+ # value.to_s.gsub(/[&<>"]/) { |s| ESCAPE_TABLE[s] }
16
+ # end
17
+ # module_function :h
18
+ #end
10
19
 
11
20
  require 'erubis'
12
21
  require 'erubis/engine/enhanced'
@@ -15,49 +24,73 @@ require 'erubis/tiny'
15
24
  require 'erubybench-lib'
16
25
 
17
26
 
18
-
19
- ## default values
20
- filename = 'erubybench.rhtml'
21
- datafile = 'erubybench.yaml'
22
- n = 10000
27
+ ## default value
28
+ defaults = {
29
+ :ntimes => 1000,
30
+ :erubyfile => 'erubybench.rhtml',
31
+ :datafile => 'erubybench.yaml',
32
+ :testmode => 'execute',
33
+ :outfile => '/dev/null',
34
+ }
23
35
 
24
36
 
25
37
  ## usage
26
- def usage(n, filename, datafile)
27
- s = "Usage: ruby #{$0} [-h] [-n N] [-f file] [-d file] [testname ...]\n"
28
- s << " -h : help\n"
29
- s << " -n N : number of times to loop (default #{n})\n"
30
- s << " -f file : eruby filename (default '#{filename}')\n"
31
- s << " -d file : data filename (default '#{datafile}')\n"
38
+ def usage(defaults)
39
+ script = File.basename($0)
40
+ s = <<END
41
+ Usage: ruby #{script} [..options..] [..testnames..] > /dev/null 2> bench.log
42
+ -h : help
43
+ -n N : number of times to loop (default #{defaults[:ntimes]})
44
+ -t erubyfile : eruby filename (default '#{defaults[:erubyfile]}')
45
+ -f datafile : data filename (default '#{defaults[:datafile]}')
46
+ -o outfile : output filename (default '#{defaults[:outfile]}')
47
+ -A : test all targets
48
+ -x testname,.. : exclude testnames
49
+ -m testmode : execute/convert/func (default '#{defaults[:testmode]}')
50
+ -X : expand loop
51
+ -p : print output
52
+ END
32
53
  return s
33
54
  end
34
55
 
35
56
 
36
57
  ## parse command-line options
37
- flag_help = false
38
- flag_all = false
39
- targets = nil
40
- test_type = nil
41
- compiler_name = 'ErubisOptimized'
42
- while !ARGV.empty? && ARGV[0][0] == ?-
43
- opt = ARGV.shift
44
- case opt
45
- when '-n' ; n = ARGV.shift.to_i
46
- when '-f' ; filename = ARGV.shift
47
- when '-d' ; datafile = ARGV.shift
48
- when '-h', '--help' ; flag_help = true
49
- when '-A' ; test_all = true
50
- when '-C' ; compiler_name = ARGV.shift
51
- when '-t' ; test_type = ARGV.shift
52
- else ; raise "#{opt}: invalid option."
53
- end
58
+ require 'optparse'
59
+ optparser = OptionParser.new
60
+ options = {}
61
+ ['-h', '-n N', '-t erubyfile', '-f datafile', '-o outfile', '-A', '-e',
62
+ '-x exclude', '-m testmode', '-X', '-p', '-D'].each do |opt|
63
+ optparser.on(opt) { |val| options[opt[1].chr] = val }
64
+ end
65
+ begin
66
+ targets = optparser.parse!(ARGV)
67
+ rescue => ex
68
+ $stderr.puts "#{command}: #{ex.to_s}"
69
+ exit(1)
54
70
  end
55
- puts "** n=#{n.inspect}, filename=#{filename.inspect}, datafile=#{datafile.inspect}"
71
+
72
+
73
+ flag_help = options['h']
74
+ ntimes = (options['n'] || defaults[:ntimes]).to_i
75
+ $erubyfile = options['t'] || defaults[:erubyfile]
76
+ datafile = options['f'] || defaults[:datafile]
77
+ outfile = options['o'] || defaults[:outfile]
78
+ flag_all = options['A']
79
+ testmode = options['m'] || defaults[:testmode]
80
+ excludes = options['x']
81
+ $escape = options['e']
82
+ flag_expand = options['X'] ? true : false
83
+ flag_output = options['p'] ? true : false
84
+ $debug = options['D']
85
+
86
+ $ntimes = ntimes
87
+
88
+ $stderr.puts "** $ntimes=#{$ntimes.inspect}, flag_expand=#{flag_expand}, options=#{options.inspect}" if $debug
56
89
 
57
90
 
58
91
  ## help
59
92
  if flag_help
60
- puts usage(n, filename, datafile)
93
+ puts usage(defaults)
61
94
  exit()
62
95
  end
63
96
 
@@ -65,25 +98,380 @@ end
65
98
  ## load data file
66
99
  require 'yaml'
67
100
  ydoc = YAML.load_file(datafile)
68
- data = []
69
- ydoc['data'].each do |hash|
70
- data << hash.inject({}) { |h, t| h[t[0].intern] = t[1]; h }
71
- #h = {}; hash.each { |k, v| h[k.intern] = v } ; data << h
101
+ context = ydoc
102
+ list = context['list']
103
+ if $escape
104
+ list.each do |item|
105
+ if item['name'] =~ / /
106
+ item['name'] = "<#{item['name'].gsub(/ /, '&amp;')}>"
107
+ else
108
+ item['name'] = "\"#{item['name']}\""
109
+ end
110
+ end
72
111
  end
73
- data = data.sort_by { |h| h[:code] }
74
- #require 'pp'; pp data
112
+ #list = []
113
+ #ydoc['list'].each do |hash|
114
+ # list << hash.inject({}) { |h, t| h[t[0].intern] = t[1]; h }
115
+ # #h = {}; hash.each { |k, v| h[k.intern] = v } ; data << h
116
+ #end
117
+ #require 'pp'; pp list
75
118
 
76
119
 
77
- ## open /dev/null
78
- $devnull = File.open("/dev/null", 'w')
120
+ ## test definitions
121
+ testdefs = YAML.load(DATA)
122
+ testdefs.each do |testdef|
123
+ c = testdef['class']
124
+ testdef['code'] ||= "print #{c}.new(File.read(erubyfile)).result(binding())\n"
125
+ testdef['compile'] ||= "#{c}.new(str).src\n"
126
+ #require 'pp'; pp testdef
127
+ end
79
128
 
80
129
 
81
- ## test definitions
82
- testdefs_str = <<END
83
- - name: ERuby
130
+ ## select test target
131
+ if flag_all
132
+ # nothing
133
+ elsif targets && !targets.empty?
134
+ testdefs = targets.collect { |t| testdefs.find { |h| h['name'] == t } }.compact
135
+ #testdefs.delete_if { |h| !targets.include?(h['name']) }
136
+ else
137
+ testdefs.delete_if { |h| h['skip'] }
138
+ end
139
+
140
+ ## exclude target
141
+ if excludes
142
+ excludes = excluces.split(/,/)
143
+ testdefs.delete_if { |h| excludes.include?(h['name']) }
144
+ end
145
+ #require 'pp'; pp testdefs
146
+
147
+
148
+ ## generate template
149
+ def erubyfilename(name)
150
+ case name
151
+ when /eruby/ ; s = '_eruby.'
152
+ when /ERB/ ; s = '_erb.'
153
+ when /PI/ ; s = '_pierubis.'
154
+ when /Tiny/ ; s = '_tiny.'
155
+ when /Erubis/ ; s = '_erubis.'
156
+ else
157
+ raise "#{name}: unknown name."
158
+ end
159
+ return $erubyfile.sub(/\./, s)
160
+ end
161
+ #
162
+ def File.write(filename, str)
163
+ File.open(filename, 'w') { |f| f.write(str) }
164
+ end
165
+ #
166
+ if $erubyfile == defaults[:erubyfile]
167
+ erubystr = File.read($erubyfile)
168
+ s = erubystr
169
+ erubystrs = {}
170
+ if $escape
171
+ erubystrs['eruby'] = s.gsub(/<%=(.*?)%>/, '<%= CGI.escapeHTML((\1).to_s) %>')
172
+ erubystrs['ERB'] = s.gsub(/<%=(.*?)%>/, '<%=h \1%>')
173
+ erubystrs['Erubis'] = s.gsub(/<%=(.*?)%>/, '<%==\1%>')
174
+ erubystrs['Tiny'] = s.gsub(/<%=(.*?)%>/, '<%=Erubis::XmlHelper.escape_xml((\1).to_s)%>')
175
+ erubystrs['PI'] = s.gsub(/<%=(.*?)%>/, '@{\1}@').gsub(/<%(.*?)%>/m, '<?rb\1?>')
176
+ else
177
+ erubystrs['eruby'] = s
178
+ erubystrs['ERB'] = s
179
+ erubystrs['Erubis'] = s
180
+ erubystrs['Tiny'] = s
181
+ erubystrs['PI'] = s.gsub(/<%=(.*?)%>/, '@!{\1}@').gsub(/<%(.*?)%>/m, '<?rb\1?>')
182
+ end
183
+ else
184
+ erubystr = File.read($erubyfile)
185
+ end
186
+ %w[eruby ERB PI Tiny Erubis].each do |name|
187
+ File.write(erubyfilename(name), erubystrs[name])
188
+ end
189
+
190
+
191
+
192
+ ## define test functions for each classes
193
+ str = erubystr
194
+ testdefs.each do |h|
195
+ s = ''
196
+ s << "def test_execute_#{h['name']}(erubyfile, context)\n"
197
+ s << " list = context['list']\n"
198
+ if flag_expand
199
+ $ntimes.times do
200
+ s << " #{h['code']}\n"
201
+ end
202
+ else
203
+ s << " $ntimes.times do\n"
204
+ s << " #{h['code']}\n"
205
+ s << " end\n"
206
+ end
207
+ s << "end\n"
208
+ #puts s
209
+ eval s
210
+ end
211
+
212
+
213
+ ## define view functions for each classes
214
+ str = erubystr
215
+ testdefs.each do |h|
216
+ if h['compile']
217
+ erubyfile = erubyfilename(h['name'])
218
+ code = eval h['compile']
219
+ s = <<-END
220
+ def view_#{h['name']}(context)
221
+ list = context['list']
222
+ #{code}
223
+ end
224
+ END
225
+ #puts s
226
+ eval s
227
+ end
228
+ end
229
+
230
+ ## define tests for view functions
231
+ testdefs.each do |h|
232
+ pr = h['return'] ? 'print ' : ''
233
+ s = ''
234
+ s << "def test_func_#{h['name']}(context)\n"
235
+ s << " list = context['list']\n"
236
+ if flag_expand
237
+ $ntimes.times do
238
+ s << " #{pr}view_#{h['name']}(context)\n"
239
+ end
240
+ else
241
+ s << " $ntimes.times do\n"
242
+ s << " #{pr}view_#{h['name']}(context)\n"
243
+ s << " end\n"
244
+ end
245
+ s << "end\n"
246
+ #puts s
247
+ eval s
248
+ end
249
+
250
+
251
+ ## define test for convertion
252
+ testdefs.each do |h|
253
+ if h['compile']
254
+ s = ''
255
+ s << "def test_convert_#{h['name']}(erubyfile)\n"
256
+ s << " str = File.read(erubyfile)\n"
257
+ if flag_expand
258
+ $ntimes.times do
259
+ s << " src = #{h['compile']}\n"
260
+ end
261
+ else
262
+ s << " $ntimes.times do \n"
263
+ s << " src = #{h['compile']}\n"
264
+ s << " end\n"
265
+ end
266
+ s << "end\n"
267
+ #puts s
268
+ eval s
269
+ end
270
+ end
271
+
272
+
273
+ ## define tests for caching
274
+ str = erubystr
275
+ Dir.mkdir('src') unless test(?d, 'src')
276
+ testdefs.each do |h|
277
+ if h['compile']
278
+ # create file to read
279
+ erubyfile = erubyfilename(h['name'])
280
+ code = eval h['compile']
281
+ fname = "src/erubybench.#{h['name']}.rb"
282
+ File.open(fname, 'w') { |f| f.write(code) }
283
+ #at_exit do File.unlink fname if test(?f, fname) end
284
+ # define function
285
+ pr = h['return'] ? 'print' : ''
286
+ s = ''
287
+ s << "def test_cache_#{h['name']}(erubyfile, context)\n"
288
+ s << " list = context['list']\n"
289
+ if flag_expand
290
+ ntimes.times do
291
+ s << " #{pr} eval(File.read('#{fname}'))\n"
292
+ end
293
+ else
294
+ s << " $ntimes.times do\n"
295
+ s << " #{pr} eval(File.read('#{fname}'))\n"
296
+ s << " end\n"
297
+ end
298
+ s << "end\n"
299
+ #puts s
300
+ eval s
301
+ end
302
+ end
303
+
304
+
305
+ ## output
306
+ if flag_output
307
+ testdefs.each do |h|
308
+ title = h['class']
309
+ func = 'test_basic_' + h['name']
310
+ puts "## #{h['class']}"
311
+ __send__(func, erubyfile, data)
312
+ puts
313
+ end
314
+ exit(0)
315
+ end
316
+
317
+
318
+ ## rehearsal
319
+ $stdout = StringIO.new
320
+ testdefs.each do |h|
321
+ ## execute test code
322
+ erubyfile = erubyfilename(h['name'])
323
+ eval h['code']
324
+ ## execute view function
325
+ next unless h['compile']
326
+ v = __send__("view_#{h['name']}", context)
327
+ print v if h['return']
328
+ ## execute caching function
329
+ fname = "src/erubybench.#{h['name']}.rb"
330
+ v = eval(File.read(fname))
331
+ print v if h['return']
332
+ end
333
+ $stdout = STDOUT
334
+
335
+
336
+ ## open output file
337
+ $stdout = outfile == '-' ? STDOUT : File.open(outfile, 'w')
338
+
339
+
340
+ ## change benchmark library to use $stderr instead of $stdout
341
+ require 'benchmark'
342
+ module Benchmark
343
+ class Report
344
+ def print(*args)
345
+ $stderr.print(*args)
346
+ end
347
+ end
348
+ module_function
349
+ def print(*args)
350
+ $stderr.print(*args)
351
+ end
352
+ end
353
+
354
+
355
+ ## do benchmark
356
+ width = 30
357
+ begin
358
+
359
+ ## evaluate
360
+ if !testmode || testmode == 'execute'
361
+ $stderr.puts "## execute"
362
+ Benchmark.bm(width) do |job|
363
+ testdefs.each do |h|
364
+ title = h['title'] || h['class']
365
+ func = 'test_execute_' + h['name']
366
+ GC.start
367
+ job.report(title) do
368
+ __send__(func, erubyfilename(h['name']), context)
369
+ end
370
+ end
371
+ end
372
+ $stderr.puts
373
+ end
374
+
375
+ ## convert
376
+ if testmode == 'convert'
377
+ $stderr.puts "## convert"
378
+ Benchmark.bm(width) do |job|
379
+ testdefs.each do |h|
380
+ next unless h['compile']
381
+ title = h['title'] || h['class']
382
+ func = 'test_convert_' + h['name']
383
+ GC.start
384
+ job.report(title) do
385
+ __send__(func, erubyfilename(h['name']))
386
+ end
387
+ end
388
+ end
389
+ end
390
+
391
+ ## caching
392
+ if testmode == 'cache'
393
+ $stderr.puts "## evaluate cache file"
394
+ Benchmark.bm(width) do |job|
395
+ testdefs.each do |h|
396
+ next unless h['compile']
397
+ #title = 'cache_' + h['name']
398
+ title = h['title'] || h['class']
399
+ func = 'test_cache_' + h['name']
400
+ GC.start
401
+ job.report(title) do
402
+ __send__(func, erubyfilename(h['name']), context)
403
+ end
404
+ end
405
+ end
406
+ $stderr.puts
407
+ end
408
+
409
+ ## function
410
+ if testmode == 'func'
411
+ $stderr.puts "## evaluate function"
412
+ Benchmark.bm(width) do |job|
413
+ testdefs.each do |h|
414
+ next unless h['compile']
415
+ #title = 'func_' + h['name']
416
+ title = h['title'] || h['class']
417
+ func = 'test_func_' + h['name']
418
+ GC.start
419
+ job.report(title) do
420
+ __send__(func, context)
421
+ end
422
+ end
423
+ end
424
+ $stderr.puts
425
+ end
426
+
427
+ #Benchmark.bm(30) do |job|
428
+ # ## basic test
429
+ # testdefs.each do |h|
430
+ # title = h['class']
431
+ # func = 'test_basic_' + h['name']
432
+ # GC.start
433
+ # job.report(title) do
434
+ # __send__(func, erubyfile, context)
435
+ # end
436
+ # end if !testmode || testmode == 'basic'
437
+ #
438
+ # ## caching function
439
+ # testdefs.each do |h|
440
+ # next unless h['compile']
441
+ # title = 'cache_' + h['name']
442
+ # func = 'test_cache_' + h['name']
443
+ # GC.start
444
+ # job.report(title) do
445
+ # __send__(func, erubyfile, context)
446
+ # end
447
+ # end if !testmode || testmode == 'cache'
448
+ #
449
+ # ## view-function test
450
+ # testdefs.each do |h|
451
+ # next unless h['compile']
452
+ # title = 'func_' + h['name']
453
+ # func = 'test_func_' + h['name']
454
+ # GC.start
455
+ # job.report(title) do
456
+ # __send__(func, list)
457
+ # end
458
+ # end if !testmode || testmode == 'func'
459
+ #
460
+ #end
461
+
462
+ ensure
463
+ $stdout.close() unless outfile == '-'
464
+ end
465
+
466
+ __END__
467
+
468
+ ## testdefs
469
+
470
+ - name: eruby
84
471
  class: ERuby
472
+ title: eruby
85
473
  code: |
86
- ERuby.import(filename)
474
+ ERuby.import(erubyfile)
87
475
  compile: |
88
476
  ERuby::Compiler.new.compile_string(str)
89
477
  return: null
@@ -91,8 +479,8 @@ testdefs_str = <<END
91
479
  - name: ERB
92
480
  class: ERB
93
481
  code: |
94
- print ERB.new(File.read(filename)).result(binding())
95
- # eruby = ERB.new(File.read(filename))
482
+ print ERB.new(File.read(erubyfile)).result(binding())
483
+ # eruby = ERB.new(File.read(erubyfile))
96
484
  # print eruby.result(binding())
97
485
  compile: |
98
486
  ERB.new(str).src
@@ -106,11 +494,20 @@ testdefs_str = <<END
106
494
  desc: print _buf #, no binding()
107
495
  class: Erubis::Eruby2
108
496
  code: |
109
- #Erubis::Eruby2.new(File.read(filename)).result()
110
- Erubis::Eruby2.new(File.read(filename)).result(binding())
497
+ #Erubis::Eruby2.new(File.read(erubyfile)).result()
498
+ Erubis::Eruby2.new(File.read(erubyfile)).result(binding())
111
499
  return: null
112
500
  skip: yes
113
501
 
502
+ - name: ErubisEruby_cached
503
+ class: Erubis::Eruby
504
+ title: Erubis::Eruby(cached)
505
+ code: |
506
+ Erubis::Eruby.load_file(erubyfile).result(binding())
507
+ compile: |
508
+ Erubis::Eruby.load_file(erubyfile)
509
+ return: str
510
+
114
511
  - name: ErubisExprStripped
115
512
  desc: strip expr code
116
513
  class: Erubis::ExprStrippedEruby
@@ -127,19 +524,19 @@ testdefs_str = <<END
127
524
  return: str
128
525
  skip: yes
129
526
 
130
- #- name: ErubisArrayBuffer
131
- # class: Erubis::ArrayBufferEruby
527
+ - name: ErubisArrayBuffer
528
+ class: Erubis::ArrayBufferEruby
132
529
  # code: |
133
- # Erubis::ArrayBufferEruby.new(File.read(filename)).result(binding())
530
+ # Erubis::ArrayBufferEruby.new(File.read(erubyfile)).result(binding())
134
531
  # compile: |
135
532
  # Erubis::ArrayBufferEruby.new(str).src
136
- # return: str
137
- # skip: no
533
+ return: str
534
+ skip: no
138
535
 
139
536
  - name: ErubisStringBuffer
140
537
  class: Erubis::StringBufferEruby
141
538
  return: str
142
- skip: no
539
+ skip: yes
143
540
 
144
541
  - name: ErubisStringIO
145
542
  class: Erubis::StringIOEruby
@@ -159,7 +556,7 @@ testdefs_str = <<END
159
556
  - name: ErubisStdoutSimplified
160
557
  class: Erubis::StdoutSimplifiedEruby
161
558
  return: str
162
- skip: no
559
+ skip: yes
163
560
 
164
561
  - name: ErubisPrintOut
165
562
  class: Erubis::PrintOutEruby
@@ -169,7 +566,7 @@ testdefs_str = <<END
169
566
  - name: ErubisPrintOutSimplified
170
567
  class: Erubis::PrintOutSimplifiedEruby
171
568
  return: str
172
- skip: no
569
+ skip: yes
173
570
 
174
571
  - name: ErubisTiny
175
572
  class: Erubis::TinyEruby
@@ -179,186 +576,25 @@ testdefs_str = <<END
179
576
  - name: ErubisTinyStdout
180
577
  class: Erubis::TinyStdoutEruby
181
578
  return: null
182
- skip: no
579
+ skip: yes
183
580
 
184
581
  - name: ErubisTinyPrint
185
582
  class: Erubis::TinyPrintEruby
186
583
  return: null
187
- skip: no
584
+ skip: yes
585
+
586
+ - name: ErubisPIEruby
587
+ class: Erubis::PI::Eruby
588
+ code: |
589
+ Erubis::PI::Eruby.new(File.read(erubyfile)).result(binding())
590
+ compile: |
591
+ Erubis::PI::Eruby.new(File.read(erubyfile)).src
592
+ return: str
188
593
 
189
594
  #- name: load
190
595
  # class: load
191
596
  # code: |
192
- # load($load_filename)
597
+ # load($load_erubyfile)
193
598
  # compile: null
194
599
  # return: null
195
600
  # skip: yes
196
-
197
- END
198
- testdefs = YAML.load(testdefs_str)
199
-
200
- ## manipulate
201
- testdefs.each do |testdef|
202
- c = testdef['class']
203
- testdef['code'] ||= "print #{c}.new(File.read(filename)).result(binding())\n"
204
- testdef['compile'] ||= "#{c}.new(str).src\n"
205
- require 'pp'
206
- #pp testdef
207
- end
208
-
209
-
210
- ### create file for load
211
- #if testdefs.find { |h| h['name'] == 'load' }
212
- # $load_filename = filename + ".tmp" # for load
213
- # $data = data
214
- # str = File.read(filename)
215
- # str.gsub!(/\bdata\b/, '$data')
216
- # hash = testdefs.find { |h| h['name'] == compiler_name }
217
- # code = eval hash['compile']
218
- # code.sub!(/_buf\s*\z/, 'print \&')
219
- # File.open($load_filename, 'w') { |f| f.write(code) }
220
- # at_exit do
221
- # File.unlink $load_filename if test(?f, $load_filename)
222
- # end
223
- #end
224
-
225
-
226
- ## select test target
227
- if test_all
228
- #testdefs.each { |h| h['skip'] = false }
229
- elsif !ARGV.empty?
230
- #testdefs.each { |h| h['skip'] = ARGV.include?(h['name']) }
231
- testdefs.delete_if { |h| !ARGV.include?(h['name']) }
232
- else
233
- testdefs.delete_if { |h| h['skip'] }
234
- end
235
- #require 'pp'
236
- #pp testdefs
237
-
238
-
239
- ## define test functions for each classes
240
- testdefs.each do |h|
241
- s = ''
242
- s << "def test_#{h['name']}(filename, data)\n"
243
- s << " $stdout = $devnull\n"
244
- n.times do
245
- s << ' ' << h['code'] #<< "\n"
246
- end
247
- s << " $stdout = STDOUT\n"
248
- s << "end\n"
249
- #puts s
250
- eval s
251
- end
252
-
253
-
254
- ## define view functions for each classes
255
- str = File.read(filename)
256
- testdefs.each do |h|
257
- next unless h['compile']
258
- code = eval h['compile']
259
- s = <<-END
260
- def view_#{h['name']}(data)
261
- #{code}
262
- end
263
- END
264
- #puts s
265
- eval s
266
- end
267
-
268
-
269
- ## define tests for view functions
270
- testdefs.each do |h|
271
- pr = h['return'] ? 'print ' : ''
272
- s = ''
273
- s << "def test_view_#{h['name']}(data)\n"
274
- s << " $stdout = $devnull\n"
275
- n.times do
276
- s << " #{pr}view_#{h['name']}(data)\n"
277
- end
278
- s << " $stdout = STDOUT\n"
279
- s << "end\n"
280
- #puts s
281
- eval s
282
- end
283
-
284
-
285
- ## define tests for caching
286
- str = File.read(filename)
287
- testdefs.each do |h|
288
- next unless h['compile']
289
- # create file to read
290
- code = eval h['compile']
291
- fname = "#{filename}.#{h['name']}"
292
- File.open(fname, 'w') { |f| f.write(code) }
293
- #at_exit do File.unlink fname if test(?f, fname) end
294
- # define function
295
- pr = h['return'] ? 'print ' : ''
296
- s = ''
297
- s << "def test_cache_#{h['name']}(filename, data)\n"
298
- s << " $stdout = $devnull\n"
299
- n.times do
300
- s << " #{pr}eval(File.read(\"\#{filename}.#{h['name']}\"))\n"
301
- end
302
- s << " $stdout = STDOUT\n"
303
- s << "end\n"
304
- #puts s
305
- eval s
306
- end
307
-
308
-
309
- ## rehearsal
310
- $stdout = $devnull
311
- testdefs.each do |h|
312
- ## execute test code
313
- eval h['code']
314
- ## execute view function
315
- next unless h['compile']
316
- v = __send__("view_#{h['name']}", data)
317
- print v if h['return']
318
- ## execute caching function
319
- v = eval(File.read("#{filename}.#{h['name']}"))
320
- print v if h['return']
321
- end
322
- $stdout = STDOUT
323
-
324
-
325
- ## do benchmark
326
- require 'benchmark'
327
- begin
328
- Benchmark.bmbm(25) do |job|
329
- ## basic test
330
- testdefs.each do |h|
331
- title = h['class']
332
- func = 'test_' + h['name']
333
- GC.start
334
- job.report(title) do
335
- __send__(func, filename, data)
336
- end
337
- end if !test_type || test_type == 'basic'
338
-
339
- ## caching function
340
- testdefs.each do |h|
341
- next unless h['compile']
342
- title = 'cache_' + h['name']
343
- func = 'test_cache_' + h['name']
344
- GC.start
345
- job.report(title) do
346
- __send__(func, filename, data)
347
- end
348
- end if !test_type || test_type == 'eval'
349
-
350
- ## view-function test
351
- testdefs.each do |h|
352
- next unless h['compile']
353
- title = 'func_' + h['name']
354
- func = 'test_view_' + h['name']
355
- GC.start
356
- job.report(title) do
357
- __send__(func, data)
358
- end
359
- end if !test_type || test_type == 'func'
360
-
361
- end
362
- ensure
363
- $devnull.close()
364
- end