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.
@@ -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