braai 1.3.0 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- braai (1.3.0)
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
@@ -18,5 +18,6 @@ Gem::Specification.new do |gem|
18
18
  gem.require_paths = ["lib"]
19
19
 
20
20
  gem.add_dependency("activesupport")
21
+ gem.add_development_dependency("mocha")
21
22
 
22
23
  end
@@ -2,6 +2,7 @@ require 'logger'
2
2
  require "active_support/core_ext/hash/indifferent_access"
3
3
  require "braai/version"
4
4
  require "braai/configuration"
5
+ require "braai/handlers"
5
6
  require "braai/matchers"
6
7
  require "braai/template"
7
8
  require "braai/context"
@@ -0,0 +1,3 @@
1
+ require 'braai/handlers/base'
2
+ require 'braai/handlers/default'
3
+ require 'braai/handlers/iteration'
@@ -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
@@ -22,40 +22,8 @@ module Braai::Matchers
22
22
  end
23
23
 
24
24
  def set_defaults
25
- @matchers ||= {}
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
@@ -1,3 +1,3 @@
1
1
  module Braai
2
- VERSION = "1.3.0"
2
+ VERSION = "1.4.0"
3
3
  end
@@ -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
@@ -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(3)
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(4)
62
+ matchers.size.must_equal(3)
63
63
  end
64
64
 
65
65
  end
@@ -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
- end
79
-
80
- end
81
-
82
- describe "for loops" do
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
@@ -3,7 +3,8 @@ require 'bundler/setup'
3
3
  require 'braai' # and any other gems you need
4
4
 
5
5
  require 'minitest/autorun'
6
- require "minitest-colorize"
6
+ require 'minitest-colorize'
7
+ require 'mocha'
7
8
 
8
9
  Braai.config.logger = Logger.new(StringIO.new)
9
10
 
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.3.0
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-28 00:00:00.000000000 Z
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