wlang 2.0.1 → 2.1.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.
Files changed (46) hide show
  1. data/CHANGELOG.md +27 -0
  2. data/Gemfile +2 -0
  3. data/Gemfile.lock +16 -0
  4. data/README.md +32 -55
  5. data/lib/wlang.rb +8 -0
  6. data/lib/wlang/compiler/grammar.citrus +19 -16
  7. data/lib/wlang/dialect.rb +18 -14
  8. data/lib/wlang/html.rb +7 -11
  9. data/lib/wlang/scope.rb +68 -28
  10. data/lib/wlang/scope/binding_scope.rb +3 -3
  11. data/lib/wlang/scope/null_scope.rb +34 -0
  12. data/lib/wlang/scope/object_scope.rb +18 -7
  13. data/lib/wlang/scope/proc_scope.rb +4 -4
  14. data/lib/wlang/scope/sinatra_scope.rb +44 -0
  15. data/lib/wlang/template.rb +10 -2
  16. data/lib/wlang/tilt/wlang_template.rb +1 -1
  17. data/lib/wlang/version.rb +2 -2
  18. data/spec/assumptions/test_core.rb +8 -0
  19. data/spec/fixtures/templates/hello_from_sinatra.wlang +1 -0
  20. data/spec/integration/html/test_greater.rb +12 -2
  21. data/spec/integration/sinatra/test_partials.rb +35 -0
  22. data/spec/integration/test_examples.rb +2 -2
  23. data/spec/spec_helper.rb +7 -0
  24. data/spec/unit/compiler/test_grammar.rb +1 -1
  25. data/spec/unit/compiler/test_parser.rb +17 -0
  26. data/spec/unit/dialect/test_context.rb +28 -0
  27. data/spec/unit/dialect/test_evaluate.rb +10 -0
  28. data/spec/unit/dialect/test_render.rb +4 -0
  29. data/spec/unit/scope/sinatra_scope/test_fetch.rb +28 -0
  30. data/spec/unit/scope/test_binding_scope.rb +1 -1
  31. data/spec/unit/scope/test_chain.rb +5 -5
  32. data/spec/unit/scope/test_coerce.rb +7 -3
  33. data/spec/unit/scope/test_null_scope.rb +35 -0
  34. data/spec/unit/scope/test_object_scope.rb +1 -1
  35. data/spec/unit/scope/test_proc_scope.rb +1 -1
  36. data/spec/unit/scope/test_push.rb +70 -0
  37. data/spec/unit/template/test_call_args_conventions.rb +101 -0
  38. data/spec/unit/test_assumptions.rb +12 -0
  39. data/spec/unit/test_scope.rb +26 -16
  40. data/wlang.gemspec +2 -0
  41. data/wlang.noespec +3 -1
  42. metadata +143 -33
  43. data/lib/wlang/scope/proxy_scope.rb +0 -18
  44. data/lib/wlang/scope/root_scope.rb +0 -24
  45. data/spec/unit/scope/test_proxy_scope.rb +0 -22
  46. data/spec/unit/scope/test_root_scope.rb +0 -22
@@ -1,28 +1,28 @@
1
1
  module WLang
2
2
  describe Scope, '.chain' do
3
3
 
4
- it 'returns Scope.root on empty chain' do
5
- Scope.chain([]).should eq(Scope.root)
4
+ it 'returns the NullScope on empty chain' do
5
+ Scope.chain([]).should eq(Scope.null)
6
6
  end
7
7
 
8
8
  it 'returns a single scope on singleton' do
9
9
  s = Scope.chain([{:who => "World"}])
10
10
  s.should be_a(Scope::ObjectScope)
11
- s.parent.should eq(Scope.root)
11
+ s.parent.should be_nil
12
12
  end
13
13
 
14
14
  it 'uses the last scope as most specific' do
15
15
  s = Scope.chain([{:who => "World"}, lambda{}])
16
16
  s.should be_a(Scope::ProcScope)
17
17
  s.parent.should be_a(Scope::ObjectScope)
18
- s.parent.parent.should eq(Scope.root)
18
+ s.parent.parent.should be_nil
19
19
  end
20
20
 
21
21
  it 'strips nils' do
22
22
  s = Scope.chain([nil, {:who => "World"}, nil, lambda{}, nil])
23
23
  s.should be_a(Scope::ProcScope)
24
24
  s.parent.should be_a(Scope::ObjectScope)
