clerq 0.3.3 → 0.3.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -1
- data/Gemfile.lock +1 -1
- data/README.md +24 -23
- data/docs/README.md +27 -20
- data/docs/promo.png +0 -0
- data/lib/assets/lib/clerq_doc.thor +1 -1
- data/lib/assets/lib/markup_macro.rb +77 -0
- data/lib/assets/lib/markup_node.rb +86 -0
- data/lib/assets/lib/spec/markup_macro_spec.rb +91 -0
- data/lib/assets/lib/spec/markup_node_spec.rb +34 -0
- data/lib/assets/promo/bin/Clerq SRS.docx +0 -0
- data/lib/assets/promo/bin/Clerq SRS.md +62 -252
- data/lib/assets/promo/bin/assets/promo_dark.png +0 -0
- data/lib/assets/promo/promo.thor +1 -1
- data/lib/assets/promo/src/clerq.md +10 -12
- data/lib/assets/tt/default.md.erb +3 -36
- data/lib/clerq/services/service.rb +8 -2
- data/lib/clerq/version.rb +1 -1
- data/promo.png +0 -0
- metadata +8 -3
- data/lib/assets/tt/pandoc.md.erb +0 -91
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 74e2ec342a403fb52eef258b5c8e537c9b64ec266f31f934edaaefe8cffadfd1
|
4
|
+
data.tar.gz: 1f2baaec876667bfd67d99e75d36abc20e4f1ddcbe99e60687093d48325b51f9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0dafc680ff7353b9102d2f8d869258c19980d2b35202c2c2fc10de639cd3223d619af8726e592a65924f5c30bcee0fc0ded2ab6923df193ac1dd5fdbed597b1b
|
7
|
+
data.tar.gz: b6f732d36363c8a5eb4d283b14fa27c209909724820676b19541d767cee77cae69113dad1fea454e7aaf474c4ac06982543a9ffe34fbc337ad8a24c57dd38ca2
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,12 @@
|
|
1
1
|
# Change log
|
2
2
|
|
3
|
-
## 0.3.
|
3
|
+
## 0.3.4 (2021-06-01)
|
4
|
+
|
5
|
+
* Now the gem works for both Ruby versions 2.X and 3.X.
|
6
|
+
* Improved templates. MarkupNode was extracted to separate file and single template defalult.md.erb was left; cleaned templates tests.
|
7
|
+
* Improved `promo:publish` command and now it's using default.md.erb
|
8
|
+
|
9
|
+
## 0.3.3 (2021-05-25)
|
4
10
|
|
5
11
|
* Updated keyword argument in Service class to support Ruby 3. If you need Ruby 2.X support, you should use v0.3.2.
|
6
12
|
* Updated `minitest`, `bundler` and `thor` dependencies.
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -18,11 +18,19 @@ Install it yourself as:
|
|
18
18
|
|
19
19
|
$ gem install clerq
|
20
20
|
|
21
|
-
|
21
|
+
## Promo
|
22
22
|
|
23
|
-
|
23
|
+
![Clerq Promo Project](promo.png)
|
24
24
|
|
25
|
-
|
25
|
+
Inside Clerq there is a demo project that was created and is still used to develop Clerq itself and its script-extensions. You can see the project [here](https://github.com/nvoynov/clerq/tree/master/lib/assets/promo) ([requirements sources](https://github.com/nvoynov/clerq/tree/master/lib/assets/promo/src) and produced documents [Clerq SRS.md](https://github.com/nvoynov/clerq/blob/master/lib/assets/promo/bin/Clerq%20SRS.md), [Clerq SRS.docx](https://github.com/nvoynov/clerq/blob/master/lib/assets/promo/bin/Clerq%20SRS.docx))
|
26
|
+
|
27
|
+
I am sure this project will be useful when you get to know the product. So, I propose to open it now and look inside as you move forward. Do the following in your console:
|
28
|
+
|
29
|
+
$ clerq new promo
|
30
|
+
$ cd promo
|
31
|
+
$ clerq promo
|
32
|
+
$ atom .
|
33
|
+
$ thor list
|
26
34
|
|
27
35
|
## Usage
|
28
36
|
|
@@ -65,7 +73,7 @@ Where
|
|
65
73
|
* `#` familiar markdown header that indicates a new `node`;
|
66
74
|
* `[p1]` is an optional identifier that becomes `node.id`;
|
67
75
|
* `Part two` is an optional `node.title`;
|
68
|
-
* `{{parent: top}}`
|
76
|
+
* `{{parent: top}}` is an optional metadata section that becomes `node.meta`;
|
69
77
|
* and finally `Body` is an optional `node.body`.
|
70
78
|
|
71
79
|
```markdown
|
@@ -140,7 +148,7 @@ parent: r}}
|
|
140
148
|
|
141
149
|
#### Assets
|
142
150
|
|
143
|
-
When you want to provide some assets or links to something outside the repository you can provide the
|
151
|
+
When you want to provide some assets or links to something outside the repository you can provide the link to the assets. Put the asset in the `bin/assets` folder and specify the link.
|
144
152
|
|
145
153
|
```markdown
|
146
154
|
# [ent] Entities
|
@@ -237,9 +245,9 @@ Clerq provides the following main service objects:
|
|
237
245
|
* `LoadAssembly` loads whole repository to Node class;
|
238
246
|
* `CheckAssembly` checks the assembly for errors (ids and links);
|
239
247
|
* `QueryNode` provides ability to query nodes from assembly;
|
240
|
-
* `QueryTemplate`
|
248
|
+
* `QueryTemplate` returns template by the template name;
|
241
249
|
* `CreateNode` crates new node in the repository;
|
242
|
-
* `RenderNode`
|
250
|
+
* `RenderNode` returns text rendered by ERB.
|
243
251
|
|
244
252
|
The first part of each repository related task is to get repository assembly. It can be performed through `NodeRepository#assemble` or `LoadAssembly.call()`. Each of these methods returns Node that provides [Enumerable](https://ruby-doc.org/core-2.6.5/Enumerable.html) interface.
|
245
253
|
|
@@ -330,21 +338,22 @@ And then you can run the task by
|
|
330
338
|
|
331
339
|
This example is just very basic and your automation scripts could be much more complex.
|
332
340
|
|
333
|
-
Another quick example is [clerq.thor]
|
341
|
+
Another quick example is the [clerq.thor](https://github.com/nvoynov/clerq/blob/master/clerq.thor) file that was created just to overcome handling curly bracket `{{}}` in Jekyll and now I run `thor clerq:src:docs` every time after changing this file.
|
334
342
|
|
335
343
|
### Templating
|
336
344
|
|
337
|
-
The
|
345
|
+
The output of the `clerq build` command can be precisely adjusted by modifying the corresponding "erb" template.
|
338
346
|
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
347
|
+
One can see the standard template in [default.md.erb](https://github.com/nvoynov/clerq/blob/master/lib/assets/tt/default.md.erb). It produced output in [Pandoc's Markdown](https://pandoc.org/MANUAL.html#pandocs-markdown) format and supports the following macros in node body:
|
348
|
+
|
349
|
+
* `{{@@list}}` - replaces the macro with the list of child nodes;
|
350
|
+
* `{{@@tree}}` - replaces the macro with the tree of child nodes;
|
351
|
+
* `{{@@eval}}` - eval ruby code inside the brackets;
|
352
|
+
* `{{@@skip}}` - skip all content inside the brackets.
|
344
353
|
|
345
354
|
### Publishing
|
346
355
|
|
347
|
-
In addition to the `clerq build` command in [lib/clerq_doc.thor](https://github.com/nvoynov/clerq/blob/master/lib/assets/lib/clerq_doc.
|
356
|
+
In addition to the `clerq build` command one can find an example of basic documents management tasks in the [lib/clerq_doc.thor](https://github.com/nvoynov/clerq/blob/master/lib/assets/lib/clerq_doc.thor) (it will be placed in new project `lib` folder). You can find there two example of commands that you can start your own publishing automation.
|
348
357
|
|
349
358
|
* `thor clerq:doc:publish` will create `<project>.docx` and `<project>.html`;
|
350
359
|
* `thor clerq:doc:grab` will import provided document into the current project repository.
|
@@ -355,10 +364,6 @@ In addition to the `clerq build` command in [lib/clerq_doc.thor](https://github.
|
|
355
364
|
|
356
365
|
The one issue I certain in is when you are using different version of thor, your custom scripts won't work.
|
357
366
|
|
358
|
-
### Test suite
|
359
|
-
|
360
|
-
Because `default.md.erb` and `pandoc.md.erb` have inside the same class `MarkupNode`, sometimes one of `default_spec.rb` or `pandoc_spec.rb` fails.
|
361
|
-
|
362
367
|
## Some considerations
|
363
368
|
|
364
369
|
### Some obvious things
|
@@ -369,10 +374,6 @@ Hold your projects in Git.
|
|
369
374
|
|
370
375
|
Use pandoc for generating output in different formats
|
371
376
|
|
372
|
-
### MarkupNode
|
373
|
-
|
374
|
-
Don't like the current dirty solution with templates and incorporated MarkupNode that does all that stuff with macro. It is the first attempt to provide template that can skip comments.
|
375
|
-
|
376
377
|
### Several artifacts
|
377
378
|
|
378
379
|
Because Clerq has `-q/--query QUERY_STRING` option you can be interested in developing several different artifacts in one project.
|
data/docs/README.md
CHANGED
@@ -18,6 +18,20 @@ Install it yourself as:
|
|
18
18
|
|
19
19
|
$ gem install clerq
|
20
20
|
|
21
|
+
## Promo
|
22
|
+
|
23
|
+
![Clerq Promo Project](promo.png)
|
24
|
+
|
25
|
+
Inside Clerq there is a demo project that was created and is still used to develop Clerq itself and its script-extensions. You can see the project [here](https://github.com/nvoynov/clerq/tree/master/lib/assets/promo) ([requirements sources](https://github.com/nvoynov/clerq/tree/master/lib/assets/promo/src) and produced documents [Clerq SRS.md](https://github.com/nvoynov/clerq/blob/master/lib/assets/promo/bin/Clerq%20SRS.md), [Clerq SRS.docx](https://github.com/nvoynov/clerq/blob/master/lib/assets/promo/bin/Clerq%20SRS.docx))
|
26
|
+
|
27
|
+
I am sure this project will be useful when you get to know the product. So, I propose to open it now and look inside as you move forward. Do the following in your console:
|
28
|
+
|
29
|
+
$ clerq new promo
|
30
|
+
$ cd promo
|
31
|
+
$ clerq promo
|
32
|
+
$ atom .
|
33
|
+
$ thor list
|
34
|
+
|
21
35
|
## Usage
|
22
36
|
|
23
37
|
The Clerq is entirely based on one single domain entity `Node` that represents a node of tree hierarchy and provides `id`, `title`, `body`, and `metadata` attributes. It supposes the following simple workflow:
|
@@ -61,7 +75,7 @@ Where
|
|
61
75
|
* `#` familiar markdown header that indicates a new `node`;
|
62
76
|
* `[p1]` is an optional identifier that becomes `node.id`;
|
63
77
|
* `Part two` is an optional `node.title`;
|
64
|
-
* {% raw %}`{{parent: top}}`{% endraw %}
|
78
|
+
* {% raw %}`{{parent: top}}`{% endraw %} is an optional metadata section that becomes `node.meta`;
|
65
79
|
* and finally `Body` is an optional `node.body`.
|
66
80
|
|
67
81
|
{% raw %}
|
@@ -146,7 +160,7 @@ parent: r}}
|
|
146
160
|
|
147
161
|
#### Assets
|
148
162
|
|
149
|
-
When you want to provide some assets or links to something outside the repository you can provide the
|
163
|
+
When you want to provide some assets or links to something outside the repository you can provide the link to the assets. Put the asset in the `bin/assets` folder and specify the link.
|
150
164
|
|
151
165
|
{% raw %}
|
152
166
|
```markdown
|
@@ -245,9 +259,9 @@ Clerq provides the following main service objects:
|
|
245
259
|
* `LoadAssembly` loads whole repository to Node class;
|
246
260
|
* `CheckAssembly` checks the assembly for errors (ids and links);
|
247
261
|
* `QueryNode` provides ability to query nodes from assembly;
|
248
|
-
* `QueryTemplate`
|
262
|
+
* `QueryTemplate` returns template by the template name;
|
249
263
|
* `CreateNode` crates new node in the repository;
|
250
|
-
* `RenderNode`
|
264
|
+
* `RenderNode` returns text rendered by ERB.
|
251
265
|
|
252
266
|
The first part of each repository related task is to get repository assembly. It can be performed through `NodeRepository#assemble` or `LoadAssembly.call()`. Each of these methods returns Node that provides [Enumerable](https://ruby-doc.org/core-2.6.5/Enumerable.html) interface.
|
253
267
|
|
@@ -342,21 +356,22 @@ And then you can run the task by
|
|
342
356
|
|
343
357
|
This example is just very basic and your automation scripts could be much more complex.
|
344
358
|
|
345
|
-
Another quick example is [clerq.thor]
|
359
|
+
Another quick example is the [clerq.thor](https://github.com/nvoynov/clerq/blob/master/clerq.thor) file that was created just to overcome handling curly bracket {% raw %}`{{}}`{% endraw %} in Jekyll and now I run `thor clerq:src:docs` every time after changing this file.
|
346
360
|
|
347
361
|
### Templating
|
348
362
|
|
349
|
-
The
|
363
|
+
The output of the `clerq build` command can be precisely adjusted by modifying the corresponding "erb" template.
|
350
364
|
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
365
|
+
One can see the standard template in [default.md.erb](https://github.com/nvoynov/clerq/blob/master/lib/assets/tt/default.md.erb). It produced output in [Pandoc's Markdown](https://pandoc.org/MANUAL.html#pandocs-markdown) format and supports the following macros in node body:
|
366
|
+
|
367
|
+
* {% raw %}`{{@@list}}`{% endraw %} - replaces the macro with the list of child nodes;
|
368
|
+
* {% raw %}`{{@@tree}}`{% endraw %} - replaces the macro with the tree of child nodes;
|
369
|
+
* {% raw %}`{{@@eval}}`{% endraw %} - eval ruby code inside the brackets;
|
370
|
+
* {% raw %}`{{@@skip}}`{% endraw %} - skip all content inside the brackets.
|
356
371
|
|
357
372
|
### Publishing
|
358
373
|
|
359
|
-
In addition to the `clerq build` command in [lib/clerq_doc.thor](https://github.com/nvoynov/clerq/blob/master/lib/assets/lib/clerq_doc.
|
374
|
+
In addition to the `clerq build` command one can find an example of basic documents management tasks in the [lib/clerq_doc.thor](https://github.com/nvoynov/clerq/blob/master/lib/assets/lib/clerq_doc.thor) (it will be placed in new project `lib` folder). You can find there two example of commands that you can start your own publishing automation.
|
360
375
|
|
361
376
|
* `thor clerq:doc:publish` will create `<project>.docx` and `<project>.html`;
|
362
377
|
* `thor clerq:doc:grab` will import provided document into the current project repository.
|
@@ -367,10 +382,6 @@ In addition to the `clerq build` command in [lib/clerq_doc.thor](https://github.
|
|
367
382
|
|
368
383
|
The one issue I certain in is when you are using different version of thor, your custom scripts won't work.
|
369
384
|
|
370
|
-
### Test suite
|
371
|
-
|
372
|
-
Because `default.md.erb` and `pandoc.md.erb` have inside the same class `MarkupNode`, sometimes one of `default_spec.rb` or `pandoc_spec.rb` fails.
|
373
|
-
|
374
385
|
## Some considerations
|
375
386
|
|
376
387
|
### Some obvious things
|
@@ -381,10 +392,6 @@ Hold your projects in Git.
|
|
381
392
|
|
382
393
|
Use pandoc for generating output in different formats
|
383
394
|
|
384
|
-
### MarkupNode
|
385
|
-
|
386
|
-
Don't like the current dirty solution with templates and incorporated MarkupNode that does all that stuff with macro. It is the first attempt to provide template that can skip comments.
|
387
|
-
|
388
395
|
### Several artifacts
|
389
396
|
|
390
397
|
Because Clerq has `-q/--query QUERY_STRING` option you can be interested in developing several different artifacts in one project.
|
data/docs/promo.png
ADDED
Binary file
|
@@ -27,7 +27,7 @@ class ClerqDoc < Thor
|
|
27
27
|
}
|
28
28
|
|
29
29
|
# Why does one need to grab the document?
|
30
|
-
# it started in MS Word but the author decieded to
|
30
|
+
# it started in MS Word but the author decieded to proceed in Clerq
|
31
31
|
# it is the source for the clerq project, SRS based on Vision?
|
32
32
|
# something else?
|
33
33
|
# TODO provide -q/--query QUERY_STRING parameter
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
# Macro that can be used in MarkupNode
|
4
|
+
#
|
5
|
+
# Usage:
|
6
|
+
# node = MarkupNode(Clerq::Entities::Node.new(
|
7
|
+
# id: 'id', body: Some text that contains {{@@macro}}")
|
8
|
+
# )
|
9
|
+
# macro = Macro.new
|
10
|
+
# macro.(node.body, node) # "Some text that contains [processed macro]"
|
11
|
+
class MarkupMacro
|
12
|
+
attr_reader :title, :regex
|
13
|
+
# TODO: find more situable name
|
14
|
+
# Process macro that must be implemented in subclasses
|
15
|
+
# @param macro [String] macrotext
|
16
|
+
# @param node [Node] the context in which the macro is processed
|
17
|
+
# @return [String] a text processed by macro
|
18
|
+
def process(macro, node)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
# Just skip macro and all the text inside it
|
23
|
+
class SkipMacro < MarkupMacro
|
24
|
+
def initialize
|
25
|
+
@title = "Skip"
|
26
|
+
@regex = /{{@@skip[\s\S]*?}}/
|
27
|
+
end
|
28
|
+
|
29
|
+
def process(macro, node = nil)
|
30
|
+
""
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# Evaluates ruby code placed inside the macro
|
35
|
+
class EvalMacro < MarkupMacro
|
36
|
+
def initialize
|
37
|
+
@title = "Eval"
|
38
|
+
@regex = /{{@@eval[\s\S]*?}}/
|
39
|
+
@extra = /{{@@eval([\s\S]*?)}}/
|
40
|
+
end
|
41
|
+
|
42
|
+
def process(macro, node)
|
43
|
+
body = @extra.match(macro)[1]
|
44
|
+
eval(body, binding)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# Builds a list of Node#items where items linked to appropriate headers
|
49
|
+
class ListMacro < MarkupMacro
|
50
|
+
def initialize
|
51
|
+
@title = "List"
|
52
|
+
@regex = /{{@@list}}/
|
53
|
+
end
|
54
|
+
|
55
|
+
def process(macro, node)
|
56
|
+
node.items.inject([]) do |ary, n|
|
57
|
+
ary << "* [#{n.title}](##{node.url(n.id)})"
|
58
|
+
end.join("\n")
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# Builds a tree of Node#items where items linked to appropriate headers
|
63
|
+
class TreeMacro < MarkupMacro
|
64
|
+
def initialize
|
65
|
+
@title = "Tree"
|
66
|
+
@regex = /{{@@tree}}/
|
67
|
+
end
|
68
|
+
|
69
|
+
def process(macro, node)
|
70
|
+
this_level = node.nesting_level + 1
|
71
|
+
node.to_a.drop(1).inject([]) do |ary, n|
|
72
|
+
lead_spaces = ' ' * (n.nesting_level - this_level)
|
73
|
+
ary << "#{lead_spaces}* [#{n.title}](##{node.url(n.id)})"
|
74
|
+
end.join("\n")
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'delegate'
|
2
|
+
require_relative 'markup_macro'
|
3
|
+
|
4
|
+
# MarkupNode is an wrapper introduced to simplify
|
5
|
+
# producing Pandoc markdown output.
|
6
|
+
# It's a delegator to the Node class
|
7
|
+
class MarkupNode < SimpleDelegator
|
8
|
+
|
9
|
+
# register available macros
|
10
|
+
@@macros = Array.new.tap do |ary|
|
11
|
+
ary << SkipMacro.new
|
12
|
+
ary << ListMacro.new
|
13
|
+
ary << TreeMacro.new
|
14
|
+
ary << EvalMacro.new
|
15
|
+
ary.freeze
|
16
|
+
end
|
17
|
+
|
18
|
+
def markup
|
19
|
+
[title, meta, body].select{|part| !part.empty?}.join("\n\n")
|
20
|
+
end
|
21
|
+
|
22
|
+
# @return [String] output text of node.title
|
23
|
+
def title
|
24
|
+
s = super
|
25
|
+
s = ".#{id.split(/\./).last}" if s.empty?
|
26
|
+
"#{'#' * nesting_level} #{s} {##{url(id)}}"
|
27
|
+
end
|
28
|
+
|
29
|
+
# @return [String] output text of node.meta
|
30
|
+
def meta
|
31
|
+
return '' if nesting_level == 0
|
32
|
+
return '' if super[:skip_meta]
|
33
|
+
|
34
|
+
hsh = {id: id}.merge(super)
|
35
|
+
hsh.delete(:order_index)
|
36
|
+
hsh.delete(:filename)
|
37
|
+
hsh.delete(:parent)
|
38
|
+
[].tap{|ary|
|
39
|
+
ary << "Attribute | Value"
|
40
|
+
ary << "--------- | -----"
|
41
|
+
hsh.each{|k,v| ary << "#{k} | #{v}"}
|
42
|
+
}.join("\n")
|
43
|
+
end
|
44
|
+
|
45
|
+
# @return [String] output text for node.body
|
46
|
+
def body
|
47
|
+
String.new(super).tap do |txt|
|
48
|
+
process_links!(txt)
|
49
|
+
process_macro!(txt)
|
50
|
+
txt.gsub!(/^$\n{2,}/, "\n")
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# @return [String] output text for link [[node.id]]
|
55
|
+
def link(ref)
|
56
|
+
node = root.find{|n| n.id == ref}
|
57
|
+
return "[#{ref}](#unknown)" unless node
|
58
|
+
"[#{node.title}](##{url(ref)})"
|
59
|
+
end
|
60
|
+
|
61
|
+
# @return [String] url for node.id
|
62
|
+
def url(id)
|
63
|
+
r = id.start_with?(/[[:digit:]]/) ? "p#{id}" : id
|
64
|
+
r.downcase
|
65
|
+
.gsub(/[^A-Za-z0-9]{1,}/, '-')
|
66
|
+
.gsub(/^-/, '')
|
67
|
+
.gsub(/-$/, '')
|
68
|
+
end
|
69
|
+
|
70
|
+
private
|
71
|
+
|
72
|
+
# process links and replace macros by markup output
|
73
|
+
# @param source [String] input string
|
74
|
+
# @return [String] markup output
|
75
|
+
def process_links!(source)
|
76
|
+
links.each{ |l| source.gsub!("[[#{l}]]", link(l)) }
|
77
|
+
end
|
78
|
+
|
79
|
+
def process_macro!(source)
|
80
|
+
@@macros.each do |macro|
|
81
|
+
source.scan(macro.regex).each do |i|
|
82
|
+
source.gsub!(i, macro.process(i, self))
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'clerq'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require_relative "../markup_macro"
|
4
|
+
require_relative "../markup_node"
|
5
|
+
include Clerq::Entities
|
6
|
+
|
7
|
+
describe MarkupMacro do
|
8
|
+
|
9
|
+
let(:node) {
|
10
|
+
node = Node.new(title: "SRS")
|
11
|
+
node << Node.new(id: "ii", title: "Introduction")
|
12
|
+
node << Node.new(id: "ur", title: "User Requirements")
|
13
|
+
node << Node.new(id: "fr", title: "Functional Requirements")
|
14
|
+
node.item("ur") << Node.new(id: ".us", title: "User Stories")
|
15
|
+
node.item("ur") << Node.new(id: ".uc", title: "Use Cases")
|
16
|
+
MarkupNode.new(node)
|
17
|
+
}
|
18
|
+
|
19
|
+
describe "SkipMacro#process" do
|
20
|
+
let(:macro) { SkipMacro.new }
|
21
|
+
let(:input) { "{{@skip some text}}" }
|
22
|
+
let(:result) { "" }
|
23
|
+
|
24
|
+
it 'must return result' do
|
25
|
+
_(macro.process(input, node)).must_equal result
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "EvalMacro#process" do
|
30
|
+
let(:macro) { EvalMacro.new }
|
31
|
+
let(:input) {
|
32
|
+
<<~EOF
|
33
|
+
{{@@eval
|
34
|
+
ary = []
|
35
|
+
3.times{|i| ary << "Hello, World!"}
|
36
|
+
ary.join("\n")
|
37
|
+
}}
|
38
|
+
EOF
|
39
|
+
}
|
40
|
+
let(:result) {
|
41
|
+
<<~EOF.chomp
|
42
|
+
Hello, World!
|
43
|
+
Hello, World!
|
44
|
+
Hello, World!
|
45
|
+
EOF
|
46
|
+
}
|
47
|
+
|
48
|
+
it 'must return result' do
|
49
|
+
_(macro.process(input, node)).must_equal result
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'must pass node binding' do
|
53
|
+
_(macro.process("{{@@eval \"#{node.id} #{node.title}\"}}", node)).must_equal " SRS"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe "ListMacro#process" do
|
58
|
+
let(:macro) { ListMacro.new }
|
59
|
+
let(:input) { "{{@@list}}" }
|
60
|
+
let(:result) {
|
61
|
+
<<~EOF.chomp
|
62
|
+
* [Introduction](#ii)
|
63
|
+
* [User Requirements](#ur)
|
64
|
+
* [Functional Requirements](#fr)
|
65
|
+
EOF
|
66
|
+
}
|
67
|
+
|
68
|
+
it 'must return result' do
|
69
|
+
_(macro.process(input, node)).must_equal result
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe "TreeMacro#process" do
|
74
|
+
let(:macro) { TreeMacro.new }
|
75
|
+
let(:input) { "{{@@tree}}" }
|
76
|
+
let(:result) {
|
77
|
+
<<~EOF.chomp
|
78
|
+
* [Introduction](#ii)
|
79
|
+
* [User Requirements](#ur)
|
80
|
+
* [User Stories](#ur-us)
|
81
|
+
* [Use Cases](#ur-uc)
|
82
|
+
* [Functional Requirements](#fr)
|
83
|
+
EOF
|
84
|
+
}
|
85
|
+
|
86
|
+
it 'must return result' do
|
87
|
+
_(macro.process(input, node)).must_equal result
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|