lutaml-uml 0.2.3 → 0.2.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 454f50ab7c670130123b6ce888ca7f9dbeae245a37a4c2e74e07529a47146f57
4
- data.tar.gz: 4d7ce781403a3c71733a13d02e81f82aa81c1650330ff14b924603bebf70d83d
3
+ metadata.gz: ef28b2562bcae4b385b3be898a71d6c326c59d5167c94ee1231932df060d5eee
4
+ data.tar.gz: 39519359dc16f9532379b5ce15aef7e8ed6d37a1ae5afa2e22253c025505d0ab
5
5
  SHA512:
6
- metadata.gz: c4697e963d15d4a170d63f8ff8f4ac9e4589ee60178883fd48de1fa152912aafce6898fd264e12ce75bfc975fadcada13ed83c00ca5865b68b0f8e3cb2427834
7
- data.tar.gz: 33e09ace7d6f3a1f800ff0dc2e3d7977d20371166f9959e4f03f96737eb722540bec9ca2e2fa5f310bcc6a5989d3520f95441425e529325aa18a821ea00936fe
6
+ metadata.gz: 8b2464f9bc2d0f95a3baf5025ca2853537e6abd175a62be6f4f427e7f5f3e13f75f7ec9d2f7c9a675bd17be67b913da3a0b690c806e63a12f0633187471a6ec6
7
+ data.tar.gz: 72a944718bd7c57c8146197f10810b40a4026cf71150f65b0ce7c17158bf046815ce71da1845c8b9d6d720521fa693fb006a50c8e02fac31b44ad8ae2b521fc3
@@ -36,9 +36,16 @@ jobs:
36
36
  gem install bundler
37
37
  bundle config --local path vendor/bundle
38
38
  bundle install --jobs 4 --retry 3
39
- - name: Install Grpahviz Windows
39
+ - name: Install graphviz
40
+ uses: nick-invision/retry@v1
41
+ with:
42
+ polling_interval_seconds: 5
43
+ timeout_minutes: 5
44
+ max_attempts: 3
45
+ command: choco install --no-progress graphviz --version 2.38.0.20190211
46
+ - name: Check dot command
40
47
  run: |
41
- cinst -y graphviz
48
+ dot -?
42
49
  - name: Run specs
43
50
  run: |
44
51
  bundle exec rake
@@ -110,6 +110,20 @@ class Relationship {
110
110
  class Element {}
111
111
  ----
112
112
 
113
+ == Class' multiline "definition" property
114
+
115
+ === Definition
116
+
117
+ Full syntax:
118
+
119
+ [source,java]
120
+ ----
121
+ definition {
122
+ inner text
123
+ }
124
+ ----
125
+
126
+
113
127
  == Attributes/entries
114
128
 
115
129
  === Definition
@@ -118,7 +132,7 @@ Full syntax:
118
132
 
119
133
  [source,java]
120
134
  ----
121
- [visibility][/][attribute] name [:type][multiplicity][=initial value][{property string}]
135
+ [visibility][/][attribute] name [:type][multiplicity][=initial value][{attribute body}]
122
136
  ----
123
137
 
124
138
  where:
@@ -128,11 +142,7 @@ where:
128
142
  * `/` - symbolizes a derived attribute.
129
143
  * `multiplicity` - Multiplicity is in square brackets (e.g. [1..*]).
130
144
  * `initial value` - Default value specifies the initial value of the attribute.
131
- * `property string` - Property string indicates a modifier that applies to the attribute:
132
- ** {readonly}: the property can be read but not changed.
133
- ** {union}: the property is a union of subsets.
134
- ** {subsets <property>}: the property is a subset of <property>.
135
- ** {redefines <property>}: the property is a new definition of <property> (overwritten by inheritance).
145
+ * `{attribute body}` - Body of attribute, additional properties for attribute
136
146
 
137
147
 
138
148
  One can use explicit or implicit syntax for attribute definition
@@ -186,6 +196,21 @@ class Figure {
186
196
  }
187
197
  ----
188
198
 
199
+ === Additional attribute' properties
200
+
201
+ example:
202
+
203
+ [source,java]
204
+ ----
205
+ class Figure {
206
+ + radius {
207
+ definition {
208
+ Radius of the Figure
209
+ }
210
+ }
211
+ }
212
+ ----
213
+
189
214
  == Methods
190
215
 
191
216
  Syntax for defining methods:
@@ -6,7 +6,7 @@
6
6
  # Usage: bin/plantuml2lutaml /path/to/plantuml.wsd
7
7
 
8
8
  file_path = ARGV[0]
9
- FILE_NAME = File.basename(file_path, '.wsd')
9
+ FILE_NAME = File.basename(file_path, ".wsd")
10
10
  wsd_file = File.new(ARGV[0])
11
11
 
12
12
  def sync_puts(line, level = 0)
@@ -18,36 +18,36 @@ SKIPPED_LINES_REGEXP = /^(@startuml|'\*{7}|note|@enduml|\!|'\/)/
18
18
  COMMENT_START = /\/'/
19
19
  COMMENT_END = /'\//
20
20
  ASSOCIATION_MAPPINGS = {
21
- /-\|>/ => ',inheritance',
22
- /<\|-/ => 'inheritance,',
23
- /->/ => ',direct',
24
- /<-/ => 'direct,'
25
- }
21
+ /-\|>/ => ",inheritance",
22
+ /<\|-/ => "inheritance,",
23
+ /->/ => ",direct",
24
+ /<-/ => "direct,",
25
+ }.freeze
26
26
 