25
- s.parent.parent.should eq(Scope.root)
25
+ s.parent.parent.should be_nil
26
26
  end
27
27
 
28
28
  end
@@ -10,6 +10,10 @@ module WLang
10
10
  Scope.coerce(lambda{}).should be_a(Scope::ProcScope)
11
11
  end
12
12
 
13
+ it 'recognizes Sinatra applications' do
14
+ Scope.coerce(sinatra_app).should be_a(Scope::SinatraScope)
15
+ end
16
+
13
17
  it 'falls back to ObjectScope on Hash' do
14
18
  Scope.coerce({}).should be_a(Scope::ObjectScope)
15
19
  end
@@ -19,14 +23,14 @@ module WLang
19
23
  end
20
24
 
21
25
  it 'returns the Scope if nothing has to be done' do
22
- Scope.coerce(Scope.root).should eq(Scope.root)
26
+ Scope.coerce(Scope.null).should eq(Scope.null)
23
27
  s = Scope.coerce({})
24
28
  Scope.coerce(s).should eq(s)
25
29
  end
26
30
 
27
- it 'builds ProxyScope on Scopes' do
31
+ it 'returns the Scope on a Scope' do
28
32
  s = Scope.coerce({})
29
- Scope.coerce(s, Scope.root).should be_a(Scope::ProxyScope)
33
+ Scope.coerce(s).should eq(s)
30
34
  end
31
35
 
32
36
  end # describe Scope
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+ module WLang
3
+ class Scope
4
+ describe NullScope do
5
+
6
+ let(:scope){ NullScope.new }
7
+
8
+ it 'throws on fetch' do
9
+ lambda{ scope.fetch(:who) }.should throw_symbol(:fail)
10
+ end
11
+
12
+ it 'throws on fetch even on `self`' do
13
+ lambda{ scope.fetch(:self) }.should throw_symbol(:fail)
14
+ end
15
+
16
+ it 'returns pushed scope on push' do
17
+ pushed = ObjectScope.new(12)
18
+ scope.push(pushed).should eq(pushed)
19
+ end
20
+
21
+ it 'coerces pushed scope on push' do
22
+ scope.push(12).should be_a(ObjectScope)
23
+ end
24
+
25
+ it 'returns nil on pop' do
26
+ scope.pop.should be_nil
27
+ end
28
+
29
+ it 'returns an empty array of subjects' do
30
+ scope.subjects.should eq([])
31
+ end
32
+
33
+ end # describe NullScope
34
+ end # class Scope
35
+ end # module WLang
@@ -24,7 +24,7 @@ module WLang
24
24
  end
25
25
 
26
26
  it 'delegates fetch to its parent when not found' do
27
- scope = Scope.coerce(12, Scope.coerce({:who => "World"}))
27
+ scope = Scope.coerce({:who => "World"}).push(12)
28
28
  scope.fetch(:who).should eq("World")
29
29
  end
30
30
 
@@ -9,7 +9,7 @@ module WLang
9
9
  end
10
10
 
11
11
  it 'delegates fetch to its parent when not found' do
12
- scope = Scope.coerce(lambda{ nil }, Scope.coerce({:who => "World"}))
12
+ scope = Scope.coerce({:who => "World"}).push(lambda{ nil })
13
13
  scope.fetch(:who).should eq("World")
14
14
  end
15
15
 
