metanorma-standoc 1.3.29 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/lib/asciidoctor/standoc/base.rb +2 -25
  4. data/lib/asciidoctor/standoc/biblio.rng +13 -3
  5. data/lib/asciidoctor/standoc/blocks.rb +20 -17
  6. data/lib/asciidoctor/standoc/cleanup.rb +2 -0
  7. data/lib/asciidoctor/standoc/cleanup_block.rb +2 -2
  8. data/lib/asciidoctor/standoc/cleanup_section.rb +8 -125
  9. data/lib/asciidoctor/standoc/cleanup_terms.rb +134 -0
  10. data/lib/asciidoctor/standoc/datamodel/attributes_table_preprocessor.rb +57 -0
  11. data/lib/asciidoctor/standoc/datamodel/diagram_preprocessor.rb +102 -0
  12. data/lib/asciidoctor/standoc/datamodel/plantuml_renderer.rb +408 -0
  13. data/lib/asciidoctor/standoc/inline.rb +10 -5
  14. data/lib/asciidoctor/standoc/isodoc.rng +17 -1
  15. data/lib/asciidoctor/standoc/macros.rb +13 -8
  16. data/lib/asciidoctor/standoc/macros_yaml2text.rb +19 -13
  17. data/lib/asciidoctor/standoc/ref.rb +13 -56
  18. data/lib/asciidoctor/standoc/ref_sect.rb +124 -0
  19. data/lib/asciidoctor/standoc/section.rb +2 -46
  20. data/lib/asciidoctor/standoc/views/datamodel/model_representation.adoc.erb +30 -0
  21. data/lib/asciidoctor/standoc/views/datamodel/plantuml_representation.adoc.erb +20 -0
  22. data/lib/metanorma/standoc/version.rb +1 -1
  23. data/metanorma-standoc.gemspec +1 -1
  24. data/spec/asciidoctor-standoc/cleanup_spec.rb +51 -0
  25. data/spec/asciidoctor-standoc/datamodel/attributes_table_preprocessor_spec.rb +76 -0
  26. data/spec/asciidoctor-standoc/datamodel/diagram_preprocessor_spec.rb +72 -0
  27. data/spec/asciidoctor-standoc/inline_spec.rb +5 -1
  28. data/spec/asciidoctor-standoc/macros_spec.rb +50 -0
  29. data/spec/asciidoctor-standoc/macros_yaml2text_spec.rb +2 -1
  30. data/spec/asciidoctor-standoc/refs_spec.rb +0 -4
  31. data/spec/examples/datamodel/address_class_profile.adoc +4 -0
  32. data/spec/examples/datamodel/address_component_profile.adoc +4 -0
  33. data/spec/examples/datamodel/common_models_diagram.adoc +4 -0
  34. data/spec/examples/datamodel/models/models/AddressClassProfile.yml +90 -0
  35. data/spec/examples/datamodel/models/models/AddressComponentProfile.yml +63 -0
  36. data/spec/examples/datamodel/models/models/AddressComponentSpecification.yml +15 -0
  37. data/spec/examples/datamodel/models/models/AddressProfile.yml +36 -0
  38. data/spec/examples/datamodel/models/models/AttributeProfile.yml +32 -0
  39. data/spec/examples/datamodel/models/models/InterchangeAddressClassProfile.yml +79 -0
  40. data/spec/examples/datamodel/models/models/Localization copy.yml +23 -0
  41. data/spec/examples/datamodel/models/models/Localization.yml +23 -0
  42. data/spec/examples/datamodel/models/models/ProfileCompliantAddress.yml +36 -0
  43. data/spec/examples/datamodel/models/models/ProfileCompliantAddressComponent.yml +15 -0
  44. data/spec/examples/datamodel/models/models/Signature copy.yml +20 -0
  45. data/spec/examples/datamodel/models/models/Signature.yml +20 -0
  46. data/spec/examples/datamodel/models/models/TextDirectionCode copy.yml +16 -0
  47. data/spec/examples/datamodel/models/models/TextDirectionCode.yml +16 -0
  48. data/spec/examples/datamodel/models/models/Validity.yml +14 -0
  49. data/spec/examples/datamodel/models/models/iso19160-1/Address.yml +22 -0
  50. data/spec/examples/datamodel/models/models/iso19160-1/AddressComponent.yml +2 -0
  51. data/spec/examples/datamodel/models/style.uml.inc +37 -0
  52. data/spec/examples/datamodel/models/views/CommonModels.yml +9 -0
  53. data/spec/examples/datamodel/models/views/TopDown.yml +62 -0
  54. data/spec/examples/datamodel/top_down_diagram.adoc +4 -0
  55. data/spec/fixtures/macros_datamodel/address_class_profile.xml +149 -0
  56. data/spec/fixtures/macros_datamodel/address_component_profile.xml +71 -0
  57. data/spec/fixtures/macros_datamodel/common_models_diagram.xml +7 -0
  58. data/spec/fixtures/macros_datamodel/top_down_diagram.xml +7 -0
  59. data/spec/spec_helper.rb +13 -2
  60. data/spec/vcr_cassettes/dated_iso_ref_joint_iso_iec.yml +66 -66
  61. data/spec/vcr_cassettes/isobib_get_123.yml +36 -36
  62. data/spec/vcr_cassettes/isobib_get_123_2001.yml +16 -16
  63. data/spec/vcr_cassettes/isobib_get_124.yml +17 -17
  64. data/spec/vcr_cassettes/rfcbib_get_rfc8341.yml +8 -8
  65. data/spec/vcr_cassettes/separates_iev_citations_by_top_level_clause.yml +41 -38
  66. metadata +41 -4
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'erb'
4
+
5
+ module Asciidoctor
6
+ module Standoc
7
+ module Datamodel
8
+ class AttributesTablePreprocessor < Asciidoctor::Extensions::Preprocessor
9
+ BLOCK_START_REGEXP = /\{(.+?)\.\*,(.+),(.+)\}/
10
+ BLOCK_END_REGEXP = /\A\{[A-Z]+\}\z/
11
+ MARCO_REGEXP = /\[datamodel_attributes_table,([^,]+),?(.+)?\]/
12
+ TEMPLATES_PATH = File.expand_path('../views/datamodel', __dir__).freeze
13
+ # search document for block `datamodel_attributes_table`
14
+ # read include derectives that goes after that in block and transform
15
+ # into yaml2text blocks
16
+ def process(document, reader)
17
+ input_lines = reader.readlines.to_enum
18
+ Reader.new(processed_lines(document, input_lines))
19
+ end
20
+
21
+ private
22
+
23
+ def processed_lines(document, input_lines)
24
+ input_lines.each_with_object([]) do |line, result|
25
+ if match = line.match(MARCO_REGEXP)
26
+ yaml_path = match[1]
27
+ result.push(*parse_marco(yaml_path, document))
28
+ else
29
+ result.push(line)
30
+ end
31
+ end
32
+ end
33
+
34
+ def parse_marco(yaml_path, document)
35
+ model_representation(yaml_relative_path(yaml_path, document))
36
+ .split("\n")
37
+ end
38
+
39
+ def model_representation(model_path)
40
+ template = File.read(File.join(
41
+ TEMPLATES_PATH,
42
+ 'model_representation.adoc.erb'
43
+ ))
44
+ file_name = File.basename(model_path).gsub(/\.ya?ml/, '')
45
+ ERB
46
+ .new(template)
47
+ .result(binding)
48
+ end
49
+
50
+ def yaml_relative_path(file_path, document)
51
+ directory = File.dirname(document.attributes['docfile'] || '.')
52
+ document.path_resolver.system_path(file_path, directory)
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'erb'
4
+ require 'asciidoctor/standoc/datamodel/plantuml_renderer'
5
+
6
+ module Asciidoctor
7
+ module Standoc
8
+ module Datamodel
9
+ class DiagramPreprocessor < Asciidoctor::Extensions::Preprocessor
10
+ BLOCK_START_REGEXP = /\{(.+?)\.\*,(.+),(.+)\}/
11
+ BLOCK_END_REGEXP = /\A\{[A-Z]+\}\z/
12
+ MARCO_REGEXP = /\[datamodel_diagram,([^,]+),?(.+)?\]/
13
+ TEMPLATES_PATH = File.expand_path('../views/datamodel', __dir__).freeze
14
+ # search document for block `datamodel_diagram`
15
+ # read include derectives that goes after that in block and transform
16
+ # into plantuml block
17
+ def process(document, reader)
18
+ input_lines = reader.readlines.to_enum
19
+ Reader.new(processed_lines(document, input_lines))
20
+ end
21
+
22
+ private
23
+
24
+ def processed_lines(document, input_lines)
25
+ input_lines.each_with_object([]) do |line, result|
26
+ if match = line.match(MARCO_REGEXP)
27
+ result
28
+ .push(*parse_datamodel_marco(match[1], match[2], document))
29
+ else
30
+ result.push(line)
31
+ end
32
+ end
33
+ end
34
+
35
+ def parse_datamodel_marco(yaml_path, include_path, document)
36
+ include_path ||= File.join(File.dirname(yaml_path), '..', 'models')
37
+ include_path = yaml_relative_path(include_path, document)
38
+ yaml_relative_to_doc_path = yaml_relative_path(yaml_path, document)
39
+ view_hash = YAML.safe_load(File.read(yaml_relative_to_doc_path))
40
+ plantuml_representations(view_hash,
41
+ yaml_relative_to_doc_path,
42
+ include_path)
43
+ end
44
+
45
+ def yaml_relative_path(file_path, document)
46
+ docfile = document.attributes['docfile'] || '.'
47
+ docfile_directory = File.dirname(docfile)
48
+ document.path_resolver.system_path(file_path, docfile_directory)
49
+ end
50
+
51
+ def import_format(include_path, import_name, values)
52
+ include_content = File.read(File.join(
53
+ include_path,
54
+ "#{import_name}.yml"
55
+ ))
56
+ content = YAML.safe_load(include_content)
57
+ if values
58
+ content['skipSection'] = values['skipSection']
59
+ end
60
+ content
61
+ end
62
+
63
+ def format_import_directives(imports, include_path)
64
+ imports
65
+ .each_with_object({}) do |(import_name, values), res|
66
+ full_model_name = import_name.split('/').join
67
+ content = import_format(include_path, import_name, values)
68
+ res[content['name'] || full_model_name] = content
69
+ end.compact
70
+ end
71
+
72
+ def prepare_view_hash(view_hash, all_imports)
73
+ view_hash.merge!(
74
+ 'classes' => model_type(all_imports, 'class'),
75
+ 'enums' => model_type(all_imports, 'enum'),
76
+ 'relations' => view_hash['relations'] || [],
77
+ 'fidelity' => (view_hash['fidelity'] || {})
78
+ .merge!('classes' => model_type(all_imports, 'class'))
79
+ )
80
+ end
81
+
82
+ def model_type(imports, type)
83
+ imports
84
+ .select do |_name, elem|
85
+ elem['modelType'] == type
86
+ end
87
+ end
88
+
89
+ def plantuml_representations(view_hash, view_path, include_path)
90
+ yaml_directory = File.dirname(view_path)
91
+ all_imports = format_import_directives(view_hash['imports'],
92
+ include_path)
93
+ prepare_view_hash(view_hash, all_imports)
94
+ Asciidoctor::Datamodel::PlantumlRenderer
95
+ .new(view_hash, File.join(yaml_directory, '..'))
96
+ .render
97
+ .split("\n")
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,408 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'erb'
4
+
5
+ module Asciidoctor
6
+ module Datamodel
7
+ class PlantumlRenderer
8
+ TEMPLATES_PATH = File.expand_path('../views/datamodel', __dir__).freeze
9
+
10
+ attr_reader :yml, :plantuml_path
11
+
12
+ def initialize(yml, plantuml_path)
13
+ @yml = yml
14
+ @plantuml_path = plantuml_path
15
+ end
16
+
17
+ def join_as_plantuml(*ary)
18
+ ary.compact.join("\n").sub(/\s+\Z/, '')
19
+ end
20
+
21
+ def render
22
+ ERB.new(
23
+ File.read(
24
+ File.join(TEMPLATES_PATH, 'plantuml_representation.adoc.erb')
25
+ )
26
+ ).result(binding)
27
+ end
28
+
29
+ def diagram_caption
30
+ yml['caption']
31
+ end
32
+
33
+ def imports_yml_to_plantuml
34
+ return if empty?(yml, 'imports')
35
+
36
+ <<~TEMPLATE
37
+ '******* IMPORTS ******************************************************
38
+ !include #{plantuml_path}/style.uml.inc
39
+ TEMPLATE
40
+ end
41
+
42
+ def class_defs_yml_to_plantuml
43
+ return if empty?(yml, 'classes') && empty?(yml, 'enums')
44
+
45
+ <<~TEMPLATE
46
+ '******* CLASS DEFINITIONS ********************************************
47
+ #{join_as_plantuml(
48
+ classes_to_classes_plantuml(yml['classes']),
49
+ enums_to_enums_plantuml(yml['enums'])
50
+ )}
51
+ TEMPLATE
52
+ end
53
+
54
+ def class_groups_yml_to_plantuml
55
+ return if empty?(yml, 'groups')
56
+
57
+ <<~TEMPLATE
58
+ '******* CLASS GROUPS *************************************************
59
+ #{join_as_plantuml(
60
+ groups_to_plantuml(yml['groups'])
61
+ )}
62
+ TEMPLATE
63
+ end
64
+
65
+ def class_relations_yml_to_plantuml
66
+ return if empty?(yml, 'classes') && empty?(yml, 'relations')
67
+
68
+ <<~TEMPLATE
69
+ '******* CLASS RELATIONS **********************************************
70
+ #{join_as_plantuml(
71
+ classes_to_relations_plantuml(yml['classes']),
72
+ relations_to_plantuml(nil, yml['relations'])
73
+ )}
74
+ TEMPLATE
75
+ end
76
+
77
+ def diagram_options_yml_to_plantuml
78
+ return if empty?(yml, 'diagram_options')
79
+
80
+ <<~TEMPLATE
81
+ '******* DIAGRAM SPECIFIC CONFIG **************************************
82
+ #{join_as_plantuml(
83
+ diagram_options_to_plantuml(yml['diagram_options'])
84
+ )}
85
+ TEMPLATE
86
+ end
87
+
88
+ def bottom_yml_to_plantuml
89
+ return if empty?(yml, 'bottom')
90
+
91
+ <<~TEMPLATE
92
+ '******* BOTTOM OVERRIDE CONFIG **************************************
93
+ #{join_as_plantuml(bottom_to_plantuml(yml['bottom']))}
94
+ TEMPLATE
95
+ end
96
+
97
+ def fidelity_yml_to_plantuml
98
+ return if empty?(yml, 'fidelity')
99
+
100
+ <<~TEMPLATE
101
+ '******* FIDELITY *****************************************************
102
+ #{join_as_plantuml(fidelity_to_plantuml(yml['fidelity']))}
103
+ TEMPLATE
104
+ end
105
+
106
+ def classes_to_classes_plantuml(classes)
107
+ classes ||= {}
108
+
109
+ return if classes.empty?
110
+
111
+ classes.map do |(class_name, class_hash)|
112
+ class_to_plantuml(class_name, class_hash)
113
+ end.join("\n")
114
+ end
115
+
116
+ def class_to_plantuml(class_name, class_hash)
117
+ return unless class_name
118
+
119
+ class_hash ||= {}
120
+
121
+ <<~TEMPLATE
122
+ class #{class_name}#{model_stereotype_to_plantuml(class_hash['type'])} {
123
+ #{join_as_plantuml(
124
+ attributes_to_plantuml(class_hash['attributes']),
125
+ constraints_to_plantuml(class_hash['constraints'])
126
+ )}
127
+ }
128
+ TEMPLATE
129
+ end
130
+
131
+ def attributes_to_plantuml(attributes)
132
+ return unless attributes
133
+
134
+ attributes.map do |(attr_name, attr_hash)|
135
+ attribute_to_plantuml(attr_name, attr_hash)
136
+ end.join('').sub(/\n\Z/, '')
137
+ end
138
+
139
+ def attribute_to_plantuml(attr_name, attr_hash)
140
+ <<~TEMPLATE
141
+ +#{attr_name}: #{attr_hash['type']}#{attribute_cardinality_plantuml(attr_hash['cardinality'])}
142
+ TEMPLATE
143
+ end
144
+
145
+ def attribute_cardinality_plantuml(cardinality, with_bracket = true)
146
+ return '' if cardinality.nil? ||
147
+ (cardinality['min'] == cardinality['max'] &&
148
+ cardinality['min'] == 1)
149
+ card = "#{cardinality['min']}..#{cardinality['max']}"
150
+ return card unless with_bracket
151
+
152
+ "[#{card}]"
153
+ end
154
+
155
+ def constraints_to_plantuml(constraints)
156
+ constraints ||= []
157
+
158
+ return if constraints.empty?
159
+
160
+ constraints_output = constraints.map do |constraint|
161
+ " {#{constraint}}"
162
+ end
163
+
164
+ <<~TEMPLATE
165
+ __ constraints __
166
+ #{join_as_plantuml(
167
+ *constraints_output
168
+ )}
169
+ TEMPLATE
170
+ end
171
+
172
+ def classes_to_relations_plantuml(classes)
173
+ output_ary = classes.map do |(class_name, class_hash)|
174
+ class_hash ||= {}
175
+ relations = class_hash['relations']
176
+ relations_to_plantuml(class_name, relations)
177
+ end
178
+
179
+ join_as_plantuml(*output_ary)
180
+ end
181
+
182
+ def relations_to_plantuml(class_name, relations)
183
+ return unless relations
184
+
185
+ output_ary = relations.map do |relation|
186
+ source = class_name || relation['source']
187
+ relation_to_plantuml(source,
188
+ relation['target'],
189
+ relation)
190
+ end
191
+
192
+ join_as_plantuml(*output_ary)
193
+ end
194
+
195
+ def relation_arrow(relationship, relation)
196
+ [
197
+ relationship_type_to_plantuml('source',
198
+ relationship['source']['type']),
199
+ (relation['direction']).to_s,
200
+ relationship_type_to_plantuml('target',
201
+ relationship['target']['type'])
202
+ ].compact.join('-')
203
+ end
204
+
205
+ def relation_label(action)
206
+ return '' unless action
207
+
208
+ case action['direction']
209
+ when 'source'
210
+ " : < #{action['verb']}"
211
+ when 'target'
212
+ " : #{action['verb']} >"
213
+ else
214
+ ''
215
+ end
216
+ end
217
+
218
+ def source_arrow_end(source, relationship)
219
+ source_attribute = relationship_cardinality_to_plantuml(
220
+ relationship['source']['attribute']
221
+ )
222
+ [source, source_attribute].join(' ')
223
+ end
224
+
225
+ def target_arrow_end(target, relationship, action)
226
+ target_attribute = relationship_cardinality_to_plantuml(
227
+ relationship['target']['attribute']
228
+ )
229
+ [
230
+ [target_attribute, target].join(' '),
231
+ relation_label(action)
232
+ ].join
233
+ end
234
+
235
+ def relation_association(source, target, association)
236
+ return unless association
237
+
238
+ "\n(#{source}, #{target}) . #{association}"
239
+ end
240
+
241
+ def relation_to_plantuml(source, target, relation)
242
+ relationship = relation['relationship'] || {}
243
+ relationship['source'] ||= {}
244
+ relationship['target'] ||= {}
245
+ relation_output_lines(source, target, relation, relationship)
246
+ end
247
+
248
+ def relation_output_lines(source, target, relation, relationship)
249
+ output_lines = [
250
+ source_arrow_end(source, relationship),
251
+ relation_arrow(relationship, relation),
252
+ target_arrow_end(target, relationship, relation['action']),
253
+ relation_association(source, target, relationship['association'])
254
+ ].join(' ')
255
+
256
+ join_as_plantuml(*output_lines)
257
+ end
258
+
259
+ def relationship_type_to_plantuml(relation_end, relationship_type)
260
+ is_source = (relation_end == 'source')
261
+ mappings = {
262
+ 'direct' => is_source ? '<' : '>',
263
+ 'inheritance' => is_source ? '<|' : '|>',
264
+ 'composition' => '*',
265
+ 'aggregation' => 'o'
266
+ }
267
+ mappings.fetch(relationship_type, '')
268
+ end
269
+
270
+ def relationship_cardinality_to_plantuml(attribute)
271
+ attribute_name = (attribute || {}).keys.first
272
+
273
+ return unless attribute_name
274
+
275
+ attribute_hash = attribute[attribute_name] || {}
276
+ card = attribute_cardinality(attribute_hash['cardinality'])
277
+ "\"+#{attribute_name}#{card}\""
278
+ end
279
+
280
+ def attribute_cardinality(attribute_cardinality)
281
+ cardinality = ''
282
+ if attribute_cardinality
283
+ cardinality = attribute_cardinality_plantuml(
284
+ attribute_cardinality,
285
+ false
286
+ )
287
+ cardinality = " #{cardinality}"
288
+ end
289
+ cardinality
290
+ end
291
+
292
+ def enums_to_enums_plantuml(enums)
293
+ enums ||= {}
294
+
295
+ enums.map do |(enum_name, enum_hash)|
296
+ enum_to_plantuml(enum_name, enum_hash)
297
+ end.join("\n\n")
298
+ end
299
+
300
+ def enum_to_plantuml(enum_name, enum_hash)
301
+ enum_hash ||= {}
302
+
303
+ <<~TEMPLATE
304
+ enum #{enum_name}#{model_stereotype_to_plantuml(enum_hash['type'])} {
305
+ #{join_as_plantuml(enum_values_to_plantuml(enum_hash['values']))}
306
+ }
307
+ TEMPLATE
308
+ end
309
+
310
+ def model_stereotype_to_plantuml(model_stereotype)
311
+ return '' unless model_stereotype
312
+
313
+ " <<#{model_stereotype}>>"
314
+ end
315
+
316
+ def enum_values_to_plantuml(enum_values)
317
+ output_ary = enum_values.map do |(enum_value, _enum_value_hash)|
318
+ " #{enum_value}"
319
+ end
320
+
321
+ join_as_plantuml(*output_ary)
322
+ end
323
+
324
+ def groups_to_plantuml(groups)
325
+ groups ||= []
326
+ return if groups.empty?
327
+
328
+ groups.reduce('') do |output, group|
329
+ output += "\ntogether {\n"
330
+ group.each do |class_name|
331
+ output += "\nclass #{class_name}\n"
332
+ end
333
+ output += "\n}\n"
334
+ output
335
+ end
336
+ end
337
+
338
+ def diagram_options_to_plantuml(diagram_options)
339
+ diagram_options ||= []
340
+ return if diagram_options.empty?
341
+
342
+ "#{diagram_options.join("\n")}\n"
343
+ end
344
+
345
+ def bottom_to_plantuml(bottom)
346
+ bottom ||= []
347
+ return if bottom.empty?
348
+
349
+ "#{bottom.join("\n")}\n"
350
+ end
351
+
352
+ def format_hidden_class(accum, fidelity_classes, class_hash)
353
+ return accum if class_hash['relations'].nil?
354
+
355
+ class_hash['relations'].each_with_object(accum) do |relation, acc|
356
+ format_source_target_relation(relation, fidelity_classes, acc)
357
+ format_association_relation(relation, fidelity_classes, acc)
358
+ end
359
+ end
360
+
361
+ def format_source_target_relation(relation, fidelity_classes, acc)
362
+ %w[source target].each do |type|
363
+ next unless relation[type] && !fidelity_classes.key?(relation[type])
364
+
365
+ acc.merge!(relation[type] => true)
366
+ end
367
+ end
368
+
369
+ def format_association_relation(relation, fidelity_classes, acc)
370
+ return unless relation['relationship'] &&
371
+ relation['relationship']['association']
372
+
373
+ association = relation['relationship']['association']
374
+ return unless association && !fidelity_classes.key?(association)
375
+
376
+ acc.merge!(association => true)
377
+ end
378
+
379
+ def hide_other_classes(fidelity)
380
+ return '' if fidelity.nil? || fidelity['classes'].nil?
381
+
382
+ output = ''
383
+ hidden_classes = fidelity['classes']
384
+ .reduce({}) do |acc, (_class_name, class_hash)|
385
+ format_hidden_class(acc, fidelity['classes'], class_hash)
386
+ end
387
+
388
+ hidden_classes.keys.each do |hidden_class_name|
389
+ output += "\nhide #{hidden_class_name}\n"
390
+ end
391
+ output
392
+ end
393
+
394
+ def fidelity_to_plantuml(fidelity)
395
+ return '' if fidelity.nil?
396
+
397
+ output = ''
398
+ output += hide_other_classes(fidelity) if fidelity['hideOtherClasses']
399
+ output += "\nhide members\n" if fidelity['hideMembers']
400
+ output
401
+ end
402
+
403
+ def empty?(yml, prop)
404
+ yml[prop].nil? || yml[prop].length.zero?
405
+ end
406
+ end
407
+ end
408
+ end