lutaml-uml 0.4.0 → 0.4.1

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: 57797f5d5a65a5bb7e781509a44460e16877d85c9becb6b6147d43a6180a931c
4
- data.tar.gz: caa53fbea010657d6dd53db86460ba5dd4a991076ab078bf08a72f553e5c40da
3
+ metadata.gz: dc9fee04e0d3f8bf1a741dcce56ebfac843c1207d5f9f4dc8b9f42869db728f6
4
+ data.tar.gz: 58b0ed6fb1e66d0a34aed9fefcf6d4625f52234bf100c93ad06f62297ec3e2cb
5
5
  SHA512:
6
- metadata.gz: 0ec63f9b0992f1ebab8b2c3116e49514cd5753fe4d1e327a40465c001711e0c0bf86410eba964c6aea1514e8bba91297f19d8a615e9e352d296386ab348bd6fa
7
- data.tar.gz: 3971b17f96585427e99b3e4000824e99560ed096bea8489dbb62dd7dcba44eca3acd5a5a6ebc55b224aafffae9a963c866f3ca12a365bdc8dd0c54985c93f52e
6
+ metadata.gz: df205676bcafcb09265a81491fbca4b78b2a1dfc59d18f080e20e4ddf633a3aed9601d09cd78b32fbd297c283027681b94276e5ceb68e1613dc8cb8dcd036243
7
+ data.tar.gz: 9191a9ba6db3db78aa785a685e4c75c4cd69f84441cb3420dde4fbc02dec885ddcaf18c12f263aa5852439721609bb3e11930b7cbfcaf8c20b461b517a1bc84c
data/exe/lutaml-wsd2uml CHANGED
@@ -27,7 +27,7 @@ ASSOCIATION_MAPPINGS = {
27
27
  in_comment_block = false
28
28
 
29
29
  def transform_line(line)
30
- line = line.gsub(/^\s*'/, '** ').gsub(/\|[\sa-zA-Z]+$/, '')
30
+ line = line.gsub(/^\s*'/, '** ').gsub(/\|[\sa-zA-Z]+$/, '').gsub(/\r/, '')
31
31
  return sync_puts(line, 2) if ASSOCIATION_MAPPINGS.keys.none? { |key| line =~ key }
32
32
 
33
33
  owner_type, member_type = ASSOCIATION_MAPPINGS.detect { |(key, _value)| line =~ key }.last.split(",")
@@ -10,7 +10,7 @@ module Lutaml
10
10
 
11
11
  def initialize(attributes)
12
12
  update_attributes(attributes)
13
- @children_packages ||= packages.map { |pkg| [pkg, pkg.packages.map(&:children_packages)] }.flatten
13
+ @children_packages ||= packages.map { |pkg| [pkg, pkg.packages, pkg.packages.map(&:children_packages)] }.flatten.uniq
14
14
  end
15
15
 
16
16
  def classes=(value)
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "parslet"
4
+ require "parslet/convenience"
4
5
  require "lutaml/uml/parsers/dsl_preprocessor"
5
6
  require "lutaml/uml/parsers/dsl_transform"
6
7
  require "lutaml/uml/node/document"
@@ -8,6 +9,7 @@ require "lutaml/uml/node/document"
8
9
  module Lutaml
9
10
  module Uml
10
11
  module Parsers
12
+ class ParsingError < StandardError; end
11
13
  # Class for parsing LutaML dsl into Lutaml::Uml::Document
12
14
  class Dsl < Parslet::Parser
13
15
  # @param [String] io - LutaML string representation
@@ -20,7 +22,15 @@ module Lutaml
20
22
 
21
23
  def parse(input_file, _options = {})
22
24
  data = Lutaml::Uml::Parsers::DslPreprocessor.call(input_file)
23
- ::Lutaml::Uml::Document.new(DslTransform.new.apply(super(data)))
25
+ # https://kschiess.github.io/parslet/tricks.html#Reporter engines
26
+ # Parslet::ErrorReporter::Deepest allows more
27
+ # detailed display of error
28
+ reporter = Parslet::ErrorReporter::Deepest.new
29
+ ::Lutaml::Uml::Document
30
+ .new(DslTransform.new.apply(super(data, reporter: reporter)))
31
+ rescue Parslet::ParseFailed => e
32
+ raise(ParsingError,
33
+ "#{e.message}\ncause: #{e.parse_failure_cause.ascii_tree}")
24
34
  end
25
35
 
26
36
  KEYWORDS = %w[
@@ -292,9 +302,7 @@ module Lutaml
292
302
  str("definition") >>
293
303
  whitespace? >>
294
304
  str("{") >>
295
- whitespace? >>
296
- (match("[\n\s]}").absent? >> any).repeat.as(:definition) >>
297
- whitespace? >>
305
+ ((str("\\") >> any) | (str("}").absent? >> any)).repeat.maybe.as(:definition) >>
298
306
  str('}')
299
307
  end
300
308
 
@@ -387,12 +395,11 @@ module Lutaml
387
395
  diagram_inner_definition.repeat.as(:members) >>
388
396
  str("}")
389
397
  end
390
- rule(:diagram_body?) { diagram_body.maybe }
391
398
  rule(:diagram_definition) do
392
399
  diagram_keyword >>
393
400
  spaces? >>
394
401
  class_name.as(:name) >>
395
- diagram_body? >>
402
+ diagram_body >>
396
403
  whitespace?
397
404
  end
398
405
  rule(:diagram_definitions) { diagram_definition >> whitespace? }
@@ -5,16 +5,28 @@ module Lutaml
5
5
  module Parsers
6
6
  # Class for preprocessing dsl ascii file special directives:
7
7
  # - include
8
- module DslPreprocessor
9
- module_function
8
+ class DslPreprocessor
9
+ attr_reader :input_file
10
10
 
11
- def call(input_file)
11
+ def initialize(input_file)
12
+ @input_file = input_file
13
+ end
14
+
15
+ class << self
16
+ def call(input_file)
17
+ new(input_file).call
18
+ end
19
+ end
20
+
21
+ def call
12
22
  include_root = File.dirname(input_file.path)
13
23
  input_file.read.split("\n").reduce([]) do |res, line|
14
24
  res.push(*process_dsl_line(include_root, line))
15
25
  end.join("\n")
16
26
  end
17
27
 
28
+ private
29
+
18
30
  def process_dsl_line(include_root, line)
19
31
  process_include_line(include_root, process_comment_line(line))
20
32
  end
@@ -28,7 +40,7 @@ module Lutaml
28
40
 
29
41
  def process_include_line(include_root, line)
30
42
  include_path_match = line.match(/^\s*include\s+(.+)/)
31
- return line if include_path_match.nil?
43
+ return line if include_path_match.nil? || line =~ /^\s\*\*/
32
44
 
33
45
  path_to_file = include_path_match[1].strip
34
46
  path_to_file = if path_to_file.match?(/^\//)
@@ -37,6 +49,9 @@ module Lutaml
37
49
  File.join(include_root, path_to_file)
38
50
  end
39
51
  File.read(path_to_file).split("\n")
52
+ rescue Errno::ENOENT
53
+ puts("No such file or directory @ rb_sysopen - #{path_to_file}, \
54
+ include file paths need to be supplied relative to the main document")
40
55
  end
41
56
  end
42
57
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Lutaml
4
4
  module Uml
5
- VERSION = "0.4.0"
5
+ VERSION = "0.4.1"
6
6
  end
7
7
  end
data/lutaml-uml.gemspec CHANGED
@@ -25,7 +25,7 @@ Gem::Specification.new do |spec|
25
25
  spec.executables = %w[lutaml-wsd2uml lutaml-yaml2uml]
26
26
 
27
27
  spec.add_runtime_dependency "hashie", "~> 4.1.0"
28
- spec.add_runtime_dependency "parslet", "~> 1.7.1"
28
+ spec.add_runtime_dependency "parslet", "~> 2.0.0"
29
29
  spec.add_runtime_dependency "ruby-graphviz", "~> 1.2"
30
30
  spec.add_runtime_dependency "thor", "~> 1.0"
31
31
  spec.add_runtime_dependency "nokogiri", "~> 1.10"
@@ -0,0 +1,34 @@
1
+ diagram MyView {
2
+ title "my diagram"
3
+
4
+ class AddressClassProfile {
5
+ addressClassProfile
6
+ }
7
+ class AttributeProfile {
8
+ attributeProfile
9
+ }
10
+
11
+ association BidirectionalAsscoiation {
12
+ owner_type aggregation
13
+ member_type direct
14
+ owner AddressClassProfile#addressClassProfile
15
+ member AttributeProfile#attributeProfile [0..*]
16
+ }
17
+
18
+ association DirectAsscoiation {
19
+ member_type direct
20
+ owner AddressClassProfile
21
+ member AttributeProfile#attributeProfile
22
+ }
23
+
24
+ class Foo {
25
+ +structuredidentifier[0..*]: StructuredIdentifierType
26
+ +technicalcommittee[1..*]: TechnicalCommitteeType
27
+ }
28
+
29
+ association ReverseAsscoiation {
30
+ owner_type aggregation
31
+ owner AddressClassProfile#addressClassProfile
32
+ member AttributeProfile
33
+ }
34
+ }
@@ -0,0 +1,6 @@
1
+ diagram MyView {
2
+ class ImageMapAreaType {
3
+ definition {
4
+ }
5
+ }
6
+ }
@@ -0,0 +1,8 @@
1
+ diagram MyView {
2
+ class ImageMapAreaType {
3
+ }
4
+ enum SomeEnum {
5
+ }
6
+ data_type SomeEnum {
7
+ }
8
+ }
@@ -0,0 +1,5 @@
1
+ diagram MyView {
2
+ title "my diagram"
3
+
4
+ ** include ../models/bipm_document/BipmCommitteeAcronym.lutaml
5
+ }
@@ -0,0 +1,6 @@
1
+ diagram MyView {
2
+ fontname "Arial"
3
+ title "my diagram"
4
+ include none_existing.lutaml
5
+ include none_existing1.lutaml
6
+ }
@@ -287,5 +287,57 @@ RSpec.describe Lutaml::Uml::Parsers::Dsl do
287
287
 
288
288
  it_behaves_like "the correct graphviz formatting"
289
289
  end
290
+
291
+ context "when defninition is blank" do
292
+ let(:content) do
293
+ File.new(fixtures_path("dsl/diagram_blank_definion.lutaml"))
294
+ end
295
+
296
+ it "successfully renders" do
297
+ expect { parse }.to_not(raise_error)
298
+ end
299
+ end
300
+
301
+ context "when there are blank definitions" do
302
+ let(:content) do
303
+ File.new(fixtures_path("dsl/diagram_blank_entities.lutaml"))
304
+ end
305
+
306
+ it "successfully renders" do
307
+ expect { parse }.to_not(raise_error)
308
+ end
309
+ end
310
+
311
+ context "when its a non existing include file" do
312
+ let(:content) do
313
+ File.new(fixtures_path("dsl/diagram_non_existing_include.lutaml"))
314
+ end
315
+
316
+ it "successfully renders" do
317
+ expect { parse }.to_not(raise_error)
318
+ end
319
+ end
320
+
321
+ context "when there are commented preprocessor lines" do
322
+ let(:content) do
323
+ File.new(fixtures_path("dsl/diagram_commented_includes.lutaml"))
324
+ end
325
+
326
+ it "successfully renders" do
327
+ expect { parse }.to_not(raise_error)
328
+ end
329
+ end
330
+
331
+ context "when broken lutaml file passed" do
332
+ let(:content) do
333
+ File.new(fixtures_path("dsl/broken_diagram.lutaml"))
334
+ end
335
+
336
+ it "returns error object and prints line number" do
337
+ expect { described_class.parse(content, {}) }
338
+ .to(raise_error(Lutaml::Uml::Parsers::ParsingError,
339
+ /but got ":" at line 25 char 32/))
340
+ end
341
+ end
290
342
  end
291
343
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lutaml-uml
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
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-06-02 00:00:00.000000000 Z
11
+ date: 2021-07-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: hashie
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 1.7.1
33
+ version: 2.0.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 1.7.1
40
+ version: 2.0.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: ruby-graphviz
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -279,16 +279,21 @@ files:
279
279
  - spec/fixtures/datamodel/views/AddressProfile.yml
280
280
  - spec/fixtures/datamodel/views/CommonModels.yml
281
281
  - spec/fixtures/datamodel/views/TopDown.yml
282
+ - spec/fixtures/dsl/broken_diagram.lutaml
282
283
  - spec/fixtures/dsl/diagram.lutaml
283
284
  - spec/fixtures/dsl/diagram_attributes.lutaml
285
+ - spec/fixtures/dsl/diagram_blank_definion.lutaml
286
+ - spec/fixtures/dsl/diagram_blank_entities.lutaml
284
287
  - spec/fixtures/dsl/diagram_class_assocation.lutaml
285
288
  - spec/fixtures/dsl/diagram_class_fields.lutaml
289
+ - spec/fixtures/dsl/diagram_commented_includes.lutaml
286
290
  - spec/fixtures/dsl/diagram_comments.lutaml
287
291
  - spec/fixtures/dsl/diagram_concept_model.lutaml
288
292
  - spec/fixtures/dsl/diagram_data_types.lutaml
289
293
  - spec/fixtures/dsl/diagram_definitions.lutaml
290
294
  - spec/fixtures/dsl/diagram_includes.lutaml
291
295
  - spec/fixtures/dsl/diagram_multiply_classes.lutaml
296
+ - spec/fixtures/dsl/diagram_non_existing_include.lutaml
292
297
  - spec/fixtures/dsl/shared.lutaml
293
298
  - spec/fixtures/dsl/shared1.lutaml
294
299
  - spec/fixtures/generated_dot/AddressClassProfile.dot