27
27
  in_comment_block = false
28
28
 
29
29
  def transform_line(line)
30
30
  return sync_puts(line, 2) if ASSOCIATION_MAPPINGS.keys.none? { |key| line =~ key }
31
31
 
32
- owner_type, member_type = ASSOCIATION_MAPPINGS.find { |(key,value)| line =~ key }.last.split(',')
33
- blocks = line.split(' ')
32
+ owner_type, member_type = ASSOCIATION_MAPPINGS.detect { |(key, _value)| line =~ key }.last.split(",")
33
+ blocks = line.split(" ")
34
34
  owner = blocks.first
35
35
  member = blocks.last
36
36
  sync_puts("association {", 2)
37
37
  sync_puts("owner #{owner}", 4)
38
38
  sync_puts("member #{member}", 4)
39
- sync_puts("owner_type #{owner_type}", 4) if owner_type.to_s.length > 0
40
- sync_puts("member_type #{member_type}", 4) if member_type.to_s.length > 0
39
+ sync_puts("owner_type #{owner_type}", 4) if !owner_type.to_s.empty?
40
+ sync_puts("member_type #{member_type}", 4) if !member_type.to_s.empty?
41
41
  sync_puts("}", 2)
42
42
  end
43
43
 
44
44
  sync_puts("diagram #{FILE_NAME} {")
45
45
  wsd_file.readlines.each do |line|
46
- if line =~ COMMENT_START
46
+ if line.match?(COMMENT_START)
47
47
  in_comment_block = true
48
48
  end
49
49
 
50
- if line =~ COMMENT_END
50
+ if line.match?(COMMENT_END)
51
51
  in_comment_block = false
52
52
  end
53
53
 
@@ -55,4 +55,4 @@ wsd_file.readlines.each do |line|
55
55
 
56
56
  transform_line(line)
57
57
  end
58
- sync_puts("}")
58
+ sync_puts("}")
@@ -75,6 +75,7 @@ def process_association(owner, values, encountered_relations)
75
75
  end
76
76
  sync_puts("diagram #{File.basename(ARGV[0], 'yml')[0..-2]} {")
77
77
  sync_puts("title '#{view_yaml['title']}'", 2)
78
+ sync_puts("caption '#{view_yaml['caption']}'", 2)
78
79
 
79
80
  # Class associations notations
