braai 1.5.0 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,23 +1,23 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- braai (1.5.0)
4
+ braai (1.6.0)
5
5
  activesupport
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- activesupport (3.2.11)
10
+ activesupport (3.2.12)
11
11
  i18n (~> 0.6)
12
12
  multi_json (~> 1.0)
13
- i18n (0.6.1)
13
+ i18n (0.6.4)
14
14
  metaclass (0.0.1)
15
15
  minitest (2.12.1)
16
16
  minitest-colorize (0.0.4)
17
17
  minitest (~> 2.0)
18
18
  mocha (0.12.4)
19
19
  metaclass (~> 0.0.1)
20
- multi_json (1.5.0)
20
+ multi_json (1.6.1)
21
21
 
22
22
  PLATFORMS
23
23
  ruby
data/lib/braai/context.rb CHANGED
@@ -1,32 +1,42 @@
1
1
  class Braai::Context
2
2
 
3
- attr_accessor :attributes
4
- attr_accessor :template
5
- attr_accessor :matchers
3
+ attr_accessor :attributes, :matchers, :fallback, :substrate
6
4
 
7
- def initialize(template, matchers, attributes = {})
5
+ def initialize(substrate, template, attributes = {})
8
6
  self.attributes = HashWithIndifferentAccess.new(attributes)
9
- self.template = template.dup
10
- self.matchers = matchers
7
+ self.substrate = substrate.dup
8
+ self.matchers = template.matchers
9
+ self.fallback = template.fallback
11
10
  end
12
11
 
13
12
  def render
14
13
  begin
14
+
15
15
  self.matchers.each do |regex, matcher|
16
- regex = Regexp.new(regex)
17
- matches = self.template.scan(regex)
18
- matches.each do |set|
19
- set = [set].flatten.map {|m| m.strip unless m.nil? }
20
- val = matcher.call(self, set[0], set)
21
- self.template.gsub!(set[0], val.to_s) if val
22
- end
16
+ substitute(regex, matcher)
17
+ end
18
+
19
+ if self.fallback
20
+ substitute(self.fallback[:regex], self.fallback[:handler])
23
21
  end
24
- return self.template
22
+
23
+ return self.substrate
25
24
  rescue Exception => e
26
- puts e.inspect
27
25
  Braai.logger.error(e)
28
26
  raise e unless Braai.config.swallow_matcher_errors
29
27
  end
30
28
  end
31
29
 
30
+ private
31
+
32
+ def substitute(regex, matcher)
33
+ regex = Regexp.new(regex)
34
+ matches = self.substrate.scan(regex)
35
+ matches.each do |set|
36
+ set = [set].flatten.map {|m| m.strip unless m.nil? }
37
+ val = matcher.call(self, set[0], set)
38
+ self.substrate.gsub!(set[0], val.to_s) if val
39
+ end
40
+ end
41
+
32
42
  end
@@ -38,7 +38,7 @@ module Braai::Handlers
38
38
  def rescue_from_error(e)
39
39
  Braai::Handlers.rescuers.each do |rescuer|
40
40
  if e.is_a?(rescuer[:klass])
41
- return rescuer[:handler].call(self)
41
+ return rescuer[:handler].call(self, e)
42
42
  end
43
43
  end
44
44
  raise e
@@ -3,7 +3,7 @@ module Braai::Handlers
3
3
  def perform
4
4
  res = []
5
5
  template.attributes[matches[2]].each do |val|
6
- res << Braai::Context.new(matches[3], template.matchers, template.attributes.merge(matches[1] => val)).render
6
+ res << Braai::Context.new(matches[3], template, template.attributes.merge(matches[1] => val)).render
7
7
  end
8
8
  res.join("\n")
9
9
  end
@@ -16,4 +16,4 @@ module Braai
16
16
  end
17
17
 
18
18
  end
19
- end
19
+ end
@@ -1,5 +1,7 @@
1
1
  module Braai::Matchers
2
2
 
3
+ attr_accessor :fallback
4
+
3
5
  IterationMatcher = /({{\s*for (\w+) in (\w+)\s*}}(.+?){{\s*\/for\s*}})/im
4
6
  DefaultMatcher = /({{\s*([\w\.]+)\s*}})/i
5
7
  RegionMatcher = /({{\s*([\w]+)\s*}}(.*){{\s*\/([\w]+)\s*}})/mi
@@ -12,12 +14,17 @@ module Braai::Matchers
12
14
  @matchers = {regex.to_s => handler || block}.merge(self.matchers)
13
15
  end
14
16
 
17
+ def add_fallback(regex, handler=nil, &block)
18
+ @fallback = { :regex => regex.to_s, :handler => handler || block }
19
+ end
20
+
15
21
  def unmap(regex)
16
22
  self.matchers.delete(regex.to_s)
17
23
  end
18
24
 
19
25
  def clear!
20
26
  self.matchers.clear
27
+ self.fallback = nil
21
28
  end
22
29
 
23
30
  def reset!
@@ -2,17 +2,17 @@ class Braai::Template
2
2
  extend Braai::Matchers
3
3
  include Braai::Matchers
4
4
 
5
- attr_accessor :attributes
6
5
  attr_accessor :template
7
6
 
8
7
  def initialize(template, matchers = {})
