flavour_saver 1.0.0 → 2.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2874ca7f6ce28bbd9ed5f1ba887a0bc7244bdd448be995c2447078439e32bb82
4
- data.tar.gz: cdae84ceb24202a2f03db262a973f254dc750a3de30efae7138e01a3ef6187cb
3
+ metadata.gz: 5bd75dc7f4e17072e0e18ffdefdfa81c6f24e98859786bb37c45191095964f2c
4
+ data.tar.gz: 41ac8be61e4a0969a7aa669a7f1cb488530f8a4d5514aca979fa37da151aca32
5
5
  SHA512:
6
- metadata.gz: 404531d6a27b3c6e8739d98dc7ab9b5af81e8b29cc9260869784882704b58b4cd7ab2e2f3e741768cbe5386c326c66e1fc1be66d3ab1f6702a2902b9ee811017
7
- data.tar.gz: b5ae4b6c36462dfc80a29e6eb25cca006330462aa44b1d38dd234e353a072ee906ac41943201ab5cce233b3812f14da697be6b29a189b4bf7b8820a98afecc7e
6
+ metadata.gz: d771d2bdc69eea05f39b747299a962f914a53a3e1475a26089ea951eef505acd5d7e8511b9fd1d61e2d22cdceaf3bd52e7b7326901c3cd7cdb1216eb3c4ba4d2
7
+ data.tar.gz: ba14f4e5d4c62ace6ae2c8a1776cd8f7d9757333a1545473169d5f3c7f12c621149804736c1ff453927d8ed87b6ed31c756df8aee53cde2c54c2a094eefd2cb5
@@ -3,6 +3,7 @@ name: Continuous integration
3
3
  on:
4
4
  push:
5
5
  branches: [ master ]
6
+ tags: [ 'v*' ]
6
7
  pull_request:
7
8
  branches: [ master ]
8
9
 
@@ -24,3 +25,23 @@ jobs:
24
25
  - name: Run tests
25
26
  run: bundle exec rspec
26
27
 
