metanorma-plugin-lutaml 0.7.7 → 0.7.9

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d59529d97e0b2a61af4daf695ab6e3490ccdb5e99f5a351e53ab8c822c063a17
4
- data.tar.gz: 2a30e8db498027922dc4f848057880a13d4a240310b2c01122ed2176be4cbf2e
3
+ metadata.gz: 29510e3dd02119b47d1d179c94d0a954b596dc0255410091d8c0db366e6a4dd3
4
+ data.tar.gz: b2502ffd6bea597bc56c8882712c58d13e72799eca5387c76329a9ef813d62eb
5
5
  SHA512:
6
- metadata.gz: e5b8fffe0ec8df9e9ae6bddff29202f9c65a40b43a4790980799763cad78f950cab5c59f0b07ac6c7e774f4199f9aa5cf9c9ec2470d4d67622d3e491416de09e
7
- data.tar.gz: c530eea53a62605af3df803eeddffdb5feee15e91856dff2541fe2b5831cd5e27ad5052fab01d101763eb9a890b0154aad28a934a40caf980111d2647eda5448
6
+ metadata.gz: b06a2f0d8be8e9073c3f631b260d8e88525353afb8e4e6cdf11bd6db9d78994543eb6a9acda9a2602212943ff972a700efa7c7d3dc870951cd3f2c6e5a219ff2
7
+ data.tar.gz: c80c2d456bec408dccb3c621397bc9313e2cc6a53cf7c5671d504737087ebb597b446d2fc043e3deaaf809a0941f0f3b732837bf4b5aee404685d70cd6ab0d27
data/Gemfile CHANGED
@@ -11,5 +11,3 @@ begin
11
11
  rescue StandardError
12
12
  nil
13
13
  end
14
-
15
- gem "ogc-gml", github: "lutaml/ogc-gml"
@@ -1,5 +1,4 @@
1
1
  require "coradoc"
2
- require "coradoc/input/html"
3
2
 
4
3
  module Metanorma
5
4
  module Plugin
@@ -7,6 +6,7 @@ module Metanorma
7
6
  module Liquid
8
7
  module CustomFilters
9
8
  def html2adoc(input)
9
+ # Coradoc::ReverseAdoc.convert(input)
10
10
  Coradoc::Input::HTML.convert(input)
11
11
  end
