hamlit 1.6.7 → 1.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/benchmarks/benchmark.rb +28 -23
- data/lib/hamlit/attribute.rb +14 -10
- data/lib/hamlit/compilers/old_attribute.rb +53 -39
- data/lib/hamlit/concerns/string_interpolation.rb +17 -17
- data/lib/hamlit/filters/base.rb +25 -0
- data/lib/hamlit/filters/css.rb +4 -23
- data/lib/hamlit/filters/javascript.rb +4 -23
- data/lib/hamlit/version.rb +1 -1
- data/spec/hamlit/engine/old_attributes_spec.rb +21 -0
- metadata +2 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ca12e0120f1176a67b7f89077b8f00b832cafe16
|
4
|
+
data.tar.gz: fe98fcc635527e47b22441eadb3409bbd4c5864e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f233e410357f3812775992bcfc6da6bfc27f6ed2b4153f60f050c34df4221084711da794ca22da329ae4665d43a2c9d1f700528038381bbd5ab56d9959b5658f
|
7
|
+
data.tar.gz: 200d020c6ed62d628aeeb03634b71f842f9d5ff245a4a6205b820b5293124fd622a766e843371fd7755096c185d8962c226463ffa796525cc354405aa18684d0
|
data/CHANGELOG.md
CHANGED
data/benchmarks/benchmark.rb
CHANGED
@@ -12,22 +12,15 @@ require 'slim'
|
|
12
12
|
require 'hamlit'
|
13
13
|
|
14
14
|
class Benchmarks
|
15
|
-
def initialize(time)
|
15
|
+
def initialize(time, escape_enabled)
|
16
16
|
@time = time
|
17
17
|
@benches = []
|
18
18
|
@versions = {}
|
19
|
-
end
|
20
19
|
|
21
|
-
|
20
|
+
init_compiled_benches(escape_enabled)
|
22
21
|
if escape_enabled
|
23
|
-
@erb_code = File.read(File.dirname(__FILE__) + '/view.erb')
|
24
|
-
@haml_code = File.read(File.dirname(__FILE__) + '/view.haml')
|
25
|
-
@slim_code = File.read(File.dirname(__FILE__) + '/view.escaped.slim')
|
26
22
|
init_escaped_benches
|
27
23
|
else
|
28
|
-
@erb_code = File.read(File.dirname(__FILE__) + '/view.erb')
|
29
|
-
@haml_code = File.read(File.dirname(__FILE__) + '/view.haml')
|
30
|
-
@slim_code = File.read(File.dirname(__FILE__) + '/view.slim')
|
31
24
|
init_plain_benches
|
32
25
|
end
|
33
26
|
end
|
@@ -45,11 +38,26 @@ class Benchmarks
|
|
45
38
|
|
46
39
|
private
|
47
40
|
|
41
|
+
def init_compiled_benches(escape_enabled)
|
42
|
+
slim_path = "/view#{'.escaped' if escape_enabled}.slim"
|
43
|
+
@erb_code = File.read(File.dirname(__FILE__) + '/view.erb')
|
44
|
+
@haml_code = File.read(File.dirname(__FILE__) + '/view.haml')
|
45
|
+
@slim_code = File.read(File.dirname(__FILE__) + slim_path)
|
46
|
+
end
|
47
|
+
|
48
48
|
# Totally the same as slim-template/slim's compiled bench.
|
49
49
|
def init_plain_benches
|
50
50
|
puts 'Compiled rendering benchmarks without HTML escape'
|
51
51
|
context = Context.new
|
52
|
+
define_plain_methods!(context)
|
53
|
+
|
54
|
+
bench('hamlit', Hamlit::VERSION) { context.run_hamlit }
|
55
|
+
bench('erubis', Erubis::VERSION) { context.run_erubis }
|
56
|
+
bench('slim', Slim::VERSION) { context.run_slim_ugly }
|
57
|
+
bench('haml', Haml::VERSION) { context.run_haml_ugly }
|
58
|
+
end
|
52
59
|
|
60
|
+
def define_plain_methods!(context)
|
53
61
|
haml_ugly = Haml::Engine.new(@haml_code, format: :html5, ugly: true)
|
54
62
|
haml_ugly.def_method(context, :run_haml_ugly)
|
55
63
|
context.instance_eval %{
|
@@ -57,19 +65,23 @@ class Benchmarks
|
|
57
65
|
def run_slim_ugly; #{Slim::Engine.new.call @slim_code}; end
|
58
66
|
def run_hamlit; #{Hamlit::Engine.new(escape_html: false).call @haml_code}; end
|
59
67
|
}
|
60
|
-
|
61
|
-
bench('hamlit', Hamlit::VERSION) { context.run_hamlit }
|
62
|
-
bench('erubis', Erubis::VERSION) { context.run_erubis }
|
63
|
-
bench('slim', Slim::VERSION) { context.run_slim_ugly }
|
64
|
-
bench('haml', Haml::VERSION) { context.run_haml_ugly }
|
65
68
|
end
|
66
69
|
|
67
70
|
# slim-template/slim's compiled bench with HTML escaping.
|
68
71
|
def init_escaped_benches
|
69
72
|
puts 'Compiled rendering benchmarks with HTML escape'
|
70
73
|
context = Context.new
|
71
|
-
context
|
74
|
+
define_escaped_methods!(context)
|
75
|
+
|
76
|
+
bench('hamlit', Hamlit::VERSION) { context.run_hamlit }
|
77
|
+
bench('slim', Slim::VERSION) { context.run_slim_ugly }
|
78
|
+
bench('faml', Faml::VERSION) { context.run_faml }
|
79
|
+
bench('erubis', Erubis::VERSION) { context.run_erubis }
|
80
|
+
bench('haml', Haml::VERSION) { context.run_haml_ugly }
|
81
|
+
end
|
72
82
|
|
83
|
+
def define_escaped_methods!(context)
|
84
|
+
context.instance_eval("def header; '<script>'; end")
|
73
85
|
haml_ugly = Haml::Engine.new(@haml_code, format: :html5, ugly: true, escape_html: true)
|
74
86
|
haml_ugly.def_method(context, :run_haml_ugly)
|
75
87
|
context.instance_eval %{
|
@@ -78,12 +90,6 @@ class Benchmarks
|
|
78
90
|
def run_faml; #{Faml::Engine.new.call @haml_code}; end
|
79
91
|
def run_hamlit; #{Hamlit::Engine.new.call @haml_code}; end
|
80
92
|
}
|
81
|
-
|
82
|
-
bench('hamlit', Hamlit::VERSION) { context.run_hamlit }
|
83
|
-
bench('slim', Slim::VERSION) { context.run_slim_ugly }
|
84
|
-
bench('faml', Faml::VERSION) { context.run_faml }
|
85
|
-
bench('erubis', Erubis::VERSION) { context.run_erubis }
|
86
|
-
bench('haml', Haml::VERSION) { context.run_haml_ugly }
|
87
93
|
end
|
88
94
|
|
89
95
|
def bench(name, version, &block)
|
@@ -100,6 +106,5 @@ class Benchmarks
|
|
100
106
|
end
|
101
107
|
|
102
108
|
time = (ENV['TIME'] || 5).to_i
|
103
|
-
bench = Benchmarks.new(time)
|
104
|
-
bench.init_compiled_benches(ENV['HTML_ESCAPE'])
|
109
|
+
bench = Benchmarks.new(time, ENV['HTML_ESCAPE'] == '1')
|
105
110
|
bench.run
|
data/lib/hamlit/attribute.rb
CHANGED
@@ -57,18 +57,22 @@ module Hamlit
|
|
57
57
|
target = flatten_attributes(target)
|
58
58
|
|
59
59
|
(base.keys | target.keys).each do |key|
|
60
|
-
|
61
|
-
case key
|
62
|
-
when :id
|
63
|
-
result[key] = [base[key], target[key]].compact.join('_')
|
64
|
-
when :class
|
65
|
-
result[key] = [base[key], target[key]].flatten.compact.map(&:to_s).sort.uniq.join(' ')
|
66
|
-
end
|
67
|
-
else
|
68
|
-
result[key] = base[key].nil? ? target[key] : base[key]
|
69
|
-
end
|
60
|
+
result[key] = merge_attribute_value(base, target, key)
|
70
61
|
end
|
71
62
|
result
|
72
63
|
end
|
64
|
+
|
65
|
+
def merge_attribute_value(base, target, key)
|
66
|
+
return target[key] unless base[key]
|
67
|
+
return base[key] unless target[key]
|
68
|
+
|
69
|
+
values = [base[key], target[key]].flatten.compact
|
70
|
+
case key
|
71
|
+
when :id
|
72
|
+
values.join('_')
|
73
|
+
when :class
|
74
|
+
values.map(&:to_s).sort.uniq.join(' ')
|
75
|
+
end
|
76
|
+
end
|
73
77
|
end
|
74
78
|
end
|
@@ -31,6 +31,27 @@ module Hamlit
|
|
31
31
|
itemscope allowfullscreen default inert sortable
|
32
32
|
truespeed typemustmatch data].freeze
|
33
33
|
|
34
|
+
DEFAULT_COUNTS = {
|
35
|
+
brace: -1,
|
36
|
+
emb: 0,
|
37
|
+
paren: 0,
|
38
|
+
bracket: 0,
|
39
|
+
}.freeze
|
40
|
+
|
41
|
+
OPEN_TOKEN_TYPES = {
|
42
|
+
on_lbrace: :brace,
|
43
|
+
on_embexpr_beg: :emb,
|
44
|
+
on_lparen: :paren,
|
45
|
+
on_lbracket: :bracket,
|
46
|
+
}.freeze
|
47
|
+
|
48
|
+
CLOSE_TOKEN_TYPES = {
|
49
|
+
on_rbrace: :brace,
|
50
|
+
on_embexpr_end: :emb,
|
51
|
+
on_rparen: :paren,
|
52
|
+
on_rbracket: :bracket,
|
53
|
+
}.freeze
|
54
|
+
|
34
55
|
def compile_old_attribute(str)
|
35
56
|
raise RuntimeBuild unless valid_hash?(str)
|
36
57
|
|
@@ -99,16 +120,9 @@ module Hamlit
|
|
99
120
|
attributes = {}
|
100
121
|
|
101
122
|
split_hash(str).each do |attr|
|
102
|
-
tokens = Ripper.lex("{#{attr}")
|
103
|
-
tokens = tokens.drop(1)
|
104
|
-
|
123
|
+
tokens = Ripper.lex("{#{attr}").drop(1)
|
105
124
|
key = read_hash_key!(tokens)
|
106
|
-
val = tokens
|
107
|
-
|
108
|
-
skip_tokens!(tokens, :on_sp)
|
109
|
-
if type_of(tokens.first) == :on_lbrace
|
110
|
-
val = parse_old_attributes(val)
|
111
|
-
end
|
125
|
+
val = read_hash_value!(tokens)
|
112
126
|
|
113
127
|
attributes[key] = val if key
|
114
128
|
end
|
@@ -116,6 +130,16 @@ module Hamlit
|
|
116
130
|
attributes
|
117
131
|
end
|
118
132
|
|
133
|
+
def read_hash_value!(tokens)
|
134
|
+
skip_tokens!(tokens, :on_sp)
|
135
|
+
val = tokens.map(&:last).join.strip
|
136
|
+
|
137
|
+
if type_of(tokens.first) == :on_lbrace
|
138
|
+
val = parse_old_attributes(val)
|
139
|
+
end
|
140
|
+
val
|
141
|
+
end
|
142
|
+
|
119
143
|
def read_hash_key!(tokens)
|
120
144
|
skip_tokens!(tokens, :on_sp)
|
121
145
|
|
@@ -131,17 +155,21 @@ module Hamlit
|
|
131
155
|
end
|
132
156
|
assert_rocket!(tokens)
|
133
157
|
when :on_tstring_beg
|
134
|
-
str = read_string!(tokens)
|
135
|
-
assert_rocket!(tokens)
|
158
|
+
str = read_string!(tokens, assert_rocket: true)
|
136
159
|
end
|
137
160
|
str
|
138
161
|
end
|
139
162
|
|
140
|
-
def read_string!(tokens)
|
163
|
+
def read_string!(tokens, assert_rocket: false)
|
141
164
|
_, type, str = tokens.shift
|
142
165
|
return '' if type == :on_tstring_end
|
143
166
|
|
144
|
-
|
167
|
+
next_token = tokens.shift
|
168
|
+
return str if RUBY_VERSION >= "2.2.0" && type_of(next_token) == :on_label_end
|
169
|
+
|
170
|
+
raise SyntaxError if type_of(next_token) != :on_tstring_end
|
171
|
+
assert_rocket!(tokens) if assert_rocket
|
172
|
+
|
145
173
|
str
|
146
174
|
end
|
147
175
|
|
@@ -168,40 +196,26 @@ module Hamlit
|
|
168
196
|
|
169
197
|
def reject_nested_columns(str, columns)
|
170
198
|
result = []
|
171
|
-
|
172
|
-
count = {
|
173
|
-
emb: 0,
|
174
|
-
paren: 0,
|
175
|
-
bracket: 0,
|
176
|
-
}
|
199
|
+
counts = DEFAULT_COUNTS.dup
|
177
200
|
|
178
201
|
Ripper.lex(str).each do |(_, col), type, _|
|
179
|
-
if columns.include?(col) &&
|
202
|
+
if columns.include?(col) && counts.values.all?(&:zero?)
|
180
203
|
result << col
|
181
204
|
end
|
182
|
-
|
183
|
-
case type
|
184
|
-
when :on_lbrace
|
185
|
-
open_count += 1
|
186
|
-
when :on_rbrace
|
187
|
-
open_count -= 1
|
188
|
-
when :on_embexpr_beg
|
189
|
-
count[:emb] += 1
|
190
|
-
when :on_embexpr_end
|
191
|
-
count[:emb] -= 1
|
192
|
-
when :on_lparen
|
193
|
-
count[:paren] += 1
|
194
|
-
when :on_rparen
|
195
|
-
count[:paren] -= 1
|
196
|
-
when :on_lbracket
|
197
|
-
count[:bracket] += 1
|
198
|
-
when :on_rbracket
|
199
|
-
count[:bracket] -= 1
|
200
|
-
end
|
205
|
+
update_open_counts(counts, type)
|
201
206
|
end
|
202
207
|
result
|
203
208
|
end
|
204
209
|
|
210
|
+
def update_open_counts(counts, type)
|
211
|
+
case
|
212
|
+
when OPEN_TOKEN_TYPES[type]
|
213
|
+
counts[OPEN_TOKEN_TYPES[type]] += 1
|
214
|
+
when CLOSE_TOKEN_TYPES[type]
|
215
|
+
counts[CLOSE_TOKEN_TYPES[type]] -= 1
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
205
219
|
class HashParser < Ripper
|
206
220
|
attr_reader :columns
|
207
221
|
|
@@ -2,7 +2,13 @@ module Hamlit
|
|
2
2
|
module Concerns
|
3
3
|
module StringInterpolation
|
4
4
|
def string_literal(str)
|
5
|
-
|
5
|
+
res = ''
|
6
|
+
rest = handle_interpolation(str.inspect) do |scan|
|
7
|
+
escapes = (scan[2].size - 1) / 2
|
8
|
+
res << scan.matched[0...-3 - escapes]
|
9
|
+
res << (escapes.odd? ? '#{' : unescape_interpolation(scan))
|
10
|
+
end
|
11
|
+
res + rest
|
6
12
|
end
|
7
13
|
|
8
14
|
def contains_interpolation?(str)
|
@@ -11,19 +17,9 @@ module Hamlit
|
|
11
17
|
|
12
18
|
private
|
13
19
|
|
14
|
-
def unescape_interpolation(
|
15
|
-
|
16
|
-
|
17
|
-
escapes = (scan[2].size - 1) / 2
|
18
|
-
res << scan.matched[0...-3 - escapes]
|
19
|
-
if escapes % 2 == 1
|
20
|
-
res << '#{'
|
21
|
-
else
|
22
|
-
content = eval('"' + balance(scan, ?{, ?}, 1)[0][0...-1] + '"')
|
23
|
-
res << '#{' + content + '}'
|
24
|
-
end
|
25
|
-
end
|
26
|
-
res + rest
|
20
|
+
def unescape_interpolation(scan)
|
21
|
+
content = eval('"' + balance(scan, ?{, ?}, 1)[0][0...-1] + '"')
|
22
|
+
'#{' + content + '}'
|
27
23
|
end
|
28
24
|
|
29
25
|
def handle_interpolation(str)
|
@@ -34,15 +30,19 @@ module Hamlit
|
|
34
30
|
|
35
31
|
def balance(scanner, start, finish, count = 0)
|
36
32
|
str = ''
|
37
|
-
|
38
|
-
regexp = Regexp.new("(.*?)[\\#{start.chr}\\#{finish.chr}]", Regexp::MULTILINE)
|
39
|
-
while scanner.scan(regexp)
|
33
|
+
while balanced_scan(scanner, start, finish)
|
40
34
|
str << scanner.matched
|
41
35
|
count += 1 if scanner.matched[-1] == start
|
42
36
|
count -= 1 if scanner.matched[-1] == finish
|
43
37
|
return [str.strip, scanner.rest] if count == 0
|
44
38
|
end
|
45
39
|
end
|
40
|
+
|
41
|
+
def balanced_scan(scanner, start, finish)
|
42
|
+
regexp = Regexp.new("(.*?)[\\#{start.chr}\\#{finish.chr}]", Regexp::MULTILINE)
|
43
|
+
scanner = StringScanner.new(scanner) unless scanner.is_a?(StringScanner)
|
44
|
+
scanner.scan(regexp)
|
45
|
+
end
|
46
46
|
end
|
47
47
|
end
|
48
48
|
end
|
data/lib/hamlit/filters/base.rb
CHANGED
@@ -39,6 +39,31 @@ module Hamlit
|
|
39
39
|
end
|
40
40
|
lines
|
41
41
|
end
|
42
|
+
|
43
|
+
def compile_html(tag, lines)
|
44
|
+
ast = [:haml, :text, compile_lines(lines, indent_width: 2), false]
|
45
|
+
ast = [:multi, [:static, "\n"], ast]
|
46
|
+
ast = [:html, :tag, tag, [:html, :attrs], ast]
|
47
|
+
ast
|
48
|
+
end
|
49
|
+
|
50
|
+
def compile_xhtml(tag, type, lines)
|
51
|
+
attr = [:html, :attr, 'type', [:static, type]]
|
52
|
+
attrs = [:html, :attrs, attr]
|
53
|
+
|
54
|
+
content = [:haml, :text, compile_lines(lines, indent_width: 4)]
|
55
|
+
multi = [:multi, [:static, "\n"], *cdata_for(type, content)]
|
56
|
+
[:html, :tag, tag, attrs, multi]
|
57
|
+
end
|
58
|
+
|
59
|
+
def cdata_for(type, ast)
|
60
|
+
case type
|
61
|
+
when 'text/javascript'
|
62
|
+
[[:static, " //<![CDATA[\n"], ast, [:static, " //]]>\n"]]
|
63
|
+
when 'text/css'
|
64
|
+
[[:static, " /*<![CDATA[*/\n"], ast, [:static, " /*]]>*/\n"]]
|
65
|
+
end
|
66
|
+
end
|
42
67
|
end
|
43
68
|
end
|
44
69
|
end
|
data/lib/hamlit/filters/css.rb
CHANGED
@@ -4,30 +4,11 @@ module Hamlit
|
|
4
4
|
module Filters
|
5
5
|
class Css < Base
|
6
6
|
def compile(lines)
|
7
|
-
|
7
|
+
if options[:format] == :xhtml
|
8
|
+
return compile_xhtml('style', 'text/css', lines)
|
9
|
+
end
|
8
10
|
|
9
|
-
compile_html(lines)
|
10
|
-
end
|
11
|
-
|
12
|
-
private
|
13
|
-
|
14
|
-
def compile_html(lines)
|
15
|
-
ast = [:haml, :text, compile_lines(lines, indent_width: 2), false]
|
16
|
-
ast = [:multi, [:static, "\n"], ast]
|
17
|
-
ast = [:html, :tag, 'style', [:html, :attrs], ast]
|
18
|
-
ast
|
19
|
-
end
|
20
|
-
|
21
|
-
def compile_xhtml(lines)
|
22
|
-
attr = [:html, :attr, 'type', [:static, 'text/css']]
|
23
|
-
attrs = [:html, :attrs, attr]
|
24
|
-
|
25
|
-
multi = [:multi, [:static, "\n"]]
|
26
|
-
multi << [:static, " /*<![CDATA[*/\n"]
|
27
|
-
multi << [:haml, :text, compile_lines(lines, indent_width: 4)]
|
28
|
-
multi << [:static, " /*]]>*/\n"]
|
29
|
-
|
30
|
-
[:html, :tag, 'style', attrs, multi]
|
11
|
+
compile_html('style', lines)
|
31
12
|
end
|
32
13
|
end
|
33
14
|
end
|
@@ -4,30 +4,11 @@ module Hamlit
|
|
4
4
|
module Filters
|
5
5
|
class Javascript < Base
|
6
6
|
def compile(lines)
|
7
|
-
|
7
|
+
if options[:format] == :xhtml
|
8
|
+
return compile_xhtml('script', 'text/javascript', lines)
|
9
|
+
end
|
8
10
|
|
9
|
-
compile_html(lines)
|
10
|
-
end
|
11
|
-
|
12
|
-
private
|
13
|
-
|
14
|
-
def compile_html(lines)
|
15
|
-
ast = [:haml, :text, compile_lines(lines, indent_width: 2), false]
|
16
|
-
ast = [:multi, [:static, "\n"], ast]
|
17
|
-
ast = [:html, :tag, 'script', [:html, :attrs], ast]
|
18
|
-
ast
|
19
|
-
end
|
20
|
-
|
21
|
-
def compile_xhtml(lines)
|
22
|
-
attr = [:html, :attr, 'type', [:static, 'text/javascript']]
|
23
|
-
attrs = [:html, :attrs, attr]
|
24
|
-
|
25
|
-
multi = [:multi, [:static, "\n"]]
|
26
|
-
multi << [:static, " //<![CDATA[\n"]
|
27
|
-
multi << [:haml, :text, compile_lines(lines, indent_width: 4)]
|
28
|
-
multi << [:static, " //]]>\n"]
|
29
|
-
|
30
|
-
[:html, :tag, 'script', attrs, multi]
|
11
|
+
compile_html('script', lines)
|
31
12
|
end
|
32
13
|
end
|
33
14
|
end
|
data/lib/hamlit/version.rb
CHANGED
@@ -371,5 +371,26 @@ describe Hamlit::Engine do
|
|
371
371
|
HTML
|
372
372
|
end
|
373
373
|
end
|
374
|
+
|
375
|
+
if RUBY_VERSION >= "2.2.0"
|
376
|
+
describe 'Ruby 2.2 syntax' do
|
377
|
+
it 'renders static attributes' do
|
378
|
+
assert_render(<<-HAML, <<-HTML)
|
379
|
+
%meta{ content: 'IE=edge', 'http-equiv': 'X-UA-Compatible' }
|
380
|
+
HAML
|
381
|
+
<meta content='IE=edge' http-equiv='X-UA-Compatible'>
|
382
|
+
HTML
|
383
|
+
end
|
384
|
+
|
385
|
+
it 'renders dynamic attributes' do
|
386
|
+
assert_render(<<-HAML, <<-HTML)
|
387
|
+
- hash = { content: 'IE=edge' }
|
388
|
+
%meta{ hash, 'http-equiv': 'X-UA-Compatible' }
|
389
|
+
HAML
|
390
|
+
<meta content='IE=edge' http-equiv='X-UA-Compatible'>
|
391
|
+
HTML
|
392
|
+
end
|
393
|
+
end
|
394
|
+
end
|
374
395
|
end
|
375
396
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hamlit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Takashi Kokubun
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-07-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: escape_utils
|
@@ -626,4 +626,3 @@ test_files:
|
|
626
626
|
- spec/spec_helper/document_generator.rb
|
627
627
|
- spec/spec_helper/render_helper.rb
|
628
628
|
- spec/spec_helper/test_case.rb
|
629
|
-
has_rdoc:
|