28
+ publish-gem:
29
+ if: github.ref_type == 'tag'
30
+ runs-on: ubuntu-latest
31
+ needs: [test]
32
+ steps:
33
+ - uses: actions/checkout@v2
34
+ - name: Set up Ruby 2.7
35
+ uses: ruby/setup-ruby@v1
36
+ with:
37
+ ruby-version: 2.7
38
+ - name: Publish to RubyGems
39
+ run: |
40
+ mkdir -p $HOME/.gem
41
+ touch $HOME/.gem/credentials
42
+ chmod 0600 $HOME/.gem/credentials
43
+ printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
44
+ gem build *.gemspec
45
+ gem push *.gem
46
+ env:
47
+ GEM_HOST_API_KEY: "${{secrets.RUBYGEMS_AUTH_TOKEN}}"
data/CHANGELOG.md CHANGED
@@ -7,6 +7,39 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.0.2]
11
+
12
+ ### Fixed
13
+
14
+ * Deprecation warning for template handler (#59)
15
+
16
+ ### Changed
17
+
18
+ * Relaxed version constraint on activesupport dependency (#60)
19
+
20
+ ## [2.0.1]
21
+
22
+ ### Fixed
23
+
24
+ * Ability to dereference arrays at a specific index (#57)
25
+
26
+ ## [2.0.0]
27
+
28
+ ### Breaking Changes
29
+
30
+ * The #if and #unless helpers now treat zero as falsey (#54, #55)
31
+ * The #unless helper now treats empty objects as falsey (#55)
32
+ * Using #each on a hash now yields the value instead of an array of key, value (#52)
33
+
34
+ ### Added
35
+
36
+ * Support for @root object (#49)
37
+ * Support for @key object inside #each blocks with Hashes (#52)
38
+
39
+ ### Fixed
40
+
41
+ * Lex number literals that start with 0 (#53)
42
+
10
43
  ## [1.0.0] - 2022-01-19
11
44
 
12
45
  ### Added
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- flavour_saver (1.0.0)
4
+ flavour_saver (2.0.2)
5
5
  rltk (~> 2.2.0)
6
6
  tilt
7
7
 
@@ -45,7 +45,7 @@ PLATFORMS
45
45
  ruby
46
46
 
47
47
  DEPENDENCIES
48
- activesupport (< 7.0)
48
+ activesupport (< 8.0)
49
49
  flavour_saver!
50
50
  rake
51
51
  rspec
@@ -26,7 +26,7 @@ Gem::Specification.new do |gem|
26
26
 
27
27
  gem.add_development_dependency 'rake'
28
28
  gem.add_development_dependency 'rspec'
29
- gem.add_development_dependency 'activesupport', '< 7.0'
29
+ gem.add_development_dependency 'activesupport', '< 8.0'
30
30
 
31
31
  gem.add_dependency 'rltk', '~> 2.2.0'
32
32
  gem.add_dependency 'tilt'
@@ -11,27 +11,31 @@ module FlavourSaver
11
11
  r = []
12
12
  count = 0
13
13
  collection.each do |element|
14
- r << yield.contents(element,
15
- 'index' => count,
16
- 'last' => count == collection.size - 1,
17
- 'first' => count == 0)
14
+ locals ={
15
+ 'index' => count,
16
+ 'last' => count == collection.size - 1,
17
+ 'first' => count == 0
18
+ }
19
+
20
+ locals['key'], element = element if collection.is_a?(Hash)
21
+
22
+ r << yield.contents(element, locals)
18
23
  count += 1
19
24
  end
20
25
  yield.rendered!
21
26
  r.join ''
22
27
  end
23
28
 
24
- def if(truthy)
25
- truthy = false if truthy.respond_to?(:size) && (truthy.size == 0)
26
- if truthy
29
+ def if(value)
30
+ if truthy?(value)
27
31
  yield.contents
28
32
  else
29
33
  yield.inverse
30
34
  end
31
35
  end
32
36
 
33
- def unless(falsy,&b)
34
- self.if(!falsy,&b)
37
+ def unless(value, &b)
38
+ self.if(!truthy?(value), &b)
35
39
  end
36
40
 
37
41
  def this
@@ -42,6 +46,16 @@ module FlavourSaver
42
46
  FS.logger.debug("FlavourSaver: #{message}")
43
47
  ''
44
48
  end
49
+
50
+ private
51
+
52
+ # Think of this as a compatability layer to make Ruby conditionals
53
+ # behave like JavaScript conditionals.
54
+ def truthy?(value)
55
+ value = false if value.respond_to?(:size) && (value.size == 0)
56
+ value = false if value.respond_to?(:zero?) && value.zero?
57
+ value
58
+ end
45
59
  end
46
60
 
47
61
  class Decorator < Defaults
@@ -107,10 +121,10 @@ module FlavourSaver
107
121
 
108
122
  def decorate_with(context, helper_names=[], locals={})
109
123
  helpers = if helper_names.any?
110
- helper_names = helper_names.map(&:to_sym)
111
- registered_helpers.select { |k,v| helper_names.member? k }.merge(locals)
124
+ helper_symbols = helper_names.map(&:to_sym)
125
+ registered_helpers.select { |k,v| helper_symbols.member? k }
112
126
  else
113
- helpers = registered_helpers
127
+ registered_helpers
114
128
  end
115
129
  helpers = helpers.merge(locals)
116
130
  Decorator.new(helpers, context)
@@ -52,7 +52,7 @@ module FlavourSaver
52
52
  :GT
53
53
  end
54
54
 
55
- rule /([1-9][0-9]*(\.[0-9]+)?)/, :expression do |n|
55
+ rule /([0-9]+(\.[0-9]+)?)/, :expression do |n|
56
56
  [ :NUMBER, n ]
57
57
  end
58
58
 
@@ -115,7 +115,6 @@ module FlavourSaver
115
115
 
116
116
  production(:expression_contents) do
117
117
  clause('WHITE? call WHITE?') { |_,e,_| e }
118
- clause('WHITE? local WHITE?') { |_,e,_| [e] }
119
118
  end
120
119
 
121
120
  production(:call) do
@@ -124,17 +123,13 @@ module FlavourSaver
124
123
  clause('DOT') { |_| [CallNode.new('this', [])] }
125
124
  end
126
125
 
127
- production(:local) do
128
- clause('AT IDENT') { |_,e| LocalVarNode.new(e) }
129
- end
130
-
131
126
  production('arguments') do
132
127
  clause('argument_list') { |e| e }
133
128
  clause('argument_list WHITE hash') { |e0,_,e1| e0 + [e1] }
134
129
  clause('hash') { |e| [e] }
135
130
  end
136
-
137
- nonempty_list(:argument_list, [:object_path,:lit, :local, :subexpr], :WHITE)
131
+
132
+ nonempty_list(:argument_list, [:object_path, :lit, :subexpr], :WHITE)
138
133
 
139
134
  production(:lit) do
140
135
  clause('string') { |e| e }
@@ -172,9 +167,20 @@ module FlavourSaver
172
167
  clause('FWSL') { |_| }
173
168
  end
174
169
 
175
- nonempty_list(:object_path, :object, :object_sep)
170
+ production(:object_path) do
171
+ clause('object') { |e| [e] }
172
+ clause('object_path object_sep object') { |e0,_,e1| e0 + [e1] }
173
+
174
+ # Accomodates objects dereferenced with a number like foo.0.text
175
+ clause('object_path object_sep number_object') { |e0,_,e1| e0 + [e1] }
176
+ end
177
+
178
+ production(:number_object) do
179
+ clause('NUMBER') { |e| LiteralCallNode.new(e, []) }
180
+ end
176
181
 
177
182
  production(:object) do
183
+ clause('AT IDENT') { |_,e| LocalVarNode.new(e) }
178
184
  clause('IDENT') { |e| CallNode.new(e, []) }
179
185
  clause('LITERAL') { |e| LiteralCallNode.new(e, []) }
180
186
  clause('parent_call') { |e| e }
@@ -8,7 +8,7 @@ module FlavourSaver
8
8
  UnknownHelperException = Class.new(RuntimeError)
9
9
  class Runtime
10
10
 
11
- attr_accessor :context, :parent, :ast
11
+ attr_accessor :context, :parent, :ast, :privates
12
12
 
13
13
  def self.run(ast, context, locals={}, helpers=[])
14
14
  self.new(ast, context, locals, helpers).to_s
@@ -20,7 +20,7 @@ module FlavourSaver
20
20
  @helpers = helpers
21
21
  @context = context
22
22
  @parent = parent
23
- @privates = {}
23
+ @privates = parent ? parent.privates.dup : { 'root' => context }
24
24
  end
25
25
 
26
26
  def to_s(tmp_context = nil,privates={})
@@ -1,3 +1,3 @@
1
1
  module FlavourSaver
2
- VERSION = "1.0.0"
2
+ VERSION = "2.0.2"
3
3
  end
data/lib/flavour_saver.rb CHANGED
@@ -17,10 +17,11 @@ module FlavourSaver
17
17
  end
18
18
 
19
19
  ActiveSupport.on_load(:action_view) do
20
- handler = proc do |template|
20
+ handler = proc do |template, source|
21
+ source ||= template.source
21
22
  # I'd rather be caching the Runtime object ready to fire, but apparently I don't get that luxury.
22
23
  <<-SOURCE
23
- FlavourSaver.evaluate((begin;#{template.source.inspect};end),self)
24
+ FlavourSaver.evaluate((begin;#{source.inspect};end),self)
24
25
  SOURCE
25
26
  end
26
27
  ActionView::Template.register_template_handler(:hbs, handler)
@@ -406,6 +406,21 @@ describe FlavourSaver do
406
406
  end
407
407
  end
408
408
 
409
+ describe 'array with numeric dereference' do
410
+ let(:template) {"{{goodbyes.0.text}} cruel {{world}}!"}
411
+
412
+ it 'properly inserts the referenced element' do
413
+ goodbyes = []
414
+ goodbyes << double(:goodbye)
415
+ expect(goodbyes[0]).to receive(:text).and_return('goodbye')
416
+
417
+ allow(context).to receive(:goodbyes).and_return(goodbyes)
418
+ allow(context).to receive(:world).and_return('world')
419
+
420
+ expect(subject).to eq "goodbye cruel world!"
421
+ end
422
+ end
423
+
409
424
  describe 'empty block' do
410
425
  let(:template) { "{{#goodbyes}}{{/goodbyes}}cruel {{world}}!" }
411
426
 
@@ -909,6 +924,17 @@ describe FlavourSaver do
909
924
  end
910
925
  end
911
926
 
927
+ describe 'each with @index in a nested block' do
928
+ let(:template) { "{{#each goodbyes}}{{#if @last}}{{@index}}. {{/if}}{{text}}! {{/each}}cruel {{world}}!" }
929
+
930
+ example 'the @index variable is used' do
931
+ g = Struct.new(:text)
932
+ allow(context).to receive(:goodbyes).and_return([g.new('goodbye'), g.new('Goodbye'), g.new('GOODBYE')])
933
+ allow(context).to receive(:world).and_return('world')
934
+ expect(subject).to eq "goodbye! Goodbye! 2. GOODBYE! cruel world!"
935
+ end
936
+ end
937
+
912
938
  describe 'each with @last' do
913
939
  let(:template) { "{{#each goodbyes}}{{@index}}. {{text}}! {{#if @last}}last{{/if}}{{/each}} cruel {{world}}!" }
914
940
 
@@ -931,6 +957,58 @@ describe FlavourSaver do
931
957
  end
932
958
  end
933
959
 
960
+ describe 'each with @root' do
961
+ let(:template) { "{{#each goodbyes}}{{@index}}. {{text}} cruel {{@root.place}}! {{/each}}" }
962
+
963
+ example 'the root variable is used' do
964
+ g = Struct.new(:text)
965
+ allow(context).to receive(:goodbyes).and_return([g.new('goodbye'), g.new('Goodbye'), g.new('GOODBYE')])
966
+ allow(context).to receive(:place).and_return('world')
967
+ expect(subject).to eq "0. goodbye cruel world! 1. Goodbye cruel world! 2. GOODBYE cruel world! "
968
+ end
969
+ end
970
+
971
+ describe 'each with @root in a nested block' do
972
+ let(:template) { "{{#each goodbyes}}{{@index}}. {{text}}{{#if @last}} cruel {{@root.place}}{{/if}}! {{/each}}" }
973
+
974
+ example 'the root variable is used' do
975
+ g = Struct.new(:text)
976
+ allow(context).to receive(:goodbyes).and_return([g.new('goodbye'), g.new('Goodbye'), g.new('GOODBYE')])
977
+ allow(context).to receive(:place).and_return('world')
978
+ expect(subject).to eq "0. goodbye! 1. Goodbye! 2. GOODBYE cruel world! "
979
+ end
980
+ end
981
+
982
+ describe 'each with @key' do
983
+ let(:template) { "{{#each goodbyes}}{{@key}}. {{text}}! {{/each}}cruel {{world}}!" }
984
+
985
+ example 'the @key variable is used' do
986
+ g = Struct.new(:text)
987
+ allow(context).to receive(:goodbyes).and_return({
988
+ one: g.new('goodbye'),
989
+ two: g.new('Goodbye'),
990
+ three: g.new('GOODBYE')
991
+ })
992
+ allow(context).to receive(:world).and_return('world')
993
+ expect(subject).to eq "one. goodbye! two. Goodbye! three. GOODBYE! cruel world!"
994
+ end
995
+ end
996
+
997
+ describe 'each with @key in a nested block' do
998
+ let(:template) { "{{#each goodbyes}}{{#if @last}}{{@key}}. {{/if}}{{text}}! {{/each}}cruel {{world}}!" }
999
+
1000
+ example 'the @key variable is used' do
1001
+ g = Struct.new(:text)
1002
+ allow(context).to receive(:goodbyes).and_return({
1003
+ one: g.new('goodbye'),
1004
+ two: g.new('Goodbye'),
1005
+ three: g.new('GOODBYE')
1006
+ })
1007
+ allow(context).to receive(:world).and_return('world')
1008
+ expect(subject).to eq "goodbye! Goodbye! three. GOODBYE! cruel world!"
1009
+ end
1010
+ end
1011
+
934
1012
  describe 'log' do
935
1013
  let(:template) { "{{log blah}}" }
936
1014
  let(:log) { double(:log) }
@@ -3,15 +3,46 @@ require 'flavour_saver'
3
3
 
4
4
  describe 'Fixture: if_else.hbs' do
5
5
  subject { Tilt.new(template).render(context).gsub(/[\s\r\n]+/, ' ').strip }
6
- let(:context) { Struct.new(:name).new }
6
+ let(:context) { Struct.new(:value).new }
7
7
  let(:template) { File.expand_path('../../fixtures/if_else.hbs', __FILE__) }
8
8
 
9
- it 'renders correctly when given a name' do
10
- context.name = 'Alan'
11
- expect(subject).to eq "Say hello to Alan."
9
+ it "renders the if block when given a string" do
10
+ context.value = "Alan"
11
+ expect(subject).to eq "The given value is truthy: Alan."
12
12
  end
13
13
 
14
- it 'renders correctly when not given a name' do
15
- expect(subject).to eq "Nobody to say hi to."
14
+ it "renders the if block when given a number greater than zero" do
15
+ context.value = 1
16
+ expect(subject).to eq "The given value is truthy: 1."
17
+ end
18
+
19
+ it "renders the if block when given an array that is not empty" do
20
+ context.value = [1]
21
+ expect(subject).to eq "The given value is truthy: [1]."
22
+ end
23
+
24
+ it "renders the else block when given false" do
25
+ context.value = false
26
+ expect(subject).to eq "The given value is falsy: false."
27
+ end
28
+
29
+ it 'renders the else block when given nil' do
30
+ context.value = nil
31
+ expect(subject).to eq "The given value is falsy: ."
32
+ end
33
+
34
+ it "renders the else block when given an empty string" do
35
+ context.value = ""
36
+ expect(subject).to eq "The given value is falsy: ."
37
+ end
38
+
39
+ it "renders the else block when given a zero" do
40
+ context.value = 0
41
+ expect(subject).to eq "The given value is falsy: 0."
42
+ end
43
+
44
+ it "renders the else block when given an empty array" do
45
+ context.value = []
46
+ expect(subject).to eq "The given value is falsy: []."
16
47
  end
17
48
  end
@@ -0,0 +1,48 @@
1
+ require 'tilt'
2
+ require 'flavour_saver'
3
+
4
+ describe 'Fixture: unless.hbs' do
5
+ subject { Tilt.new(template).render(context).gsub(/[\s\r\n]+/, ' ').strip }
6
+ let(:context) { Struct.new(:value).new }
7
+ let(:template) { File.expand_path('../../fixtures/unless.hbs', __FILE__) }
8
+
9
+ it "renders the unless block when given false" do
10
+ context.value = false
11
+ expect(subject).to eq "The given value is falsy: false."
12
+ end
13
+
14
+ it 'renders the unless block when given nil' do
15
+ context.value = nil
16
+ expect(subject).to eq "The given value is falsy: ."
17
+ end
18
+
19
+ it "renders the unless block when given an empty string" do
20
+ context.value = ""
21
+ expect(subject).to eq "The given value is falsy: ."
22
+ end
23
+
24
+ it "renders the unless block when given a zero" do
25
+ context.value = 0
26
+ expect(subject).to eq "The given value is falsy: 0."
27
+ end
28
+
29
+ it "renders the unless block when given an empty array" do
30
+ context.value = []
31
+ expect(subject).to eq "The given value is falsy: []."
32
+ end
33
+
34
+ it "renders the else block when given a string" do
35
+ context.value = "Alan"
36
+ expect(subject).to eq "The given value is truthy: Alan."
37
+ end
38
+
39
+ it "renders the else block when given a number greater than zero" do
40
+ context.value = 1
41
+ expect(subject).to eq "The given value is truthy: 1."
42
+ end
43
+
44
+ it "renders the else block when given an array that is not empty" do
45
+ context.value = [1]
46
+ expect(subject).to eq "The given value is truthy: [1]."
47
+ end
48
+ end
@@ -1,5 +1,5 @@
1
- {{#if name}}
2
- Say hello to {{name}}.
1
+ {{#if value}}
2
+ The given value is truthy: {{value}}.
3
3
  {{else}}
4
- Nobody to say hi to.
4
+ The given value is falsy: {{value}}.
5
5
  {{/if}}
@@ -0,0 +1,5 @@
1
+ {{#unless value}}
2
+ The given value is falsy: {{value}}.
3
+ {{else}}
4
+ The given value is truthy: {{value}}.
5
+ {{/unless}}
@@ -71,7 +71,38 @@ describe FlavourSaver::Lexer do
71
71
  it 'has values in the correct order' do
72
72
  expect(subject.map(&:value).compact).to eq [ 'foo', 'bar', 'baz', 'hello', 'goodbye' ]
73
73
  end
74
+ end
75
+
76
+ describe '{{0}}' do
77
+ subject { FlavourSaver::Lexer.lex "{{0}}" }
78
+
79
+ it 'properly lexes the expression' do
80
+ expect(subject.map(&:type)).to eq(
81
+ [:EXPRST, :NUMBER, :EXPRE, :EOS]
82
+ )
83
+ end
74
84
 
85
+ it 'contains only the number "0"' do
86
+ expect(subject[1..-3].size).to eq 1
87
+ expect(subject[1].type).to eq :NUMBER
88
+ expect(subject[1].value).to eq '0'
89
+ end
90
+ end
91
+
92
+ describe '{{0.0123456789}}' do
93
+ subject { FlavourSaver::Lexer.lex "{{0.0123456789}}" }
94
+
95
+ it 'properly lexes the expression' do
96
+ expect(subject.map(&:type)).to eq(
97
+ [:EXPRST, :NUMBER, :EXPRE, :EOS]
98
+ )
99
+ end
100
+
101
+ it 'contains only the number "0.0123456789"' do
102
+ expect(subject[1..-3].size).to eq 1
103
+ expect(subject[1].type).to eq :NUMBER
104
+ expect(subject[1].value).to eq '0.0123456789'
105
+ end
75
106
  end
76
107
  end
77
108
 
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flavour_saver
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 2.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Clayton Passmore
8
8
  - James Harton
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2022-01-21 00:00:00.000000000 Z
12
+ date: 2022-07-18 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -45,14 +45,14 @@ dependencies:
45
45
  requirements:
46
46
  - - "<"
47
47
  - !ruby/object:Gem::Version
48
- version: '7.0'
48
+ version: '8.0'
49
49
  type: :development
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
53
  - - "<"
54
54
  - !ruby/object:Gem::Version
55
- version: '7.0'
55
+ version: '8.0'
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: rltk
58
58
  requirement: !ruby/object:Gem::Requirement
@@ -123,6 +123,7 @@ files:
123
123
  - spec/acceptance/segment_literals_spec.rb
124
124
  - spec/acceptance/simple_expression_spec.rb
125
125
  - spec/acceptance/subexpression_spec.rb
126
+ - spec/acceptance/unless_spec.rb
126
127
  - spec/fixtures/backtrack.hbs
127
128
  - spec/fixtures/comment.hbs
128
129
  - spec/fixtures/custom_block_helper.hbs
@@ -134,6 +135,7 @@ files:
134
135
  - spec/fixtures/raw.hbs
135
136
  - spec/fixtures/sections.hbs
136
137
  - spec/fixtures/simple_expression.hbs
138
+ - spec/fixtures/unless.hbs
137
139
  - spec/lib/flavour_saver/lexer_spec.rb
138
140
  - spec/lib/flavour_saver/parser_spec.rb
139
141
  - spec/lib/flavour_saver/runtime_spec.rb
@@ -146,7 +148,7 @@ metadata:
146
148
  changelog_uri: http://github.com/FlavourSaver/FlavourSaver/blob/master/CHANGELOG.md
147
149
  homepage_uri: http://github.com/FlavourSaver/FlavourSaver
148
150
  source_code_uri: http://github.com/FlavourSaver/FlavourSaver
149
- post_install_message:
151
+ post_install_message:
150
152
  rdoc_options: []
151
153
  require_paths:
152
154
  - lib
@@ -161,8 +163,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
161
163
  - !ruby/object:Gem::Version
162
164
  version: '0'
163
165
  requirements: []
164
- rubygems_version: 3.2.15
165
- signing_key:
166
+ rubygems_version: 3.1.6
167
+ signing_key:
166
168
  specification_version: 4
167
169
  summary: Handlebars.js without the .js
168
170
  test_files:
@@ -181,6 +183,7 @@ test_files:
181
183
  - spec/acceptance/segment_literals_spec.rb
182
184
  - spec/acceptance/simple_expression_spec.rb
183
185
  - spec/acceptance/subexpression_spec.rb
186
+ - spec/acceptance/unless_spec.rb
184
187
  - spec/fixtures/backtrack.hbs
185
188
  - spec/fixtures/comment.hbs
186
189
  - spec/fixtures/custom_block_helper.hbs
@@ -192,6 +195,7 @@ test_files:
192
195
  - spec/fixtures/raw.hbs
193
196
  - spec/fixtures/sections.hbs
194
197
  - spec/fixtures/simple_expression.hbs
198
+ - spec/fixtures/unless.hbs
195
199
  - spec/lib/flavour_saver/lexer_spec.rb
196
200
  - spec/lib/flavour_saver/parser_spec.rb
197
201
  - spec/lib/flavour_saver/runtime_spec.rb