12
12
 
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ class KlassTableAttributeDrop < Liquid::Drop
4
+ LOWER_VALUE_MAPPINGS = {
5
+ "C" => "0",
6
+ "M" => "1",
7
+ }.freeze
8
+
9
+ def initialize(attr) # rubocop:disable Lint/MissingSuper
10
+ @attr = attr
11
+ end
12
+
13
+ def id
14
+ @attr[:id]
15
+ end
16
+
17
+ def name
18
+ @attr[:name]
19
+ end
20
+
21
+ def type
22
+ @attr[:type]
23
+ end
24
+
25
+ def xmi_id
26
+ @attr[:xmi_id]
27
+ end
28
+
29
+ def is_derived
30
+ @attr[:is_derived]
31
+ end
32
+
33
+ def cardinality
34
+ min = @attr[:cardinality]["min"]
35
+ min = min.nil? ? nil : LOWER_VALUE_MAPPINGS[min]
36
+
37
+ "#{min}..#{@attr[:cardinality]['max']}"
38
+ end
39
+
40
+ def definition
41
+ @attr[:definition]
42
+ end
43
+
44
+ def association
45
+ @attr[:association]
46
+ end
47
+
48
+ def has_association?
49
+ !!@attr[:association]
50
+ end
51
+
52
+ def upper_klass
53
+ @attr[:upper_klass]
54
+ end
55
+
56
+ def name_ns
57
+ @attr[:name_ns]
58
+ end
59
+
60
+ def type_ns
61
+ @attr[:type_ns]
62
+ end
63
+
64
+ def gen_name
65
+ @attr[:gen_name]
66
+ end
67
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ class KlassTableContentDrop < Liquid::Drop
4
+ def initialize(content) # rubocop:disable Lint/MissingSuper
5
+ @content = content
6
+ end
7
+
8
+ def owned_props
9
+ @content[:owned_props]
10
+ end
11
+
12
+ def assoc_props
13
+ @content[:assoc_props]
14
+ end
15
+
16
+ def inherited_props
17
+ @content[:inherited_props]
18
+ end
19
+
20
+ def inherited_assoc_props
21
+ @content[:inherited_assoc_props]
22
+ end
23
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ class KlassTableDrop < Liquid::Drop
4
+ def initialize(klass) # rubocop:disable Lint/MissingSuper
5
+ @klass = klass
6
+ end
7
+
8
+ def id
9
+ @klass[:general_id]
10
+ end
11
+
12
+ def name
13
+ @klass[:name]
14
+ end
15
+
16
+ def stereotype
17
+ @klass[:stereotype]
18
+ end
19
+
20
+ def definition
21
+ @klass[:definition]
22
+ end
23
+
24
+ def type
25
+ @klass[:type]
26
+ end
27
+
28
+ def upper_klass
29
+ @klass[:general_upper_klass]
30
+ end
31
+
32
+ def general
33
+ KlassTableGeneralDrop.new(@klass[:general]) if @klass[:general]
34
+ end
35
+
36
+ def has_general?
37
+ !!@klass[:general]
38
+ end
39
+
40
+ def attributes
41
+ @klass[:general_attributes].map do |attr|
42
+ KlassTableAttributeDrop.new(attr)
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ class KlassTableGeneralDrop < Liquid::Drop
4
+ def initialize(gen) # rubocop:disable Lint/MissingSuper
5
+ @gen = gen
6
+ end
7
+
8
+ def id
9
+ @gen[:general_id]
10
+ end
11
+
12
+ def name
13
+ @gen[:general_name]
14
+ end
15
+
16
+ def upper_klass
17
+ @gen[:general_upper_klass]
18
+ end
19
+
20
+ def general
21
+ KlassTableGeneralDrop.new(@gen[:general]) if @gen[:general]
22
+ end
23
+
24
+ def has_general?
25
+ !!@gen[:general]
26
+ end
27
+
28
+ def attributes
29
+ @gen[:general_attributes].map do |attr|
30
+ KlassTableAttributeDrop.new(attr)
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,11 @@
1
+ {%- for attr in attributes -%}
2
+ {%- if attr.has_association? != false -%}
3
+ {%- capture name_col -%}
4
+ {{ attr.name_ns }}:{{ attr.name }}
5
+ ({{ attr.gen_name }})
6
+ {%- endcapture -%}
7
+ | {{ name_col | newline_to_br }}
8
+ | {{ attr.type_ns }}:{{ attr.type }} [{{ attr.cardinality }}]
9
+ | {{ attr.definition }}
10
+ {%- endif -%}
11
+ {%- endfor -%}
@@ -0,0 +1,11 @@
1
+ {%- for attr in attributes -%}
2
+ {%- if attr.has_association? == false -%}
3
+ {%- capture name_col -%}
4
+ {{ attr.name_ns }}:{{ attr.name }}
5
+ ({{ attr.gen_name }})
6
+ {%- endcapture -%}
7
+ | {{ name_col | newline_to_br }}
8
+ | {{ attr.type }} [{{ attr.cardinality }}]
9
+ | {{ attr.definition }}
10
+ {%- endif -%}
11
+ {%- endfor -%}
@@ -0,0 +1,23 @@
1
+ [cols="1a,1a,2a"]
2
+ |===
3
+ | 型の定義
4
+ 2+| {{ root.definition }}
5
+
6
+ h| 上位の型 2+| {{ root.general.upper_klass }}:{{ root.general.name }}
7
+ h| ステレオタイプ 2+| << {{ root.stereotype }} >>
8
+
9
+ 3+h| 継承する属性
10
+ h| 属性名 h| 属性の型及び多重度 h| 定義
11
+ {{ content.inherited_props }}
12
+
13
+ 3+h| 自身に定義された属性
14
+ {{ content.owned_props }}
15
+
16
+ 3+h| 継承する関連役割
17
+ h| 関連役割名 h| 関連役割の型及び多重度 h| 定義
18
+ {{ content.inherited_assoc_props }}
19
+
20
+ 3+h| 自身に定義された関連役割
21
+ h| 関連役割名 h| 関連役割の型及び多重度 h| 定義
22
+ {{ content.assoc_props }}
23
+ |===
@@ -0,0 +1,310 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "liquid"
4
+ require "asciidoctor"
5
+ require "asciidoctor/reader"
6
+ require "lutaml"
7
+ # require "lutaml/uml"
8
+ require "xmi"
9
+ require "lutaml/xmi"
10
+ require "metanorma/plugin/lutaml/utils"
11
+ require "metanorma/plugin/lutaml/asciidoctor/preprocessor"
12
+
13
+ module Metanorma
14
+ module Plugin
15
+ module Lutaml
16
+ # Macro for quick rendering of datamodel attributes/values tables
17
+ # from liquid drop object
18
+ class LutamlEaXmiPreprocessor <
19
+ ::Asciidoctor::Extensions::Preprocessor
20
+ MACRO_REGEXP =
21
+ /\[lutaml_ea_xmi,([^,]+),?(.+)?\]/.freeze
22
+ LIQUID_INCLUDE_PATH = File.join(
23
+ Gem.loaded_specs["metanorma-plugin-lutaml"].full_gem_path,
24
+ "lib", "metanorma", "plugin", "lutaml", "liquid_templates"
25
+ )
26
+ DEFAULT_RENDER_INCLUDE = "packages"
27
+ RENDER_STYLES_INCLUDES = {
28
+ "default" => "packages",
29
+ "entity_list" => "packages_entity_list",
30
+ "entity_list_class" => "packages_entity_list_class",
31
+ "data_dictionary" => "packages_data_dictionary",
32
+ }.freeze
33
+ RENDER_STYLE_ATTRIBUTE = "render_style"
34
+ SUPPORTED_NESTED_MACRO = %w[
35
+ before diagram_include_block after include_block package_text
36
+ ].freeze
37
+ # search document for block `lutaml_ea_xmi`
38
+ # read include derectives that goes after that in block and transform
39
+ # into yaml2text blocks
40
+ def process(document, reader)
41
+ r = Asciidoctor::PreprocessorNoIfdefsReader.new document, reader.lines
42
+ input_lines = r.readlines.to_enum
43
+ Asciidoctor::PreprocessorNoIfdefsReader
44
+ .new(document, processed_lines(document, input_lines))
45
+ end
46
+
47
+ private
48
+
49
+ def lutaml_document_from_file_or_cache(document, file_path, yaml_config)
50
+ full_path = Utils.relative_file_path(document, file_path)
51
+ if document.attributes["lutaml_xmi_cache"] &&
52
+ document.attributes["lutaml_xmi_cache"][full_path]
53
+ return document.attributes["lutaml_xmi_cache"][full_path]
54
+ end
55
+
56
+ yaml_config["ea_extension"]&.each do |ea_extension_path|
57
+ ea_extension_full_path = File.expand_path(
58
+ ea_extension_path, File.dirname(file_path)
59
+ )
60
+ Xmi::EaRoot.load_extension(ea_extension_full_path)
61
+ end
62
+
63
+ result_document = ::Lutaml::XMI::Parsers::XML.serialize_xmi_to_liquid(
64
+ File.new(
65
+ full_path, encoding: "UTF-8"
66
+ ),
67
+ )
68
+
69
+ document.attributes["lutaml_xmi_cache"] ||= {}
70
+ document.attributes["lutaml_xmi_cache"][full_path] = result_document
71
+ result_document
72
+ end
73
+
74
+ def parse_yaml_config_file(document, file_path)
75
+ return {} if file_path.nil?
76
+
77
+ relative_file_path = Utils.relative_file_path(document, file_path)
78
+ YAML.safe_load(File.read(relative_file_path, encoding: "UTF-8"))
79
+ end
80
+
81
+ def processed_lines(document, input_lines)
82
+ result = []
83
+ loop do
84
+ result.push(*process_text_blocks(document, input_lines))
85
+ end
86
+ result
87
+ end
88
+
89
+ def process_text_blocks(document, input_lines)
90
+ line = input_lines.next
91
+ block_match = line.match(MACRO_REGEXP)
92
+
93
+ return [line] if block_match.nil?
94
+
95
+ yaml_config = parse_yaml_config_file(document, block_match[2])
96
+ lutaml_document = lutaml_document_from_file_or_cache(document,
97
+ block_match[1],
98
+ yaml_config)
99
+ fill_in_diagrams_attributes(document, lutaml_document)
100
+ model_representation(
101
+ lutaml_document, document,
102
+ collect_additional_context(document, input_lines, input_lines.next),
103
+ yaml_config
104
+ )
105
+ end
106
+
107
+ def fill_in_entities_refs_attributes(document,
108
+ lutaml_document, options)
109
+ # render_style = options.fetch(RENDER_STYLE_ATTRIBUTE, "default")
110
+ all_children_packages = lutaml_document.packages
111
+ .map(&:children_packages).flatten
112
+ package_flat_packages = lambda do |pks|
113
+ pks.each_with_object({}) do |package, res|
114
+ res[package.name] = package.xmi_id
115
+ end
116
+ end
117
+ children_pks = package_flat_packages.call(all_children_packages)
118
+ ref_dictionary = package_flat_packages.call(lutaml_document.packages)
119
+ .merge(children_pks)
120
+ %w[class enum data_type].each do |type|
121
+ package_flat = lambda do |pks|
122
+ pks.each_with_object({}) do |package, res|
123
+ plural = type == "class" ? "classes" : "#{type}s"
124
+ package.send(plural).map do |entity|
125
+ res["#{type}:#{package.name}:#{entity.name}"] = entity.xmi_id
126
+ end
127
+ end
128
+ end
129
+ children_pks_diags = package_flat.call(all_children_packages)
130
+ ref_dictionary = ref_dictionary
131
+ .merge(package_flat.call(lutaml_document.packages)
132
+ .merge(children_pks_diags))
133
+ end
134
+ document.attributes["lutaml_entity_id"] = ref_dictionary
135
+ end
136
+
137
+ def fill_in_diagrams_attributes(document, lutaml_document)
138
+ package_flat_diagrams = lambda do |pks|
139
+ pks.each_with_object({}) do |package, res|
140
+ package.diagrams.map do |diag|
141
+ res["#{package.name}:#{diag.name}"] = diag.xmi_id
142
+ end
143
+ end
144
+ end
145
+ children_pks_diags = package_flat_diagrams.call(
146
+ lutaml_document.packages.map(&:children_packages).flatten,
147
+ )
148
+
149
+ document.attributes["lutaml_figure_id"] = package_flat_diagrams
150
+ .call(lutaml_document.packages)
151
+ .merge(children_pks_diags)
152
+ end
153
+
154
+ def collect_additional_context(document, input_lines, end_mark)
155
+ additional_context = Hash.new { |hash, key| hash[key] = [] }
156
+ additional_context["all_macros"] = []
157
+ block_lines = []
158
+ while (block_line = input_lines.next) != end_mark
159
+ block_lines.push(block_line)
160
+ end
161
+ processed_lines =
162
+ process(document, ::Asciidoctor::PreprocessorReader.new(
163
+ document, block_lines
164
+ ))
165
+ .read_lines
166
+ block_document = ::Asciidoctor::Document
167
+ .new(processed_lines, {}).parse
168
+ block_document.blocks.each do |block|
169
+ next unless SUPPORTED_NESTED_MACRO.include?(block.attributes["role"])
170
+
171
+ attrs = block.attributes
172
+ name = attrs.delete("role")
173
+ package = attrs.delete("package")
174
+ macro_keyword = [name, package].compact.join(";")
175
+ block_text = block.lines.length.positive? ? block.lines.join("\n") : ""
176
+ additional_context[macro_keyword]
177
+ .push({ "text" => block_text }.merge(attrs))
178
+ additional_context["all_macros"]
179
+ .push({ "text" => block_text,
180
+ "type" => name, "package" => package }.merge(attrs))
181
+ end
182
+ additional_context
183
+ end
184
+
185
+ def package_level(lutaml_document, level)
186
+ return lutaml_document if level <= 0
187
+
188
+ package_level(lutaml_document["packages"].first, level - 1)
189
+ end
190
+
191
+ def create_context_object(lutaml_document, additional_context, options)
192
+ root_package = package_level(lutaml_document.to_liquid,
193
+ options["package_root_level"] || 1)
194
+ if options.empty? || options["packages"].nil?
195
+ return {
196
+ "render_nested_packages" => true,
197
+ "packages" => root_package["packages"],
198
+ "root_packages" => [root_package],
199
+ "additional_context" => additional_context
200
+ .merge("external_classes" => options["external_classes"]),
201
+ "name" => root_package["name"],
202
+ }
203
+ end
204
+
205
+ all_packages = [root_package, *root_package["children_packages"]]
206
+ {
207
+ "packages" => sort_and_filter_out_packages(all_packages, options),
208
+ "package_entities" => package_entities(options),
209
+ "package_skip_sections" => package_skip_sections(options),
210
+ "additional_context" => additional_context
211
+ .merge("external_classes" => options["external_classes"]),
212
+ "root_packages" => [root_package],
213
+ "render_nested_packages" => options["render_nested_packages"] ||
214
+ false,
215
+ "name" => root_package["name"],
216
+ }
217
+ end
218
+
219
+ def package_entities(options)
220
+ return {} unless options["packages"]
221
+
222
+ options["packages"]
223
+ .find_all { |entity| entity.is_a?(Hash) && entity.values.first["render_entities"] }
224
+ .map do |entity|
225
+ [entity.keys.first,
226
+ entity.values.first["render_entities"].map { |n| [n, true] }.to_h]
227
+ end.to_h
228
+ end
229
+
230
+ def package_skip_sections(options)
231
+ return {} unless options["packages"]
232
+
233
+ options["packages"]
234
+ .find_all { |entity| entity.is_a?(Hash) && entity.values.first["skip_tables"] }
235
+ .map do |entity|
236
+ [entity.keys.first, entity.values.first["skip_tables"].map do |n|
237
+ [n, true]
238
+ end.to_h]
239
+ end.to_h
240
+ end
241
+
242
+ def sort_and_filter_out_packages(all_packages, options)
243
+ return all_packages if options["packages"].nil?
244
+
245
+ result = []
246
+ # Step one - filter out all skipped packages
247
+ options["packages"]
248
+ .find_all { |entity| entity.is_a?(Hash) && entity["skip"] }
249
+ .each do |entity|
250
+ entity_regexp = config_entity_regexp(entity["skip"])
251
+ all_packages
252
+ .delete_if { |package| package["name"] =~ entity_regexp }
253
+ end
254
+ # Step two - select supplied packages by pattern
255
+ options["packages"]
256
+ .find_all { |entity| entity.is_a?(String) || (entity.is_a?(Hash) && !entity["skip"]) }
257
+ .each do |entity_obj|
258
+ entity = entity_obj.is_a?(String) ? entity_obj : entity_obj.keys.first
259
+ entity_regexp = config_entity_regexp(entity)
260
+ all_packages.each do |package|
261
+ if package["name"]&.match?(entity_regexp)
262
+ result.push(package)
263
+ all_packages
264
+ .delete_if { |nest_package| nest_package["name"] == package["name"] }
265
+ end
266
+ end
267
+ end
268
+ result
269
+ end
270
+
271
+ def config_entity_regexp(entity)
272
+ additional_sym = ".*" if /\*$/.match?(entity)
273
+ %r{^#{Regexp.escape(entity.delete('*'))}#{additional_sym}$}
274
+ end
275
+
276
+ def model_representation(lutaml_document, document, additional_context,
277
+ options)
278
+ fill_in_entities_refs_attributes(document, lutaml_document, options)
279
+ render_result, errors = Utils.render_liquid_string(
280
+ template_string: template(options["section_depth"] || 2,
281
+ options["render_style"],
282
+ options["include_root"]),
283
+ context_items: create_context_object(lutaml_document,
284
+ additional_context,
285
+ options),
286
+ context_name: "context",
287
+ document: document,
288
+ include_path: LIQUID_INCLUDE_PATH,
289
+ )
290
+ Utils.notify_render_errors(document, errors)
291
+ render_result.split("\n")
292
+ end
293
+
294
+ def template(section_depth, render_style, include_root)
295
+ include_name = RENDER_STYLES_INCLUDES.fetch(render_style,
296
+ DEFAULT_RENDER_INCLUDE)
297
+ result = ""
298
+ if include_root
299
+ result += <<~LIQUID
300
+ {% include "#{include_name}", package_skip_sections: context.package_skip_sections, package_entities: context.package_entities, context: context.root_packages, additional_context: context.additional_context, render_nested_packages: false %}
301
+ LIQUID
302
+ end
303
+ result + <<~LIQUID
304
+ {% include "#{include_name}", depth: #{section_depth}, package_skip_sections: context.package_skip_sections, package_entities: context.package_entities, context: context, additional_context: context.additional_context, render_nested_packages: context.render_nested_packages %}
305
+ LIQUID
306
+ end
307
+ end
308
+ end
309
+ end
310
+ end
@@ -0,0 +1,201 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "liquid_drops/klass_table_drop"
4
+ require_relative "liquid_drops/klass_table_attribute_drop"
5
+ require_relative "liquid_drops/klass_table_general_drop"
6
+ require_relative "liquid_drops/klass_table_content_drop"
7
+
8
+ module Metanorma
9
+ module Plugin
10
+ module Lutaml
11
+ class LutamlKlassTableBlockMacro < ::Asciidoctor::Extensions::BlockMacroProcessor
12
+ DEFAULT_TEMPLATE_PATH = File.join(
13
+ Gem::Specification.find_by_name("metanorma-plugin-lutaml").gem_dir,
14
+ "lib/metanorma/plugin/lutaml/liquid_templates/<NAME>.liquid",
15
+ )
16
+ DEFAULT_TABLE_TEMPLATE = DEFAULT_TEMPLATE_PATH
17
+ .gsub("<NAME>", "_klass_table")
18
+ DEFAULT_ROW_TEMPLATE = DEFAULT_TEMPLATE_PATH
19
+ .gsub("<NAME>", "_klass_row")
20
+ DEFAULT_ASSOC_ROW_TEMPLATE = DEFAULT_TEMPLATE_PATH
21
+ .gsub("<NAME>", "_klass_assoc_row")
22
+
23
+ use_dsl
24
+ named :lutaml_klass_table
25
+
26
+ def process(parent, target, attrs)
27
+ result_path = Utils.relative_file_path(parent.document, target)
28
+
29
+ gen = ::Lutaml::XMI::Parsers::XML.serialize_generalization_by_name(
30
+ result_path, attrs["name"]
31
+ )
32
+
33
+ render(gen, parent, attrs)
34
+ end
35
+
36
+ private
37
+
38
+ def render(gen, parent, attrs) # rubocop:disable Metrics/MethodLength
39
+ content = {}
40
+
41
+ content[:owned_props] = render_owned_props(
42
+ gen, parent, attrs
43
+ )
44
+ content[:assoc_props] = render_assoc_props(
45
+ gen, parent, attrs
46
+ )
47
+ content[:inherited_props] = render_inherited_props(
48
+ gen, parent, attrs
49
+ )
50
+ content[:inherited_assoc_props] = render_inherited_assoc_props(
51
+ gen, parent, attrs
52
+ )
53
+
54
+ # content[:inherited_props] += render_named_inherited_props(
55
+ # gen, parent, attrs, "gml"
56
+ # )
57
+ # content[:inherited_props] += render_named_inherited_props(
58
+ # gen, parent, attrs, "core"
59
+ # )
60
+ # content[:inherited_assoc_props] += render_named_inherited_props(
61
+ # gen, parent, attrs, "gen"
62
+ # )
63
+
64
+ rendered_table = render_table(gen, parent, attrs, content)
65
+
66
+ block = create_open_block(parent, "", attrs)
67
+ parse_content(block, rendered_table, attrs)
68
+ end
69
+
70
+ def render_table(gen, parent, attrs, content)
71
+ table_tmpl = get_template(
72
+ parent.document, attrs["table_template"], :table
73
+ )
74
+
75
+ table_tmpl.assigns["root"] = KlassTableDrop.new(gen)
76
+ table_tmpl.assigns["content"] =
77
+ KlassTableContentDrop.new(content)
78
+
79
+ table_tmpl.render
80
+ end
81
+
82
+ def render_general_rows(general_item, parent, attrs)
83
+ row_tmpl = get_template(
84
+ parent.document, attrs["row_template"], :row
85
+ )
86
+ render_rows(general_item, row_tmpl)
87
+ end
88
+
89
+ def render_assoc_rows(general_item, parent, attrs)
90
+ row_tmpl = get_template(
91
+ parent.document, attrs["assoc_template"], :assoc_row
92
+ )
93
+ render_rows(general_item, row_tmpl)
94
+ end
95
+
96
+ def render_rows(general_item, row_tmpl)
97
+ gen_attrs = general_item[:general_attributes]
98
+ upper_klass = general_item[:general_upper_klass]
99
+ gen_name = general_item[:general_name]
100
+ attributes = prepare_row_drops(gen_attrs, upper_klass, gen_name)
101
+ row_tmpl.assigns["attributes"] = attributes
102
+ row_tmpl.render
103
+ end
104
+
105
+ def prepare_row_drops(gen_attrs, upper_klass, gen_name) # rubocop:disable Metrics/MethodLength
106
+ gen_attrs.map do |attr|
107
+ attr[:gen_name] = gen_name
108
+ attr[:upper_klass] = upper_klass
109
+ attr[:name_ns] = case attr[:type_ns]
110
+ when "core", "gml"
111
+ upper_klass
112
+ else
113
+ attr[:type_ns]
114
+ end
115
+
116
+ attr[:name_ns] = upper_klass if attr[:name_ns].nil?
117
+
118
+ KlassTableAttributeDrop.new(attr)
119
+ end
120
+ end
121
+
122
+ def render_owned_props(gen, parent, attrs)
123
+ render_general_rows(gen, parent, attrs)
124
+ end
125
+
126
+ def render_assoc_props(gen, parent, attrs)
127
+ render_assoc_rows(gen, parent, attrs)
128
+ end
129
+
130
+ def render_gml_inherited_props(gen, parent, attrs)
131
+ render_named_inherited_props(gen, parent, attrs, "gml")
132
+ end
133
+
134
+ def render_core_inherited_props(gen, parent, attrs)
135
+ render_named_inherited_props(gen, parent, attrs, "core")
136
+ end
137
+
138
+ def render_gen_inherited_props(gen, parent, attrs)
139
+ render_named_inherited_props(gen, parent, attrs, "gen")
140
+ end
141
+
142
+ def render_named_inherited_props(gen, parent, attrs, name)
143
+ attr_key = "#{name}_attributes".to_sym
144
+ general_item = {}
145
+ general_item[:general_attributes] = gen[attr_key]
146
+ general_item[:general_upper_klass] = gen[attr_key].first[:upper_klass]
147
+ general_item[:general_name] = name
148
+
149
+ render_general_rows(general_item, parent, attrs)
150
+ end
151
+
152
+ def render_inherited_props(gen, parent, attrs)
153
+ render_inherited_rows(gen, parent, attrs, assoc: false)
154
+ end
155
+
156
+ def render_inherited_assoc_props(gen, parent, attrs)
157
+ render_inherited_rows(gen, parent, attrs, assoc: true)
158
+ end
159
+
160
+ def render_inherited_rows(gen, parent, attrs, assoc: false) # rubocop:disable Metrics/MethodLength
161
+ rendered_rows = ""
162
+ general_item = gen[:general]
163
+
164
+ while general_item && !general_item.empty?
165
+ rendered_rows += if assoc
166
+ render_assoc_rows(general_item, parent, attrs)
167
+ else
168
+ render_general_rows(general_item, parent, attrs)
169
+ end
170
+ general_item = general_item[:general]
171
+ end
172
+
173
+ rendered_rows
174
+ end
175
+
176
+ def get_template(document, template_path, tmpl_type)
177
+ if template_path.nil?
178
+ template_path = get_default_template_path(tmpl_type)
179
+ end
180
+
181
+ rel_tmpl_path = Utils.relative_file_path(
182
+ document, template_path
183
+ )
184
+
185
+ ::Liquid::Template.parse(File.read(rel_tmpl_path))
186
+ end
187
+
188
+ def get_default_template_path(tmpl_type)
189
+ case tmpl_type
190
+ when :row
191
+ DEFAULT_ROW_TEMPLATE
192
+ when :assoc_row
193
+ DEFAULT_ASSOC_ROW_TEMPLATE
194
+ else
195
+ DEFAULT_TABLE_TEMPLATE
196
+ end
197
+ end
198
+ end
199
+ end
200
+ end
201
+ end
@@ -121,10 +121,10 @@ options)
121
121
  end
122
122
  end
123
123
  end
124
- children_pks_daigs = package_flat.call(all_children_packages)
124
+ children_pks_diags = package_flat.call(all_children_packages)
125
125
  ref_dictionary = ref_dictionary
126
126
  .merge(package_flat.call(lutaml_document.packages)
127
- .merge(children_pks_daigs))
127
+ .merge(children_pks_diags))
128
128
  end
