temple 0.6.10 → 0.7.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +0 -2
- data/CHANGES +15 -0
- data/README.md +6 -6
- data/Rakefile +1 -1
- data/lib/temple.rb +5 -4
- data/lib/temple/engine.rb +1 -1
- data/lib/temple/erb/engine.rb +2 -2
- data/lib/temple/filters/encoding.rb +1 -1
- data/lib/temple/filters/eraser.rb +1 -1
- data/lib/temple/filters/escapable.rb +2 -2
- data/lib/temple/filters/remove_bom.rb +2 -9
- data/lib/temple/filters/static_freezer.rb +11 -0
- data/lib/temple/filters/validator.rb +1 -1
- data/lib/temple/generator.rb +4 -4
- data/lib/temple/generators/rails_output_buffer.rb +3 -3
- data/lib/temple/html/attribute_merger.rb +1 -1
- data/lib/temple/html/attribute_remover.rb +1 -1
- data/lib/temple/html/attribute_sorter.rb +1 -1
- data/lib/temple/html/fast.rb +42 -42
- data/lib/temple/html/pretty.rb +30 -39
- data/lib/temple/map.rb +105 -0
- data/lib/temple/mixins/engine_dsl.rb +11 -9
- data/lib/temple/mixins/options.rb +26 -24
- data/lib/temple/mixins/template.rb +3 -3
- data/lib/temple/templates/rails.rb +14 -37
- data/lib/temple/templates/tilt.rb +4 -4
- data/lib/temple/utils.rb +23 -26
- data/lib/temple/version.rb +1 -1
- data/temple.gemspec +2 -0
- data/test/filters/test_eraser.rb +4 -4
- data/test/filters/test_escapable.rb +7 -5
- data/test/filters/test_static_freezer.rb +25 -0
- data/test/html/test_attribute_sorter.rb +1 -1
- data/test/html/test_fast.rb +6 -6
- data/test/html/test_pretty.rb +2 -8
- data/test/test_engine.rb +1 -1
- data/test/test_erb.rb +2 -2
- data/test/test_filter.rb +2 -2
- data/test/test_generator.rb +4 -4
- data/test/test_map.rb +39 -0
- metadata +7 -5
- data/lib/temple/hash.rb +0 -105
- data/test/test_hash.rb +0 -39
@@ -32,14 +32,16 @@ describe Temple::Filters::Escapable do
|
|
32
32
|
end
|
33
33
|
|
34
34
|
it 'should have use_html_safe option' do
|
35
|
-
|
36
|
-
|
37
|
-
[:
|
38
|
-
|
35
|
+
with_html_safe do
|
36
|
+
filter = Temple::Filters::Escapable.new(use_html_safe: true)
|
37
|
+
filter.call([:escape, true,
|
38
|
+
[:static, Temple::HTML::SafeString.new("a < b")]
|
39
|
+
]).should.equal [:static, "a < b"]
|
40
|
+
end
|
39
41
|
end
|
40
42
|
|
41
43
|
it 'should support censoring' do
|
42
|
-
filter = Temple::Filters::Escapable.new(:
|
44
|
+
filter = Temple::Filters::Escapable.new(escape_code: '(%s).gsub("Temple sucks", "Temple rocks")')
|
43
45
|
filter.call([:escape, true,
|
44
46
|
[:static, "~~ Temple sucks ~~"]
|
45
47
|
]).should.equal [:static, "~~ Temple rocks ~~"]
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe Temple::Filters::StaticFreezer do
|
4
|
+
if RUBY_VERSION >= '2.1'
|
5
|
+
it 'should freeze static on new ruby' do
|
6
|
+
filter = Temple::Filters::StaticFreezer.new
|
7
|
+
filter.call([:static, 'hi']).should.equal [:dynamic, '"hi".freeze']
|
8
|
+
end
|
9
|
+
else
|
10
|
+
it 'should not freeze static on old ruby' do
|
11
|
+
filter = Temple::Filters::StaticFreezer.new
|
12
|
+
filter.call([:static, 'hi']).should.equal [:static, 'hi']
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should freeze static if free_static==true' do
|
17
|
+
filter = Temple::Filters::StaticFreezer.new(freeze_static: true)
|
18
|
+
filter.call([:static, 'hi']).should.equal [:dynamic, '"hi".freeze']
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should not freeze static if free_static==false' do
|
22
|
+
filter = Temple::Filters::StaticFreezer.new(freeze_static: false)
|
23
|
+
filter.call([:static, 'hi']).should.equal [:static, 'hi']
|
24
|
+
end
|
25
|
+
end
|
@@ -3,7 +3,7 @@ require 'helper'
|
|
3
3
|
describe Temple::HTML::AttributeSorter do
|
4
4
|
before do
|
5
5
|
@ordered = Temple::HTML::AttributeSorter.new
|
6
|
-
@unordered = Temple::HTML::AttributeSorter.new :
|
6
|
+
@unordered = Temple::HTML::AttributeSorter.new sort_attrs: false
|
7
7
|
end
|
8
8
|
|
9
9
|
it 'should sort html attributes by name by default, when :sort_attrs is true' do
|
data/test/html/test_fast.rb
CHANGED
@@ -21,15 +21,15 @@ describe Temple::HTML::Fast do
|
|
21
21
|
end
|
22
22
|
|
23
23
|
it 'should compile js wrapped in comments' do
|
24
|
-
Temple::HTML::Fast.new(:
|
25
|
-
Temple::HTML::Fast.new(:
|
26
|
-
Temple::HTML::Fast.new(:
|
27
|
-
Temple::HTML::Fast.new(:
|
24
|
+
Temple::HTML::Fast.new(js_wrapper: nil).call([:html, :js, [:static, 'test']]).should.equal [:static, "test"]
|
25
|
+
Temple::HTML::Fast.new(js_wrapper: :comment).call([:html, :js, [:static, 'test']]).should.equal [:multi, [:static, "<!--\n"], [:static, "test"], [:static, "\n//-->"]]
|
26
|
+
Temple::HTML::Fast.new(js_wrapper: :cdata).call([:html, :js, [:static, 'test']]).should.equal [:multi, [:static, "\n//<![CDATA[\n"], [:static, "test"], [:static, "\n//]]>\n"]]
|
27
|
+
Temple::HTML::Fast.new(js_wrapper: :both).call([:html, :js, [:static, 'test']]).should.equal [:multi, [:static, "<!--\n//<![CDATA[\n"], [:static, "test"], [:static, "\n//]]>\n//-->"]]
|
28
28
|
end
|
29
29
|
|
30
30
|
it 'should guess default js comment' do
|
31
|
-
Temple::HTML::Fast.new(:
|
32
|
-
Temple::HTML::Fast.new(:
|
31
|
+
Temple::HTML::Fast.new(js_wrapper: :guess, format: :xhtml).call([:html, :js, [:static, 'test']]).should.equal [:multi, [:static, "\n//<![CDATA[\n"], [:static, "test"], [:static, "\n//]]>\n"]]
|
32
|
+
Temple::HTML::Fast.new(js_wrapper: :guess, format: :html).call([:html, :js, [:static, 'test']]).should.equal [:multi, [:static, "<!--\n"], [:static, "test"], [:static, "\n//-->"]]
|
33
33
|
end
|
34
34
|
|
35
35
|
it 'should compile autoclosed html tag' do
|
data/test/html/test_pretty.rb
CHANGED
@@ -20,10 +20,7 @@ describe Temple::HTML::Pretty do
|
|
20
20
|
[:static, ">"],
|
21
21
|
[:multi,
|
22
22
|
[:static, "\n text"],
|
23
|
-
[:
|
24
|
-
[:code, "_temple_html_pretty2 = (code).to_s"],
|
25
|
-
[:code, "if _temple_html_pretty1 !~ _temple_html_pretty2; _temple_html_pretty2 = _temple_html_pretty2.gsub(\"\\n\", \"\\n \"); end"],
|
26
|
-
[:dynamic, "_temple_html_pretty2"]]],
|
23
|
+
[:dynamic, "::Temple::Utils.indent_dynamic((code), false, \"\\n \", _temple_html_pretty1)"]],
|
27
24
|
[:static, "\n </p>"]],
|
28
25
|
[:static, "\n</div>"]]]
|
29
26
|
end
|
@@ -52,10 +49,7 @@ describe Temple::HTML::Pretty do
|
|
52
49
|
[:dynamic, '"text<".html_safe']
|
53
50
|
).should.equal [:multi,
|
54
51
|
[:code, "_temple_html_pretty1 = /<code|<pre|<textarea/"],
|
55
|
-
[:
|
56
|
-
[:code, "_temple_html_pretty2 = (\"text<\".html_safe).to_s"],
|
57
|
-
[:code, "if _temple_html_pretty1 !~ _temple_html_pretty2; _temple_html_pretty3 = _temple_html_pretty2.html_safe?; _temple_html_pretty2 = _temple_html_pretty2.gsub(\"\\n\", \"\\n\"); _temple_html_pretty2 = _temple_html_pretty2.html_safe if _temple_html_pretty3; end"],
|
58
|
-
[:dynamic, "_temple_html_pretty2"]]]
|
52
|
+
[:dynamic, "::Temple::Utils.indent_dynamic((\"text<\".html_safe), nil, \"\\n\", _temple_html_pretty1)"]]
|
59
53
|
end
|
60
54
|
end
|
61
55
|
end
|
data/test/test_engine.rb
CHANGED
@@ -19,7 +19,7 @@ class TestEngine < Temple::Engine
|
|
19
19
|
end
|
20
20
|
use :MyFilter1, proc {|exp| exp }
|
21
21
|
use :MyFilter2, proc {|exp| exp }
|
22
|
-
use Temple::HTML::Pretty, :
|
22
|
+
use Temple::HTML::Pretty, pretty: true
|
23
23
|
filter :MultiFlattener
|
24
24
|
generator :ArrayBuffer
|
25
25
|
use :BeforeLast, Callable1.new
|
data/test/test_erb.rb
CHANGED
@@ -56,7 +56,7 @@ world}
|
|
56
56
|
<% end %>
|
57
57
|
}
|
58
58
|
|
59
|
-
erb(src, :
|
60
|
-
erb(src, :
|
59
|
+
erb(src, trim_mode: '>').should.equal ERB.new(src, nil, '>').result
|
60
|
+
erb(src, trim_mode: '<>').should.equal ERB.new(src, nil, '<>').result
|
61
61
|
end
|
62
62
|
end
|
data/test/test_filter.rb
CHANGED
@@ -13,8 +13,8 @@ describe Temple::Filter do
|
|
13
13
|
Temple::Filter.should.respond_to :default_options
|
14
14
|
Temple::Filter.should.respond_to :set_default_options
|
15
15
|
Temple::Filter.should.respond_to :define_options
|
16
|
-
Temple::Filter.new.options.should.be.instance_of Temple::
|
17
|
-
SimpleFilter.new(:
|
16
|
+
Temple::Filter.new.options.should.be.instance_of Temple::ImmutableMap
|
17
|
+
SimpleFilter.new(key: 3).options[:key].should.equal 3
|
18
18
|
end
|
19
19
|
|
20
20
|
it 'should implement call' do
|
data/test/test_generator.rb
CHANGED
@@ -32,7 +32,7 @@ describe Temple::Generator do
|
|
32
32
|
end
|
33
33
|
|
34
34
|
it 'should compile multi expression' do
|
35
|
-
gen = SimpleGenerator.new(:
|
35
|
+
gen = SimpleGenerator.new(buffer: "VAR")
|
36
36
|
gen.call([:multi,
|
37
37
|
[:static, "static"],
|
38
38
|
[:dynamic, "dynamic"],
|
@@ -41,14 +41,14 @@ describe Temple::Generator do
|
|
41
41
|
end
|
42
42
|
|
43
43
|
it 'should compile capture' do
|
44
|
-
gen = SimpleGenerator.new(:
|
44
|
+
gen = SimpleGenerator.new(buffer: "VAR", capture_generator: SimpleGenerator)
|
45
45
|
gen.call([:capture, "foo",
|
46
46
|
[:static, "test"]
|
47
47
|
]).should.equal 'VAR = BUFFER; foo = BUFFER; foo << (S:test); foo; VAR'
|
48
48
|
end
|
49
49
|
|
50
50
|
it 'should compile capture with multi' do
|
51
|
-
gen = SimpleGenerator.new(:
|
51
|
+
gen = SimpleGenerator.new(buffer: "VAR", capture_generator: SimpleGenerator)
|
52
52
|
gen.call([:multi,
|
53
53
|
[:static, "before"],
|
54
54
|
|
@@ -63,7 +63,7 @@ describe Temple::Generator do
|
|
63
63
|
end
|
64
64
|
|
65
65
|
it 'should compile newlines' do
|
66
|
-
gen = SimpleGenerator.new(:
|
66
|
+
gen = SimpleGenerator.new(buffer: "VAR")
|
67
67
|
gen.call([:multi,
|
68
68
|
[:static, "static"],
|
69
69
|
[:newline],
|
data/test/test_map.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe Temple::ImmutableMap do
|
4
|
+
it 'has read accessor' do
|
5
|
+
hash = Temple::ImmutableMap.new({a: 1},{b: 2, a: 3})
|
6
|
+
hash[:a].should.equal 1
|
7
|
+
hash[:b].should.equal 2
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'has include?' do
|
11
|
+
hash = Temple::ImmutableMap.new({a: 1},{b: 2, a: 3})
|
12
|
+
hash.should.include :a
|
13
|
+
hash.should.include :b
|
14
|
+
hash.should.not.include :c
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'has values' do
|
18
|
+
Temple::ImmutableMap.new({a: 1},{b: 2, a: 3}).values.sort.should.equal [1,2]
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'has keys' do
|
22
|
+
Temple::ImmutableMap.new({a: 1},{b: 2, a: 3}).keys.should.equal [:a,:b]
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'has to_a' do
|
26
|
+
Temple::ImmutableMap.new({a: 1},{b: 2, a: 3}).to_a.should.equal [[:a, 1], [:b, 2]]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe Temple::MutableMap do
|
31
|
+
it 'has write accessor' do
|
32
|
+
parent = {a: 1}
|
33
|
+
hash = Temple::MutableMap.new(parent)
|
34
|
+
hash[:a].should.equal 1
|
35
|
+
hash[:a] = 2
|
36
|
+
hash[:a].should.equal 2
|
37
|
+
parent[:a].should.equal 1
|
38
|
+
end
|
39
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: temple
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Magnus Holm
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-12-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: tilt
|
@@ -86,6 +86,7 @@ files:
|
|
86
86
|
- lib/temple/filters/escapable.rb
|
87
87
|
- lib/temple/filters/multi_flattener.rb
|
88
88
|
- lib/temple/filters/remove_bom.rb
|
89
|
+
- lib/temple/filters/static_freezer.rb
|
89
90
|
- lib/temple/filters/static_merger.rb
|
90
91
|
- lib/temple/filters/validator.rb
|
91
92
|
- lib/temple/generator.rb
|
@@ -95,7 +96,6 @@ files:
|
|
95
96
|
- lib/temple/generators/rails_output_buffer.rb
|
96
97
|
- lib/temple/generators/string_buffer.rb
|
97
98
|
- lib/temple/grammar.rb
|
98
|
-
- lib/temple/hash.rb
|
99
99
|
- lib/temple/html/attribute_merger.rb
|
100
100
|
- lib/temple/html/attribute_remover.rb
|
101
101
|
- lib/temple/html/attribute_sorter.rb
|
@@ -104,6 +104,7 @@ files:
|
|
104
104
|
- lib/temple/html/filter.rb
|
105
105
|
- lib/temple/html/pretty.rb
|
106
106
|
- lib/temple/html/safe.rb
|
107
|
+
- lib/temple/map.rb
|
107
108
|
- lib/temple/mixins/dispatcher.rb
|
108
109
|
- lib/temple/mixins/engine_dsl.rb
|
109
110
|
- lib/temple/mixins/grammar_dsl.rb
|
@@ -122,6 +123,7 @@ files:
|
|
122
123
|
- test/filters/test_eraser.rb
|
123
124
|
- test/filters/test_escapable.rb
|
124
125
|
- test/filters/test_multi_flattener.rb
|
126
|
+
- test/filters/test_static_freezer.rb
|
125
127
|
- test/filters/test_static_merger.rb
|
126
128
|
- test/helper.rb
|
127
129
|
- test/html/test_attribute_merger.rb
|
@@ -136,7 +138,7 @@ files:
|
|
136
138
|
- test/test_filter.rb
|
137
139
|
- test/test_generator.rb
|
138
140
|
- test/test_grammar.rb
|
139
|
-
- test/
|
141
|
+
- test/test_map.rb
|
140
142
|
- test/test_utils.rb
|
141
143
|
homepage: https://github.com/judofyr/temple
|
142
144
|
licenses:
|
@@ -150,7 +152,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
150
152
|
requirements:
|
151
153
|
- - ">="
|
152
154
|
- !ruby/object:Gem::Version
|
153
|
-
version:
|
155
|
+
version: 1.9.2
|
154
156
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
155
157
|
requirements:
|
156
158
|
- - ">="
|
data/lib/temple/hash.rb
DELETED
@@ -1,105 +0,0 @@
|
|
1
|
-
module Temple
|
2
|
-
# Immutable hash class which supports hash merging
|
3
|
-
# @api public
|
4
|
-
class ImmutableHash
|
5
|
-
include Enumerable
|
6
|
-
|
7
|
-
def initialize(*hash)
|
8
|
-
@hash = hash.compact
|
9
|
-
end
|
10
|
-
|
11
|
-
def include?(key)
|
12
|
-
@hash.any? {|h| h.include?(key) }
|
13
|
-
end
|
14
|
-
|
15
|
-
def [](key)
|
16
|
-
@hash.each {|h| return h[key] if h.include?(key) }
|
17
|
-
nil
|
18
|
-
end
|
19
|
-
|
20
|
-
def each
|
21
|
-
keys.each {|k| yield(k, self[k]) }
|
22
|
-
end
|
23
|
-
|
24
|
-
def keys
|
25
|
-
@hash.inject([]) {|keys, h| keys.concat(h.keys) }.uniq
|
26
|
-
end
|
27
|
-
|
28
|
-
def values
|
29
|
-
keys.map {|k| self[k] }
|
30
|
-
end
|
31
|
-
|
32
|
-
def to_hash
|
33
|
-
result = {}
|
34
|
-
each {|k, v| result[k] = v }
|
35
|
-
result
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
# Mutable hash class which supports hash merging
|
40
|
-
# @api public
|
41
|
-
class MutableHash < ImmutableHash
|
42
|
-
def initialize(*hash)
|
43
|
-
super({}, *hash)
|
44
|
-
end
|
45
|
-
|
46
|
-
def []=(key, value)
|
47
|
-
@hash.first[key] = value
|
48
|
-
end
|
49
|
-
|
50
|
-
def update(hash)
|
51
|
-
@hash.first.update(hash)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
class OptionHash < MutableHash
|
56
|
-
def initialize(*hash, &block)
|
57
|
-
super(*hash)
|
58
|
-
@handler = block
|
59
|
-
@valid = {}
|
60
|
-
@deprecated = {}
|
61
|
-
end
|
62
|
-
|
63
|
-
def []=(key, value)
|
64
|
-
validate_key!(key)
|
65
|
-
super
|
66
|
-
end
|
67
|
-
|
68
|
-
def update(hash)
|
69
|
-
validate_hash!(hash)
|
70
|
-
super
|
71
|
-
end
|
72
|
-
|
73
|
-
def valid_keys
|
74
|
-
(keys + @valid.keys +
|
75
|
-
@hash.map {|h| h.valid_keys if h.respond_to?(:valid_keys) }.compact.flatten).uniq
|
76
|
-
end
|
77
|
-
|
78
|
-
def add_valid_keys(*keys)
|
79
|
-
keys.flatten.each { |key| @valid[key] = true }
|
80
|
-
end
|
81
|
-
|
82
|
-
def add_deprecated_keys(*keys)
|
83
|
-
keys.flatten.each { |key| @valid[key] = @deprecated[key] = true }
|
84
|
-
end
|
85
|
-
|
86
|
-
def validate_hash!(hash)
|
87
|
-
hash.to_hash.keys.each {|key| validate_key!(key) }
|
88
|
-
end
|
89
|
-
|
90
|
-
def validate_key!(key)
|
91
|
-
@handler.call(self, key, true) if deprecated_key?(key)
|
92
|
-
@handler.call(self, key, false) unless valid_key?(key)
|
93
|
-
end
|
94
|
-
|
95
|
-
def deprecated_key?(key)
|
96
|
-
@deprecated.include?(key) ||
|
97
|
-
@hash.any? {|h| h.deprecated_key?(key) if h.respond_to?(:deprecated_key?) }
|
98
|
-
end
|
99
|
-
|
100
|
-
def valid_key?(key)
|
101
|
-
include?(key) || @valid.include?(key) ||
|
102
|
-
@hash.any? {|h| h.valid_key?(key) if h.respond_to?(:valid_key?) }
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|
data/test/test_hash.rb
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
|
3
|
-
describe Temple::ImmutableHash do
|
4
|
-
it 'has read accessor' do
|
5
|
-
hash = Temple::ImmutableHash.new({:a => 1},{:b => 2, :a => 3})
|
6
|
-
hash[:a].should.equal 1
|
7
|
-
hash[:b].should.equal 2
|
8
|
-
end
|
9
|
-
|
10
|
-
it 'has include?' do
|
11
|
-
hash = Temple::ImmutableHash.new({:a => 1},{:b => 2, :a => 3})
|
12
|
-
hash.should.include :a
|
13
|
-
hash.should.include :b
|
14
|
-
hash.should.not.include :c
|
15
|
-
end
|
16
|
-
|
17
|
-
it 'has values' do
|
18
|
-
Temple::ImmutableHash.new({:a => 1},{:b => 2, :a => 3}).values.sort.should.equal [1,2]
|
19
|
-
end
|
20
|
-
|
21
|
-
it 'has keys' do
|
22
|
-
Temple::ImmutableHash.new({:a => 1},{:b => 2, :a => 3}).keys.should.equal [:a,:b]
|
23
|
-
end
|
24
|
-
|
25
|
-
it 'has to_a' do
|
26
|
-
Temple::ImmutableHash.new({:a => 1},{:b => 2, :a => 3}).to_a.should.equal [[:a, 1], [:b, 2]]
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
describe Temple::MutableHash do
|
31
|
-
it 'has write accessor' do
|
32
|
-
parent = {:a => 1}
|
33
|
-
hash = Temple::MutableHash.new(parent)
|
34
|
-
hash[:a].should.equal 1
|
35
|
-
hash[:a] = 2
|
36
|
-
hash[:a].should.equal 2
|
37
|
-
parent[:a].should.equal 1
|
38
|
-
end
|
39
|
-
end
|