80
81
  view_yaml["relations"]&.each do |values|
@@ -83,20 +84,55 @@ end
83
84
 
84
85
  view_yaml["imports"].keys.each do |entry|
85
86
  import = YAML.safe_load(File.read(File.join(models_path, "#{entry}.yml")))
86
- import_name = import["name"] || File.basename(entry)
87
+ import_name = import["name"] || File.basename(entry)
87
88
  # Class notation
88
89
  sync_puts("#{import['modelType']} #{import_name} {", 2)
90
+ if import["definition"]
91
+ definition = <<~TEXT
92
+ definition {
93
+ #{import['definition']}
94
+ }
95
+ TEXT
96
+ sync_puts(definition, 4)
97
+ end
89
98
  import["values"]&.each_pair do |key, values|
90
- sync_puts("#{key}", 4)
99
+ result_string = key
100
+ if values["definition"]
101
+ result_string += <<~TEXT
102
+ {
103
+ definition {
104
+ #{values['definition']}
105
+ }
106
+ }
107
+ TEXT
108
+ end
109
+ sync_puts(result_string, 4)
91
110
  end
92
111
  import["attributes"]&.each_pair do |key, values|
112
+ definition = values["definition"]
93
113
  cardinality = if values["cardinality"]
94
114
  cardinality_val = values["cardinality"]
95
115
  "[#{cardinality_val['min']}..#{cardinality_val['max']}]"
96
116
  else
97
117
  ""
98
118
  end
99
- sync_puts("+#{key}: #{values['type']} #{cardinality}", 4)
119
+ result_string = "+#{key}"
120
+ if values["type"]
121
+ result_string += ": #{values['type']}"
122
+ end
123
+ if cardinality
124
+ result_string += " #{cardinality}"
125
+ end
126
+ if definition
127
+ result_string += <<~TEXT
128
+ {
129
+ definition
130
+ #{definition}
131
+ end definition
132
+ }
133
+ TEXT
134
+ end
135
+ sync_puts(result_string, 4)
100
136
  end
101
137
  sync_puts("}", 2)
102
138
 
@@ -3,8 +3,11 @@
3
3
  module Lutaml
4
4
  module Uml
5
5
  class DataType < Class
6
- def keyword
7
- "dataType"
6
+ attr_reader :keyword
7
+
8
+ def initialize(attributes = {})
9
+ super
10
+ @keyword = "dataType"
8
11
  end
9
12
  end
10
13
  end
@@ -12,7 +12,14 @@ module Lutaml
12
12
 
13
13
  attr_reader :attributes,
14
14
  :members,
15
- :modifier
15
+ :modifier,
16
+ :definition,
17
+ :keyword
18
+
19
+ def initialize(attributes = {})
20
+ super
21
+ @keyword = "enumeration"
22
+ end
16
23
 
17
24
  def attributes=(value)
18
25
  @attributes = value.to_a.map do |attr|
@@ -24,10 +31,6 @@ module Lutaml
24
31
  def methods
25
32
  []
26
33
  end
27
-
28
- def keyword
29
- "enumeration"
30
- end
31
34
  end
32
35
  end
33
36
  end
@@ -53,6 +53,7 @@ module Lutaml
53
53
  realizes
54
54
  static
55
55
  title
56
+ caption
56
57
  ].freeze
57
58
 
58
59
  KEYWORDS.each do |keyword|
@@ -81,9 +82,9 @@ module Lutaml
81
82
  str(")")).maybe
82
83
  end
83
84
  rule(:cardinality_body_definition) do
84
- match['0-9\*'].as(:min) >>
85
+ match['0-9\*'].as('min') >>
85
86
  str("..").maybe >>
86
- match['0-9\*'].as(:max).maybe
87
+ match['0-9\*'].as('max').maybe
87
88
  end
88
89
  rule(:cardinality) do
89
90
  str("[") >>
@@ -132,7 +133,8 @@ module Lutaml
132
133
  attribute_name >>
133
134
  match['"\''].maybe >>
