braai 1.3.0 → 1.4.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/Gemfile.lock +5 -1
- data/braai.gemspec +1 -0
- data/lib/braai.rb +1 -0
- data/lib/braai/handlers.rb +3 -0
- data/lib/braai/handlers/base.rb +36 -0
- data/lib/braai/handlers/default.rb +21 -0
- data/lib/braai/handlers/iteration.rb +11 -0
- data/lib/braai/matchers.rb +2 -34
- data/lib/braai/version.rb +1 -1
- data/spec/braai/handlers/base_spec.rb +59 -0
- data/spec/braai/handlers/default_spec.rb +29 -0
- data/spec/braai/handlers/iteration_spec.rb +34 -0
- data/spec/braai/matchers_spec.rb +4 -4
- data/spec/braai/template_spec.rb +10 -58
- data/spec/spec_helper.rb +2 -1
- metadata +28 -2
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
braai (1.
|
4
|
+
braai (1.4.0)
|
5
5
|
activesupport
|
6
6
|
|
7
7
|
GEM
|
@@ -11,9 +11,12 @@ GEM
|
|
11
11
|
i18n (~> 0.6)
|
12
12
|
multi_json (~> 1.0)
|
13
13
|
i18n (0.6.1)
|
14
|
+
metaclass (0.0.1)
|
14
15
|
minitest (2.12.1)
|
15
16
|
minitest-colorize (0.0.4)
|
16
17
|
minitest (~> 2.0)
|
18
|
+
mocha (0.12.4)
|
19
|
+
metaclass (~> 0.0.1)
|
17
20
|
multi_json (1.5.0)
|
18
21
|
|
19
22
|
PLATFORMS
|
@@ -22,3 +25,4 @@ PLATFORMS
|
|
22
25
|
DEPENDENCIES
|
23
26
|
braai!
|
24
27
|
minitest-colorize
|
28
|
+
mocha
|
data/braai.gemspec
CHANGED
data/lib/braai.rb
CHANGED
@@ -0,0 +1,36 @@
|
|
1
|
+
module Braai::Handlers
|
2
|
+
class Base
|
3
|
+
attr_accessor :template, :key, :matches
|
4
|
+
|
5
|
+
def initialize(template, key, matches)
|
6
|
+
@template = template
|
7
|
+
@key = key
|
8
|
+
@matches = matches
|
9
|
+
end
|
10
|
+
|
11
|
+
class << self
|
12
|
+
|
13
|
+
def call(template, key, matches)
|
14
|
+
handler = self.new(template, key, matches)
|
15
|
+
handler.safe_perform
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
def safe_perform
|
21
|
+
begin
|
22
|
+
perform
|
23
|
+
rescue => e
|
24
|
+
rescue_from_error(e)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def perform
|
29
|
+
template
|
30
|
+
end
|
31
|
+
|
32
|
+
def rescue_from_error(e)
|
33
|
+
template
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Braai::Handlers
|
2
|
+
class Default < Base
|
3
|
+
def perform
|
4
|
+
chain = matches[1].split('.')
|
5
|
+
value = template.attributes[chain.shift]
|
6
|
+
return nil unless value
|
7
|
+
|
8
|
+
chain.each do |a|
|
9
|
+
if value.respond_to?(a.to_sym)
|
10
|
+
value = value.send(a)
|
11
|
+
elsif value.is_a?(Hash)
|
12
|
+
value = value[a.to_sym] || value[a.to_s]
|
13
|
+
else
|
14
|
+
return nil
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
value
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Braai::Handlers
|
2
|
+
class Iteration < Base
|
3
|
+
def perform
|
4
|
+
res = []
|
5
|
+
template.attributes[matches[2]].each do |val|
|
6
|
+
res << Braai::Context.new(matches[3], template.matchers, template.attributes.merge(matches[1] => val)).render
|
7
|
+
end
|
8
|
+
res.join("\n")
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
data/lib/braai/matchers.rb
CHANGED
@@ -22,40 +22,8 @@ module Braai::Matchers
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def set_defaults
|
25
|
-
|
26
|
-
|
27
|
-
@matchers[/({{\s*for (\w+) in (\w+)\s*}}(.+?){{\s*\/for\s*}})/im] = ->(template, key, matches) {
|
28
|
-
res = []
|
29
|
-
template.attributes[matches[2]].each do |val|
|
30
|
-
res << Braai::Context.new(matches[3], template.matchers, template.attributes.merge(matches[1] => val)).render
|
31
|
-
end
|
32
|
-
res.join("\n")
|
33
|
-
}
|
34
|
-
|
35
|
-
@matchers[/({{\s*([\w\.]+)\s*}})/i] = ->(template, key, matches) {
|
36
|
-
chain = matches[1].split('.')
|
37
|
-
value = template.attributes[chain.shift]
|
38
|
-
return nil unless value
|
39
|
-
|
40
|
-
chain.each do |a|
|
41
|
-
if value.respond_to?(a.to_sym)
|
42
|
-
value = value.send(a)
|
43
|
-
elsif value.is_a?(Hash)
|
44
|
-
value = value[a.to_sym] || value[a.to_s]
|
45
|
-
else
|
46
|
-
return nil
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
value
|
51
|
-
}
|
52
|
-
|
53
|
-
@matchers[/({{\s*([\w]+)\s*}})/i] = ->(template, key, matches) {
|
54
|
-
attr = template.attributes[matches.last]
|
55
|
-
attr ? attr.to_s : nil
|
56
|
-
}
|
57
|
-
|
58
|
-
@matchers
|
25
|
+
map(/({{\s*for (\w+) in (\w+)\s*}}(.+?){{\s*\/for\s*}})/im, Braai::Handlers::Iteration)
|
26
|
+
map(/({{\s*([\w\.]+)\s*}})/i, Braai::Handlers::Default)
|
59
27
|
end
|
60
28
|
|
61
29
|
end
|
data/lib/braai/version.rb
CHANGED
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'ostruct'
|
3
|
+
|
4
|
+
describe Braai::Handlers::Base do
|
5
|
+
include Mocha::Integration::MiniTest
|
6
|
+
include Braai::Matchers
|
7
|
+
|
8
|
+
let(:person) { OpenStruct.new(name: "My Name", title: "Director") }
|
9
|
+
let(:template) { "Hello {{ person.name }}" }
|
10
|
+
let(:key) { "{{ person.name }}" }
|
11
|
+
let(:matches) { [ "{{ person.name }}", "name" ] }
|
12
|
+
let(:handler) { Braai::Handlers::Base.new(template, key, matches) }
|
13
|
+
|
14
|
+
describe '.call' do
|
15
|
+
|
16
|
+
it 'condition' do
|
17
|
+
Braai::Handlers::Base.any_instance.expects(:safe_perform)
|
18
|
+
Braai::Handlers::Base.call(template, key, matches)
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
describe '#initialize' do
|
24
|
+
|
25
|
+
it 'creates an object with instance variables' do
|
26
|
+
handler = Braai::Handlers::Base.new(template, key, matches)
|
27
|
+
handler.template.must_equal(template)
|
28
|
+
handler.key.must_equal(key)
|
29
|
+
handler.matches.must_equal(matches)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '#perform' do
|
34
|
+
|
35
|
+
it 'returns the original template by default' do
|
36
|
+
handler.perform.must_equal("Hello {{ person.name }}")
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe '#safe_perform' do
|
41
|
+
|
42
|
+
it 'calls perform on the handler' do
|
43
|
+
handler.expects(:perform)
|
44
|
+
handler.safe_perform
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'should receive rescue_from_error when needed' do
|
48
|
+
handler.stubs(:perform).raises(ArgumentError)
|
49
|
+
handler.safe_perform.must_equal('Hello {{ person.name }}')
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe '#rescue_from_error' do
|
54
|
+
|
55
|
+
it 'call the class method of the same name' do
|
56
|
+
handler.rescue_from_error(ArgumentError).must_equal('Hello {{ person.name }}')
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Braai::Handlers::Default do
|
4
|
+
include Mocha::Integration::MiniTest
|
5
|
+
include Braai::Matchers
|
6
|
+
|
7
|
+
let(:template) { "{{ greet }} {{ name.upcase }}" }
|
8
|
+
let(:adv_template) { "{{ greet }} my name is {{ name.full_name.upcase }}" }
|
9
|
+
|
10
|
+
it "uses the default matcher to render" do
|
11
|
+
res = Braai::Template.new(template).render(greet: "Hi", name: "mark")
|
12
|
+
res.must_equal("Hi MARK")
|
13
|
+
end
|
14
|
+
|
15
|
+
it "handles the attribute not being there" do
|
16
|
+
res = Braai::Template.new(template).render(greet: "Hi")
|
17
|
+
res.must_equal("Hi {{ name.upcase }}")
|
18
|
+
end
|
19
|
+
|
20
|
+
it "handles deeply nested attributes" do
|
21
|
+
res = Braai::Template.new(adv_template).render(greet: "Hello", name: OpenStruct.new(full_name: 'inigo montoya'))
|
22
|
+
res.must_equal("Hello my name is INIGO MONTOYA")
|
23
|
+
end
|
24
|
+
|
25
|
+
it "handles nested attribute hashes" do
|
26
|
+
res = Braai::Template.new(adv_template).render(greet: "Hello", name: { full_name: 'inigo montoya' })
|
27
|
+
res.must_equal("Hello my name is INIGO MONTOYA")
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Braai::Handlers::Iteration do
|
4
|
+
include Mocha::Integration::MiniTest
|
5
|
+
include Braai::Matchers
|
6
|
+
|
7
|
+
let(:template) do
|
8
|
+
<<-EOF
|
9
|
+
<h1>{{ greet }}</h1>
|
10
|
+
<ul>
|
11
|
+
{{ for product in products }}
|
12
|
+
<li>{{ product }}</li>
|
13
|
+
{{ /for }}
|
14
|
+
</ul>
|
15
|
+
<div>
|
16
|
+
{{ for food in foods }}
|
17
|
+
<p>{{ food }}</p>
|
18
|
+
{{ /for }}
|
19
|
+
</div>
|
20
|
+
<h2>{{greet.upcase}}</h2>
|
21
|
+
EOF
|
22
|
+
end
|
23
|
+
|
24
|
+
it "renders the loop" do
|
25
|
+
res = Braai::Template.new(template).render(greet: "mark", products: %w{car boat truck}, foods: %w{apple orange})
|
26
|
+
res.must_match("<h1>mark</h1>")
|
27
|
+
res.must_match("<li>car</li>")
|
28
|
+
res.must_match("<li>boat</li>")
|
29
|
+
res.must_match("<li>truck</li>")
|
30
|
+
res.must_match("<p>apple</p>")
|
31
|
+
res.must_match("<p>orange</p>")
|
32
|
+
res.must_match("<h2>MARK</h2>")
|
33
|
+
end
|
34
|
+
end
|
data/spec/braai/matchers_spec.rb
CHANGED
@@ -43,11 +43,11 @@ describe Braai::Matchers do
|
|
43
43
|
describe 'reset!' do
|
44
44
|
|
45
45
|
it "resets the matchers to their original state" do
|
46
|
-
matchers.size.must_equal(
|
46
|
+
matchers.size.must_equal(2)
|
47
47
|
map("foo") {}
|
48
|
-
matchers.size.must_equal(4)
|
49
|
-
reset!
|
50
48
|
matchers.size.must_equal(3)
|
49
|
+
reset!
|
50
|
+
matchers.size.must_equal(2)
|
51
51
|
end
|
52
52
|
|
53
53
|
end
|
@@ -59,7 +59,7 @@ describe Braai::Matchers do
|
|
59
59
|
map("foo") {}
|
60
60
|
matchers.size.must_equal(1)
|
61
61
|
set_defaults
|
62
|
-
matchers.size.must_equal(
|
62
|
+
matchers.size.must_equal(3)
|
63
63
|
end
|
64
64
|
|
65
65
|
end
|
data/spec/braai/template_spec.rb
CHANGED
@@ -38,6 +38,11 @@ describe Braai::Template do
|
|
38
38
|
Braai::Template.map(/{{ greetings }}/i, GreetHandler)
|
39
39
|
end
|
40
40
|
|
41
|
+
it "renders a template without matches" do
|
42
|
+
res = Braai::Template.new("Hi {{ greet }}").render()
|
43
|
+
res.must_equal("Hi {{ greet }}")
|
44
|
+
end
|
45
|
+
|
41
46
|
it "renders a simple template using a block" do
|
42
47
|
res = Braai::Template.new("{{ greet }}").render(greet: "Hi Mark")
|
43
48
|
res.must_equal("Hi Mark")
|
@@ -75,65 +80,12 @@ describe Braai::Template do
|
|
75
80
|
res.must_equal("<h1>greet</h1><h2>greetmark</h2>")
|
76
81
|
end
|
77
82
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
let(:template) do
|
85
|
-
<<-EOF
|
86
|
-
<h1>{{ greet }}</h1>
|
87
|
-
<ul>
|
88
|
-
{{ for product in products }}
|
89
|
-
<li>{{ product }}</li>
|
90
|
-
{{ /for }}
|
91
|
-
</ul>
|
92
|
-
<div>
|
93
|
-
{{ for food in foods }}
|
94
|
-
<p>{{ food }}</p>
|
95
|
-
{{ /for }}
|
96
|
-
</div>
|
97
|
-
<h2>{{greet.upcase}}</h2>
|
98
|
-
EOF
|
99
|
-
end
|
100
|
-
|
101
|
-
it "renders the loop" do
|
102
|
-
res = Braai::Template.new(template).render(greet: "mark", products: %w{car boat truck}, foods: %w{apple orange})
|
103
|
-
res.must_match("<h1>mark</h1>")
|
104
|
-
res.must_match("<li>car</li>")
|
105
|
-
res.must_match("<li>boat</li>")
|
106
|
-
res.must_match("<li>truck</li>")
|
107
|
-
res.must_match("<p>apple</p>")
|
108
|
-
res.must_match("<p>orange</p>")
|
109
|
-
res.must_match("<h2>MARK</h2>")
|
110
|
-
end
|
111
|
-
|
112
|
-
end
|
113
|
-
|
114
|
-
describe "default matcher" do
|
115
|
-
|
116
|
-
let(:template) { "{{ greet }} {{ name.upcase }}" }
|
117
|
-
let(:adv_template) { "{{ greet }} my name is {{ name.full_name.upcase }}" }
|
118
|
-
|
119
|
-
it "uses the default matcher to render" do
|
120
|
-
res = Braai::Template.new(template).render(greet: "Hi", name: "mark")
|
121
|
-
res.must_equal("Hi MARK")
|
122
|
-
end
|
123
|
-
|
124
|
-
it "handles the attribute not being there" do
|
125
|
-
res = Braai::Template.new(template).render(greet: "Hi")
|
126
|
-
res.must_equal("Hi {{ name.upcase }}")
|
127
|
-
end
|
128
|
-
|
129
|
-
it "handles deeply nested attributes" do
|
130
|
-
res = Braai::Template.new(adv_template).render(greet: "Hello", name: OpenStruct.new(full_name: 'inigo montoya'))
|
131
|
-
res.must_equal("Hello my name is INIGO MONTOYA")
|
132
|
-
end
|
83
|
+
it "matches only one" do
|
84
|
+
template = "<h1>{{ greet }}</h1><h2>{{ unmatched }}</h2>"
|
85
|
+
res = Braai::Template.new(template).render
|
86
|
+
res.must_equal("<h1>greet</h1><h2>{{ unmatched }}</h2>")
|
87
|
+
end
|
133
88
|
|
134
|
-
it "handles nested attribute hashes" do
|
135
|
-
res = Braai::Template.new(adv_template).render(greet: "Hello", name: { full_name: 'inigo montoya' })
|
136
|
-
res.must_equal("Hello my name is INIGO MONTOYA")
|
137
89
|
end
|
138
90
|
|
139
91
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: braai
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-01-
|
12
|
+
date: 2013-01-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -27,6 +27,22 @@ dependencies:
|
|
27
27
|
- - ! '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: mocha
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
30
46
|
description: Fully extensible templating system.
|
31
47
|
email:
|
32
48
|
- mark@markbates.com
|
@@ -44,10 +60,17 @@ files:
|
|
44
60
|
- lib/braai.rb
|
45
61
|
- lib/braai/configuration.rb
|
46
62
|
- lib/braai/context.rb
|
63
|
+
- lib/braai/handlers.rb
|
64
|
+
- lib/braai/handlers/base.rb
|
65
|
+
- lib/braai/handlers/default.rb
|
66
|
+
- lib/braai/handlers/iteration.rb
|
47
67
|
- lib/braai/matchers.rb
|
48
68
|
- lib/braai/template.rb
|
49
69
|
- lib/braai/version.rb
|
50
70
|
- spec/braai/context_spec.rb
|
71
|
+
- spec/braai/handlers/base_spec.rb
|
72
|
+
- spec/braai/handlers/default_spec.rb
|
73
|
+
- spec/braai/handlers/iteration_spec.rb
|
51
74
|
- spec/braai/matchers_spec.rb
|
52
75
|
- spec/braai/readme_spec.rb
|
53
76
|
- spec/braai/template_spec.rb
|
@@ -78,6 +101,9 @@ specification_version: 3
|
|
78
101
|
summary: Fully extensible templating system.
|
79
102
|
test_files:
|
80
103
|
- spec/braai/context_spec.rb
|
104
|
+
- spec/braai/handlers/base_spec.rb
|
105
|
+
- spec/braai/handlers/default_spec.rb
|
106
|
+
- spec/braai/handlers/iteration_spec.rb
|
81
107
|
- spec/braai/matchers_spec.rb
|
82
108
|
- spec/braai/readme_spec.rb
|
83
109
|
- spec/braai/template_spec.rb
|