flott 1.0.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.
- data/.gitignore +5 -0
- data/.travis.yml +16 -0
- data/Gemfile +9 -0
- data/README.rdoc +76 -0
- data/Rakefile +25 -0
- data/VERSION +1 -0
- data/benchmarks/data/.keep +0 -0
- data/benchmarks/flott_benchmark.rb +165 -0
- data/benchmarks/runner.rb +6 -0
- data/doc-main.txt +76 -0
- data/flott.gemspec +41 -0
- data/install.rb +16 -0
- data/lib/flott.rb +1016 -0
- data/lib/flott/cache.rb +99 -0
- data/lib/flott/version.rb +8 -0
- data/make_doc.rb +5 -0
- data/tests/templates/header +8 -0
- data/tests/templates/subdir/deeptemplate +6 -0
- data/tests/templates/subdir/included +9 -0
- data/tests/templates/subdir/subdir2/deepincluded2 +2 -0
- data/tests/templates/subdir/subdir2/included2 +1 -0
- data/tests/templates/subdir/subdir3/included3 +1 -0
- data/tests/templates/template +12 -0
- data/tests/templates/template2 +6 -0
- data/tests/templates/toplevel +2 -0
- data/tests/templates/toplevel2 +1 -0
- data/tests/test_cache.rb +70 -0
- data/tests/test_flott.rb +200 -0
- data/tests/test_flott_file.rb +155 -0
- data/tests/test_helper.rb +3 -0
- metadata +153 -0
data/.gitignore
ADDED
data/.travis.yml
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# Passes arguments to bundle install (http://gembundler.com/man/bundle-install.1.html)
|
2
|
+
bundler_args: --binstubs
|
3
|
+
|
4
|
+
# Specify which ruby versions you wish to run your tests on, each version will be used
|
5
|
+
rvm:
|
6
|
+
- 1.8.7
|
7
|
+
- 1.9.2
|
8
|
+
- 1.9.3
|
9
|
+
- rbx-18mode
|
10
|
+
- rbx-19mode
|
11
|
+
- ree
|
12
|
+
- jruby-18mode
|
13
|
+
- jruby-19mode
|
14
|
+
- ruby-head
|
15
|
+
|
16
|
+
script: "bundle exec rake"
|
data/Gemfile
ADDED
data/README.rdoc
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
== Usage
|
2
|
+
|
3
|
+
If you want to play with the parser it's best to use the Flott method:
|
4
|
+
|
5
|
+
Flott('1 + 1 = [=1 + 1]') # => "1 + 1 = 2"
|
6
|
+
|
7
|
+
|
8
|
+
However if you want to take advantage of the directory tree walking and inclusion
|
9
|
+
features, you have to use actual files:
|
10
|
+
|
11
|
+
If two template files are stored in the current directory.
|
12
|
+
One file "header":
|
13
|
+
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
|
14
|
+
"http://www.w3.org/TR/html4/strict.dtd">
|
15
|
+
<html>
|
16
|
+
<head>
|
17
|
+
<title>Hello [=@name]!</title>
|
18
|
+
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-15">
|
19
|
+
</head>
|
20
|
+
<body>
|
21
|
+
And one file "template":
|
22
|
+
[^header-]
|
23
|
+
<h1>Hello [=@name]!</h1>
|
24
|
+
[for i in 1..6
|
25
|
+
if i % 2 == 0-]
|
26
|
+
<b>Hello [=@name]!</b>
|
27
|
+
[else-]
|
28
|
+
<i>Hello [=@name]!</i>
|
29
|
+
[end
|
30
|
+
end-]
|
31
|
+
</body>
|
32
|
+
</html>
|
33
|
+
|
34
|
+
The parser can be used like this
|
35
|
+
fp = Flott::Parser.from_filename('template')
|
36
|
+
env = Flott::Environment.new
|
37
|
+
env[:name] = "Florian"
|
38
|
+
fp.evaluate(env)
|
39
|
+
|
40
|
+
Or this:
|
41
|
+
puts Flott.string_from_file(filename, :name => "Florian")
|
42
|
+
|
43
|
+
You should also take a look at the other convenience methods in the Flott
|
44
|
+
module.
|
45
|
+
|
46
|
+
The output is created by including "header" into "template" with the
|
47
|
+
<tt>[^filename]</tt> syntax. <tt>[!@name]</tt> is a shortcut for
|
48
|
+
<tt>[print @name]</tt> while <tt>[=@name]</tt> first calls
|
49
|
+
Flott::Parser.escape on @name. It's also possible to just print or puts
|
50
|
+
strings.
|
51
|
+
|
52
|
+
Note the use of the assignment to the instance variable @name before
|
53
|
+
executing the template. The state passed to Parser#evaluate as
|
54
|
+
an environment and can be referenced in the template itself with
|
55
|
+
<tt>[=@name]</tt>.
|
56
|
+
|
57
|
+
After execution the output is:
|
58
|
+
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
|
59
|
+
"http://www.w3.org/TR/html4/strict.dtd">
|
60
|
+
<html>
|
61
|
+
<head>
|
62
|
+
<title>Hello Florian!</title>
|
63
|
+
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-15">
|
64
|
+
</head>
|
65
|
+
<body>
|
66
|
+
|
67
|
+
<h1>Hello Florian!</h1>
|
68
|
+
<i>Hello Florian!</i>
|
69
|
+
<b>Hello Florian!</b>
|
70
|
+
<i>Hello Florian!</i>
|
71
|
+
<b>Hello Florian!</b>
|
72
|
+
<i>Hello Florian!</i>
|
73
|
+
<b>Hello Florian!</b>
|
74
|
+
</body>
|
75
|
+
</html>
|
76
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# vim: set filetype=ruby et sw=2 ts=2:
|
2
|
+
|
3
|
+
require 'gem_hadar'
|
4
|
+
|
5
|
+
GemHadar do
|
6
|
+
name 'flott'
|
7
|
+
author 'Florian Frank'
|
8
|
+
email 'flori@ping.de'
|
9
|
+
homepage "http://github.com/flori/#{name}"
|
10
|
+
summary 'Ruby as a templating language'
|
11
|
+
description summary
|
12
|
+
test_dir 'tests'
|
13
|
+
ignore '.*.sw[pon]', 'pkg', 'Gemfile.lock', '.rvmrc', '.AppleDouble'
|
14
|
+
readme 'README.rdoc'
|
15
|
+
clobber Dir['benchmarks/data/*.{dat,log}'], 'coverage'
|
16
|
+
|
17
|
+
dependency 'bullshit', '~>0.1.3'
|
18
|
+
dependency 'rake', '0.9.2.2'
|
19
|
+
dependency 'tins', '~>0.4.2'
|
20
|
+
end
|
21
|
+
|
22
|
+
desc "Benchmarking library"
|
23
|
+
task :benchmark do
|
24
|
+
ruby '-Ilib benchmarks/runner.rb'
|
25
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
1.0.0
|
File without changes
|
@@ -0,0 +1,165 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'bullshit'
|
4
|
+
require 'tins/xt'
|
5
|
+
|
6
|
+
class FlottBenchmark < Bullshit::RepeatCase
|
7
|
+
warmup true
|
8
|
+
|
9
|
+
truncate_data do
|
10
|
+
window_size 50
|
11
|
+
end
|
12
|
+
|
13
|
+
autocorrelation do
|
14
|
+
alpha_level 0.05
|
15
|
+
max_lags 50
|
16
|
+
file yes
|
17
|
+
end
|
18
|
+
|
19
|
+
iterations 1000
|
20
|
+
|
21
|
+
output_dir File.join(File.dirname(__FILE__), 'data')
|
22
|
+
data_file yes
|
23
|
+
|
24
|
+
require 'erb'
|
25
|
+
|
26
|
+
require 'flott'
|
27
|
+
include Flott
|
28
|
+
|
29
|
+
require_maybe 'kashmir'
|
30
|
+
require_maybe 'eruby'
|
31
|
+
require_maybe "amrita2" and include Amrita2
|
32
|
+
require_maybe "tenjin"
|
33
|
+
|
34
|
+
LENGTH = 500
|
35
|
+
|
36
|
+
def setup
|
37
|
+
@output = String.new
|
38
|
+
@target = %'AAAAA9.865881AAAAA\n' * LENGTH
|
39
|
+
end
|
40
|
+
|
41
|
+
def common_output_reset
|
42
|
+
@output != @target and
|
43
|
+
raise "output incorrect: #{@output.inspect} != #{@target.inspect}"
|
44
|
+
@output.replace ''
|
45
|
+
end
|
46
|
+
|
47
|
+
def setup_flott
|
48
|
+
@env = Environment.new(@output)
|
49
|
+
par = Parser.new( %'AAAAA[!3.141 ** 2]AAAAA\n' * LENGTH)
|
50
|
+
@flott = par.compile
|
51
|
+
end
|
52
|
+
|
53
|
+
def benchmark_flott
|
54
|
+
@flott.evaluate(@env)
|
55
|
+
end
|
56
|
+
|
57
|
+
alias after_flott common_output_reset
|
58
|
+
|
59
|
+
def setup_flott_escaped
|
60
|
+
@env = Environment.new(@output)
|
61
|
+
@flott = Parser.new( %'AAAAA[=3.141 ** 2]AAAAA\n' * LENGTH).compile
|
62
|
+
end
|
63
|
+
|
64
|
+
def benchmark_flott_escaped
|
65
|
+
@flott.evaluate(@env)
|
66
|
+
end
|
67
|
+
|
68
|
+
alias after_flott_escaped common_output_reset
|
69
|
+
|
70
|
+
def setup_erb
|
71
|
+
@erb = ERB.new( %'AAAAA<%=3.141 ** 2%>AAAAA\n' * LENGTH, 0, '-')
|
72
|
+
end
|
73
|
+
|
74
|
+
def benchmark_erb
|
75
|
+
@output = @erb.result
|
76
|
+
end
|
77
|
+
|
78
|
+
alias after_erb common_output_reset
|
79
|
+
|
80
|
+
if defined? Kashmir
|
81
|
+
def setup_kashmir
|
82
|
+
@kashmir = Kashmir.new(%'AAAAA^(3.141 ** 2)AAAAA\n' * LENGTH)
|
83
|
+
end
|
84
|
+
|
85
|
+
def benchmark_kashmir
|
86
|
+
@output = @kashmir.expand(Object.new)
|
87
|
+
end
|
88
|
+
|
89
|
+
alias after_kashmir common_output_reset
|
90
|
+
|
91
|
+
def setup_kashmir_escaped
|
92
|
+
@kashmir = Kashmir.for_XML(%'AAAAA^(3.141 ** 2)AAAAA\n' * LENGTH)
|
93
|
+
end
|
94
|
+
|
95
|
+
def benchmark_kashmir_escaped
|
96
|
+
@output = @kashmir.expand(Object.new)
|
97
|
+
end
|
98
|
+
|
99
|
+
alias after_kashmir_escaped common_output_reset
|
100
|
+
end
|
101
|
+
|
102
|
+
if defined? ERuby
|
103
|
+
def setup_eruby
|
104
|
+
require 'stringio'
|
105
|
+
ec = ERuby::Compiler.new
|
106
|
+
@eruby = ec.compile_string(%'AAAAA<%=3.141 ** 2%>AAAAA\n' * LENGTH)
|
107
|
+
$stdout = StringIO.new(@output)
|
108
|
+
end
|
109
|
+
|
110
|
+
def benchmark_eruby
|
111
|
+
eval(@eruby)
|
112
|
+
end
|
113
|
+
|
114
|
+
def after_eruby
|
115
|
+
common_output_reset
|
116
|
+
$stdout.rewind
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
if defined? Amrita2
|
121
|
+
def setup_amrita
|
122
|
+
@amrita = Template.new(%'AAAAA<span am:src="test"></span>AAAAA\n' * LENGTH)
|
123
|
+
end
|
124
|
+
|
125
|
+
def benchmark_amrita
|
126
|
+
@output = @amrita.render_with(:test => 3.141 ** 2).dup
|
127
|
+
end
|
128
|
+
|
129
|
+
alias after_amrita common_output_reset
|
130
|
+
end
|
131
|
+
|
132
|
+
if defined? Tenjin
|
133
|
+
require 'tempfile'
|
134
|
+
|
135
|
+
def setup_tenjin
|
136
|
+
template = %'AAAAA\#{3.141 ** 2}AAAAA\n' * LENGTH
|
137
|
+
tempfile = Tempfile.new 'temp'
|
138
|
+
tempfile.write template
|
139
|
+
tempfile.fsync
|
140
|
+
@template_name = tempfile.path
|
141
|
+
@tenjin = Tenjin::Engine.new
|
142
|
+
end
|
143
|
+
|
144
|
+
def benchmark_tenjin
|
145
|
+
@output = @tenjin.render(@template_name)
|
146
|
+
end
|
147
|
+
|
148
|
+
alias after_tenjin common_output_reset
|
149
|
+
|
150
|
+
def setup_tenjin_escaped
|
151
|
+
template = %'AAAAA${3.141 ** 2}AAAAA\n' * LENGTH
|
152
|
+
tempfile = Tempfile.new 'temp'
|
153
|
+
tempfile.write template
|
154
|
+
tempfile.fsync
|
155
|
+
@template_name = tempfile.path
|
156
|
+
@tenjin = Tenjin::Engine.new
|
157
|
+
end
|
158
|
+
|
159
|
+
def benchmark_tenjin_escaped
|
160
|
+
@output = @tenjin.render(@template_name)
|
161
|
+
end
|
162
|
+
|
163
|
+
alias after_tenjin_escaped common_output_reset
|
164
|
+
end
|
165
|
+
end
|
data/doc-main.txt
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
== Usage
|
2
|
+
|
3
|
+
If you want to play with the parser it's best to use the Flott method:
|
4
|
+
|
5
|
+
Flott('1 + 1 = [=1 + 1]') # => "1 + 1 = 2"
|
6
|
+
|
7
|
+
|
8
|
+
However if you want to take advantage of the directory tree walking and inclusion
|
9
|
+
features, you have to use methods.
|
10
|
+
|
11
|
+
If two template files are stored in the current directory.
|
12
|
+
One file "header":
|
13
|
+
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
|
14
|
+
"http://www.w3.org/TR/html4/strict.dtd">
|
15
|
+
<html>
|
16
|
+
<head>
|
17
|
+
<title>Hello [=@name]!</title>
|
18
|
+
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-15">
|
19
|
+
</head>
|
20
|
+
<body>
|
21
|
+
And one file "template":
|
22
|
+
[^header-]
|
23
|
+
<h1>Hello [=@name]!</h1>
|
24
|
+
[for i in 1..6
|
25
|
+
if i % 2 == 0-]
|
26
|
+
<b>Hello [=@name]!</b>
|
27
|
+
[else-]
|
28
|
+
<i>Hello [=@name]!</i>
|
29
|
+
[end
|
30
|
+
end-]
|
31
|
+
</body>
|
32
|
+
</html>
|
33
|
+
|
34
|
+
The parser can be used like this
|
35
|
+
fp = Flott::Parser.from_filename('template')
|
36
|
+
env = Flott::Environment.new
|
37
|
+
env[:name] = "Florian"
|
38
|
+
fp.evaluate(env)
|
39
|
+
|
40
|
+
Or this:
|
41
|
+
puts Flott.string_from_file(filename, :name => "Florian")
|
42
|
+
|
43
|
+
You should also take a look at the other convenience methods in the Flott
|
44
|
+
module.
|
45
|
+
|
46
|
+
The output is created by including "header" into "template" with the
|
47
|
+
<tt>[^filename]</tt> syntax. <tt>[!@name]</tt> is a shortcut for
|
48
|
+
<tt>[print @name]</tt> while <tt>[=@name]</tt> first calls
|
49
|
+
Flott::Parser.escape on @name. It's also possible to just print or puts
|
50
|
+
strings.
|
51
|
+
|
52
|
+
Note the use of the assignment to the instance variable @name before
|
53
|
+
executing the template. The state passed to Parser#evaluate as
|
54
|
+
an environment and can be referenced in the template itself with
|
55
|
+
<tt>[=@name]</tt>.
|
56
|
+
|
57
|
+
After execution the output is:
|
58
|
+
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
|
59
|
+
"http://www.w3.org/TR/html4/strict.dtd">
|
60
|
+
<html>
|
61
|
+
<head>
|
62
|
+
<title>Hello Florian!</title>
|
63
|
+
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-15">
|
64
|
+
</head>
|
65
|
+
<body>
|
66
|
+
|
67
|
+
<h1>Hello Florian!</h1>
|
68
|
+
<i>Hello Florian!</i>
|
69
|
+
<b>Hello Florian!</b>
|
70
|
+
<i>Hello Florian!</i>
|
71
|
+
<b>Hello Florian!</b>
|
72
|
+
<i>Hello Florian!</i>
|
73
|
+
<b>Hello Florian!</b>
|
74
|
+
</body>
|
75
|
+
</html>
|
76
|
+
|
data/flott.gemspec
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = "flott"
|
5
|
+
s.version = "1.0.0"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Florian Frank"]
|
9
|
+
s.date = "2012-05-11"
|
10
|
+
s.description = "Ruby as a templating language"
|
11
|
+
s.email = "flori@ping.de"
|
12
|
+
s.extra_rdoc_files = ["README.rdoc", "lib/flott.rb", "lib/flott/version.rb", "lib/flott/cache.rb"]
|
13
|
+
s.files = [".gitignore", ".travis.yml", "Gemfile", "README.rdoc", "Rakefile", "VERSION", "benchmarks/data/.keep", "benchmarks/flott_benchmark.rb", "benchmarks/runner.rb", "doc-main.txt", "flott.gemspec", "install.rb", "lib/flott.rb", "lib/flott/cache.rb", "lib/flott/version.rb", "make_doc.rb", "tests/templates/header", "tests/templates/subdir/deeptemplate", "tests/templates/subdir/included", "tests/templates/subdir/subdir2/deepincluded2", "tests/templates/subdir/subdir2/included2", "tests/templates/subdir/subdir3/included3", "tests/templates/template", "tests/templates/template2", "tests/templates/toplevel", "tests/templates/toplevel2", "tests/test_cache.rb", "tests/test_flott.rb", "tests/test_flott_file.rb", "tests/test_helper.rb"]
|
14
|
+
s.homepage = "http://github.com/flori/flott"
|
15
|
+
s.rdoc_options = ["--title", "Flott - Ruby as a templating language", "--main", "README.rdoc"]
|
16
|
+
s.require_paths = ["lib"]
|
17
|
+
s.rubygems_version = "1.8.24"
|
18
|
+
s.summary = "Ruby as a templating language"
|
19
|
+
s.test_files = ["tests/test_flott_file.rb", "tests/test_flott.rb", "tests/test_cache.rb", "tests/test_helper.rb"]
|
20
|
+
|
21
|
+
if s.respond_to? :specification_version then
|
22
|
+
s.specification_version = 3
|
23
|
+
|
24
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
25
|
+
s.add_development_dependency(%q<gem_hadar>, ["~> 0.1.8"])
|
26
|
+
s.add_runtime_dependency(%q<bullshit>, ["~> 0.1.3"])
|
27
|
+
s.add_runtime_dependency(%q<rake>, ["= 0.9.2.2"])
|
28
|
+
s.add_runtime_dependency(%q<tins>, ["~> 0.4.2"])
|
29
|
+
else
|
30
|
+
s.add_dependency(%q<gem_hadar>, ["~> 0.1.8"])
|
31
|
+
s.add_dependency(%q<bullshit>, ["~> 0.1.3"])
|
32
|
+
s.add_dependency(%q<rake>, ["= 0.9.2.2"])
|
33
|
+
s.add_dependency(%q<tins>, ["~> 0.4.2"])
|
34
|
+
end
|
35
|
+
else
|
36
|
+
s.add_dependency(%q<gem_hadar>, ["~> 0.1.8"])
|
37
|
+
s.add_dependency(%q<bullshit>, ["~> 0.1.3"])
|
38
|
+
s.add_dependency(%q<rake>, ["= 0.9.2.2"])
|
39
|
+
s.add_dependency(%q<tins>, ["~> 0.4.2"])
|
40
|
+
end
|
41
|
+
end
|
data/install.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rbconfig'
|
4
|
+
require 'fileutils'
|
5
|
+
include FileUtils::Verbose
|
6
|
+
include Config
|
7
|
+
|
8
|
+
dest = CONFIG["sitelibdir"]
|
9
|
+
mkdir_p(dest)
|
10
|
+
file = 'lib/flott.rb'
|
11
|
+
install(file, dest)
|
12
|
+
|
13
|
+
dest = File.join(dest, 'flott')
|
14
|
+
mkdir_p dest
|
15
|
+
file = 'lib/flott/cache.rb'
|
16
|
+
install(file, dest)
|