134
135
  attribute_type? >>
135
- cardinality?)
136
+ cardinality? >>
137
+ class_body?)
136
138
  .as(:attributes)
137
139
  end
138
140
 
@@ -143,6 +145,13 @@ module Lutaml
143
145
  match['"\''].maybe
144
146
  end
145
147
  rule(:title_definition) { title_keyword >> title_text }
148
+ rule(:caption_keyword) { kw_caption >> spaces }
149
+ rule(:caption_text) do
150
+ match['"\''].maybe >>
151
+ match['a-zA-Z0-9_\- '].repeat(1).as(:caption) >>
152
+ match['"\''].maybe
153
+ end
154
+ rule(:caption_definition) { caption_keyword >> caption_text }
146
155
 
147
156
  rule(:fontname_keyword) { kw_fontname >> spaces }
148
157
  rule(:fontname_text) do
@@ -252,7 +261,8 @@ module Lutaml
252
261
  end
253
262
  rule(:class_keyword) { kw_class >> spaces }
254
263
  rule(:class_inner_definitions) do
255
- attribute_definition |
264
+ definition_body |
265
+ attribute_definition |
256
266
  comment_definition |
257
267
  comment_multiline_definition
258
268
  end
@@ -276,10 +286,23 @@ module Lutaml
276
286
  class_body?
277
287
  end
278
288
 
289
+ # -- Definition
290
+ rule(:definition_body) do
291
+ spaces? >>
292
+ str("definition") >>
293
+ whitespace? >>
294
+ str("{") >>
295
+ whitespace? >>
296
+ (match("[\n\s]}").absent? >> any).repeat.as(:definition) >>
297
+ whitespace? >>
298
+ str('}')
299
+ end
300
+
279
301
  # -- Enum
280
302
  rule(:enum_keyword) { kw_enum >> spaces }
281
303
  rule(:enum_inner_definitions) do
282
- attribute_definition |
304
+ definition_body |
305
+ attribute_definition |
283
306
  comment_definition |
284
307
  comment_multiline_definition
285
308
  end
@@ -339,6 +362,7 @@ module Lutaml
339
362
  rule(:diagram_keyword) { kw_diagram >> spaces? }
340
363
  rule(:diagram_inner_definitions) do
341
364
  title_definition |
365
+ caption_definition |
342
366
  fontname_definition |
343
367
  class_definition.as(:classes) |
344
368
  enum_definition.as(:enums) |
@@ -27,7 +27,7 @@ module Lutaml
27
27
  end
28
28
 
29
29
  def process_include_line(include_root, line)
30
- include_path_match = line.match(/\s*include\s+(.+)/)
30
+ include_path_match = line.match(/^\s*include\s+(.+)/)
31
31
  return line if include_path_match.nil?
32
32
 
33
33
  path_to_file = include_path_match[1].strip
@@ -3,8 +3,11 @@
3
3
  module Lutaml
4
4
  module Uml
5
5
  class PrimitiveType < DataType
6
- def keyword
7
- "primitive"
6
+ attr_reader :keyword
7
+
8
+ def initialize(attributes = {})
9
+ super
10
+ @keyword = "primitive"
8
11
  end
9
12
  end
10
13
  end
@@ -6,6 +6,7 @@ module Lutaml
6
6
  include HasAttributes
7
7
 
8
8
  attr_accessor :name,
9
+ :definition,
9
10
  :xmi_id,
10
11
  :xmi_uuid,
11
12
  :namespace,
@@ -42,6 +43,16 @@ module Lutaml
42
43
 
43
44
  the_name
44
45
  end