@@ -0,0 +1,70 @@
1
+ require 'spec_helper'
2
+ module WLang
3
+ describe Scope, 'push' do
4
+
5
+ let(:x_scope){ Scope.coerce(:x) }
6
+
7
+ subject{ x_scope.push(pushed) }
8
+
9
+ before do
10
+ subject.should be_a(Scope)
11
+ end
12
+
13
+ after do
14
+ x_scope.parent.should be_nil
15
+ x_scope.subject.should eq(:x)
16
+ x_scope.root.should eq(x_scope)
17
+ x_scope.subjects.should eq([:x])
18
+ end
19
+
20
+ context 'when pushing a simple value' do
21
+ let(:pushed){ :y }
22
+
23
+ it 'returns the scope with correct subject' do
24
+ subject.subject.should eq(:y)
25
+ end
26
+
27
+ it 'sets the parent correctly on created scope' do
28
+ subject.parent.should eq(x_scope)
29
+ end
30
+
31
+ it 'returns the correct root scope' do
32
+ subject.root.should eq(x_scope)
33
+ end
34
+
35
+ it 'has the correct subjects' do
36
+ subject.subjects.should eq([:x, :y])
37
+ end
38
+ end
39
+
40
+ context 'when pushing another scope' do
41
+ let(:pushed){ Scope.coerce(:y).push(:z) }
42
+
43
+ it 'returns the scope with most specific subject' do
44
+ subject.subject.should eq(:z)
45
+ end
46
+
47
+ it 'rechains parents correctly' do
48
+ subject.parent.subject.should eq(:y)
49
+ subject.parent.parent.subject.should eq(:x)
50
+ subject.parent.parent.parent.should be_nil
51
+ end
52
+
53
+ it 'returns the correct root scope' do
54
+ subject.root.should eq(x_scope)
55
+ end
56
+
57
+ it 'does not touch the original scope' do
58
+ pushed.subject.should eq(:z)
59
+ pushed.parent.subject.should eq(:y)
60
+ pushed.parent.parent.should be_nil
61
+ pushed.root.should eq(pushed.parent)
62
+ end
63
+
64
+ it 'has the correct subjects' do
65
+ subject.subjects.should eq([:x, :y, :z])
66
+ end
67
+ end
68
+
69
+ end
70
+ end
@@ -0,0 +1,101 @@
1
+ require 'spec_helper'
2
+ module WLang
3
+ describe Template, 'call_args_conventions' do
4
+
5
+ let(:template){ Template.new("Hello ${who}!") }
6
+
7
+ subject{ template.send(:call_args_conventions, args.dup) }
8
+
9
+ let(:scope) { subject.first }
10
+ let(:buffer){ subject.last }
11
+
12
+ before do
13
+ scope.should be_a(Scope)
14
+ buffer.should respond_to(:<<)
15
+ end
16
+
17
+ context 'without any argument' do
18
+ let(:args){ [] }
19
+ it 'sets a default NullScope' do
20
+ scope.should eq(Scope.null)
21
+ end
22
+ it 'uses a string buffer' do
23
+ buffer.should eq('')
24
+ end
25
+ end
26
+
27
+ context 'with only a String buffer' do
28
+ let(:args){ [ 'foo' ] }
29
+ it 'sets a default NullScope' do
30
+ scope.should eq(Scope.null)
31
+ end
32
+ it 'uses the provided buffer' do
33
+ buffer.should eq('foo')
34
+ end
35
+ end
36
+
37
+ context 'with only a StringIO buffer' do
38
+ let(:args){ [ StringIO.new ] }
39
+ it 'sets a default NullScope' do
40
+ scope.should eq(Scope.null)
41
+ end
42
+ it 'uses the provided buffer' do
43
+ buffer.should eq(args.first)
44
+ buffer.object_id.should eq(args.first.object_id)
45
+ end
46
+ end
47
+
48
+ context 'with only a Hash' do
49
+ let(:args){ [ {} ] }
50
+ it 'sets the correct scope subjects' do
51
+ scope.subjects.should eq(args)
52
+ end
53
+ it 'uses a string buffer' do
54
+ buffer.should eq('')
55
+ end
56
+ end
57
+
58
+ context 'with multiple scoping arguments' do
59
+ let(:args){ [ 12, {} ] }
60
+ it 'builds a chain of scoping arguments' do
61
+ scope.subjects.should eq(args)
62
+ end
63
+ it 'uses a string buffer' do
64
+ buffer.should eq('')
65
+ end
66
+ end
67
+
68
+ context 'with both a Hash and a String' do
69
+ let(:args){ [ {}, 'foo' ] }
70
+ it 'sets a default ObjectScope' do
71
+ scope.subjects.should eq([args.first])
72
+ end
73
+ it 'uses a string buffer' do
74
+ buffer.should eq('foo')
75
+ end
76
+ end
77
+
78
+ context 'when the template has locals and no arguments' do
79
+ let(:template){ Template.new(hello_with_data_path) }
80
+ let(:args){ [] }
81
+ it 'uses template locals in Scope' do
82
+ scope.subjects.should eq([{"who" => "world"}])
83
+ end
84
+ it 'uses a string buffer' do
85
+ buffer.should eq('')
86
+ end
87
+ end
88
+
89
+ context 'when the template has locals and arguments' do
90
+ let(:template){ Template.new(hello_with_data_path) }
91
+ let(:args){ [ 12, {}, 'foo' ] }
92
+ it 'sets the correct scoping subjects' do
93
+ scope.subjects.should eq([12, {}, {"who" => "world"}])
94
+ end
95
+ it 'uses the string as buffer' do
96
+ buffer.should eq('foo')
97
+ end
98
+ end
99
+
100
+ end
101
+ end
@@ -22,8 +22,20 @@ describe "ruby assumptions" do
22
22
 
