nm 0.5.4 → 0.6.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.
metadata CHANGED
@@ -1,46 +1,80 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: nm
3
- version: !ruby/object:Gem::Version
4
- version: 0.5.4
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.6.0
5
5
  platform: ruby
6
- authors:
6
+ authors:
7
7
  - Kelly Redding
8
8
  - Collin Redding
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2016-09-30 00:00:00 Z
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
16
- name: assert
12
+ date: 2021-06-23 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: much-style-guide
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: 0.6.6
21
+ type: :development
17
22
  prerelease: false
18
- requirement: &id001 !ruby/object:Gem::Requirement
19
- requirements:
20
- - - ~>
21
- - !ruby/object:Gem::Version
22
- version: 2.16.1
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: 0.6.6
28
+ - !ruby/object:Gem::Dependency
29
+ name: assert
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: 2.19.6
23
35
  type: :development
24
- version_requirements: *id001
25
- description: Data templating system.
26
- email:
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: 2.19.6
42
+ - !ruby/object:Gem::Dependency
43
+ name: much-mixin
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: 0.2.4
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: 0.2.4
56
+ description: 'Node-Map: a data templating DSL.'
57
+ email:
27
58
  - kelly@kellyredding.com
28
59
  - collin.redding@me.com
29
60
  executables: []
30
-
31
61
  extensions: []
32
-
33
62
  extra_rdoc_files: []
34
-
35
- files:
36
- - .gitignore
63
+ files:
64
+ - ".gitignore"
65
+ - ".l.yml"
66
+ - ".rubocop.yml"
67
+ - ".ruby-version"
68
+ - ".t.yml"
37
69
  - Gemfile
38
70
  - LICENSE
39
71
  - README.md
40
72
  - lib/nm.rb
73
+ - lib/nm/context.rb
41
74
  - lib/nm/ext.rb
75
+ - lib/nm/render.rb
42
76
  - lib/nm/source.rb
43
- - lib/nm/template.rb
77
+ - lib/nm/template_behaviors.rb
44
78
  - lib/nm/version.rb
45
79
  - log/.gitkeep
46
80
  - nm.gemspec
@@ -54,37 +88,38 @@ files:
54
88
  - test/support/templates/locals.nm
55
89
  - test/support/templates/locals_alt.data.inem
56
90
  - test/support/templates/obj.nm
91
+ - test/system/.keep
92
+ - test/unit/context_tests.rb
57
93
  - test/unit/ext_tests.rb
94
+ - test/unit/nm_tests.rb
95
+ - test/unit/render_tests.rb
58
96
  - test/unit/source_tests.rb
59
- - test/unit/template_tests.rb
97
+ - test/unit/template_behaviors_tests.rb
60
98
  - tmp/.gitkeep
61
99
  homepage: http://github.com/redding/nm
62
- licenses:
100
+ licenses:
63
101
  - MIT
64
102
  metadata: {}
65
-
66
103
  post_install_message:
67
104
  rdoc_options: []
68
-
69
- require_paths:
105
+ require_paths:
70
106
  - lib
71
- required_ruby_version: !ruby/object:Gem::Requirement
72
- requirements:
73
- - &id002
74
- - ">="
75
- - !ruby/object:Gem::Version
76
- version: "0"
77
- required_rubygems_version: !ruby/object:Gem::Requirement
78
- requirements:
79
- - *id002
107
+ required_ruby_version: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - "~>"
110
+ - !ruby/object:Gem::Version
111
+ version: '2.5'
112
+ required_rubygems_version: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
80
117
  requirements: []
81
-
82
- rubyforge_project:
83
- rubygems_version: 2.6.6
118
+ rubygems_version: 3.1.6
84
119
  signing_key:
85
120
  specification_version: 4
86
- summary: Data templating system.
87
- test_files:
121
+ summary: 'Node-Map: a data templating DSL.'
122
+ test_files:
88
123
  - test/helper.rb
89
124
  - test/support/factory.rb
90
125
  - test/support/templates/_list.nm
@@ -95,6 +130,10 @@ test_files:
95
130
  - test/support/templates/locals.nm