129
129
  document.attributes["lutaml_entity_id"] = ref_dictionary
130
130
  end
@@ -138,12 +138,12 @@ options)
138
138
  end
139
139
  end
140
140
  end
141
- children_pks_daigs = package_flat_diagrams.call(
141
+ children_pks_diags = package_flat_diagrams.call(
142
142
  lutaml_document.packages.map(&:children_packages).flatten,
143
143
  )
144
144
  document.attributes["lutaml_figure_id"] = package_flat_diagrams
145
145
  .call(lutaml_document.packages)
146
- .merge(children_pks_daigs)
146
+ .merge(children_pks_diags)
147
147
  end
148
148
 
149
149
  def collect_additional_context(document, input_lines, end_mark)
@@ -265,7 +265,7 @@ options)
265
265
 
266
266
  def config_entity_regexp(entity)
267
267
  additional_sym = ".*" if /\*$/.match?(entity)
268
- %r{^#{Regexp.escape(entity.gsub('*', ''))}#{additional_sym}$}
268
+ %r{^#{Regexp.escape(entity.delete('*'))}#{additional_sym}$}
269
269
  end
270
270
 
271
271
  def model_representation(lutaml_document, document, additional_context,
@@ -1,7 +1,7 @@
1
1
  module Metanorma
2
2
  module Plugin
3
3
  module Lutaml
4
- VERSION = "0.7.7".freeze
4
+ VERSION = "0.7.9".freeze
5
5
  end
6
6
  end
7
7
  end
@@ -3,6 +3,7 @@ require "metanorma/plugin/lutaml/lutaml_preprocessor"
3
3
  require "metanorma/plugin/lutaml/lutaml_uml_class_preprocessor"
4
4
  require "metanorma/plugin/lutaml/lutaml_uml_attributes_table_preprocessor"
5
5
  require "metanorma/plugin/lutaml/lutaml_uml_datamodel_description_preprocessor"
6
+ require "metanorma/plugin/lutaml/lutaml_ea_xmi_preprocessor"
6
7
  require "metanorma/plugin/lutaml/lutaml_diagram_block"
7
8
  require "metanorma/plugin/lutaml/lutaml_diagram_block_macro"
8
9
  require "metanorma/plugin/lutaml/lutaml_figure_inline_macro"
@@ -11,6 +12,7 @@ require "metanorma/plugin/lutaml/lutaml_ea_diagram_block_macro"
11
12
  require "metanorma/plugin/lutaml/lutaml_gml_dictionary_base"
12
13
  require "metanorma/plugin/lutaml/lutaml_gml_dictionary_block_macro"
13
14
  require "metanorma/plugin/lutaml/lutaml_gml_dictionary_block"
15
+ require "metanorma/plugin/lutaml/lutaml_klass_table_block_macro"
14
16
 
15
17
  module Metanorma
16
18
  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.7.7
4
+ version: 0.7.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-09-18 00:00:00.000000000 Z
11
+ date: 2024-09-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: asciidoctor
@@ -332,7 +332,14 @@ files:
332
332
  - lib/metanorma/plugin/lutaml/liquid/multiply_local_file_system.rb
333
333
  - lib/metanorma/plugin/lutaml/liquid_drops/gml_dictionary_drop.rb
334
334
  - lib/metanorma/plugin/lutaml/liquid_drops/gml_dictionary_entry_drop.rb
335
+ - lib/metanorma/plugin/lutaml/liquid_drops/klass_table_attribute_drop.rb
336
+ - lib/metanorma/plugin/lutaml/liquid_drops/klass_table_content_drop.rb
337
+ - lib/metanorma/plugin/lutaml/liquid_drops/klass_table_drop.rb
338
+ - lib/metanorma/plugin/lutaml/liquid_drops/klass_table_general_drop.rb
335
339
  - lib/metanorma/plugin/lutaml/liquid_templates/_diagrams_block.liquid
340
+ - lib/metanorma/plugin/lutaml/liquid_templates/_klass_assoc_row.liquid
341
+ - lib/metanorma/plugin/lutaml/liquid_templates/_klass_row.liquid
342
+ - lib/metanorma/plugin/lutaml/liquid_templates/_klass_table.liquid
336
343
  - lib/metanorma/plugin/lutaml/liquid_templates/_packages.liquid
337
344
  - lib/metanorma/plugin/lutaml/liquid_templates/_packages_class.liquid
338
345
  - lib/metanorma/plugin/lutaml/liquid_templates/_packages_data_dictionary.liquid
@@ -348,10 +355,12 @@ files:
348
355
  - lib/metanorma/plugin/lutaml/lutaml_diagram_block.rb
349
356
  - lib/metanorma/plugin/lutaml/lutaml_diagram_block_macro.rb
350
357
  - lib/metanorma/plugin/lutaml/lutaml_ea_diagram_block_macro.rb
358
+ - lib/metanorma/plugin/lutaml/lutaml_ea_xmi_preprocessor.rb
351
359
  - lib/metanorma/plugin/lutaml/lutaml_figure_inline_macro.rb
352
360
  - lib/metanorma/plugin/lutaml/lutaml_gml_dictionary_base.rb
353
361
  - lib/metanorma/plugin/lutaml/lutaml_gml_dictionary_block.rb
354
362
  - lib/metanorma/plugin/lutaml/lutaml_gml_dictionary_block_macro.rb
363
+ - lib/metanorma/plugin/lutaml/lutaml_klass_table_block_macro.rb
355
364
  - lib/metanorma/plugin/lutaml/lutaml_preprocessor.rb
356
365
  - lib/metanorma/plugin/lutaml/lutaml_table_inline_macro.rb
357
366
  - lib/metanorma/plugin/lutaml/lutaml_uml_attributes_table_preprocessor.rb