metanorma-plugin-lutaml 0.4.4 → 0.4.8
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.
- checksums.yaml +4 -4
- data/README.adoc +84 -53
- data/lib/metanorma/plugin/lutaml/liquid_templates/_diagrams_block.liquid +1 -1
- data/lib/metanorma/plugin/lutaml/liquid_templates/_packages.liquid +44 -24
- data/lib/metanorma/plugin/lutaml/liquid_templates/_packages_class.liquid +11 -10
- data/lib/metanorma/plugin/lutaml/liquid_templates/_packages_data_dictionary.liquid +181 -0
- data/lib/metanorma/plugin/lutaml/liquid_templates/_packages_data_dictionary_classes.liquid +65 -0
- data/lib/metanorma/plugin/lutaml/liquid_templates/_packages_data_type.liquid +10 -10
- data/lib/metanorma/plugin/lutaml/liquid_templates/_packages_entity_list.liquid +113 -0
- data/lib/metanorma/plugin/lutaml/liquid_templates/_packages_enum.liquid +11 -10
- data/lib/metanorma/plugin/lutaml/lutaml_figure_inline_macro.rb +23 -0
- data/lib/metanorma/plugin/lutaml/lutaml_preprocessor.rb +1 -1
- data/lib/metanorma/plugin/lutaml/lutaml_uml_attributes_table_preprocessor.rb +10 -9
- data/lib/metanorma/plugin/lutaml/lutaml_uml_datamodel_description_preprocessor.rb +41 -9
- data/lib/metanorma/plugin/lutaml/version.rb +1 -1
- data/lib/metanorma-plugin-lutaml.rb +1 -0
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 202335c2a56ade17a5bdfedd489b6c39363b256ebbaa2e2cbfe812a6bb6995e5
|
4
|
+
data.tar.gz: 9637bc5a68bbbe8cda105e74a537ae7e41d5676f584e64e907ad26ba6cf50082
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7e183219067f431d7b839d59ab3e5c8a8b3f54b335cb1e232297f1fa997e7f7abafa4a0858d5398a034c2a025d46feef240f3e71b14db7730fb1789b2dd11afb
|
7
|
+
data.tar.gz: 400132cae1b7b1b3f03414f4c4ab8b16edde68ab285cd192bd0894d913bee26985182aaf880c2a4ddac1935541bac62913679424e433d88bacc8242c7fcabede
|
data/README.adoc
CHANGED
@@ -1,21 +1,36 @@
|
|
1
|
-
= metanorma-plugin-lutaml
|
1
|
+
= Metanorma LutaML plugin (metanorma-plugin-lutaml)
|
2
2
|
|
3
3
|
image:https://github.com/metanorma/metanorma-plugin-lutaml/workflows/rake/badge.svg["Build Status", link="https://github.com/metanorma/metanorma-plugin-lutaml/actions?workflow=rake"]
|
4
4
|
|
5
|
-
==
|
5
|
+
== Purpose
|
6
6
|
|
7
|
-
|
7
|
+
LutaML is a data model accessor that supports various data model formats,
|
8
|
+
including:
|
8
9
|
|
9
|
-
|
10
|
+
* EXPRESS (`*.exp` files)
|
11
|
+
* OMG UML in XMI format (`*.xmi` files)
|
12
|
+
|
13
|
+
This plugin allows you to access LutaML models from within a Metanorma document.
|
14
|
+
|
15
|
+
== Installation
|
10
16
|
|
11
17
|
[source,console]
|
12
18
|
----
|
13
19
|
$ gem install metanorma-plugin-lutaml
|
14
20
|
----
|
15
21
|
|
16
|
-
=== Usage, `lutaml` macro
|
17
22
|
|
18
|
-
|
23
|
+
== Usage with EXPRESS
|
24
|
+
|
25
|
+
=== General
|
26
|
+
|
27
|
+
LutaML supports accessing EXPRESS models via the
|
28
|
+
https://github.com/lutaml/expressir[Expressir] parser.
|
29
|
+
|
30
|
+
|
31
|
+
=== Usage of the `lutaml_express` EXPRESS macro
|
32
|
+
|
33
|
+
Given an `example.exp` EXPRESS file with the content:
|
19
34
|
|
20
35
|
[source,exp]
|
21
36
|
----
|
@@ -42,11 +57,11 @@ SCHEMA test_schema 'test';
|
|
42
57
|
END_SCHEMA;
|
43
58
|
----
|
44
59
|
|
45
|
-
And the `
|
60
|
+
And the `lutaml_express` macro block:
|
46
61
|
|
47
62
|
[source,adoc]
|
48
63
|
-----
|
49
|
-
[
|
64
|
+
[lutaml_express,example.exp,my_context]
|
50
65
|
----
|
51
66
|
|
52
67
|
{% for schema in my_context.schemas %}
|
@@ -67,13 +82,15 @@ Where:
|
|
67
82
|
* `{example.exp}` is the location of the EXPRESS schema file (`*.exp`) that
|
68
83
|
contains data to be loaded. Location of the file is computed relative to the
|
69
84
|
source directory that `[lutaml]` is used (e.g., if
|
70
|
-
`[
|
85
|
+
`[lutaml_express,example.exp,my_context]` is invoked in an `.adoc` file located at
|
71
86
|
`/foo/bar/doc.adoc`, the data file is expected to be found at
|
72
87
|
`/foo/bar/example.exp`);
|
73
88
|
|
74
|
-
* `{my_context}` is the name where the EXPRESS Repository read from the
|
75
|
-
file can be accessed with.
|
76
|
-
|
89
|
+
* `{my_context}` is the name where the EXPRESS Repository read from the `.exp`
|
90
|
+
file can be accessed with.
|
91
|
+
|
92
|
+
** The `context` object is a serialized `Expressir::Model::Repository` object
|
93
|
+
with all variable names available. See
|
77
94
|
https://github.com/lutaml/expressir[Expressir] docs for reference.
|
78
95
|
`{my_context}` has `schemas` method to access Expressir
|
79
96
|
https://github.com/lutaml/expressir/blob/master/lib/expressir/model/schema.rb[schemas]
|
@@ -121,7 +138,7 @@ Example of usage:
|
|
121
138
|
= Document title
|
122
139
|
Author
|
123
140
|
:lutaml-express-index: my_custom_name; /path/to/express_files; cache=/path/to/cache_file.yaml
|
124
|
-
[
|
141
|
+
[lutaml_express,my_custom_name,my_context]
|
125
142
|
----
|
126
143
|
{% for schema in my_context.schemas %}
|
127
144
|
== {{schema.id}}
|
@@ -142,7 +159,7 @@ diagram MyView {
|
|
142
159
|
enum AddressClassProfile {
|
143
160
|
imlicistAttributeProfile: CharacterString [0..1] {
|
144
161
|
definition
|
145
|
-
this is multiline with `
|
162
|
+
this is multiline with `asciidoc`
|
146
163
|
end definition
|
147
164
|
}
|
148
165
|
}
|
@@ -193,7 +210,7 @@ diagram MyView {
|
|
193
210
|
----
|
194
211
|
|
195
212
|
|
196
|
-
=== Usage
|
213
|
+
=== Usage of `lutaml_uml_attributes_table` macro
|
197
214
|
|
198
215
|
This macro allows to quickly render data model attributes/values tables.
|
199
216
|
|
@@ -246,7 +263,7 @@ Will produce this output:
|
|
246
263
|
|===
|
247
264
|
-----
|
248
265
|
|
249
|
-
In case of "enumeration"(AddressClassProfile) entity:
|
266
|
+
In case of "enumeration" (AddressClassProfile) entity:
|
250
267
|
|
251
268
|
[source,adoc]
|
252
269
|
-----
|
@@ -264,12 +281,12 @@ Will produce this output:
|
|
264
281
|
|===
|
265
282
|
|Name |Definition
|
266
283
|
|
267
|
-
|imlicistAttributeProfile |this is multiline with `
|
284
|
+
|imlicistAttributeProfile |this is multiline with `asciidoc`
|
268
285
|
|
269
286
|
|===
|
270
287
|
-----
|
271
288
|
|
272
|
-
=== Usage
|
289
|
+
=== Usage of `lutaml_uml_datamodel_description` macro
|
273
290
|
|
274
291
|
This macro allows to quickly render data model packages and its dependent
|
275
292
|
objects for supplied XMI file.
|
@@ -286,44 +303,44 @@ The `lutaml_uml_datamodel_description` macro can be used:
|
|
286
303
|
[lutaml_uml_datamodel_description, path/to/example.xmi]
|
287
304
|
--
|
288
305
|
[.before]
|
289
|
-
|
306
|
+
....
|
290
307
|
my text
|
291
|
-
|
308
|
+
....
|
292
309
|
|
293
|
-
[.diagram_include_block, base_path="requirements/"]
|
294
|
-
|
310
|
+
[.diagram_include_block, base_path="requirements/", format="emf"]
|
311
|
+
....
|
295
312
|
Diagram text
|
296
|
-
|
313
|
+
....
|
297
314
|
|
298
315
|
[.include_block, package="Another", base_path="spec/fixtures"]
|
299
|
-
|
316
|
+
....
|
300
317
|
my text
|
301
|
-
|
318
|
+
....
|
302
319
|
|
303
320
|
[.include_block, base_path="spec/fixtures"]
|
304
|
-
|
321
|
+
....
|
305
322
|
my text
|
306
|
-
|
323
|
+
....
|
307
324
|
|
308
325
|
[.before, package="Another"]
|
309
|
-
|
326
|
+
....
|
310
327
|
text before Another package
|
311
|
-
|
328
|
+
....
|
312
329
|
|
313
330
|
[.after, package="Another"]
|
314
|
-
|
331
|
+
....
|
315
332
|
text after Another package
|
316
|
-
|
333
|
+
....
|
317
334
|
|
318
335
|
[.after, package="CityGML"]
|
319
|
-
|
336
|
+
....
|
320
337
|
text after CityGML package
|
321
|
-
|
338
|
+
....
|
322
339
|
|
323
340
|
[.after]
|
324
|
-
|
341
|
+
....
|
325
342
|
footer text
|
326
|
-
|
343
|
+
....
|
327
344
|
--
|
328
345
|
--
|
329
346
|
-----
|
@@ -332,33 +349,42 @@ Where:
|
|
332
349
|
|
333
350
|
* `path/to/example.xmi` - required, path to the XMI file to render
|
334
351
|
|
335
|
-
* `[.before]` - macro to add additional text before the rendered output, can be used only once, additional occurrences of macro will overwrite text
|
352
|
+
* `[.before]` - macro to add additional text before the rendered output, can be used only once, additional occurrences of macro will overwrite text, not that `literal` block style must be used in there(eg `....`)
|
336
353
|
|
337
354
|
* `[.after]` - macro to add additional text after the rendered output, can be used only once, additional occurrences of macro will overwrite text
|
338
355
|
|
339
356
|
* `[.after, package="Another"]` - macro with text to be inserted before(after in case of `.before` name) the package
|
340
357
|
|
341
|
-
* `[.diagram_include_block]` - macro to automatically include diagram images. Attribute `base_path` is a required attribute to supply path prefix where to look for a
|
358
|
+
* `[.diagram_include_block]` - macro to automatically include diagram images. Attribute `base_path` is a required attribute to supply path prefix where to look for a diagram image. `format` is an optional attribute that tells what file extension to use when including diagram file. The logic is as follows:
|
342
359
|
[source,adoc]
|
343
360
|
-----
|
344
361
|
{% for diagram in package.diagrams %}
|
345
362
|
[[figure-{{ diagram.xmi_id }}]]
|
346
363
|
.{{ diagram.name }}
|
347
|
-
image::{{ image_base_path }}/{{ diagram.xmi_id }}.png[]
|
364
|
+
image::{{ image_base_path }}/{{ diagram.xmi_id }}.{{ format | default: 'png' }}[]
|
348
365
|
|
349
366
|
{% if diagram.definition %}
|
350
367
|
{{ diagram.definition | html2adoc }}
|
351
368
|
{% endif %}
|
352
369
|
{% endfor %}
|
353
370
|
-----
|
354
|
-
|
371
|
+
|
372
|
+
For instance, the script will take package diagrams supplied in the XMI file and will try to include `image` with the name equal to diagram' xmi_id attribute plus `.png`. Also one can add any text to the macro text, it will be added as paragraph before each image include.
|
355
373
|
|
356
374
|
* `[.diagram_include_block, package="Another"]` - same as above, but diagram will be included only for supplied package name
|
357
375
|
|
358
|
-
* `[.include_block, base_path="spec/fixtures"]` - macro to
|
376
|
+
* `[.include_block, base_path="spec/fixtures"]` - macro to include files (`*.adoc` or `*.liquid`) for each package name. Attribute `base_path` is a required attribute to supply path prefix where to look for file to include. Macro will look for a file called `base_path` + `/` `_package_name`(downcase, replace : -> '', ' ' -> '_') + `.adoc`[`.liquid`], eg for package 'My Package name' and `base_path` eq to `my/path`, macro will look for the following file path: `my/path/_my_package_name.adoc`.
|
359
377
|
|
360
378
|
* `[.include_block, package="Another", base_path="spec/fixtures"]` - same as above, but include block will be included only for supplied package name
|
361
379
|
|
380
|
+
In addition to the macros listed above that can be used only inside `lutaml_uml_datamodel_description` macro there is another macro called `lutaml_figure`. `lutaml_figure` is used to lookup and reference xmi package diagrams. The syntax is as follows:
|
381
|
+
|
382
|
+
[source,adoc]
|
383
|
+
-----
|
384
|
+
This is lutaml_figure::[package="Wrapper root package", name="Fig B1 Full model"] figure
|
385
|
+
-----
|
386
|
+
|
387
|
+
This code will be transformed into `<<figure-{diagram.xmi_id}>>` and will point to diagram figure. One can only use this macro when document rendered `lutaml_uml_datamodel_description` macro as it needs diagram lookup table in order to reference package diagram.
|
362
388
|
|
363
389
|
Will produce this output:
|
364
390
|
|
@@ -372,18 +398,17 @@ Diagram text
|
|
372
398
|
|
373
399
|
[[figure-EAID_ACBB5EE3_3428_40f5_9C7C_E41923419F29]]
|
374
400
|
.CityGML Package Diagram
|
375
|
-
image::requirements
|
401
|
+
image::requirements/EAID_ACBB5EE3_3428_40f5_9C7C_E41923419F29.png[]
|
376
402
|
|
377
403
|
BuildingFurnitureFunctionValue is a code list that enumerates the different purposes of a BuildingFurniture.
|
378
404
|
|
379
405
|
[[figure-EAID_938AE961_1C57_4052_B964_997D1894A58D]]
|
380
406
|
.Use of ISO and OASIS standards in CityGML
|
381
|
-
image::requirements
|
407
|
+
image::requirements/EAID_938AE961_1C57_4052_B964_997D1894A58D.png[]
|
382
408
|
|
383
409
|
The CityGML package is organized into
|
384
410
|
2 packages with 1 modules:
|
385
411
|
|
386
|
-
[arabic]
|
387
412
|
. Another package
|
388
413
|
. CityTML package
|
389
414
|
|
@@ -393,18 +418,17 @@ Content for CityGML package
|
|
393
418
|
|
394
419
|
==== Defining tables
|
395
420
|
|
396
|
-
|
397
|
-
.<<tab-P-another-C-abstractatomictimeseries>> -- Elements of Another::AbstractAtomicTimeseries
|
421
|
+
.<<tab-P-another-C-{XMI_ID}>> -- Elements of “Another::AbstractAtomicTimeseries” (class)
|
398
422
|
|
399
|
-
[[tab-P-another-C-
|
400
|
-
.Elements of Another::AbstractAtomicTimeseries
|
423
|
+
[[tab-P-another-C-{XMI_ID}]]
|
424
|
+
.Elements of “Another::AbstractAtomicTimeseries” (class)
|
401
425
|
[width="100%",cols="a,a,a,a,a,a,a,a"]
|
402
426
|
|===
|
403
427
|
h|Name: 7+| AbstractAtomicTimeseries
|
404
428
|
h|Definition: 7+|
|
405
429
|
h|Stereotype: 7+| interface
|
406
430
|
h|Abstract: 7+|
|
407
|
-
|
431
|
+
h|Associations: 7+| (none)
|
408
432
|
.4+h|Public attributes:
|
409
433
|
| _Name_
|
410
434
|
2+| _Definition_
|
@@ -438,7 +462,7 @@ h|Constraints: 7+| (none)
|
|
438
462
|
text after CityGML package
|
439
463
|
-----
|
440
464
|
|
441
|
-
In addition to just supplying XMI file, this macro also supports YAML
|
465
|
+
In addition to just supplying an XMI file, this macro also supports a YAML
|
442
466
|
configuration file.
|
443
467
|
|
444
468
|
The format for using YAML is this:
|
@@ -453,26 +477,33 @@ packages:
|
|
453
477
|
- three
|
454
478
|
# skips these packages
|
455
479
|
- skip: four
|
480
|
+
render_style: entity_list|data_dictionary|default
|
481
|
+
section_depth: 2
|
456
482
|
-----
|
457
483
|
|
458
484
|
Where:
|
459
485
|
|
460
486
|
* `packages` - required, root element with the list of strings or objects
|
461
|
-
|
462
487
|
* `Package *` - pattern matching, specifies lookup condition for packages to
|
463
488
|
render.
|
464
489
|
+
|
465
490
|
NOTE: In this example, it is equal to the following regular expression: `/^Package.*$/`
|
466
491
|
|
467
492
|
* `skip: four` - object with package name to skip
|
493
|
+
* `render_style` - what template to use to render packages, can be: entity_list, data_dictionary or default
|
494
|
+
* `section_depth` - what package to use as root package for render, eg `section_depth` equal to 2 tells processor to use first nested package of the first root packages in xmi file. Example: if xmi file has this package structure: [{ name: 'One', packages: [{ name: 'one-1' }, { name: 'one-2' }] }, { name: 'Two', packages: [{ name: 'two-1' }, { name: 'two-2' }] }] and we have `section_depth` equal to 2, root package will be `one-1`
|
468
495
|
|
469
496
|
Usage with macro:
|
470
497
|
|
471
498
|
[source,adoc]
|
472
|
-
|
499
|
+
--
|
473
500
|
[lutaml_uml_datamodel_description, path/to/example.xmi, path/to/config.yml]
|
474
|
-
|
475
|
-
|
501
|
+
----
|
502
|
+
[.diagram_include_block, base_path="models/Images", format="png"]
|
503
|
+
...
|
504
|
+
...
|
505
|
+
----
|
506
|
+
--
|
476
507
|
|
477
508
|
The macro processor will read supplied YAML file and arrange packages according
|
478
509
|
to the order supplied in the config file, also all packages supplied as `skip`
|
@@ -3,7 +3,7 @@
|
|
3
3
|
{% for diagram in package.diagrams %}
|
4
4
|
[[figure-{{ diagram.xmi_id }}]]
|
5
5
|
.{{ diagram.name }}
|
6
|
-
image::{{ image_base_path }}/{{ diagram.xmi_id }}.png[]
|
6
|
+
image::{{ image_base_path }}/{{ diagram.xmi_id }}.{{ format | default: 'png' }}[]
|
7
7
|
|
8
8
|
{% if diagram.definition %}
|
9
9
|
{{ diagram.definition | html2adoc }}
|
@@ -1,28 +1,38 @@
|
|
1
1
|
{% for package in context.packages %}
|
2
2
|
{% assign package_name = package.name | downcase | replace: ":", "" | replace: " ", "_" %}
|
3
|
-
{% if additional_context.before %}
|
4
|
-
{
|
5
|
-
{
|
6
|
-
{%
|
7
|
-
{% if additional_context[before_package_key] %}
|
8
|
-
{{ additional_context[before_package_key].text }}
|
3
|
+
{% if additional_context.before and additional_context.before.size > 0 %}
|
4
|
+
{% for before in additional_context.before %}
|
5
|
+
{{ before.text }}
|
6
|
+
{% endfor %}
|
9
7
|
{% endif %}
|
10
8
|
{% assign is_package_spare = package.name | slice: 0,5 %}
|
11
9
|
{% if is_package_spare == 'old: ' %}{% continue %}
|
12
10
|
{% elsif is_package_spare == 'Spare' %}{% continue %}
|
13
11
|
{% endif %}
|
14
12
|
|
15
|
-
{% capture equalsigns %}{% for count in (1..depth) %}={% endfor %}{% endcapture %}
|
13
|
+
{% capture equalsigns %}{% for count in (1..depth) %}={% endfor %}{% endcapture %}
|
14
|
+
|
15
|
+
[[lutaml-section-{{ package_name }}]]
|
16
|
+
{{equalsigns}} {{ package.name }} package
|
17
|
+
|
16
18
|
{{equalsigns}}= {{ package.name }} overview
|
17
19
|
|
20
|
+
{% assign before_package_key = 'before;' | append: package.name %}
|
21
|
+
{% if additional_context[before_package_key] and additional_context[before_package_key].size > 0 %}
|
22
|
+
{% for before in additional_context[before_package_key] %}
|
23
|
+
{{ before.text }}
|
24
|
+
{% endfor %}
|
25
|
+
{% endif %}
|
18
26
|
{% if additional_context.diagram_include_block %}
|
19
|
-
{%
|
27
|
+
{% for diagram_include_block in additional_context.diagram_include_block %}
|
28
|
+
{% include "diagrams_block", package_name: package_name, image_base_path: diagram_include_block.base_path, text: diagram_include_block.text, format: diagram_include_block.format %}
|
29
|
+
{% endfor %}
|
20
30
|
{% endif %}
|
21
31
|
|
22
32
|
{% if package.packages.size > 0 %}The {{ package.name }} package is organized into
|
23
33
|
{{ package.packages.size }} packages{% assign modules_nested_size = 0 %}{% for module in package.packages %}{% assign modules_nested_size = modules_nested_size | plus: module.packages.size %}{% endfor %}{% if modules_nested_size > 0 %} with {{modules_nested_size}} modules{% endif %}:
|
24
34
|
{% endif %}
|
25
|
-
|
35
|
+
|
26
36
|
{% for module in package.packages %}
|
27
37
|
{% if module.packages.length > 0 %}
|
28
38
|
. {{ module.name }} package comprises:
|
@@ -38,14 +48,14 @@
|
|
38
48
|
|
39
49
|
{{equalsigns}}= Defining tables
|
40
50
|
|
41
|
-
[arabic]
|
42
51
|
{% for klass in package.classes %}
|
43
52
|
{% assign is_klass_spare = klass.name | slice: 0,5 %}
|
44
53
|
{% if is_klass_spare == 'old: ' %}{% continue %}
|
45
54
|
{% elsif is_klass_spare == 'Spare' %}{% continue %}
|
46
55
|
{% endif %}
|
47
56
|
{% assign klass_name = klass.name | downcase | replace: ':', '' | replace: ' ', '_' %}
|
48
|
-
|
57
|
+
{% assign klass_xid = klass.xmi_id %}
|
58
|
+
.<<tab-P-{{ package_name }}-C-{{ klass_xid }}>> -- Elements of "{{ package.name }}::{{ klass.name }}"
|
49
59
|
|
50
60
|
{% endfor %}
|
51
61
|
{% for enum in package.enums %}
|
@@ -54,7 +64,8 @@
|
|
54
64
|
{% elsif is_enum_spare == 'Spare' %}{% continue %}
|
55
65
|
{% endif %}
|
56
66
|
{% assign enum_name = enum.name | downcase | replace: ':', '' | replace: ' ', '_' %}
|
57
|
-
|
67
|
+
{% assign enum_xid = enum.xmi_id %}
|
68
|
+
.<<tab-P-{{ package_name }}-E-{{ enum_xid }}>> -- Elements of "{{ package.name }}::{{ enum.name }}"
|
58
69
|
|
59
70
|
{% endfor %}
|
60
71
|
{% for data_type in package.data_types %}
|
@@ -63,7 +74,8 @@
|
|
63
74
|
{% elsif is_data_type_spare == 'Spare' %}{% continue %}
|
64
75
|
{% endif %}
|
65
76
|
{% assign data_type_name = data_type.name | downcase | replace: ':', '' | replace: ' ', '_' %}
|
66
|
-
|
77
|
+
{% assign data_type_xid = data_type.xmi_id %}
|
78
|
+
.<<tab-P-{{ package_name }}-DT-{{ data_type_xid }}>> -- Elements of "{{ package.name }}::{{ data_type.name }}"
|
67
79
|
|
68
80
|
{% endfor %}
|
69
81
|
|
@@ -81,9 +93,9 @@
|
|
81
93
|
|
82
94
|
{% endif %}
|
83
95
|
|
84
|
-
{% if additional_context.include_block %}
|
85
|
-
{%
|
86
|
-
{% capture block_filename %}{{ block.base_path }}
|
96
|
+
{% if additional_context.include_block and additional_context.include_block.size > 0 %}
|
97
|
+
{% for block in additional_context.include_block %}
|
98
|
+
{% capture block_filename %}{{ block.base_path }}{{ package_name }}{% endcapture %}
|
87
99
|
{% capture block_content %}{% include block_filename %}{% endcapture %}
|
88
100
|
{% unless block_content contains "Liquid error" %}
|
89
101
|
{% if block.text %}
|
@@ -91,12 +103,13 @@
|
|
91
103
|
{% endif %}
|
92
104
|
{{ block_content }}
|
93
105
|
{% endunless %}
|
106
|
+
{% endfor %}
|
94
107
|
{% endif %}
|
95
108
|
|
96
109
|
{% assign include_block_package_key = 'include_block;' | append: package.name %}
|
97
|
-
{%
|
98
|
-
{%
|
99
|
-
{% capture block_filename %}{{ block.base_path }}
|
110
|
+
{% if additional_context[include_block_package_key] and additional_context[include_block_package_key].size > 0 %}
|
111
|
+
{% for block in additional_context[include_block_package_key] %}
|
112
|
+
{% capture block_filename %}{{ block.base_path }}{{ package_name }}{% endcapture %}
|
100
113
|
{% capture block_content %}{% include block_filename %}{% endcapture %}
|
101
114
|
{% unless block_content contains "Liquid error" %}
|
102
115
|
{% if block.text %}
|
@@ -104,16 +117,23 @@
|
|
104
117
|
{% endif %}
|
105
118
|
{{ block_content }}
|
106
119
|
{% endunless %}
|
120
|
+
{% endfor %}
|
107
121
|
{% endif %}
|
108
122
|
|
109
123
|
{% assign after_package_key = 'after;' | append: package.name %}
|
110
|
-
{{equalsigns}}= Additional Information
|
111
124
|
{% if additional_context[after_package_key] %}
|
112
|
-
{{
|
125
|
+
{{equalsigns}}= Additional information
|
126
|
+
{% for after in additional_context[after_package_key] %}
|
127
|
+
{{ after.text }}
|
128
|
+
{% endfor %}
|
129
|
+
{% endif %}
|
130
|
+
{% if package.packages.size > 0 and render_nested_packages %}
|
131
|
+
{% assign nested_depth = depth | plus: 1 %}{% include "packages", depth: nested_depth, context: package %}
|
113
132
|
{% endif %}
|
114
|
-
{% if package.packages.size > 0 and render_nested_packages %}{% assign nested_depth = depth | plus: 1 %}{% include "packages", depth: nested_depth, context: package %}{% endif %}
|
115
133
|
{% endfor %}
|
116
134
|
|
117
|
-
{% if additional_context.after %}
|
118
|
-
{
|
135
|
+
{% if additional_context.after and additional_context.after.size > 0 %}
|
136
|
+
{% for after in additional_context.after %}
|
137
|
+
{{ after.text }}
|
138
|
+
{% endfor %}
|
119
139
|
{% endif %}
|
@@ -3,8 +3,9 @@
|
|
3
3
|
{% elsif is_klass_spare == 'Spare' %}{% continue %}
|
4
4
|
{% endif %}
|
5
5
|
{% assign klass_name = klass.name | downcase | replace: ':', '' | replace: ' ', '_' %}
|
6
|
-
|
7
|
-
|
6
|
+
{% assign klass_xid = klass.xmi_id %}
|
7
|
+
[[tab-P-{{ package_name }}-C-{{ klass_xid }}]]
|
8
|
+
.Elements of "{{ package.name }}::{{ klass.name }}" (class)
|
8
9
|
[width="100%",cols="a,a,a,a,a,a,a,a"]
|
9
10
|
|===
|
10
11
|
|
@@ -24,14 +25,14 @@ h|Inheritance from: 7+| {{ inherited | map: 'member_end' | join: ", " }}
|
|
24
25
|
h|Generalization of: 7+| {{ generalizations | map: 'member_end' | join: ", " }}
|
25
26
|
{% endif %}
|
26
27
|
|
27
|
-
h|Abstract: 7+| {
|
28
|
+
h|Abstract: 7+| {% if klass.is_abstract %}True{% else %}False{% endif %}
|
28
29
|
{% assign aggregations = klass.associations | where: "member_end_type", "aggregation" %}
|
29
30
|
{% if aggregations.size > 0 %}
|
30
31
|
.{{aggregations.size | plus: 1}}+h|Associations:
|
31
|
-
4+|_Association
|
32
|
-
|_Obligation_
|
32
|
+
4+| _Association with_
|
33
|
+
| _Obligation_
|
33
34
|
| _Maximum occurrence_
|
34
|
-
|
|
35
|
+
| _Provides_
|
35
36
|
|
36
37
|
{% for assoc in aggregations %}
|
37
38
|
4+| {{assoc.member_end}}
|
@@ -41,9 +42,9 @@ h|Abstract: 7+| {{ klass.is_abstract }}
|
|
41
42
|
|
42
43
|
{% endfor %}
|
43
44
|
{% else %}
|
44
|
-
|
45
|
-
.1+h|Associations: 7+| (none)
|
45
|
+
h| Associations: 7+| (none)
|
46
46
|
{% endif %}
|
47
|
+
|
47
48
|
{% if klass.attributes.size > 0 %}
|
48
49
|
.{{klass.attributes.size | plus: 1}}+h|Public attributes:
|
49
50
|
| _Name_
|
@@ -63,12 +64,12 @@ h|Abstract: 7+| {{ klass.is_abstract }}
|
|
63
64
|
|
64
65
|
{% endfor %}
|
65
66
|
{% else %}
|
66
|
-
|
67
|
+
h| Public attributes:
|
67
68
|
7+| (none)
|
68
69
|
{% endif %}
|
69
70
|
|
70
71
|
{% if klass.constraints.size > 0 %}
|
71
|
-
.{{ klass.constraints.size }}
|
72
|
+
.{{ klass.constraints.size }}+h| Constraints:
|
72
73
|
{% for constr in klass.constraints %}
|
73
74
|
7+| `{{ constr.body }}`
|
74
75
|
|
@@ -0,0 +1,181 @@
|
|
1
|
+
{% for package in context.packages %}
|
2
|
+
{% assign package_name = package.name | downcase | replace: ":", "" | replace: " ", "_" %}
|
3
|
+
{% if additional_context.before and additional_context.before.size > 0 %}
|
4
|
+
{% for before in additional_context.before %}
|
5
|
+
{{ before.text }}
|
6
|
+
{% endfor %}
|
7
|
+
{% endif %}
|
8
|
+
{% capture equalsigns %}{% for count in (1..depth) %}={% endfor %}{% endcapture %}{{equalsigns}} {{ package.name }}
|
9
|
+
{{equalsigns}}= {{ package.name }}
|
10
|
+
|
11
|
+
{% assign before_package_key = 'before;' | append: package.name %}
|
12
|
+
{% if additional_context[before_package_key] and additional_context[before_package_key].size > 0 %}
|
13
|
+
{% for before in additional_context[before_package_key] %}
|
14
|
+
{{ before.text }}
|
15
|
+
{% endfor %}
|
16
|
+
{% endif %}
|
17
|
+
|
18
|
+
[cols="1a,4a"]
|
19
|
+
|===
|
20
|
+
|
21
|
+
h|Description: | {{ package.definition }}
|
22
|
+
h|Parent package: | {{ context.name }}
|
23
|
+
h|Stereotype: | «{{ package.stereotype }}»
|
24
|
+
|
25
|
+
|===
|
26
|
+
|
27
|
+
{% assign feature_types = package.classes | where: "stereotype", "FeatureType" %}
|
28
|
+
{% assign object_types = package.classes | where: "stereotype", "ObjectType" %}
|
29
|
+
{% assign basic_types = package.classes | where: "stereotype", "BasicType" %}
|
30
|
+
{% assign unions = package.classes | where: "stereotype", "Union" %}
|
31
|
+
{% assign code_lists = package.classes | where: "stereotype", "CodeList" %}
|
32
|
+
{% if feature_types.size > 0 or object_types.size > 0 %}
|
33
|
+
{{equalsigns}}= Classes
|
34
|
+
|
35
|
+
{% include "packages_data_dictionary_classes", classes: feature_types %}
|
36
|
+
{% include "packages_data_dictionary_classes", classes: object_types %}
|
37
|
+
{% endif %}
|
38
|
+
|
39
|
+
{% if basic_types.size > 0 %}
|
40
|
+
{{equalsigns}}= Basic types
|
41
|
+
|
42
|
+
{% include "packages_data_dictionary_classes", classes: basic_types %}
|
43
|
+
{% endif %}
|
44
|
+
|
45
|
+
{% if unions.size > 0 %}
|
46
|
+
{{equalsigns}}= Unions
|
47
|
+
|
48
|
+
{% include "packages_data_dictionary_classes", classes: unions %}
|
49
|
+
{% endif %}
|
50
|
+
|
51
|
+
{% if code_lists.size > 0 %}
|
52
|
+
{{equalsigns}}= Code lists
|
53
|
+
|
54
|
+
{% include "packages_data_dictionary_classes", classes: code_lists %}
|
55
|
+
{% endif %}
|
56
|
+
|
57
|
+
{% if package.data_types.size > 0 %}
|
58
|
+
{{equalsigns}}= Data types
|
59
|
+
|
60
|
+
{% for data_type in package.data_types %}
|
61
|
+
{% capture generalizations %}{% for assoc in data_type.associations | where: "member_end_type", "generalization" %}{{ assoc.member_end }} {% endfor %}{% endcapture %}
|
62
|
+
[[{{ data_type.name }}-section]]
|
63
|
+
[cols="1a"]
|
64
|
+
|===
|
65
|
+
|*{{ data_type.name }}*
|
66
|
+
|[cols="1,4"]
|
67
|
+
!===
|
68
|
+
!Definition: ! {{ data_type.definition }}
|
69
|
+
!Subclass of: ! {{ generalizations }}
|
70
|
+
!Stereotype: ! «DataType»
|
71
|
+
!===
|
72
|
+
{% if data_type.associations.size > 0 %}
|
73
|
+
{% capture rendered_associations %}
|
74
|
+
{% for assoc in data_type.associations %}
|
75
|
+
{% if assoc.member_end_attribute_name.size > 0 %}
|
76
|
+
{% capture cardinality %}{% if assoc.member_end_cardinality.min == 'C' %}[0..{{ assoc.member_end_cardinality.max }}]{% elsif assoc.member_end_cardinality.min == 'M' and assoc.member_end_cardinality.max == '1' %}[1..1]{% else %}[{{ assoc.member_end_cardinality.max }}]{% endif %}{% endcapture %}
|
77
|
+
! {{ assoc.member_end_attribute_name }} !<<{{assoc.member_end}}-section,{{assoc.member_end}}>> {{ cardinality }} ! {{ assoc.definition }}
|
78
|
+
{% endif %}
|
79
|
+
{% endfor %}
|
80
|
+
{% endcapture %}
|
81
|
+
{% if rendered_associations.size > 0 %}
|
82
|
+
|
|
83
|
+
[cols="15,20,60",options="header"]
|
84
|
+
!===
|
85
|
+
! Role name !Target class and multiplicity !Definition
|
86
|
+
{{ rendered_associations }}
|
87
|
+
!===
|
88
|
+
{% endif %}
|
89
|
+
{% endif %}
|
90
|
+
{% if data_type.attributes.size > 0 %}
|
91
|
+
|
|
92
|
+
[cols="15,20,60",options="header"]
|
93
|
+
!===
|
94
|
+
! Attribute ! Value type and multiplicity ! Definition
|
95
|
+
{% for attr in data_type.attributes %}
|
96
|
+
{% capture cardinality %}{% if attr.cardinality.min == 'C' %}[0..{{ attr.cardinality.max }}]{% elsif assoc.member_end_cardinality.min == 'M' and assoc.member_end_cardinality.max == '1' %}[1..1]{% else %}[{{ attr.cardinality.max }}]{% endif %}{% endcapture %}
|
97
|
+
! {{ attr.name }} !<<{{ attr.type }}-section,{{ attr.name }}>> {{ cardinality }} !{{ attr.definition }}
|
98
|
+
{% endfor %}
|
99
|
+
!===
|
100
|
+
| NOTE: Unless otherwise specified, all attributes and role names have the stereotype «Property».
|
101
|
+
{% endif %}
|
102
|
+
|===
|
103
|
+
|
104
|
+
{% endfor %}
|
105
|
+
{% endif %}
|
106
|
+
|
107
|
+
{% if package.enums.size > 0 %}
|
108
|
+
{{equalsigns}}= Enumerations
|
109
|
+
|
110
|
+
{% for enum in package.enums %}
|
111
|
+
{% capture generalizations %}{% for assoc in enum.associations | where: "member_end_type", "generalization" %}{{ assoc.member_end }} {% endfor %}{% endcapture %}
|
112
|
+
[[{{ enum.name }}-section]]
|
113
|
+
[cols="1a"]
|
114
|
+
|===
|
115
|
+
|*{{ enum.name }}*
|
116
|
+
|
|
117
|
+
[cols="1,4"]
|
118
|
+
!===
|
119
|
+
!Definition: ! {{ enum.definition }}
|
120
|
+
!Stereotype: ! «Enumeration»
|
121
|
+
!===
|
122
|
+
{% if enum.values.size > 0 %}
|
123
|
+
|
|
124
|
+
[cols="1,4",options="header"]
|
125
|
+
!===
|
126
|
+
! Literal value !Definition
|
127
|
+
|
128
|
+
{% for val in enum.values %}
|
129
|
+
! {{ val.name }} !{{ val.definition }}
|
130
|
+
{% endfor %}
|
131
|
+
!===
|
132
|
+
{% endif %}
|
133
|
+
|===
|
134
|
+
|
135
|
+
{% endfor %}
|
136
|
+
{% endif %}
|
137
|
+
|
138
|
+
{% if additional_context.include_block and additional_context.include_block.size > 0 %}
|
139
|
+
{% for block in additional_context.include_block %}
|
140
|
+
{% capture block_filename %}{{ block.base_path }}{{ package_name }}{% endcapture %}
|
141
|
+
{% capture block_content %}{% include block_filename %}{% endcapture %}
|
142
|
+
{% unless block_content contains "Liquid error" %}
|
143
|
+
{% if block.text %}
|
144
|
+
{{ block.text }}
|
145
|
+
{% endif %}
|
146
|
+
{{ block_content }}
|
147
|
+
{% endunless %}
|
148
|
+
{% endfor %}
|
149
|
+
{% endif %}
|
150
|
+
|
151
|
+
{% assign include_block_package_key = 'include_block;' | append: package.name %}
|
152
|
+
{% if additional_context[include_block_package_key] and additional_context[include_block_package_key].size > 0 %}
|
153
|
+
{% for block in additional_context[include_block_package_key] %}
|
154
|
+
{% capture block_filename %}{{ block.base_path }}{{ package_name }}{% endcapture %}
|
155
|
+
{% capture block_content %}{% include block_filename %}{% endcapture %}
|
156
|
+
{% unless block_content contains "Liquid error" %}
|
157
|
+
{% if block.text %}
|
158
|
+
{{ block.text }}
|
159
|
+
{% endif %}
|
160
|
+
{{ block_content }}
|
161
|
+
{% endunless %}
|
162
|
+
{% endfor %}
|
163
|
+
{% endif %}
|
164
|
+
|
165
|
+
{% assign after_package_key = 'after;' | append: package.name %}
|
166
|
+
{% if additional_context[after_package_key] %}
|
167
|
+
{{equalsigns}}= Additional information
|
168
|
+
{% for after in additional_context[after_package_key] %}
|
169
|
+
{{ after.text }}
|
170
|
+
{% endfor %}
|
171
|
+
{% endif %}
|
172
|
+
{% if package.packages.size > 0 and render_nested_packages %}
|
173
|
+
{% assign nested_depth = depth | plus: 1 %}{% include "packages_data_dictionary", depth: nested_depth, context: package %}
|
174
|
+
{% endif %}
|
175
|
+
{% endfor %}
|
176
|
+
|
177
|
+
{% if additional_context.after and additional_context.after.size > 0 %}
|
178
|
+
{% for after in additional_context.after %}
|
179
|
+
{{ after.text }}
|
180
|
+
{% endfor %}
|
181
|
+
{% endif %}
|
@@ -0,0 +1,65 @@
|
|
1
|
+
{% for klass in classes %}
|
2
|
+
{% capture generalizations %}{% for assoc in klass.associations | where: "member_end_type", "generalization" %}{{ assoc.member_end }} {% endfor %}{% endcapture %}
|
3
|
+
[[{{ klass.name }}-section]]
|
4
|
+
[cols="1a"]
|
5
|
+
|===
|
6
|
+
|*{{ klass.name }}*
|
7
|
+
|
|
8
|
+
[cols="1,4"]
|
9
|
+
!===
|
10
|
+
! Definition: ! {{ klass.definition }}
|
11
|
+
! Subclass of: ! {{ generalizations }}
|
12
|
+
! Stereotype: ! «{{ klass.stereotype }}»
|
13
|
+
!===
|
14
|
+
|
15
|
+
{% if klass.associations.size > 0 %}
|
16
|
+
{% capture rendered_associations %}
|
17
|
+
{% for assoc in klass.associations %}
|
18
|
+
|
19
|
+
{% if assoc.member_end_attribute_name.size > 0 %}
|
20
|
+
|
21
|
+
{% capture cardinality %}{% if assoc.member_end_cardinality.min == 'C' %}[0..{{ assoc.member_end_cardinality.max }}]{% elsif assoc.member_end_cardinality.min == 'M' and assoc.member_end_cardinality.max == '1' %}[1..1]{% else %}[{{ assoc.member_end_cardinality.max }}]{% endif %}{% endcapture %}
|
22
|
+
|
23
|
+
! {{ assoc.member_end_attribute_name }}
|
24
|
+
! <<{{assoc.member_end}}-section,{{assoc.member_end}}>> {{ cardinality }}
|
25
|
+
! {{ assoc.definition }}
|
26
|
+
|
27
|
+
{% endif %}
|
28
|
+
{% endfor %}
|
29
|
+
{% endcapture %}
|
30
|
+
|
31
|
+
{% if rendered_associations.size > 0 %}
|
32
|
+
|
|
33
|
+
[cols="15,20,60",options="header"]
|
34
|
+
!===
|
35
|
+
! *Role name*
|
36
|
+
! *Target class and multiplicity*
|
37
|
+
! *Definition*
|
38
|
+
{{ rendered_associations }}
|
39
|
+
!===
|
40
|
+
{% endif %}
|
41
|
+
|
42
|
+
{% endif %}
|
43
|
+
{% if klass.attributes.size > 0 %}
|
44
|
+
|
|
45
|
+
[cols="15,20,60",options="header"]
|
46
|
+
!===
|
47
|
+
! *Attribute*
|
48
|
+
! *Value type and multiplicity*
|
49
|
+
! *Definition*
|
50
|
+
{% for attr in klass.attributes %}
|
51
|
+
|
52
|
+
{% capture cardinality %}{% if attr.cardinality.min == 'C' %}[0..{{ attr.cardinality.max }}]{% elsif assoc.member_end_cardinality.min == 'M' and assoc.member_end_cardinality.max == '1' %}[1..1]{% else %}[{{ attr.cardinality.max }}]{% endif %}{% endcapture %}
|
53
|
+
|
54
|
+
! {{ attr.name }}
|
55
|
+
!<<{{ attr.type }}-section,{{ attr.name }}>> {{ cardinality }}
|
56
|
+
!{{ attr.definition }}
|
57
|
+
|
58
|
+
{% endfor %}
|
59
|
+
!===
|
60
|
+
|
61
|
+
| NOTE: Unless otherwise specified, all attributes and role names have the stereotype «Property».
|
62
|
+
{% endif %}
|
63
|
+
|===
|
64
|
+
|
65
|
+
{% endfor %}
|
@@ -3,8 +3,9 @@
|
|
3
3
|
{% elsif is_klass_spare == 'Spare' %}{% continue %}
|
4
4
|
{% endif %}
|
5
5
|
{% assign klass_name = klass.name | downcase | replace: ':', '' | replace: ' ', '_' %}
|
6
|
-
|
7
|
-
|
6
|
+
{% assign klass_xid = klass.xmi_id %}
|
7
|
+
[[tab-P-{{ package_name }}-DT-{{ klass_xid }}]]
|
8
|
+
.Elements of "{{ package.name }}::{{ klass.name }}" (data type)
|
8
9
|
[width="100%",cols="a,a,a,a,a,a,a,a"]
|
9
10
|
|===
|
10
11
|
|
@@ -24,14 +25,14 @@ h|Inheritance from: 7+| {{ inherited | map: 'member_end' | join: ", " }}
|
|
24
25
|
h|Generalization of: 7+| {{ generalizations | map: 'member_end' | join: ", " }}
|
25
26
|
{% endif %}
|
26
27
|
|
27
|
-
h|Abstract: 7+| {
|
28
|
+
h|Abstract: 7+| {% if klass.is_abstract %}True{% else %}False{% endif %}
|
28
29
|
{% assign aggregations = klass.associations | where: "member_end_type", "aggregation" %}
|
29
30
|
{% if aggregations.size > 0 %}
|
30
31
|
.{{aggregations.size | plus: 1}}+h|Associations:
|
31
|
-
4+|_Association
|
32
|
-
|_Obligation_
|
32
|
+
4+| _Association with_
|
33
|
+
| _Obligation_
|
33
34
|
| _Maximum occurrence_
|
34
|
-
|
|
35
|
+
| _Provides_
|
35
36
|
|
36
37
|
{% for assoc in aggregations %}
|
37
38
|
4+| {{assoc.member_end}}
|
@@ -41,12 +42,11 @@ h|Abstract: 7+| {{ klass.is_abstract }}
|
|
41
42
|
|
42
43
|
{% endfor %}
|
43
44
|
{% else %}
|
44
|
-
|
45
|
-
.1+h|Associations: 7+| (none)
|
45
|
+
h| Associations: 7+| (none)
|
46
46
|
{% endif %}
|
47
47
|
|
48
48
|
{% if klass.attributes.size > 0 %}
|
49
|
-
.{{klass.attributes.size | plus: 1}}+h|Values:
|
49
|
+
.{{klass.attributes.size | plus: 1}}+h| Values:
|
50
50
|
| _Name_
|
51
51
|
6+| _Definition_
|
52
52
|
|
@@ -56,7 +56,7 @@ h|Abstract: 7+| {{ klass.is_abstract }}
|
|
56
56
|
|
57
57
|
{% endfor %}
|
58
58
|
{% else %}
|
59
|
-
|
59
|
+
h| Values:
|
60
60
|
7+| (none)
|
61
61
|
{% endif %}
|
62
62
|
|
@@ -0,0 +1,113 @@
|
|
1
|
+
{% for package in context.packages %}
|
2
|
+
{% assign package_name = package.name | downcase | replace: ":", "" | replace: " ", "_" %}
|
3
|
+
{% if additional_context.before and additional_context.before.size > 0 %}
|
4
|
+
{% for before in additional_context.before %}
|
5
|
+
{{ before.text }}
|
6
|
+
{% endfor %}
|
7
|
+
{% endif %}
|
8
|
+
{% capture equalsigns %}{% for count in (1..depth) %}={% endfor %}{% endcapture %}{{equalsigns}} {{ package.name }}
|
9
|
+
|
10
|
+
[[rc_{{ package_name }}-model_section]]
|
11
|
+
{{equalsigns}}= {{ package.name }}
|
12
|
+
|
13
|
+
{% assign before_package_key = 'before;' | append: package.name %}
|
14
|
+
{% if additional_context[before_package_key] and additional_context[before_package_key].size > 0 %}
|
15
|
+
{% for before in additional_context[before_package_key] %}
|
16
|
+
{{ before.text }}
|
17
|
+
{% endfor %}
|
18
|
+
{% endif %}
|
19
|
+
{% if additional_context.diagram_include_block %}
|
20
|
+
{% for diagram_include_block in additional_context.diagram_include_block %}
|
21
|
+
{% include "diagrams_block", package_name: package_name, image_base_path: diagram_include_block.base_path, text: diagram_include_block.text %}
|
22
|
+
{% endfor %}
|
23
|
+
{% endif %}
|
24
|
+
|
25
|
+
{% if additional_context.include_block and additional_context.include_block.size > 0 %}
|
26
|
+
{% for block in additional_context.include_block %}
|
27
|
+
{% capture block_filename %}{{ block.base_path }}{{ package_name }}{% endcapture %}
|
28
|
+
{% capture block_content %}{% include block_filename %}{% endcapture %}
|
29
|
+
{% unless block_content contains "Liquid error" %}
|
30
|
+
{% if block.text %}
|
31
|
+
{{ block.text }}
|
32
|
+
{% endif %}
|
33
|
+
{{ block_content }}
|
34
|
+
{% endunless %}
|
35
|
+
{% endfor %}
|
36
|
+
{% endif %}
|
37
|
+
|
38
|
+
{% assign include_block_package_key = 'include_block;' | append: package.name %}
|
39
|
+
{% if additional_context[include_block_package_key] and additional_context[include_block_package_key].size > 0 %}
|
40
|
+
{% for block in additional_context[include_block_package_key] %}
|
41
|
+
{% capture block_filename %}{{ block.base_path }}{{ package_name }}{% endcapture %}
|
42
|
+
{% capture block_content %}{% include block_filename %}{% endcapture %}
|
43
|
+
{% unless block_content contains "Liquid error" %}
|
44
|
+
{% if block.text %}
|
45
|
+
{{ block.text }}
|
46
|
+
{% endif %}
|
47
|
+
{{ block_content }}
|
48
|
+
{% endunless %}
|
49
|
+
{% endfor %}
|
50
|
+
{% endif %}
|
51
|
+
|
52
|
+
{{equalsigns}}= Class definitions
|
53
|
+
{% if package.classes.size > 0 %}
|
54
|
+
.Classes used in {{ package.name }}
|
55
|
+
[cols="2a,6a",options="header"]
|
56
|
+
|===
|
57
|
+
|Class |Description
|
58
|
+
|
59
|
+
{% for klass in package.classes %}
|
60
|
+
|<<{{ klass.name }}-section,{{ klass.name }}>> «{{ klass.stereotype }}»
|
61
|
+
|{{ klass.definition }}
|
62
|
+
|
63
|
+
{% endfor %}
|
64
|
+
|===
|
65
|
+
{% endif %}
|
66
|
+
|
67
|
+
{% if package.data_types.size > 0 %}
|
68
|
+
.Data types used in {{ package.name }}
|
69
|
+
[cols="2,6",options="header"]
|
70
|
+
|===
|
71
|
+
|Name |Description
|
72
|
+
|
73
|
+
{% for klass in package.data_types %}
|
74
|
+
|<<{{ klass.name }}-section,{{ klass.name }}>> «{{ klass.stereotype }}»
|
75
|
+
|{{ klass.definition }}
|
76
|
+
|
77
|
+
{% endfor %}
|
78
|
+
|
79
|
+
|===
|
80
|
+
{% endif %}
|
81
|
+
|
82
|
+
{% if package.enums.size > 0 %}
|
83
|
+
.Enumerated Classes used in {{ package.name }}
|
84
|
+
[cols="2a,6a",options="header"]
|
85
|
+
|===
|
86
|
+
|Name |Description
|
87
|
+
|
88
|
+
{% for klass in package.enums %}
|
89
|
+
|<<{{ klass.name }}-section,{{ klass.name }}>> «{{ klass.stereotype }}»
|
90
|
+
|{{ klass.definition }}
|
91
|
+
|
92
|
+
{% endfor %}
|
93
|
+
|
94
|
+
|===
|
95
|
+
{% endif %}
|
96
|
+
|
97
|
+
{% assign after_package_key = 'after;' | append: package.name %}
|
98
|
+
{% if additional_context[after_package_key] %}
|
99
|
+
{{equalsigns}}= Additional information
|
100
|
+
{% for after in additional_context[after_package_key] %}
|
101
|
+
{{ after.text }}
|
102
|
+
{% endfor %}
|
103
|
+
{% endif %}
|
104
|
+
{% if package.packages.size > 0 and render_nested_packages %}
|
105
|
+
{% assign nested_depth = depth | plus: 1 %}{% include "packages_entity_list", depth: nested_depth, context: package %}
|
106
|
+
{% endif %}
|
107
|
+
{% endfor %}
|
108
|
+
|
109
|
+
{% if additional_context.after and additional_context.after.size > 0 %}
|
110
|
+
{% for after in additional_context.after %}
|
111
|
+
{{ after.text }}
|
112
|
+
{% endfor %}
|
113
|
+
{% endif %}
|
@@ -3,8 +3,9 @@
|
|
3
3
|
{% elsif is_klass_spare == 'Spare' %}{% continue %}
|
4
4
|
{% endif %}
|
5
5
|
{% assign klass_name = klass.name | downcase | replace: ':', '' | replace: ' ', '_' %}
|
6
|
-
|
7
|
-
|
6
|
+
{% assign klass_xid = klass.xmi_id %}
|
7
|
+
[[tab-P-{{ package_name }}-E-{{ klass_xid }}]]
|
8
|
+
.Elements of "{{ package.name }}::{{ klass.name }}" (enumeration)
|
8
9
|
[width="100%",cols="a,a,a,a,a,a,a,a"]
|
9
10
|
|===
|
10
11
|
|
@@ -24,14 +25,14 @@ h|Inheritance from: 7+| {{ inherited | map: 'member_end' | join: ", " }}
|
|
24
25
|
h|Generalization of: 7+| {{ generalizations | map: 'member_end' | join: ", " }}
|
25
26
|
{% endif %}
|
26
27
|
|
27
|
-
h|Abstract: 7+| {
|
28
|
+
h|Abstract: 7+| {% if klass.is_abstract %}True{% else %}False{% endif %}
|
28
29
|
{% assign aggregations = klass.associations | where: "member_end_type", "aggregation" %}
|
29
30
|
{% if aggregations.size > 0 %}
|
30
31
|
.{{aggregations.size | plus: 1}}+h|Associations:
|
31
|
-
4+|_Association
|
32
|
-
|_Obligation_
|
32
|
+
4+| _Association with_
|
33
|
+
| _Obligation_
|
33
34
|
| _Maximum occurrence_
|
34
|
-
|
|
35
|
+
| _Provides_
|
35
36
|
|
36
37
|
{% for assoc in aggregations %}
|
37
38
|
4+| {{assoc.member_end}}
|
@@ -41,11 +42,11 @@ h|Abstract: 7+| {{ klass.is_abstract }}
|
|
41
42
|
|
42
43
|
{% endfor %}
|
43
44
|
{% else %}
|
44
|
-
|
45
|
-
.1+h|Associations: 7+| (none)
|
45
|
+
h| Associations: 7+| (none)
|
46
46
|
{% endif %}
|
47
|
+
|
47
48
|
{% if klass.values.size > 0 %}
|
48
|
-
.{{klass.values.size | plus: 1}}+h|Values:
|
49
|
+
.{{klass.values.size | plus: 1}}+h| Values:
|
49
50
|
| _Name_
|
50
51
|
6+| _Definition_
|
51
52
|
|
@@ -55,7 +56,7 @@ h|Abstract: 7+| {{ klass.is_abstract }}
|
|
55
56
|
|
56
57
|
{% endfor %}
|
57
58
|
{% else %}
|
58
|
-
|
59
|
+
h| Values:
|
59
60
|
7+| (none)
|
60
61
|
{% endif %}
|
61
62
|
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Metanorma
|
4
|
+
module Plugin
|
5
|
+
module Lutaml
|
6
|
+
class LutamlFigureInlineMacro < Asciidoctor::Extensions::InlineMacroProcessor
|
7
|
+
include LutamlDiagramBase
|
8
|
+
|
9
|
+
use_dsl
|
10
|
+
named :lutaml_figure
|
11
|
+
|
12
|
+
def process(parent, _target, attrs)
|
13
|
+
diagram_key = [attrs["package"], attrs["name"]].compact.join(":")
|
14
|
+
return if parent.document.attributes['lutaml_figure_id'].nil?
|
15
|
+
xmi_id = parent.document.attributes['lutaml_figure_id'][diagram_key]
|
16
|
+
return unless xmi_id
|
17
|
+
|
18
|
+
%Q(<xref target="figure-#{xmi_id}"></xref>)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -52,7 +52,7 @@ module Metanorma
|
|
52
52
|
|
53
53
|
def process_text_blocks(document, input_lines, express_indexes)
|
54
54
|
line = input_lines.next
|
55
|
-
block_match = line.match(/^\[
|
55
|
+
block_match = line.match(/^\[lutaml_express,([^,]+)?,?([^,]+)?,?([^,]+)?\]/)
|
56
56
|
return [line] if block_match.nil?
|
57
57
|
|
58
58
|
end_mark = input_lines.next
|
@@ -14,7 +14,7 @@ module Metanorma
|
|
14
14
|
# @example [lutaml_uml_attributes_table,path/to/lutaml,EntityName]
|
15
15
|
class LutamlUmlAttributesTablePreprocessor < Asciidoctor::Extensions::Preprocessor
|
16
16
|
MARCO_REGEXP =
|
17
|
-
/\[lutaml_uml_attributes_table,([^,]+),?(
|
17
|
+
/\[lutaml_uml_attributes_table,([^,]+),?([^,]+),?(.+?)?\]/
|
18
18
|
# search document for block `datamodel_attributes_table`
|
19
19
|
# read include derectives that goes after that in block and transform
|
20
20
|
# into yaml2text blocks
|
@@ -36,15 +36,16 @@ module Metanorma
|
|
36
36
|
input_lines.each_with_object([]) do |line, result|
|
37
37
|
if match = line.match(MARCO_REGEXP)
|
38
38
|
lutaml_path = match[1]
|
39
|
-
entity_name = match[
|
40
|
-
|
39
|
+
entity_name = match[2]
|
40
|
+
skip_headers = match[3]
|
41
|
+
result.push(*parse_marco(lutaml_path, entity_name, document, skip_headers))
|
41
42
|
else
|
42
43
|
result.push(line)
|
43
44
|
end
|
44
45
|
end
|
45
46
|
end
|
46
47
|
|
47
|
-
def parse_marco(lutaml_path, entity_name, document)
|
48
|
+
def parse_marco(lutaml_path, entity_name, document, skip_headers)
|
48
49
|
lutaml_document = lutaml_document_from_file(document, lutaml_path)
|
49
50
|
.serialized_document
|
50
51
|
entities = [lutaml_document["classes"], lutaml_document["enums"]]
|
@@ -53,12 +54,12 @@ module Metanorma
|
|
53
54
|
entity_definition = entities.detect do |klass|
|
54
55
|
klass["name"] == entity_name.strip
|
55
56
|
end
|
56
|
-
model_representation(entity_definition, document)
|
57
|
+
model_representation(entity_definition, document, skip_headers)
|
57
58
|
end
|
58
59
|
|
59
|
-
def model_representation(entity_definition, document)
|
60
|
+
def model_representation(entity_definition, document, skip_headers)
|
60
61
|
render_result, errors = Utils.render_liquid_string(
|
61
|
-
template_string: table_template,
|
62
|
+
template_string: table_template(skip_headers),
|
62
63
|
context_items: entity_definition,
|
63
64
|
context_name: "definition",
|
64
65
|
document: document
|
@@ -68,9 +69,9 @@ module Metanorma
|
|
68
69
|
end
|
69
70
|
|
70
71
|
# rubocop:disable Layout/IndentHeredoc
|
71
|
-
def table_template
|
72
|
+
def table_template(skip_headers)
|
72
73
|
<<~TEMPLATE
|
73
|
-
=== {{ definition.name }}
|
74
|
+
#{"=== {{ definition.name }}" unless skip_headers}
|
74
75
|
{{ definition.definition }}
|
75
76
|
|
76
77
|
{% if definition.attributes %}
|
@@ -20,6 +20,14 @@ module Metanorma
|
|
20
20
|
Gem.loaded_specs["metanorma-plugin-lutaml"].full_gem_path,
|
21
21
|
"lib", "metanorma", "plugin", "lutaml", "liquid_templates"
|
22
22
|
)
|
23
|
+
DEFAULT_RENDER_INCLUDE = 'packages'.freeze
|
24
|
+
RENDER_STYLES_INCLUDES = {
|
25
|
+
'default' => 'packages',
|
26
|
+
'entity_list' => 'packages_entity_list',
|
27
|
+
'data_dictionary' => 'packages_data_dictionary'
|
28
|
+
}.freeze
|
29
|
+
SUPPORTED_NESTED_MACRO = %w[
|
30
|
+
before diagram_include_block after include_block].freeze
|
23
31
|
# search document for block `lutaml_uml_datamodel_description`
|
24
32
|
# read include derectives that goes after that in block and transform
|
25
33
|
# into yaml2text blocks
|
@@ -57,40 +65,63 @@ module Metanorma
|
|
57
65
|
block_match = line.match(MARCO_REGEXP)
|
58
66
|
return [line] if block_match.nil?
|
59
67
|
|
68
|
+
lutaml_document = lutaml_document_from_file(document, block_match[1])
|
69
|
+
fill_in_diagrams_attributes(document, lutaml_document)
|
60
70
|
model_representation(
|
61
|
-
|
71
|
+
lutaml_document,
|
62
72
|
document,
|
63
73
|
collect_additional_context(input_lines, input_lines.next),
|
64
74
|
parse_yaml_config_file(document, block_match[2]))
|
65
75
|
end
|
66
76
|
|
77
|
+
def fill_in_diagrams_attributes(document, lutaml_document_wrapper)
|
78
|
+
lutaml_document = lutaml_document_wrapper.original_document
|
79
|
+
package_flat_diagrams = lambda do |pks|
|
80
|
+
pks.each_with_object({}) do |package, res|
|
81
|
+
package.diagrams.map { |diag| res["#{package.name}:#{diag.name}"] = diag.xmi_id }
|
82
|
+
end
|
83
|
+
end
|
84
|
+
children_pks_daigs = package_flat_diagrams.call(lutaml_document.packages.map(&:children_packages).flatten)
|
85
|
+
document.attributes['lutaml_figure_id'] = package_flat_diagrams.call(lutaml_document.packages)
|
86
|
+
.merge(children_pks_daigs)
|
87
|
+
end
|
88
|
+
|
67
89
|
def collect_additional_context(input_lines, end_mark)
|
68
|
-
additional_context = {}
|
90
|
+
additional_context = Hash.new { |hash, key| hash[key] = [] }
|
69
91
|
block_lines = []
|
70
92
|
while (block_line = input_lines.next) != end_mark
|
71
93
|
block_lines.push(block_line)
|
72
94
|
end
|
73
95
|
block_document = (Asciidoctor::Document.new(block_lines, {})).parse
|
74
96
|
block_document.blocks.each do |block|
|
97
|
+
next unless SUPPORTED_NESTED_MACRO.include?(block.attributes['role'])
|
98
|
+
|
75
99
|
attrs = block.attributes
|
76
100
|
name = attrs.delete('role')
|
77
101
|
package = attrs.delete('package')
|
78
102
|
macro_keyword = [name, package].compact.join(";")
|
79
|
-
|
103
|
+
block_text = block.lines.length > 0 ? block.lines[1..-2].join("\n") : ''
|
104
|
+
additional_context[macro_keyword].push({ 'text' => block_text }.merge(attrs))
|
80
105
|
end
|
81
106
|
additional_context
|
82
107
|
end
|
83
108
|
|
109
|
+
def package_level(lutaml_document, level)
|
110
|
+
return lutaml_document if level <= 0
|
111
|
+
|
112
|
+
package_level(lutaml_document['packages'].first, level - 1)
|
113
|
+
end
|
114
|
+
|
84
115
|
def create_context_object(lutaml_document, additional_context, options)
|
85
|
-
|
116
|
+
root_package = package_level(lutaml_document.to_liquid, options['package_root_level'] || 1)
|
117
|
+
if options.length.zero? || options['packages'].nil?
|
86
118
|
return {
|
87
119
|
'render_nested_packages' => true,
|
88
|
-
"packages" =>
|
120
|
+
"packages" => root_package['packages'],
|
89
121
|
"additional_context" => additional_context
|
90
122
|
}
|
91
123
|
end
|
92
124
|
|
93
|
-
root_package = lutaml_document.to_liquid['packages'].first
|
94
125
|
all_packages = [root_package, *root_package['children_packages']]
|
95
126
|
{
|
96
127
|
"packages" => sort_and_filter_out_packages(all_packages, options),
|
@@ -133,7 +164,7 @@ module Metanorma
|
|
133
164
|
|
134
165
|
def model_representation(lutaml_document, document, additional_context, options)
|
135
166
|
render_result, errors = Utils.render_liquid_string(
|
136
|
-
template_string: table_template,
|
167
|
+
template_string: table_template(options['section_depth'] || 2, options['render_style']),
|
137
168
|
context_items: create_context_object(lutaml_document,
|
138
169
|
additional_context,
|
139
170
|
options),
|
@@ -145,9 +176,10 @@ module Metanorma
|
|
145
176
|
render_result.split("\n")
|
146
177
|
end
|
147
178
|
|
148
|
-
def table_template
|
179
|
+
def table_template(section_depth, render_style)
|
180
|
+
include_name = RENDER_STYLES_INCLUDES.fetch(render_style, DEFAULT_RENDER_INCLUDE)
|
149
181
|
<<~LIQUID
|
150
|
-
{% include "
|
182
|
+
{% include "#{include_name}", depth: #{section_depth}, context: context, additional_context: context.additional_context, render_nested_packages: context.render_nested_packages %}
|
151
183
|
LIQUID
|
152
184
|
end
|
153
185
|
end
|
@@ -4,6 +4,7 @@ require "metanorma/plugin/lutaml/lutaml_uml_attributes_table_preprocessor"
|
|
4
4
|
require "metanorma/plugin/lutaml/lutaml_uml_datamodel_description_preprocessor"
|
5
5
|
require "metanorma/plugin/lutaml/lutaml_diagram_block"
|
6
6
|
require "metanorma/plugin/lutaml/lutaml_diagram_block_macro"
|
7
|
+
require "metanorma/plugin/lutaml/lutaml_figure_inline_macro"
|
7
8
|
|
8
9
|
module Metanorma
|
9
10
|
module Plugin
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: metanorma-plugin-lutaml
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ribose Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-08-
|
11
|
+
date: 2021-08-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: liquid
|
@@ -261,11 +261,15 @@ files:
|
|
261
261
|
- lib/metanorma/plugin/lutaml/liquid_templates/_diagrams_block.liquid
|
262
262
|
- lib/metanorma/plugin/lutaml/liquid_templates/_packages.liquid
|
263
263
|
- lib/metanorma/plugin/lutaml/liquid_templates/_packages_class.liquid
|
264
|
+
- lib/metanorma/plugin/lutaml/liquid_templates/_packages_data_dictionary.liquid
|
265
|
+
- lib/metanorma/plugin/lutaml/liquid_templates/_packages_data_dictionary_classes.liquid
|
264
266
|
- lib/metanorma/plugin/lutaml/liquid_templates/_packages_data_type.liquid
|
267
|
+
- lib/metanorma/plugin/lutaml/liquid_templates/_packages_entity_list.liquid
|
265
268
|
- lib/metanorma/plugin/lutaml/liquid_templates/_packages_enum.liquid
|
266
269
|
- lib/metanorma/plugin/lutaml/lutaml_diagram_base.rb
|
267
270
|
- lib/metanorma/plugin/lutaml/lutaml_diagram_block.rb
|
268
271
|
- lib/metanorma/plugin/lutaml/lutaml_diagram_block_macro.rb
|
272
|
+
- lib/metanorma/plugin/lutaml/lutaml_figure_inline_macro.rb
|
269
273
|
- lib/metanorma/plugin/lutaml/lutaml_preprocessor.rb
|
270
274
|
- lib/metanorma/plugin/lutaml/lutaml_uml_attributes_table_preprocessor.rb
|
271
275
|
- lib/metanorma/plugin/lutaml/lutaml_uml_datamodel_description_preprocessor.rb
|
@@ -292,7 +296,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
292
296
|
- !ruby/object:Gem::Version
|
293
297
|
version: '0'
|
294
298
|
requirements: []
|
295
|
-
rubygems_version: 3.
|
299
|
+
rubygems_version: 3.0.3
|
296
300
|
signing_key:
|
297
301
|
specification_version: 4
|
298
302
|
summary: Metanorma plugin for LutaML
|