96
131
  - test/support/templates/locals_alt.data.inem
97
132
  - test/support/templates/obj.nm
133
+ - test/system/.keep
134
+ - test/unit/context_tests.rb
98
135
  - test/unit/ext_tests.rb
136
+ - test/unit/nm_tests.rb
137
+ - test/unit/render_tests.rb
99
138
  - test/unit/source_tests.rb
100
- - test/unit/template_tests.rb
139
+ - test/unit/template_behaviors_tests.rb
data/lib/nm/template.rb DELETED
@@ -1,103 +0,0 @@
1
- require 'nm/source'
2
- require 'nm/ext'
3
-
4
- module Nm
5
-
6
- class Template
7
-
8
- def initialize(*args)
9
- @__dstack__ = [nil]
10
-
11
- # apply any given locals to template scope as methods
12
- metaclass = class << self; self; end
13
- metaclass.class_eval do
14
- (args.last.kind_of?(::Hash) ? args.pop : {}).each do |key, value|
15
- define_method(key){ value }
16
- end
17
- end
18
-
19
- source_file = args.last.kind_of?(::String) ? args.pop : ''
20
- @__source__ = args.last.kind_of?(Source) ? args.pop : DefaultSource.new
21
-
22
- return if source_file.empty?
23
- if !File.exists?(source_file)
24
- raise ArgumentError, "source file `#{source_file}` does not exist"
25
- end
26
-
27
- instance_eval(@__source__.data(source_file), source_file, 1)
28
- end
29
-
30
- def inspect
31
- "#<Template:#{@__source__.class}:#{'0x0%x' % (@__source__.object_id << 1)}"\
32
- " @__source__.root=#{@__source__.root.to_s.inspect}"\
33
- " __data__=#{self.__data__.inspect}>"
34
- end
35
-
36
- def __data__
37
- @__dstack__.last || ::Hash.new
38
- end
39
-
40
- def __node__(key, value = nil, &block)
41
- unless @__dstack__[-1].nil? || @__dstack__[-1].is_a?(::Hash)
42
- raise Nm::InvalidError, "invalid `node` call"
43
- end
44
- @__dstack__[-1] ||= ::Hash.new
45
-
46
- @__dstack__.push(nil)
47
- self.instance_exec(&(block || Proc.new {}))
48
- @__dstack__.pop.tap{ |v| @__dstack__[-1][key] = (v || value) }
49
-
50
- return self
51
- end
52
-
53
- alias_method :node, :__node__
54
- alias_method :_node, :__node__
55
- alias_method :n, :__node__
56
-
57
- def __map__(list, &block)
58
- unless list.respond_to?(:map)
59
- raise ArgumentError, "given list (`#{list.class}`) doesn't respond to `.map`"
60
- end
61
- unless @__dstack__[-1].nil? || @__dstack__[-1].is_a?(::Array)
62
- raise Nm::InvalidError, "invalid `map` call"
63
- end
64
- @__dstack__[-1] ||= ::Array.new
65
-
66
- list.map do |item|
67
- @__dstack__.push(nil)
68
- self.instance_exec(item, &(block || Proc.new {}))
69
- @__dstack__.pop.tap{ |v| @__dstack__[-1].push(v || item) }
70
- end
71
-
72
- return self
73
- end
74
-
75
- alias_method :map, :__map__
76
- alias_method :_map, :__map__
77
- alias_method :m, :__map__
78
-
79
- def __render__(*args)
80
- data = @__source__.render(*args)
81
- @__dstack__[-1] = @__dstack__[-1].__nm_add_call_data__('render', data)
82
-
83
- return self
84
- end
85
-
86
- alias_method :render, :__render__
87
- alias_method :_render, :__render__
88
- alias_method :r, :__render__
89
-
90
- def __partial__(*args)
91
- data = @__source__.partial(*args)
92
- @__dstack__[-1] = @__dstack__[-1].__nm_add_call_data__('partial', data)
93
-
94
- return self
95
- end
96
-
97
- alias_method :partial, :__partial__
98
- alias_method :_partial, :__partial__
99
- alias_method :p, :__partial__
100
-
101
- end
102
-
103
- end
@@ -1,357 +0,0 @@
1
- require 'assert'
2
- require 'nm/template'
3
-
4
- require 'nm/ext'
5
- require 'nm/source'
6
-
7
- class Nm::Template
8
-
9
- class UnitTests < Assert::Context
10
- desc "Nm::Template"
11
- subject{ Nm::Template }
12
-
13
- end
14
-
15
- class InitTests < UnitTests
16
- desc "when init"
17
- setup do
18
- @template = Nm::Template.new
19
- end
20
- subject{ @template }
21
-
22
- should have_imeths :__data__, :__node__, :__map__, :__render__, :__partial__
23
- should have_imeths :node, :_node, :n
24
- should have_imeths :map, :_map, :m
25
- should have_imeths :render, :_render, :r
26
- should have_imeths :partial, :_partial, :p
27
-
28
- should "have empty data if no markup meths called or no source given" do
29
- assert_equal ::Hash.new, subject.__data__
30
- end
31
-
32
- should "return itself when its markup methods are called" do
33
- t = Nm::Template.new
34
- assert_equal t, t.__node__('key', 'value')
35
-
36
- t = Nm::Template.new
37
- assert_equal t, t.__map__([], &Proc.new{})
38
-
39
- t = Nm::Template.new
40
- assert_equal t, t.__render__(Factory.template_file('obj'))
41
-
42
- t = Nm::Template.new
43
- assert_equal t, t.__partial__(Factory.template_file('obj'))
44
- end
45
-
46
- end
47
-
48
- class NodeMethodTests < UnitTests
49
- desc "`__node__` method"
50
-
51
- should "add key-value pairs at any level" do
52
- exp = {'a' => 'Aye'}
53
- assert_equal exp, Nm::Template.new.__node__('a', 'Aye').__data__
54
-
55
- exp = {
56
- 'nested' => {'a' => 'Aye'}
57
- }
58
- t = Nm::Template.new.__node__('nested'){ __node__('a', 'Aye') }
59
- assert_equal exp, t.__data__
60
- end
61
-
62
- should "be aliased as `node`, `_node` and `n`" do
63
- exp = {'a' => 'Aye'}
64
- assert_equal exp, Nm::Template.new.__node__('a', 'Aye').__data__
65
- assert_equal exp, Nm::Template.new.node('a', 'Aye').__data__
66
- assert_equal exp, Nm::Template.new._node('a', 'Aye').__data__
67
- assert_equal exp, Nm::Template.new.n('a', 'Aye').__data__
68
- end
69
-
70
- should "complain if called after a `__map__` call" do
71
- t = Nm::Template.new.__map__([1,2,3])
72
- assert_raises Nm::InvalidError do
73
- t.__node__('a', 'Aye')
74
- end
75
- end
76
-
77
- end
78
-
79
- class MapMethodTests < UnitTests
80
- desc "`map` method"
81
- setup do
82
- @list = [1,2,3]
83
- end
84
-
85
- should "map a given list to the data" do
86
- exp = @list
87
- assert_equal exp, Nm::Template.new.__map__(@list).__data__
88
-
89
- exp = [
90
- {'1' => 1},
91
- {'2' => 2},
92
- {'3' => 3},
93
- ]
94
- t = Nm::Template.new.__map__(@list){ |item| __node__(item.to_s, item) }
95
- assert_equal exp, t.__data__
96
-
97
- exp = {
98
- 'list' => [
99
- {'1' => 1},
100
- {'2' => 2},
101
- {'3' => 3},
102
- ]
103
- }
104
- list = @list
105
- t = Nm::Template.new.__node__('list') do
106
- __map__(list){ |item| __node__(item.to_s, item) }
107
- end
108
- assert_equal exp, t.__data__
109
- end
110
-
111
- should "be aliased as `map`, `_map` and `m`" do
112
- exp = @list
113
- assert_equal exp, Nm::Template.new.__map__(@list).__data__
114
- assert_equal exp, Nm::Template.new.map(@list).__data__
115
- assert_equal exp, Nm::Template.new._map(@list).__data__
116
- assert_equal exp, Nm::Template.new.m(@list).__data__
117
- end
118
-
119
- should "complain if given a list that doesn't respond to `.map`" do
120
- val = 123
121
- assert_not_responds_to 'map', val
122
- assert_raises ArgumentError do
123
- Nm::Template.new.__map__(val)
124
- end
125
- end
126
-
127
- should "complain if called after a `__node__` call" do
128
- t = Nm::Template.new.__node__('a', 'Aye')
129
- assert_raises Nm::InvalidError do
130
- t.__map__([1,2,3])
131
- end
132
- end
133
-
134
- end
135
-
136
- class RenderTests < InitTests
137
- setup do
138
- @source = Nm::Source.new(Factory.template_root)
139
-
140
- @obj_template_name = "obj"
141
- @obj = {
142
- 'obj' => {
143
- 'a' => 'Aye',
144
- 'b' => 'Bee',
145
- 'c' => 'See'
146
- }
147
- }
148
-
149
- @list_template_name = "list"
150
- @list = [
151
- { '1' => 1 },
152
- { '2' => 2 },
153
- { '3' => 3 }
154
- ]
155
- end
156
-
157
- end
158
-
159
- class RenderMethodTests < RenderTests
160
- desc "`render` method"
161
-
162
- should "render a template for the given template name and add its data" do
163
- t = Nm::Template.new(@source)
164
- assert_equal @obj, t.__render__(@obj_template_name).__data__
165
- end
166
-
167
- should "be aliased as `render`, `_render` and `r`" do
168
- t = Nm::Template.new(@source)
169
- assert_equal @obj, t.__render__(@obj_template_name).__data__
170
-
171
- t = Nm::Template.new(@source)
172
- assert_equal @obj, t.render(@obj_template_name).__data__
173
-
174
- t = Nm::Template.new(@source)
175
- assert_equal @obj, t._render(@obj_template_name).__data__
176
-
177
- t = Nm::Template.new(@source)
178
- assert_equal @obj, t.r(@obj_template_name).__data__
179
- end
180
-
181
- should "merge if call returns an obj and called after a `__node__` call" do
182
- t = Nm::Template.new(@source)
183
- t.__node__('1', 'One')
184
-
185
- exp = {'1' => 'One'}.merge(@obj)
186
- assert_equal exp, t.__render__(@obj_template_name).__data__
187
- end
188
-
189
- should "complain if call returns an obj and called after a `__map__` call" do
190
- t = Nm::Template.new(@source)
191
- t.__map__([1,2,3])
192
- assert_raises Nm::InvalidError do
193
- t.__render__(@obj_template_name).__data__
194
- end
195
- end
196
-
197
- should "concat if call returns a list and called after a `__map__` call" do
198
- t = Nm::Template.new(@source)
199
- t.__map__([1,2,3])
200
-
201
- exp = [1,2,3].concat(@list)
202
- assert_equal exp, t.__render__(@list_template_name).__data__
203
- end
204
-
205
- should "complain if call returns a list and called after a `__node__` call" do
206
- t = Nm::Template.new(@source)
207
- t.__node__('1', 'One')
208
-
209
- assert_raises Nm::InvalidError do
210
- t.__render__(@list_template_name).__data__
211
- end
212
- end
213
-
214
- end
215
-
216
- class PartialMethodTests < RenderTests
217
- desc "`partial` method"
218
- setup do
219
- @partial_obj_template_name = "_obj"
220
- @partial_obj = {
221
- 'a' => 'Aye',
222
- 'b' => 'Bee',
223
- 'c' => 'See'
224
- }
225
- @partial_list_template_name = "_list"
226
- @partial_list = @list
227
- end
228
-
229
- should "render a template for the given partial name and add its data" do
230
- t = Nm::Template.new(@source)
231
- assert_equal @partial_obj, t.__partial__(@partial_obj_template_name).__data__
232
- end
233
-
234
- should "be aliased as `render`, `_render` and `r`" do
235
- t = Nm::Template.new(@source)
236
- assert_equal @partial_obj, t.__partial__(@partial_obj_template_name).__data__
237
-
238
- t = Nm::Template.new(@source)
239
- assert_equal @partial_obj, t.partial(@partial_obj_template_name).__data__
240
-
241
- t = Nm::Template.new(@source)
242
- assert_equal @partial_obj, t._partial(@partial_obj_template_name).__data__
243
-
244
- t = Nm::Template.new(@source)
245
- assert_equal @partial_obj, t.p(@partial_obj_template_name).__data__
246
- end
247
-
248
- should "merge if call returns an obj and called after a `__node__` call" do
249
- t = Nm::Template.new(@source)
250
- t.__node__('1', 'One')
251
-
252
- exp = {'1' => 'One'}.merge(@partial_obj)
253
- assert_equal exp, t.__partial__(@partial_obj_template_name).__data__
254
- end
255
-
256
- should "complain if call returns an obj and called after a `__map__` call" do
257
- t = Nm::Template.new(@source)
258
- t.__map__([1,2,3])
259
- assert_raises Nm::InvalidError do
260
- t.__partial__(@partial_obj_template_name).__data__
261
- end
262
- end
263
-
264
- should "merge if call returns a list and called after a `__map__` call" do
265
- t = Nm::Template.new(@source)
266
- t.__map__([1,2,3])
267
-
268
- exp = [1,2,3].concat(@partial_list)
269
- assert_equal exp, t.__partial__(@partial_list_template_name).__data__
270
- end
271
-
272
- should "complain if call returns a list and called after a `__node__` call" do
273
- t = Nm::Template.new(@source)
274
- t.__node__('1', 'One')
275
-
276
- assert_raises Nm::InvalidError do
277
- t.__partial__(@partial_list_template_name).__data__
278
- end
279
- end
280
-
281
- end
282
-
283
- class SourceFileTests < UnitTests
284
- desc "when init given a source file"
285
- setup do
286
- @obj_source_file = Factory.template_file('obj.nm')
287
- @exp_obj = {
288
- 'obj' => {
289
- 'a' => 'Aye',
290
- 'b' => 'Bee',
291
- 'c' => 'See'
292
- }
293
- }
294
-
295
- @list_source_file = Factory.template_file('list.nm')
296
- @exp_list = [
297
- { '1' => 1 },
298
- { '2' => 2 },
299
- { '3' => 3 }
300
- ]
301
- end
302
-
303
- should "evaluate the source file" do
304
- assert_equal @exp_obj, Nm::Template.new(@obj_source_file).__data__
305
- assert_equal @exp_list, Nm::Template.new(@list_source_file).__data__
306
- end
307
-
308
- should "evaluate the source file with locals" do
309
- assert_equal @exp_obj, Nm::Template.new(@obj_source_file, {}).__data__
310
- assert_equal @exp_list, Nm::Template.new(@list_source_file, {}).__data__
311
- end
312
-
313
- end
314
-
315
- class NoExistSourceFileTests < UnitTests
316
- desc "when init given a source file that does not exist"
317
- setup do
318
- @no_exist_source_file = Factory.template_file('does-not-exist.nm')
319
- end
320
-
321
- should "complain that the source does not exist" do
322
- assert_raises ArgumentError do
323
- Nm::Template.new(@no_exist_source_file)
324
- end
325
- end
326
-
327
- end
328
-
329
- class LocalsTests < UnitTests
330
- desc "when init with locals"
331
- setup do
332
- @locals = {
333
- 'key' => 'value',
334
- 'node' => 'A Node',
335
- 'map' => 'A Map'
336
- }
337
- end
338
-
339
- should "expose the local as a reader method on the template" do
340
- t = Nm::Template.new
341
- assert_not_responds_to 'key', t
342
-
343
- t = Nm::Template.new(@locals)
344
- assert_equal 'value', t.key
345
- end
346
-
347
- should "not interfere with method aliases" do
348
- d = Nm::Template.new(Factory.template_file('aliases.nm'), @locals).__data__
349
- assert_kind_of ::Array, d
350
- assert_equal 1, d.size
351
- assert_equal 'A Node', d.first['node local value']
352
- assert_equal 'A Map', d.first['map local value']
353
- end
354
-
355
- end
356
-
357
- end