braai 1.6.1 → 1.6.2
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 +1 -1
- data/README.md +15 -2
- data/lib/braai.rb +1 -0
- data/lib/braai/handlers.rb +2 -1
- data/lib/braai/handlers/conditional.rb +14 -0
- data/lib/braai/handlers/default.rb +3 -24
- data/lib/braai/helpers.rb +30 -0
- data/lib/braai/matchers.rb +5 -3
- data/lib/braai/version.rb +1 -1
- data/spec/braai/handlers/conditional_spec.rb +60 -0
- data/spec/braai/matchers_spec.rb +4 -4
- data/spec/braai/readme_spec.rb +9 -1
- metadata +8 -4
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -57,9 +57,22 @@ response = Braai::Template.new(template).render(name: "mark")
|
|
57
57
|
response.must_equal "I'm MARK and Damn, I love BBQ!!"
|
58
58
|
```
|
59
59
|
|
60
|
+
### Conditional Logic
|
61
|
+
|
62
|
+
Braai supports conditional logic with simple if statements (no support for comparisons yet).
|
63
|
+
|
64
|
+
```ruby
|
65
|
+
template = '{{ product.name }}{{ if product.featured }}***{{ /if }}'
|
66
|
+
featured_product = OpenStruct.new(name: 'Special Product', featured: true)
|
67
|
+
regular_product = OpenStruct.new(name: 'Regular Product', featured: false)
|
68
|
+
|
69
|
+
Braai::Template.new(template).render(product: featured_product).must_equal("Special Product***")
|
70
|
+
Braai::Template.new(template).render(product: regular_product).must_equal("Regular Product")
|
71
|
+
```
|
72
|
+
|
60
73
|
### For Loops
|
61
74
|
|
62
|
-
Braai supports looping right out of the box.
|
75
|
+
Braai also supports looping right out of the box.
|
63
76
|
|
64
77
|
```ruby
|
65
78
|
template = <<-EOF
|
@@ -100,4 +113,4 @@ res.should match("<h2>MARK</h2>")
|
|
100
113
|
* Mark Bates
|
101
114
|
* Nick Plante
|
102
115
|
* Sam Beam
|
103
|
-
* Kevin Incorvia
|
116
|
+
* Kevin Incorvia
|
data/lib/braai.rb
CHANGED
data/lib/braai/handlers.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
require 'braai/handlers/base'
|
2
2
|
require 'braai/handlers/default'
|
3
3
|
require 'braai/handlers/iteration'
|
4
|
+
require 'braai/handlers/conditional'
|
4
5
|
|
5
6
|
module Braai
|
6
7
|
module Handlers
|
7
|
-
|
8
|
+
|
8
9
|
class << self
|
9
10
|
def rescue_from(klass, handler)
|
10
11
|
self.rescuers.unshift({klass: klass, handler: handler})
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Braai::Handlers
|
2
|
+
class Conditional < Base
|
3
|
+
include Braai::Helpers
|
4
|
+
|
5
|
+
def perform
|
6
|
+
res = resolve_variable_chain_value(matches[1])
|
7
|
+
if res && res != ""
|
8
|
+
Braai::Context.new(matches[2], template, template.attributes).render
|
9
|
+
else
|
10
|
+
""
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -1,30 +1,9 @@
|
|
1
1
|
module Braai::Handlers
|
2
2
|
class Default < Base
|
3
|
-
|
4
|
-
value = nil
|
5
|
-
chain = matches[1].split('.')
|
6
|
-
|
7
|
-
if template.attributes.has_key?(chain.first)
|
8
|
-
value = template.attributes[chain.shift] || ''
|
9
|
-
else
|
10
|
-
return nil unless value
|
11
|
-
end
|
3
|
+
include Braai::Helpers
|
12
4
|
|
13
|
-
|
14
|
-
|
15
|
-
value = value.send(a) || ''
|
16
|
-
elsif value.is_a?(Hash)
|
17
|
-
if value.has_key?(a.to_sym) || value.has_key?(a.to_s)
|
18
|
-
value = value[a.to_sym] || value[a.to_s] || ''
|
19
|
-
else
|
20
|
-
return nil
|
21
|
-
end
|
22
|
-
else
|
23
|
-
return nil
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
value
|
5
|
+
def perform
|
6
|
+
resolve_variable_chain_value(matches[1])
|
28
7
|
end
|
29
8
|
end
|
30
9
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Braai
|
2
|
+
module Helpers
|
3
|
+
def resolve_variable_chain_value(str)
|
4
|
+
value = nil
|
5
|
+
chain = str.split('.')
|
6
|
+
|
7
|
+
if template.attributes.has_key?(chain.first)
|
8
|
+
value = template.attributes[chain.shift] || ''
|
9
|
+
else
|
10
|
+
return nil unless value
|
11
|
+
end
|
12
|
+
|
13
|
+
chain.each do |a|
|
14
|
+
if value.respond_to?(a.to_sym)
|
15
|
+
value = value.send(a) || ''
|
16
|
+
elsif value.is_a?(Hash)
|
17
|
+
if value.has_key?(a.to_sym) || value.has_key?(a.to_s)
|
18
|
+
value = value[a.to_sym] || value[a.to_s] || ''
|
19
|
+
else
|
20
|
+
return nil
|
21
|
+
end
|
22
|
+
else
|
23
|
+
return nil
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
value
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/braai/matchers.rb
CHANGED
@@ -2,9 +2,10 @@ module Braai::Matchers
|
|
2
2
|
|
3
3
|
attr_accessor :fallback
|
4
4
|
|
5
|
-
IterationMatcher
|
6
|
-
|
7
|
-
|
5
|
+
IterationMatcher = /({{\s*for (\w+) in (\w+)\s*}}(.+?){{\s*\/for\s*}})/im
|
6
|
+
ConditionalMatcher = /({{\s*if\s*([\w\.]+)\s*}}(.*){{\s*\/if\s*}})/mi
|
7
|
+
DefaultMatcher = /({{\s*([\w\.]+)\s*}})/i
|
8
|
+
RegionMatcher = /({{\s*([\w]+)\s*}}(.*){{\s*\/([\w]+)\s*}})/mi
|
8
9
|
|
9
10
|
def matchers
|
10
11
|
@matchers ||= reset!
|
@@ -34,6 +35,7 @@ module Braai::Matchers
|
|
34
35
|
|
35
36
|
def set_defaults
|
36
37
|
map(IterationMatcher, Braai::Handlers::Iteration)
|
38
|
+
map(ConditionalMatcher, Braai::Handlers::Conditional)
|
37
39
|
map(DefaultMatcher, Braai::Handlers::Default)
|
38
40
|
end
|
39
41
|
|
data/lib/braai/version.rb
CHANGED
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Braai::Handlers::Conditional do
|
4
|
+
include Mocha::Integration::MiniTest
|
5
|
+
include Braai::Matchers
|
6
|
+
|
7
|
+
let(:template) do
|
8
|
+
<<-EOF
|
9
|
+
<ul>
|
10
|
+
{{ if product.active }}
|
11
|
+
<li>
|
12
|
+
<h1>{{ product.name }}</h1>
|
13
|
+
{{ if product.description }}<h2>{{ product.description }}</h2>{{ /if }}
|
14
|
+
</li>
|
15
|
+
{{ /if }}
|
16
|
+
</ul>
|
17
|
+
EOF
|
18
|
+
end
|
19
|
+
|
20
|
+
let(:inactive_product) do
|
21
|
+
OpenStruct.new(name: 'Inactive Thing', active: false, description: 'This is a thing.')
|
22
|
+
end
|
23
|
+
|
24
|
+
let(:active_product) do
|
25
|
+
OpenStruct.new(name: 'Active Thing', active: true, description: 'This is a thing.')
|
26
|
+
end
|
27
|
+
|
28
|
+
let(:missing_attribute_product) do
|
29
|
+
OpenStruct.new(name: 'No Description', active: true)
|
30
|
+
end
|
31
|
+
|
32
|
+
let(:empty_attribute_product) do
|
33
|
+
OpenStruct.new(name: 'Empty Description', active: true, description: '')
|
34
|
+
end
|
35
|
+
|
36
|
+
it "does not render conditional items that fail the test" do
|
37
|
+
res = Braai::Template.new(template).render(product: inactive_product)
|
38
|
+
res.gsub(/\s+/, '').must_match("<ul></ul>")
|
39
|
+
end
|
40
|
+
|
41
|
+
it "renders conditional items that pass the test" do
|
42
|
+
res = Braai::Template.new(template).render(product: active_product)
|
43
|
+
res.must_match(/Active Thing/)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "renders the conditional string if present" do
|
47
|
+
res = Braai::Template.new(template).render(product: active_product)
|
48
|
+
res.must_match(/This is a thing/)
|
49
|
+
end
|
50
|
+
|
51
|
+
it "does not render conditional string when the value is empty" do
|
52
|
+
res = Braai::Template.new(template).render(product: empty_attribute_product)
|
53
|
+
res.wont_match("h2")
|
54
|
+
end
|
55
|
+
|
56
|
+
it "does not render conditional string when the attribute is missing" do
|
57
|
+
res = Braai::Template.new(template).render(product: missing_attribute_product)
|
58
|
+
res.wont_match("h2")
|
59
|
+
end
|
60
|
+
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(2)
|
47
|
-
map("foo") {}
|
48
46
|
matchers.size.must_equal(3)
|
47
|
+
map("foo") {}
|
48
|
+
matchers.size.must_equal(4)
|
49
49
|
reset!
|
50
|
-
matchers.size.must_equal(
|
50
|
+
matchers.size.must_equal(3)
|
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(4)
|
63
63
|
end
|
64
64
|
|
65
65
|
end
|
data/spec/braai/readme_spec.rb
CHANGED
@@ -28,6 +28,14 @@ describe 'README' do
|
|
28
28
|
response.must_equal "I'm MARK and Damn, I love BBQ!!"
|
29
29
|
end
|
30
30
|
|
31
|
+
it "if statement example" do
|
32
|
+
template = '{{ product.name }}{{ if product.featured }}***{{ /if }}'
|
33
|
+
featured_product = OpenStruct.new(name: 'Special Product', featured: true)
|
34
|
+
regular_product = OpenStruct.new(name: 'Regular Product', featured: false)
|
35
|
+
Braai::Template.new(template).render(product: featured_product).must_equal("Special Product***")
|
36
|
+
Braai::Template.new(template).render(product: regular_product).must_equal("Regular Product")
|
37
|
+
end
|
38
|
+
|
31
39
|
it "for loop example" do
|
32
40
|
template = <<-EOF
|
33
41
|
<h1>{{ greet }}</h1>
|
@@ -54,4 +62,4 @@ EOF
|
|
54
62
|
res.must_match("<h2>MARK</h2>")
|
55
63
|
end
|
56
64
|
|
57
|
-
end
|
65
|
+
end
|
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.6.
|
4
|
+
version: 1.6.2
|
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-03-
|
12
|
+
date: 2013-03-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -62,13 +62,16 @@ files:
|
|
62
62
|
- lib/braai/context.rb
|
63
63
|
- lib/braai/handlers.rb
|
64
64
|
- lib/braai/handlers/base.rb
|
65
|
+
- lib/braai/handlers/conditional.rb
|
65
66
|
- lib/braai/handlers/default.rb
|
66
67
|
- lib/braai/handlers/iteration.rb
|
68
|
+
- lib/braai/helpers.rb
|
67
69
|
- lib/braai/matchers.rb
|
68
70
|
- lib/braai/template.rb
|
69
71
|
- lib/braai/version.rb
|
70
72
|
- spec/braai/context_spec.rb
|
71
73
|
- spec/braai/handlers/base_spec.rb
|
74
|
+
- spec/braai/handlers/conditional_spec.rb
|
72
75
|
- spec/braai/handlers/default_spec.rb
|
73
76
|
- spec/braai/handlers/iteration_spec.rb
|
74
77
|
- spec/braai/matchers_spec.rb
|
@@ -89,7 +92,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
89
92
|
version: '0'
|
90
93
|
segments:
|
91
94
|
- 0
|
92
|
-
hash: -
|
95
|
+
hash: -2452820398062054300
|
93
96
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
94
97
|
none: false
|
95
98
|
requirements:
|
@@ -98,7 +101,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
98
101
|
version: '0'
|
99
102
|
segments:
|
100
103
|
- 0
|
101
|
-
hash: -
|
104
|
+
hash: -2452820398062054300
|
102
105
|
requirements: []
|
103
106
|
rubyforge_project:
|
104
107
|
rubygems_version: 1.8.25
|
@@ -108,6 +111,7 @@ summary: Fully extensible templating system.
|
|
108
111
|
test_files:
|
109
112
|
- spec/braai/context_spec.rb
|
110
113
|
- spec/braai/handlers/base_spec.rb
|
114
|
+
- spec/braai/handlers/conditional_spec.rb
|
111
115
|
- spec/braai/handlers/default_spec.rb
|
112
116
|
- spec/braai/handlers/iteration_spec.rb
|
113
117
|
- spec/braai/matchers_spec.rb
|