46
+
47
+ def definition=(value)
48
+ @definition = value
49
+ .to_s
50
+ .gsub(/\\}/, '}')
51
+ .gsub(/\\{/, '{')
52
+ .split("\n")
53
+ .map(&:strip)
54
+ .join("\n")
55
+ end
45
56
  end
46
57
  end
47
58
  end
@@ -4,6 +4,7 @@ module Lutaml
4
4
  module Uml
5
5
  class TopElementAttribute
6
6
  include HasAttributes
7
+ include HasMembers
7
8
 
8
9
  attr_accessor :name,
9
10
  :visibility,
@@ -20,6 +21,16 @@ module Lutaml
20
21
  update_attributes(attributes)
21
22
  end
22
23
  # rubocop:enable Rails/ActiveRecordAliases
24
+
25
+ def definition=(value)
26
+ @definition = value
27
+ .to_s
28
+ .gsub(/\\}/, '}')
29
+ .gsub(/\\{/, '{')
30
+ .split("\n")
31
+ .map(&:strip)
32
+ .join("\n")
33
+ end
23
34
  end
24
35
  end
25
36
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Lutaml
4
4
  module Uml
5
- VERSION = "0.2.3"
5
+ VERSION = "0.2.8"
6
6
  end
7
7
  end
@@ -24,17 +24,16 @@ Gem::Specification.new do |spec|
24
24
  spec.require_paths = ["lib"]
25
25
  spec.executables = %w[lutaml-uml]
26
26
 
27
- spec.add_runtime_dependency "activesupport", "~> 5.0"
28
27
  spec.add_runtime_dependency "hashie", "~> 4.1.0"
29
28
  spec.add_runtime_dependency "parslet", "~> 1.7.1"
30
29
  spec.add_runtime_dependency "ruby-graphviz", "~> 1.2"
31
30
  spec.add_runtime_dependency "thor", "~> 1.0"
32
31
 
32
+ spec.add_development_dependency "bundler", "~> 2.0"
33
33
  spec.add_development_dependency "byebug"
34
34
  spec.add_development_dependency "nokogiri", "~> 1.10"
35
- spec.add_development_dependency "rubocop", "~> 0.54.0"
36
- spec.add_development_dependency "bundler", "~> 2.0"
37
35
  spec.add_development_dependency "pry", "~> 0.12.2"
38
36
  spec.add_development_dependency "rake", "~> 10.0"
39
37
  spec.add_development_dependency "rspec", "~> 3.0"
38
+ spec.add_development_dependency "rubocop", "~> 0.54.0"
40
39
  end
@@ -0,0 +1,25 @@
1
+ diagram MyView {
2
+ title "my diagram"
3
+
4
+ class AddressClassProfile {
5
+ definition {
6
+ this is multiline with `ascidoc`
7
+ comments
8
+ and list
9
+ \{foo\} \{name\}
10
+ }
11
+ +addressClassProfile: CharacterString [0..1]
12
+ }
13
+
14
+ class AttributeProfile {
15
+ imlicistAttributeProfile: CharacterString [0..1] {
16
+ definition
17
+ {
18
+ this is attribute definition
19
+ with multiply lines
20
+ \{foo\} \{name\}
21
+ end definition
22
+ }
23
+ }
24
+ }
25
+ }
@@ -121,7 +121,7 @@ RSpec.describe Lutaml::Uml::Parsers::Dsl do
121
121
  expect(association.member_end).to(eq("AttributeProfile"))
122
122
  expect(association.member_end_attribute_name)
123
123
  .to(eq("attributeProfile"))
124
- expect(association.member_end_cardinality).to(eq(min: "0", max: "*"))
124
+ expect(association.member_end_cardinality).to(eq("min" => "0", "max" => "*"))
125
125
  end
126
126
  end
127
127
 
@@ -248,5 +248,29 @@ RSpec.describe Lutaml::Uml::Parsers::Dsl do
248
248
 
249
249
  it_behaves_like "the correct graphviz formatting"
250
250
  end
251
+
252
+ context "when defninition directives included" do
253
+ let(:content) do
254
+ File.new(fixtures_path("dsl/diagram_definitions.lutaml"))
255
+ end
256
+ let(:class_definition) do
257
+ "this is multiline with `ascidoc`\ncomments\nand list\n{foo} {name}"
258
+ end
259
+ let(:attribute_definition) do
260
+ "this is attribute definition\nwith multiply lines\n{foo} {name}\nend definition"
261
+ end
262
+
263
+ it "create comments for document and classes" do
264
+ expect(by_name(parse.classes, "AddressClassProfile").definition)
265
+ .to(eq(class_definition))
266
+ expect(by_name(parse.classes, "AttributeProfile")
267
+ .attributes
268
+ .first
269
+ .definition)
270
+ .to(eq(attribute_definition))
271
+ end
272
+
273
+ it_behaves_like "the correct graphviz formatting"
274
+ end
251
275
  end
252
276
  end
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lutaml-uml
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.2.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: 2020-11-21 00:00:00.000000000 Z
11
+ date: 2020-11-29 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: activesupport
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '5.0'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '5.0'
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: hashie
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -81,61 +67,47 @@ dependencies:
81
67
  - !ruby/object:Gem::Version
82
68
  version: '1.0'
83
69
  - !ruby/object:Gem::Dependency
84
- name: byebug
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: nokogiri
70
+ name: bundler
99
71
  requirement: !ruby/object:Gem::Requirement
100
72
  requirements:
101
73
  - - "~>"
102
74
  - !ruby/object:Gem::Version
103
- version: '1.10'
75
+ version: '2.0'
104
76
  type: :development
105
77
  prerelease: false
106
78
  version_requirements: !ruby/object:Gem::Requirement
107
79
  requirements:
108
80
  - - "~>"
109
81
  - !ruby/object:Gem::Version
110
- version: '1.10'
82
+ version: '2.0'
111
83
  - !ruby/object:Gem::Dependency
112
- name: rubocop
84
+ name: byebug
113
85
  requirement: !ruby/object:Gem::Requirement
114
86
  requirements:
115
- - - "~>"
87
+ - - ">="
116
88
  - !ruby/object:Gem::Version
117
- version: 0.54.0
89
+ version: '0'
118
90
  type: :development
119
91
  prerelease: false
120
92
  version_requirements: !ruby/object:Gem::Requirement
121
93
  requirements:
122
- - - "~>"
94
+ - - ">="
123
95
  - !ruby/object:Gem::Version
124
- version: 0.54.0
96
+ version: '0'
125
97
  - !ruby/object:Gem::Dependency
126
- name: bundler
98
+ name: nokogiri
127
99
  requirement: !ruby/object:Gem::Requirement
128
100
  requirements:
129
101
  - - "~>"
130
102
  - !ruby/object:Gem::Version
131
- version: '2.0'
103
+ version: '1.10'
132
104
  type: :development
133
105
  prerelease: false
134
106
  version_requirements: !ruby/object:Gem::Requirement
135
107
  requirements:
136
108
  - - "~>"
137
109
  - !ruby/object:Gem::Version
138
- version: '2.0'
110
+ version: '1.10'
139
111
  - !ruby/object:Gem::Dependency
140
112
  name: pry
141
113
  requirement: !ruby/object:Gem::Requirement
@@ -178,6 +150,20 @@ dependencies:
178
150
  - - "~>"
179
151
  - !ruby/object:Gem::Version
180
152
  version: '3.0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: rubocop
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: 0.54.0
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: 0.54.0
181
167
  description: UML model module for LutaML.
182
168
  email:
183
169
  - open.source@ribose.com'
@@ -297,6 +283,7 @@ files:
297
283
  - spec/fixtures/dsl/diagram_comments.lutaml
298
284
  - spec/fixtures/dsl/diagram_concept_model.lutaml
299
285
  - spec/fixtures/dsl/diagram_data_types.lutaml
286
+ - spec/fixtures/dsl/diagram_definitions.lutaml
300
287
  - spec/fixtures/dsl/diagram_includes.lutaml
301
288
  - spec/fixtures/dsl/diagram_multiply_classes.lutaml
302
289
  - spec/fixtures/dsl/shared.lutaml