23
23
  it "lambda arity" do
24
24
  lambda{|| }.arity.should eq(0)
25
+ (lambda{ }.arity <= 0).should be_true
25
26
  lambda{|fn|}.arity.should eq(1)
26
27
  lambda{|fn1,fn2|}.arity.should eq(2)
27
28
  end
28
29
 
30
+ it 'allows using a Proc usable in a case statement' do
31
+ proc = lambda{|x| x > 10}
32
+ [ 17, 3 ].map{|x|
33
+ case x
34
+ when proc then x*10
35
+ else
36
+ x
37
+ end
38
+ }.should eq([170, 3])
39
+ end
40
+
29
41
  end
@@ -6,51 +6,61 @@ module WLang
6
6
 
7
7
  it 'acts like a stack' do
8
8
  s = scope
9
- s.evaluate(:who).should eq("World")
10
- lambda{ s.pop.evaluate(:who) }.should throw_symbol(:fail)
9
+ s.evaluate(:who, nil).should eq("World")
11
10
  s = scope.push(:who => "World2")
12
- s.evaluate(:who).should eq("World2")
11
+ s.evaluate(:who, nil).should eq("World2")
13
12
  s = s.pop
14
- s.evaluate(:who).should eq("World")
13
+ s.evaluate(:who, nil).should eq("World")
15
14
  end
16
15
 
17
16
  it 'has a `with` helper' do
18
17
  scope.with(:who => "World2") do |s|
19
- s.evaluate(:who).should eq("World2")
18
+ s.evaluate(:who, nil).should eq("World2")
20
19
  end
21
- scope.evaluate(:who).should eq("World")
20
+ scope.evaluate(:who, nil).should eq("World")
22
21
  end
23
22
 
24
23
  it 'allows pushing scopes' do
25
24
  scope.with Scope.coerce(:other => "World2") do |s|
26
- s.evaluate(:other).should eq("World2")
27
- s.evaluate(:who).should eq("World")
25
+ s.evaluate(:other, nil).should eq("World2")
26
+ s.evaluate(:who, nil).should eq("World")
27
+ end
28
+ end
29
+
30
+ it 'gives access to the root' do
31
+ scope.root.should eq(scope)
32
+ scope.with(:other => "World2") do |s|
33
+ s.root.should eq(scope)
28
34
  end
29
35
  end
30
36
 
31
37
  it 'evaluates `self` accurately' do
32
- scope.evaluate(:self).should eq(:who => "World")
38
+ scope.evaluate(:self, nil).should eq(:who => "World")
33
39
  end
34
40
 
35
41
  it 'evaluates dot expressions correctly' do
36
- scope.evaluate("who.upcase").should eq("WORLD")
42
+ scope.evaluate("who.upcase", nil).should eq("WORLD")
37
43
  end
38
44
 
39
45
  it 'strips strings before evaluation' do
40
- scope.evaluate(" who ").should eq("World")
41
- scope.evaluate(" who.upcase ").should eq("WORLD")
46
+ scope.evaluate(" who ", nil).should eq("World")
47
+ scope.evaluate(" who.upcase ", nil).should eq("WORLD")
42
48
  end
43
49
 
44
50
  it 'fails when not found' do
45
- lambda{ scope.evaluate(:nosuchone) }.should throw_symbol(:fail)
51
+ lambda{
52
+ scope.evaluate(:nosuchone, nil)
53
+ }.should throw_symbol(:fail)
46
54
  end
47
55
 
48
56
  it 'supports a default value instead of fail' do
49
- scope.evaluate(:nosuchone, 12).should eq(12)
57
+ scope.evaluate(:nosuchone, nil, 12).should eq(12)
58
+ scope.evaluate(:nosuchone, nil, nil).should be_nil
50
59
  end
51
60
 
52
- it 'supports nil as default value' do
53
- scope.evaluate(:nosuchone, nil).should be_nil
61
+ it 'supports a default value through a block instead of fail' do
62
+ scope.evaluate(:nosuchone, nil){ 12 }.should eq(12)
63
+ scope.evaluate(:nosuchone, nil){ nil }.should be_nil
54
64
  end
55
65
 
56
66
  end # describe Scope