9
- self.template = template
10
8
  @matchers = self.class.matchers.merge(matchers)
9
+ @template = template
10
+ @fallback = self.class.fallback
11
11
  end
12
12
 
13
13
  def render(attributes = {})
14
- context = Braai::Context.new(self.template, self.matchers, attributes)
14
+ context = Braai::Context.new(@template, self, attributes)
15
15
  context.render
16
16
  end
17
17
 
18
- end
18
+ end
data/lib/braai/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Braai
2
- VERSION = "1.5.0"
2
+ VERSION = "1.6.0"
3
3
  end
@@ -7,7 +7,8 @@ describe Braai::Context do
7
7
  describe 'attributes arguments' do
8
8
 
9
9
  it 'allows a nested hash' do
10
- context = Braai::Context.new("template", "matchers", { hash: { foo: 'bar' } })
10
+ template = mock(:matchers => true, :fallback => true)
11
+ context = Braai::Context.new("some {{stuff}}", template, { hash: { foo: 'bar' } })
11
12
  context.attributes[:hash].must_equal("foo" => 'bar')
12
13
  end
13
14
 
@@ -15,4 +16,4 @@ describe Braai::Context do
15
16
 
16
17
  end
17
18
 
18
- end
19
+ end
@@ -59,7 +59,7 @@ describe Braai::Handlers::Base do
59
59
  describe '#rescue_from_error' do
60
60
 
61
61
  it 'calls a user-defined error handler if specified' do
62
- Braai::Handlers.rescue_from ArgumentError, ->(e) { "<!-- #{key} -->" }
62
+ Braai::Handlers.rescue_from ArgumentError, ->(handler, e) { "<!-- #{key} -->" }
63
63
  handler.rescue_from_error(ArgumentError.new).must_equal('<!-- {{ person.name }} -->')
64
64
  end
65
65
 
@@ -70,8 +70,8 @@ describe Braai::Handlers::Base do
70
70
  end
71
71
 
72
72
  it "stops after the first matching rescuer" do
73
- Braai::Handlers.rescue_from Exception, ->(e) { "!!! #{key} !!!" }
74
- Braai::Handlers.rescue_from ArgumentError, ->(e) { "<!-- #{key} -->" }
73
+ Braai::Handlers.rescue_from Exception, ->(handler, e) { "!!! #{key} !!!" }
74
+ Braai::Handlers.rescue_from ArgumentError, ->(handler, e) { "<!-- #{key} -->" }
75
75
  handler.rescue_from_error(ArgumentError.new).must_equal('<!-- {{ person.name }} -->')
76
76
  end
77
77
 
@@ -3,6 +3,7 @@ require 'ostruct'
3
3
 
4
4
  describe Braai::Template do
5
5
 
6
+
6
7
  class GreetHandler
7
8
  def self.call(template, key, matches)
8
9
  template.attributes[:greet].upcase
@@ -59,6 +60,7 @@ describe Braai::Template do
59
60
  res.must_equal("<h1>Hi Mark</h1><h2>Hi Mark</h2>")
60
61
  end
61
62
 
63
+
62
64
  describe 'matches' do
63
65
 
64
66
  describe 'multimatches' do
@@ -71,6 +73,7 @@ describe Braai::Template do
71
73
  end
72
74
 
73
75
  before do
76
+ Braai::Template.clear!
74
77
  Braai::Template.map(multi_regex, &multi_matcher)
75
78
  end
76
79
 
@@ -90,6 +93,29 @@ describe Braai::Template do
90
93
 
91
94
  end
92
95
 
96
+
97
+ describe "fallback matcher" do
98
+
99
+ before do
100
+ Braai::Template.map(/({{ yummy_(\w+) }})/, ->(view, key, matches) { "#{matches[1].upcase}: #{view.attributes[matches[1]]}" })
101
+ Braai::Template.add_fallback(/({{ (\w+) }})/, ->(view, key, matches) { "UNMATCHED_TAG" })
102
+ end
103
+
104
+ it "is called" do
105
+ template = "<h2>{{ bango }}</h2>"
106
+ res = Braai::Template.new(template).render
107
+ res.must_equal("<h2>UNMATCHED_TAG</h2>")
108
+ end
109
+
110
+ it "always comes last" do
111
+ template = "<h2>{{ bango }}</h2><p>{{ yummy_food }}</p><p>{{ yummy_drink }}</p> {{ blaz }}"
112
+
113
+ res = Braai::Template.new(template).render(food: 'pizza', drink: 'beer')
114
+ res.must_equal("<h2>UNMATCHED_TAG</h2><p>FOOD: pizza</p><p>DRINK: beer</p> UNMATCHED_TAG")
115
+ end
116
+
117
+ end
118
+
93
119
  describe "matcher errors" do
94
120
 
95
121
  before do
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.5.0
4
+ version: 1.6.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-02-04 00:00:00.000000000 Z
12
+ date: 2013-03-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -95,7 +95,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
95
95
  version: '0'
96
96
  requirements: []
97
97
  rubyforge_project:
98
- rubygems_version: 1.8.24
98
+ rubygems_version: 1.8.25
99
99
  signing_key:
100
100
  specification_version: 3
101
101
  summary: Fully extensible templating system.