ltdtemplate 0.2.2 → 0.2.3
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.
- data/CHANGELOG +25 -0
- data/lib/ltdtemplate.rb +21 -12
- data/lib/ltdtemplate/code.rb +7 -6
- data/lib/ltdtemplate/code/code_block.rb +1 -1
- data/lib/ltdtemplate/code/variable.rb +1 -1
- data/lib/ltdtemplate/value/array.rb +9 -6
- data/lib/ltdtemplate/value/boolean.rb +3 -0
- data/lib/ltdtemplate/value/code_block.rb +3 -0
- data/lib/ltdtemplate/value/namespace.rb +9 -6
- data/lib/ltdtemplate/value/nil.rb +3 -0
- data/lib/ltdtemplate/value/number.rb +3 -0
- data/lib/ltdtemplate/value/string.rb +3 -0
- data/ltdtemplate.gemspec +2 -2
- data/test/09use.rb +15 -0
- data/test/10missing_meth.rb +18 -0
- data/test/11classes.rb +47 -0
- metadata +9 -3
data/CHANGELOG
CHANGED
@@ -1,4 +1,21 @@
|
|
1
|
+
2013-08-04 Version 0.2.3
|
2
|
+
|
3
|
+
Documented LtdTemplate constructor options, including the new
|
4
|
+
:missing_method option to supply a callback for missing method
|
5
|
+
calls (an alternative to subclassing LtdTemplate::Value classes).
|
6
|
+
Fixed implementation of class and instance set_classes methods
|
7
|
+
(which can now also accept a loaded class constant as an
|
8
|
+
alternative to a class name string).
|
9
|
+
|
10
|
+
LtdTemplate value classes now have a "type" method that returns
|
11
|
+
an associated symbol (e.g., :nil, :number, :string) for use by
|
12
|
+
the :missing_method callback.
|
13
|
+
|
14
|
+
Added test cases for $.use, the :missing_method callback, and
|
15
|
+
class and instance set_classes methods.
|
16
|
+
|
1
17
|
2013-07-29 Version 0.2.2
|
18
|
+
|
2
19
|
Added string methods capcase, downcase, join, regexp,
|
3
20
|
rep/replace, rep1/replace1, split, and upcase.
|
4
21
|
|
@@ -9,6 +26,7 @@
|
|
9
26
|
also renamed RESOURCES.txt to RESOURCES.
|
10
27
|
|
11
28
|
2013-07-28 Version 0.2.1
|
29
|
+
|
12
30
|
Added array.{each,each_rnd,each_seq} methods (executing the code
|
13
31
|
block supplied as the first parameter with parameters key and
|
14
32
|
value).
|
@@ -20,23 +38,29 @@
|
|
20
38
|
an array, hash, or Sarah as required for the data.
|
21
39
|
|
22
40
|
2013-07-24 Version 0.1.5
|
41
|
+
|
23
42
|
Added RESOURCES.txt to .yardopts. OOPS!
|
24
43
|
|
25
44
|
2013-07-24 Version 0.1.4
|
45
|
+
|
26
46
|
Added String.html (HTML encoding) and String.pcte (percent encoding)
|
27
47
|
methods. Added RESOURCES.txt describing resource usage/limits.
|
28
48
|
|
29
49
|
2013-07-13 Version 0.1.3
|
50
|
+
|
30
51
|
Fix broken links and otherwise add some polish to TEMPLATE_MANUAL.html.
|
31
52
|
|
32
53
|
2013-07-13 Version 0.1.2
|
54
|
+
|
33
55
|
Added .yardopts to gemspec. Still trying to get the hang of Ruby
|
34
56
|
packaging.
|
35
57
|
|
36
58
|
2013-07-12 Version 0.1.1
|
59
|
+
|
37
60
|
Added Gemfile
|
38
61
|
|
39
62
|
2013-07-12 Version 0.1.0
|
63
|
+
|
40
64
|
Fixed class names in unit tests.
|
41
65
|
String.* now handles multipliers <= 0.
|
42
66
|
Added number.abs (absolute value) method.
|
@@ -50,4 +74,5 @@
|
|
50
74
|
Added the template manual (TEMPLATE_MANUAL.html).
|
51
75
|
|
52
76
|
2013-07-08 Version 0.0.1
|
77
|
+
|
53
78
|
First release
|
data/lib/ltdtemplate.rb
CHANGED
@@ -8,7 +8,7 @@
|
|
8
8
|
|
9
9
|
class LtdTemplate
|
10
10
|
|
11
|
-
VERSION = '0.2.
|
11
|
+
VERSION = '0.2.3'
|
12
12
|
|
13
13
|
TOKEN_MAP = {
|
14
14
|
?. => :dot, # method separator
|
@@ -95,14 +95,16 @@ class LtdTemplate
|
|
95
95
|
@@classes.merge! classes
|
96
96
|
end
|
97
97
|
|
98
|
+
# Constructor
|
99
|
+
#
|
100
|
+
# @param options [Hash] Options hash
|
101
|
+
# @option options [Proc] :loader Callback for $.use method
|
102
|
+
# @option options [Proc] :missing_method Callback for missing methods
|
98
103
|
def initialize (options = {})
|
99
|
-
@classes =
|
100
|
-
@code = nil
|
101
|
-
@
|
102
|
-
@limits = {}
|
103
|
-
@namespace = nil
|
104
|
+
@classes, @factory_singletons = {}, {}
|
105
|
+
@code, @namespace = nil, nil
|
106
|
+
@limits, @usage = {}, {}
|
104
107
|
@options = options
|
105
|
-
@usage = {}
|
106
108
|
@used = {}
|
107
109
|
end
|
108
110
|
|
@@ -143,7 +145,7 @@ class LtdTemplate
|
|
143
145
|
self
|
144
146
|
end
|
145
147
|
|
146
|
-
#
|
148
|
+
# Override default factory classes for this template instance.
|
147
149
|
#
|
148
150
|
# @param classes [Hash] A hash of factory symbols and corresponding
|
149
151
|
# classes to be instantiated.
|
@@ -161,12 +163,19 @@ class LtdTemplate
|
|
161
163
|
# @return Returns the new code/value object.
|
162
164
|
def factory (type, *args)
|
163
165
|
use :factory
|
164
|
-
type = @classes[type]
|
165
|
-
|
166
|
-
|
167
|
-
|
166
|
+
type = @classes[type] || @@classes[type]
|
167
|
+
if type.is_a? String
|
168
|
+
file = type.downcase.gsub '::', File::SEPARATOR
|
169
|
+
require file
|
170
|
+
eval(type).instance(self, *args)
|
171
|
+
else
|
172
|
+
type.instance(self, *args)
|
173
|
+
end
|
168
174
|
end
|
169
175
|
|
176
|
+
# Shortcut for frequently used template factory :nil
|
177
|
+
def nil; @factory_singletons[:nil] || factory(:nil); end
|
178
|
+
|
170
179
|
# Render the template.
|
171
180
|
#
|
172
181
|
# The options hash may include :parameters, which may be an array or
|
data/lib/ltdtemplate/code.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
|
-
class LtdTemplate; end
|
2
|
-
|
3
1
|
# LtdTemplate::Code - Base class for LtdTemplate code/value objects
|
4
2
|
#
|
5
3
|
# @author Brian Katzung <briank@kappacs.com>, Kappa Computer Solutions, LLC
|
6
4
|
# @copyright 2013 Brian Katzung and Kappa Computer Solutions, LLC
|
7
5
|
# @license MIT License
|
8
6
|
|
7
|
+
class LtdTemplate; end
|
8
|
+
|
9
9
|
class LtdTemplate::Code
|
10
10
|
|
11
11
|
# @!attribute [r] tpl_methods
|
@@ -38,8 +38,7 @@ class LtdTemplate::Code
|
|
38
38
|
# @param key [String] The (native) string for the method.
|
39
39
|
# @return [LtdTemplate::Value::Code_Block]
|
40
40
|
def get_item (key)
|
41
|
-
(@tpl_methods.has_key? key) ? @tpl_methods[key] :
|
42
|
-
@template.factory(:nil)
|
41
|
+
(@tpl_methods.has_key? key) ? @tpl_methods[key] : @template.nil
|
43
42
|
end
|
44
43
|
|
45
44
|
# Set a non-array value's method code block.
|
@@ -72,7 +71,7 @@ class LtdTemplate::Code
|
|
72
71
|
if params = opts[:parameters]
|
73
72
|
set_value(params.scalar? ? params.positional[0] : params)
|
74
73
|
end
|
75
|
-
@template.
|
74
|
+
@template.nil
|
76
75
|
end
|
77
76
|
|
78
77
|
# Try to execute code-block methods bound to the object or object
|
@@ -91,8 +90,10 @@ class LtdTemplate::Code
|
|
91
90
|
if method
|
92
91
|
opts[:target] = self
|
93
92
|
method.get_value opts
|
93
|
+
elsif mmproc = @template.options[:missing_method]
|
94
|
+
mmproc.call(@template, self, opts) || @template.nil
|
94
95
|
else
|
95
|
-
@template.
|
96
|
+
@template.nil
|
96
97
|
end
|
97
98
|
end
|
98
99
|
|
@@ -21,7 +21,7 @@ class LtdTemplate::Code::Code_Block < LtdTemplate::Code
|
|
21
21
|
def get_value (opts = {})
|
22
22
|
values = @code.map { |part| part.get_value }.flatten
|
23
23
|
case values.size
|
24
|
-
when 0 then @template.
|
24
|
+
when 0 then @template.nil
|
25
25
|
when 1 then values[0]
|
26
26
|
else @template.factory(:array).set_value(values)
|
27
27
|
end
|
@@ -67,7 +67,7 @@ class LtdTemplate::Code::Variable < LtdTemplate::Code
|
|
67
67
|
case opts[:method]
|
68
68
|
when '=' then do_set opts # see LtdTemplate::Code
|
69
69
|
when '?='
|
70
|
-
if is_set? then @template.
|
70
|
+
if is_set? then @template.nil
|
71
71
|
else do_set opts
|
72
72
|
end
|
73
73
|
else target.get_value opts
|
@@ -37,7 +37,7 @@ class LtdTemplate::Value::Array < LtdTemplate::Code
|
|
37
37
|
#
|
38
38
|
def has_item? (key); @sarah.has_key? key; end
|
39
39
|
def get_item (key)
|
40
|
-
@sarah.has_key?(key) ? @sarah[key] : @template.
|
40
|
+
@sarah.has_key?(key) ? @sarah[key] : @template.nil
|
41
41
|
end
|
42
42
|
def set_item (key, value)
|
43
43
|
@sarah[key] = value
|
@@ -75,6 +75,9 @@ class LtdTemplate::Value::Array < LtdTemplate::Code
|
|
75
75
|
end
|
76
76
|
end
|
77
77
|
|
78
|
+
# Type (for :missing_method callback)
|
79
|
+
def type; :array; end
|
80
|
+
|
78
81
|
#
|
79
82
|
# Scalar assignment is used instead of array assignment if the
|
80
83
|
# parameter list contains exactly one positional parameter and
|
@@ -175,21 +178,21 @@ class LtdTemplate::Value::Array < LtdTemplate::Code
|
|
175
178
|
end
|
176
179
|
|
177
180
|
def do_pop (opts)
|
178
|
-
@sarah.pop || @template.
|
181
|
+
@sarah.pop || @template.nil
|
179
182
|
end
|
180
183
|
|
181
184
|
def do_push (opts)
|
182
185
|
if params = opts[:parameters] then @sarah.append! params.sarah end
|
183
|
-
@template.
|
186
|
+
@template.nil
|
184
187
|
end
|
185
188
|
|
186
189
|
def do_shift (opts)
|
187
|
-
@sarah.shift || @template.
|
190
|
+
@sarah.shift || @template.nil
|
188
191
|
end
|
189
192
|
|
190
193
|
def do_unshift (opts)
|
191
194
|
if params = opts[:parameters] then @sarah.insert! params.sarah end
|
192
|
-
@template.
|
195
|
+
@template.nil
|
193
196
|
end
|
194
197
|
|
195
198
|
protected
|
@@ -201,7 +204,7 @@ class LtdTemplate::Value::Array < LtdTemplate::Code
|
|
201
204
|
value.is_a? Array
|
202
205
|
return @template.factory(:array).set_from_hash value if
|
203
206
|
value.is_a? Hash
|
204
|
-
@template.
|
207
|
+
@template.nil
|
205
208
|
end
|
206
209
|
|
207
210
|
end
|
@@ -37,6 +37,9 @@ class LtdTemplate::Value::Boolean < LtdTemplate::Code
|
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
|
+
# Type (for :missing_method callback)
|
41
|
+
def type; :boolean; end
|
42
|
+
|
40
43
|
# Implement +/| (or):
|
41
44
|
# bool|(bool1, ..., boolN)
|
42
45
|
# True if ANY boolean is true. Evaluates {} blocks until true.
|
@@ -72,8 +72,8 @@ class LtdTemplate::Value::Namespace < LtdTemplate::Value::Array
|
|
72
72
|
when 'if' then do_if opts
|
73
73
|
when 'loop' then do_loop opts
|
74
74
|
when 'method' then method_string
|
75
|
-
when 'nil' then @template.
|
76
|
-
when 'target' then @target || @template.
|
75
|
+
when 'nil' then @template.nil
|
76
|
+
when 'target' then @target || @template.nil
|
77
77
|
when 'true' then @template.factory :boolean, true
|
78
78
|
when 'use' then do_use opts
|
79
79
|
when 'var' then do_add_names opts
|
@@ -81,18 +81,21 @@ class LtdTemplate::Value::Namespace < LtdTemplate::Value::Array
|
|
81
81
|
end
|
82
82
|
end
|
83
83
|
|
84
|
+
# Type (for :missing_method callback)
|
85
|
+
def type; :namespace; end
|
86
|
+
|
84
87
|
# Add new namespace names with nil or specific values
|
85
88
|
#
|
86
89
|
def do_add_names (opts)
|
87
90
|
params = opts[:parameters]
|
88
91
|
if params.positional.size
|
89
|
-
tnil = @template.
|
92
|
+
tnil = @template.nil
|
90
93
|
params.positional.each { |item| set_item(item.to_native, tnil) }
|
91
94
|
end
|
92
95
|
if params.named.size
|
93
96
|
params.named.each { |item, val| set_item(item, val) }
|
94
97
|
end
|
95
|
-
@template.
|
98
|
+
@template.nil
|
96
99
|
end
|
97
100
|
|
98
101
|
# Implement conditionals
|
@@ -111,7 +114,7 @@ class LtdTemplate::Value::Namespace < LtdTemplate::Value::Array
|
|
111
114
|
return e2.get_value(:method => 'call') if e1.to_boolean
|
112
115
|
end
|
113
116
|
end
|
114
|
-
@template.
|
117
|
+
@template.nil
|
115
118
|
end
|
116
119
|
|
117
120
|
def do_loop (opts)
|
@@ -141,7 +144,7 @@ class LtdTemplate::Value::Namespace < LtdTemplate::Value::Array
|
|
141
144
|
result.kind_of? String
|
142
145
|
end
|
143
146
|
end
|
144
|
-
tpl.
|
147
|
+
tpl.nil
|
145
148
|
end
|
146
149
|
|
147
150
|
end
|
@@ -45,6 +45,9 @@ class LtdTemplate::Value::Number < LtdTemplate::Code
|
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
48
|
+
# Type (for :missing_method callback)
|
49
|
+
def type; :number; end
|
50
|
+
|
48
51
|
# Implement sequential operations (+, *, /, %, &, |, ^)
|
49
52
|
def do_sequential (opts = {}, &block)
|
50
53
|
if params = opts[:parameters]
|
data/ltdtemplate.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "ltdtemplate"
|
3
|
-
s.version = "0.2.
|
4
|
-
s.date = "2013-
|
3
|
+
s.version = "0.2.3"
|
4
|
+
s.date = "2013-08-04"
|
5
5
|
s.authors = ["Brian Katzung"]
|
6
6
|
s.email = ["briank@kappacs.com"]
|
7
7
|
s.homepage = "http://rubygems.org/gems/ltdtemplate"
|
data/test/09use.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'ltdtemplate'
|
3
|
+
|
4
|
+
class TestLtdTemplate_09 < MiniTest::Unit::TestCase
|
5
|
+
|
6
|
+
def test_use1
|
7
|
+
loader = Proc.new { |tpl, name| "@#{name}=(0+(@#{name},1))" }
|
8
|
+
tpl = LtdTemplate.new :loader => loader
|
9
|
+
tpl.parse "<<$.use('ab)$.use('cd)$.use('ab)\",\".join(@ab,@cd)>>"
|
10
|
+
assert_equal "1,1", tpl.render, "use ab, cd, ab counts => 1, 1"
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
# END
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'ltdtemplate'
|
3
|
+
|
4
|
+
class TestLtdTemplate_10 < MiniTest::Unit::TestCase
|
5
|
+
|
6
|
+
def test_missing_meth1
|
7
|
+
miss_meth = Proc.new do |tpl, obj, opt|
|
8
|
+
tpl.factory :string, "#{obj.type}.#{opt[:method]};"
|
9
|
+
end
|
10
|
+
tpl = LtdTemplate.new :missing_method => miss_meth
|
11
|
+
tpl.parse "<<$.*.abc 1.def '.ghi>>"
|
12
|
+
assert_equal "array.abc;number.def;string.ghi;", tpl.render,
|
13
|
+
"missing method ary.abc, num.def, str.def"
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
# END
|
data/test/11classes.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'ltdtemplate'
|
3
|
+
require 'ltdtemplate/value/nil'
|
4
|
+
|
5
|
+
class TestLtdTemplate_11 < MiniTest::Unit::TestCase
|
6
|
+
|
7
|
+
def test_classes1
|
8
|
+
LtdTemplate.set_classes :nil => Nil1
|
9
|
+
tpl = LtdTemplate.new
|
10
|
+
tpl.parse '<<$.nil.type>>'
|
11
|
+
assert_equal 'nil1', tpl.render, 'nil type after class class change'
|
12
|
+
|
13
|
+
tpl = LtdTemplate.new
|
14
|
+
tpl.set_classes :nil => Nil2
|
15
|
+
tpl.parse '<<$.nil.type>>'
|
16
|
+
assert_equal 'nil2', tpl.render, 'nil type after instance class change'
|
17
|
+
|
18
|
+
tpl = LtdTemplate.new
|
19
|
+
tpl.parse '<<$.nil.type>>'
|
20
|
+
assert_equal 'nil1', tpl.render, 'recheck nil type after class change'
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
class Nil1 < LtdTemplate::Value::Nil
|
26
|
+
|
27
|
+
def get_value (opts = {})
|
28
|
+
case opts[:method]
|
29
|
+
when 'type' then @template.factory :string, 'nil1'
|
30
|
+
else super
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
class Nil2 < LtdTemplate::Value::Nil
|
37
|
+
|
38
|
+
def get_value (opts = {})
|
39
|
+
case opts[:method]
|
40
|
+
when 'type' then @template.factory :string, 'nil2'
|
41
|
+
else super
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
# END
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 2
|
8
|
-
-
|
9
|
-
version: 0.2.
|
8
|
+
- 3
|
9
|
+
version: 0.2.3
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Brian Katzung
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2013-
|
17
|
+
date: 2013-08-04 00:00:00 -05:00
|
18
18
|
default_executable:
|
19
19
|
dependencies: []
|
20
20
|
|
@@ -49,6 +49,7 @@ files:
|
|
49
49
|
- CHANGELOG
|
50
50
|
- RESOURCES
|
51
51
|
- TEMPLATE_MANUAL.html
|
52
|
+
- test/10missing_meth.rb
|
52
53
|
- test/00class.rb
|
53
54
|
- test/04number.rb
|
54
55
|
- test/05string.rb
|
@@ -58,6 +59,8 @@ files:
|
|
58
59
|
- test/08interpolate.rb
|
59
60
|
- test/01instance.rb
|
60
61
|
- test/02tpl_literal.rb
|
62
|
+
- test/09use.rb
|
63
|
+
- test/11classes.rb
|
61
64
|
has_rdoc: true
|
62
65
|
homepage: http://rubygems.org/gems/ltdtemplate
|
63
66
|
licenses:
|
@@ -91,6 +94,7 @@ signing_key:
|
|
91
94
|
specification_version: 3
|
92
95
|
summary: A resource-limitable, textual templating system
|
93
96
|
test_files:
|
97
|
+
- test/10missing_meth.rb
|
94
98
|
- test/00class.rb
|
95
99
|
- test/04number.rb
|
96
100
|
- test/05string.rb
|
@@ -100,3 +104,5 @@ test_files:
|
|
100
104
|
- test/08interpolate.rb
|
101
105
|
- test/01instance.rb
|
102
106
|
- test/02tpl_literal.rb
|
107
|
+
- test/09use.rb
|
108
|
+
- test/11classes.rb
|