data/wlang.gemspec CHANGED
@@ -129,6 +129,8 @@ Gem::Specification.new do |s|
129
129
  s.add_development_dependency("rspec", "~> 2.10.0")
130
130
  s.add_development_dependency("yard", "~> 0.8.1")
131
131
  s.add_development_dependency("bluecloth", "~> 2.2.0")
132
+ s.add_development_dependency("sinatra", ">= 1.4")
133
+ s.add_development_dependency("rack-test", "~> 0.6.1")
132
134
  s.add_dependency("citrus", "~> 2.4.1")
133
135
  s.add_dependency("temple", "~> 0.4.0")
134
136
  s.add_dependency("quickl", "~> 0.4.3")
data/wlang.noespec CHANGED
@@ -12,7 +12,7 @@ variables:
12
12
  upper:
13
13
  WLang
14
14
  version:
15
- 2.0.1
15
+ 2.1.0
16
16
  summary: |-
17
17
  WLang is a powerful code generation and templating engine
18
18
  description: |-
@@ -43,3 +43,5 @@ variables:
43
43
  - {name: rspec, version: "~> 2.10.0", groups: [development]}
44
44
  - {name: yard, version: "~> 0.8.1", groups: [development]}
45
45
  - {name: bluecloth, version: "~> 2.2.0", groups: [development]}
46
+ - {name: sinatra, version: ">= 1.4", groups: [development]}
47
+ - {name: rack-test, version: "~> 0.6.1", groups: [development]}
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wlang
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
4
+ version: 2.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-06-12 00:00:00.000000000 Z
13
+ date: 2012-11-28 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: tilt
17
- requirement: &70314890052460 !ruby/object:Gem::Requirement
17
+ requirement: !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ~>
@@ -22,10 +22,15 @@ dependencies:
22
22
  version: '1.3'
23
23
  type: :development
24
24
  prerelease: false
25
- version_requirements: *70314890052460
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ~>
29
+ - !ruby/object:Gem::Version
30
+ version: '1.3'
26
31
  - !ruby/object:Gem::Dependency
27
32
  name: rake
28
- requirement: &70314890051680 !ruby/object:Gem::Requirement
33
+ requirement: !ruby/object:Gem::Requirement
29
34
  none: false
30
35
  requirements:
31
36
  - - ~>
@@ -33,10 +38,15 @@ dependencies:
33
38
  version: 0.9.2
34
39
  type: :development
35
40
  prerelease: false
36
- version_requirements: *70314890051680
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ~>
45
+ - !ruby/object:Gem::Version
46
+ version: 0.9.2
37
47
  - !ruby/object:Gem::Dependency
38
48
  name: bundler
39
- requirement: &70314890051220 !ruby/object:Gem::Requirement
49
+ requirement: !ruby/object:Gem::Requirement
40
50
  none: false
41
51
  requirements:
42
52
  - - ~>
@@ -44,10 +54,15 @@ dependencies:
44
54
  version: '1.0'
45
55
  type: :development
46
56
  prerelease: false
47
- version_requirements: *70314890051220
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ~>
61
+ - !ruby/object:Gem::Version
62
+ version: '1.0'
48
63
  - !ruby/object:Gem::Dependency
49
64
  name: rspec
50
- requirement: &70314890050440 !ruby/object:Gem::Requirement
65
+ requirement: !ruby/object:Gem::Requirement
51
66
  none: false
52
67
  requirements:
53
68
  - - ~>
@@ -55,10 +70,15 @@ dependencies:
55
70
  version: 2.10.0
56
71
  type: :development
57
72
  prerelease: false
58
- version_requirements: *70314890050440
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ~>
77
+ - !ruby/object:Gem::Version
78
+ version: 2.10.0
59
79
  - !ruby/object:Gem::Dependency
60
80
  name: yard
61
- requirement: &70314890049900 !ruby/object:Gem::Requirement
81
+ requirement: !ruby/object:Gem::Requirement
62
82
  none: false
63
83
  requirements:
64
84
  - - ~>
@@ -66,21 +86,63 @@ dependencies:
66
86
  version: 0.8.1
67
87
  type: :development
68
88
  prerelease: false
69
- version_requirements: *70314890049900
89
+ version_requirements: !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ~>
93
+ - !ruby/object:Gem::Version
94
+ version: 0.8.1
70
95
  - !ruby/object:Gem::Dependency
71
96
  name: bluecloth
72
- requirement: &70314890067040 !ruby/object:Gem::Requirement
97
+ requirement: !ruby/object:Gem::Requirement
98
+ none: false
99
+ requirements:
100
+ - - ~>
101
+ - !ruby/object:Gem::Version
102
+ version: 2.2.0
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
73
106
  none: false
74
107
  requirements:
75
108
  - - ~>
76
109
  - !ruby/object:Gem::Version
77
110
  version: 2.2.0
111
+ - !ruby/object:Gem::Dependency
112
+ name: sinatra
113
+ requirement: !ruby/object:Gem::Requirement
114
+ none: false
115
+ requirements:
116
+ - - ! '>='
117
+ - !ruby/object:Gem::Version
118
+ version: '1.4'
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ none: false
123
+ requirements:
124
+ - - ! '>='
125
+ - !ruby/object:Gem::Version
126
+ version: '1.4'
127
+ - !ruby/object:Gem::Dependency
128
+ name: rack-test
129
+ requirement: !ruby/object:Gem::Requirement
130
+ none: false
131
+ requirements:
132
+ - - ~>
133
+ - !ruby/object:Gem::Version
134
+ version: 0.6.1
78
135
  type: :development
79
136
  prerelease: false
80
- version_requirements: *70314890067040
137
+ version_requirements: !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ~>
141
+ - !ruby/object:Gem::Version
142
+ version: 0.6.1
81
143
  - !ruby/object:Gem::Dependency
82
144
  name: citrus
83
- requirement: &70314890066500 !ruby/object:Gem::Requirement
145
+ requirement: !ruby/object:Gem::Requirement
84
146
  none: false
85
147
  requirements:
86
148
  - - ~>
@@ -88,10 +150,15 @@ dependencies:
88
150
  version: 2.4.1
89
151
  type: :runtime
90
152
  prerelease: false
91
- version_requirements: *70314890066500
153
+ version_requirements: !ruby/object:Gem::Requirement
154
+ none: false
155
+ requirements:
156
+ - - ~>
157
+ - !ruby/object:Gem::Version
158
+ version: 2.4.1
92
159
  - !ruby/object:Gem::Dependency
93
160
  name: temple
94
- requirement: &70314890065820 !ruby/object:Gem::Requirement
161
+ requirement: !ruby/object:Gem::Requirement
95
162
  none: false
96
163
  requirements:
97
164
  - - ~>
@@ -99,10 +166,15 @@ dependencies:
99
166
  version: 0.4.0
100
167
  type: :runtime
101
168
  prerelease: false
102
- version_requirements: *70314890065820
169
+ version_requirements: !ruby/object:Gem::Requirement
170
+ none: false
171
+ requirements:
172
+ - - ~>
173
+ - !ruby/object:Gem::Version
174
+ version: 0.4.0
103
175
  - !ruby/object:Gem::Dependency
104
176
  name: quickl
105
- requirement: &70314890065160 !ruby/object:Gem::Requirement
177
+ requirement: !ruby/object:Gem::Requirement
106
178
  none: false
107
179
  requirements:
108
180
  - - ~>
@@ -110,10 +182,15 @@ dependencies:
110
182
  version: 0.4.3
111
183
  type: :runtime
112
184
  prerelease: false
113
- version_requirements: *70314890065160
185
+ version_requirements: !ruby/object:Gem::Requirement
186
+ none: false
187
+ requirements:
188
+ - - ~>
189
+ - !ruby/object:Gem::Version
190
+ version: 0.4.3
114
191
  - !ruby/object:Gem::Dependency
115
192
  name: awesome_print
116
- requirement: &70314890064300 !ruby/object:Gem::Requirement
193
+ requirement: !ruby/object:Gem::Requirement
117
194
  none: false
118
195
  requirements:
119
196
  - - ~>
@@ -121,10 +198,15 @@ dependencies:
121
198
  version: 1.0.2
122
199
  type: :runtime
123
200
  prerelease: false
124
- version_requirements: *70314890064300
201
+ version_requirements: !ruby/object:Gem::Requirement
202
+ none: false
203
+ requirements:
204
+ - - ~>
205
+ - !ruby/object:Gem::Version
206
+ version: 1.0.2
125
207
  - !ruby/object:Gem::Dependency
126
208
  name: epath
127
- requirement: &70314890063720 !ruby/object:Gem::Requirement
209
+ requirement: !ruby/object:Gem::Requirement
128
210
  none: false
129
211
  requirements:
130
212
  - - ! '>='
@@ -132,10 +214,15 @@ dependencies:
132
214
  version: '0.2'
133
215
  type: :runtime
134
216
  prerelease: false
135
- version_requirements: *70314890063720
217
+ version_requirements: !ruby/object:Gem::Requirement
218
+ none: false
219
+ requirements:
220
+ - - ! '>='
221
+ - !ruby/object:Gem::Version
222
+ version: '0.2'
136
223
  - !ruby/object:Gem::Dependency
137
224
  name: backports
138
- requirement: &70314890063180 !ruby/object:Gem::Requirement
225
+ requirement: !ruby/object:Gem::Requirement
139
226
  none: false
140
227
  requirements:
141
228
  - - ~>
@@ -143,7 +230,12 @@ dependencies:
143
230
  version: '2.6'
144
231
  type: :runtime
145
232
  prerelease: false
146
- version_requirements: *70314890063180
233
+ version_requirements: !ruby/object:Gem::Requirement
234
+ none: false
235
+ requirements:
236
+ - - ~>
237
+ - !ruby/object:Gem::Version
238
+ version: '2.6'
147
239
  description: ! 'WLang is a general-purpose *code generation*/*templating engine*.
148
240
  It''s main aim is to
149
241
 
@@ -192,10 +284,10 @@ files:
192
284
  - lib/wlang/html.rb
193
285
  - lib/wlang/loader.rb
194
286
  - lib/wlang/scope/binding_scope.rb
287
+ - lib/wlang/scope/null_scope.rb
195
288
  - lib/wlang/scope/object_scope.rb
196
289
  - lib/wlang/scope/proc_scope.rb
197
- - lib/wlang/scope/proxy_scope.rb
198
- - lib/wlang/scope/root_scope.rb
290
+ - lib/wlang/scope/sinatra_scope.rb
199
291
  - lib/wlang/scope.rb
200
292
  - lib/wlang/source/front_matter.rb
201
293
  - lib/wlang/source.rb
@@ -208,9 +300,11 @@ files:
208
300
  - Manifest.txt
209
301
  - Rakefile
210
302
  - README.md
303
+ - spec/assumptions/test_core.rb
211
304
  - spec/fixtures/dialect/foobar.rb
212
305
  - spec/fixtures/dialect/upcasing.rb
213
306
  - spec/fixtures/templates/hello.wlang
307
+ - spec/fixtures/templates/hello_from_sinatra.wlang
214
308
  - spec/fixtures/templates/hello_with_data.wlang
215
309
  - spec/fixtures/templates/hello_with_explicit_locals.wlang
216
310
  - spec/fixtures/templates/hello_with_partials.wlang
@@ -230,6 +324,7 @@ files:
230
324
  - spec/integration/html/test_sharp.rb
231
325
  - spec/integration/html/test_slash.rb
232
326
  - spec/integration/html/test_star.rb
327
+ - spec/integration/sinatra/test_partials.rb
233
328
  - spec/integration/test_dummy.rb
234
329
  - spec/integration/test_examples.rb
235
330
  - spec/integration/test_readme.rb
@@ -249,19 +344,21 @@ files:
249
344
  - spec/unit/compiler/test_to_ruby_code.rb
250
345
  - spec/unit/compiler/test_to_ruby_proc.rb
251
346
  - spec/unit/dialect/test_compile.rb
347
+ - spec/unit/dialect/test_context.rb
252
348
  - spec/unit/dialect/test_evaluate.rb
253
349
  - spec/unit/dialect/test_new.rb
254
350
  - spec/unit/dialect/test_render.rb
255
351
  - spec/unit/dialect/test_tag.rb
256
352
  - spec/unit/dialect/test_tag_dispatching_name.rb
257
353
  - spec/unit/dialect/test_with_scope.rb
354
+ - spec/unit/scope/sinatra_scope/test_fetch.rb
258
355
  - spec/unit/scope/test_binding_scope.rb
259
356
  - spec/unit/scope/test_chain.rb
260
357
  - spec/unit/scope/test_coerce.rb
358
+ - spec/unit/scope/test_null_scope.rb
261
359
  - spec/unit/scope/test_object_scope.rb
262
360
  - spec/unit/scope/test_proc_scope.rb
263
- - spec/unit/scope/test_proxy_scope.rb
264
- - spec/unit/scope/test_root_scope.rb
361
+ - spec/unit/scope/test_push.rb
265
362
  - spec/unit/source/front_matter/test_locals.rb
266
363
  - spec/unit/source/front_matter/test_template_content.rb
267
364
  - spec/unit/source/test_locals.rb
@@ -269,6 +366,7 @@ files:
269
366
  - spec/unit/source/test_template_content.rb
270
367
  - spec/unit/source/test_with_front_matter.rb
271
368
  - spec/unit/template/test_call.rb
369
+ - spec/unit/template/test_call_args_conventions.rb
272
370
  - spec/unit/template/test_new.rb
273
371
  - spec/unit/template/test_path.rb
274
372
  - spec/unit/template/test_render.rb
@@ -297,22 +395,30 @@ required_ruby_version: !ruby/object:Gem::Requirement
297
395
  - - ! '>='
298
396
  - !ruby/object:Gem::Version
299
397
  version: '0'
398
+ segments:
399
+ - 0
400
+ hash: -1010122426012540526
300
401
  required_rubygems_version: !ruby/object:Gem::Requirement
301
402
  none: false
302
403
  requirements:
303
404
  - - ! '>='
304
405
  - !ruby/object:Gem::Version
305
406
  version: '0'
407
+ segments:
408
+ - 0
409
+ hash: -1010122426012540526
306
410
  requirements: []
307
411
  rubyforge_project:
308
- rubygems_version: 1.8.15
412
+ rubygems_version: 1.8.24
309
413
  signing_key:
310
414
  specification_version: 3
311
415
  summary: WLang is a powerful code generation and templating engine
312
416
  test_files:
417
+ - spec/assumptions/test_core.rb
313
418
  - spec/fixtures/dialect/foobar.rb
314
419
  - spec/fixtures/dialect/upcasing.rb
315
420
  - spec/fixtures/templates/hello.wlang
421
+ - spec/fixtures/templates/hello_from_sinatra.wlang
316
422
  - spec/fixtures/templates/hello_with_data.wlang
317
423
  - spec/fixtures/templates/hello_with_explicit_locals.wlang
318
424
  - spec/fixtures/templates/hello_with_partials.wlang
@@ -332,6 +438,7 @@ test_files:
332
438
  - spec/integration/html/test_sharp.rb
333
439
  - spec/integration/html/test_slash.rb
334
440
  - spec/integration/html/test_star.rb
441
+ - spec/integration/sinatra/test_partials.rb
335
442
  - spec/integration/test_dummy.rb
336
443
  - spec/integration/test_examples.rb
337
444
  - spec/integration/test_readme.rb
@@ -351,19 +458,21 @@ test_files:
351
458
  - spec/unit/compiler/test_to_ruby_code.rb
352
459
  - spec/unit/compiler/test_to_ruby_proc.rb
353
460
  - spec/unit/dialect/test_compile.rb
461
+ - spec/unit/dialect/test_context.rb
354
462
  - spec/unit/dialect/test_evaluate.rb
355
463
  - spec/unit/dialect/test_new.rb
356
464
  - spec/unit/dialect/test_render.rb
357
465
  - spec/unit/dialect/test_tag.rb
358
466
  - spec/unit/dialect/test_tag_dispatching_name.rb
359
467
  - spec/unit/dialect/test_with_scope.rb
468
+ - spec/unit/scope/sinatra_scope/test_fetch.rb
360
469
  - spec/unit/scope/test_binding_scope.rb
361
470
  - spec/unit/scope/test_chain.rb
362
471
  - spec/unit/scope/test_coerce.rb
472
+ - spec/unit/scope/test_null_scope.rb
363
473
  - spec/unit/scope/test_object_scope.rb
364
474
  - spec/unit/scope/test_proc_scope.rb
365
- - spec/unit/scope/test_proxy_scope.rb
366
- - spec/unit/scope/test_root_scope.rb
475
+ - spec/unit/scope/test_push.rb
367
476
  - spec/unit/source/front_matter/test_locals.rb
368
477
  - spec/unit/source/front_matter/test_template_content.rb
369
478
  - spec/unit/source/test_locals.rb
@@ -371,6 +480,7 @@ test_files:
371
480
  - spec/unit/source/test_template_content.rb
372
481
  - spec/unit/source/test_with_front_matter.rb
373
482
  - spec/unit/template/test_call.rb
483
+ - spec/unit/template/test_call_args_conventions.rb
374
484
  - spec/unit/template/test_new.rb
375
485
  - spec/unit/template/test_path.rb
376
486
  - spec/unit/template/test_render.rb