expressir 0.2.17-arm64-darwin → 0.2.25-arm64-darwin

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 (94) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +5 -0
  3. data/.github/workflows/release.yml +31 -3
  4. data/README.adoc +3 -3
  5. data/exe/format +45 -29
  6. data/lib/expressir/express_exp/2.4/express_parser.bundle +0 -0
  7. data/lib/expressir/express_exp/2.5/express_parser.bundle +0 -0
  8. data/lib/expressir/express_exp/2.6/express_parser.bundle +0 -0
  9. data/lib/expressir/express_exp/2.7/express_parser.bundle +0 -0
  10. data/lib/expressir/express_exp/3.0/express_parser.bundle +0 -0
  11. data/lib/expressir/express_exp/cache.rb +48 -0
  12. data/lib/expressir/express_exp/formatter.rb +2 -2
  13. data/lib/expressir/express_exp/hyperlink_formatter.rb +10 -15
  14. data/lib/expressir/express_exp/model_visitor.rb +23 -0
  15. data/lib/expressir/express_exp/parser.rb +18 -3
  16. data/lib/expressir/express_exp/resolve_references_model_visitor.rb +33 -0
  17. data/lib/expressir/express_exp/visitor.rb +19 -18
  18. data/lib/expressir/model.rb +3 -1
  19. data/lib/expressir/model/attribute.rb +12 -5
  20. data/lib/expressir/model/cache.rb +13 -0
  21. data/lib/expressir/model/constant.rb +9 -2
  22. data/lib/expressir/model/entity.rb +10 -8
  23. data/lib/expressir/model/enumeration_item.rb +7 -0
  24. data/lib/expressir/model/expressions/aggregate_initializer.rb +1 -1
  25. data/lib/expressir/model/expressions/aggregate_item.rb +2 -2
  26. data/lib/expressir/model/expressions/attribute_reference.rb +2 -2
  27. data/lib/expressir/model/expressions/binary_expression.rb +3 -3
  28. data/lib/expressir/model/expressions/call.rb +2 -2
  29. data/lib/expressir/model/expressions/entity_constructor.rb +2 -2
  30. data/lib/expressir/model/expressions/group_reference.rb +2 -2
  31. data/lib/expressir/model/expressions/index_reference.rb +3 -3
  32. data/lib/expressir/model/expressions/interval.rb +5 -5
  33. data/lib/expressir/model/expressions/query_expression.rb +5 -3
  34. data/lib/expressir/model/expressions/simple_reference.rb +5 -1
  35. data/lib/expressir/model/expressions/unary_expression.rb +2 -2
  36. data/lib/expressir/model/function.rb +13 -11
  37. data/lib/expressir/model/identifier.rb +6 -3
  38. data/lib/expressir/model/interface.rb +3 -3
  39. data/lib/expressir/model/interface_item.rb +2 -2
  40. data/lib/expressir/model/interfaced_item.rb +9 -8
  41. data/lib/expressir/model/literals/binary.rb +1 -1
  42. data/lib/expressir/model/literals/integer.rb +1 -1
  43. data/lib/expressir/model/literals/logical.rb +1 -1
  44. data/lib/expressir/model/literals/real.rb +1 -1
  45. data/lib/expressir/model/literals/string.rb +2 -2
  46. data/lib/expressir/model/model_element.rb +46 -21
  47. data/lib/expressir/model/parameter.rb +9 -2
  48. data/lib/expressir/model/procedure.rb +12 -10
  49. data/lib/expressir/model/{informal_proposition.rb → remark_item.rb} +3 -6
  50. data/lib/expressir/model/repository.rb +1 -1
  51. data/lib/expressir/model/rule.rb +14 -12
  52. data/lib/expressir/model/schema.rb +13 -11
  53. data/lib/expressir/model/statements/alias.rb +5 -3
  54. data/lib/expressir/model/statements/assignment.rb +2 -2
  55. data/lib/expressir/model/statements/call.rb +2 -2
  56. data/lib/expressir/model/statements/case.rb +3 -3
  57. data/lib/expressir/model/statements/case_action.rb +2 -2
  58. data/lib/expressir/model/statements/compound.rb +1 -1
  59. data/lib/expressir/model/statements/if.rb +3 -3
  60. data/lib/expressir/model/statements/repeat.rb +9 -7
  61. data/lib/expressir/model/statements/return.rb +1 -1
  62. data/lib/expressir/model/subtype_constraint.rb +11 -4
  63. data/lib/expressir/model/type.rb +6 -4
  64. data/lib/expressir/model/types/aggregate.rb +8 -1
  65. data/lib/expressir/model/types/array.rb +5 -5
  66. data/lib/expressir/model/types/bag.rb +3 -3
  67. data/lib/expressir/model/types/binary.rb +2 -2
  68. data/lib/expressir/model/types/enumeration.rb +4 -4
  69. data/lib/expressir/model/types/generic.rb +7 -0
  70. data/lib/expressir/model/types/generic_entity.rb +7 -0
  71. data/lib/expressir/model/types/list.rb +4 -4
  72. data/lib/expressir/model/types/real.rb +1 -1
  73. data/lib/expressir/model/types/select.rb +5 -5
  74. data/lib/expressir/model/types/set.rb +3 -3
  75. data/lib/expressir/model/types/string.rb +2 -2
  76. data/lib/expressir/model/unique.rb +8 -1
  77. data/lib/expressir/model/variable.rb +9 -2
  78. data/lib/expressir/model/where.rb +8 -1
  79. data/lib/expressir/version.rb +1 -1
  80. data/original/examples/syntax/multiple.yaml +18 -0
  81. data/original/examples/syntax/remark.exp +12 -10
  82. data/original/examples/syntax/remark.yaml +24 -3
  83. data/original/examples/syntax/remark_formatted.exp +3 -1
  84. data/original/examples/syntax/single.exp +1 -0
  85. data/original/examples/syntax/single.yaml +7 -0
  86. data/original/examples/syntax/single_formatted.exp +4 -0
  87. data/original/examples/syntax/single_formatted.yaml +15 -0
  88. data/original/examples/syntax/syntax.yaml +82 -0
  89. data/original/examples/syntax/syntax_hyperlink_formatted.exp +902 -0
  90. data/spec/expressir/express_exp/cache_spec.rb +64 -0
  91. data/spec/expressir/express_exp/formatter_spec.rb +17 -0
  92. data/spec/expressir/express_exp/parser_spec.rb +9 -9
  93. data/spec/expressir/model/model_element_spec.rb +32 -29
  94. metadata +9 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b062539c95ceffeabeed14198454dc989cceba5cccff2ed616da4b11fd1dff5a
4
- data.tar.gz: 3d58d00d08553a0bda9dd7cb347ea2160f7d86a29ca9315771af3c5db1b82d73
3
+ metadata.gz: 05621c7782b2f221c393ae9f37450448d6c9d3bdaf6c44a4cfc3a07a531ddd83
4
+ data.tar.gz: bac61b760408cc12bea0abb2ca362767be28a5975dd2638a372ce631eb5fc2ec
5
5
  SHA512:
6
- metadata.gz: 6445e6e3509c45c8d561f72fa64bd5a6b056a9ca8f2b55787c0c0e917d770e89471957f859000a4cb07628ab36de9b77b271f9e93ea27d211c209d15e938a1d6
7
- data.tar.gz: 39696b728b724b93a577a2fb73cdbe646ae8a10b7e4035f3c410761f99f04b632b7fb96d835a3dfca43a6572d3152d1a2c7959312a94a30e133684adf899ce4d
6
+ metadata.gz: b0f85201f8c638e40e97bfaaa836523c884f7ed35f56da3e2f812a571d008fbeb52959c4971c0b354ea42efe31fd21578f6a9f3da5b89992d496a23f34f4e8c7
7
+ data.tar.gz: 4d3c9cd28a2ded77e45413f8bfb61dd6abe85db648fda5df01231698e2f4854df4126a857c4504863caee71c84339625bd4f300c35f85be8f8aa1ad0832dd765
@@ -43,3 +43,8 @@ jobs:
43
43
  - run: bundle exec rake compile
44
44
 
45
45
  - run: bundle exec rake
46
+
47
+ - uses: actions/upload-artifact@v2
48
+ with:
49
+ name: express_parser-${{ matrix.os }}-${{ matrix.ruby }}
50
+ path: lib/expressir/express_exp/express_parser.so
@@ -1,13 +1,38 @@
1
1
  name: release
2
2
 
3
3
  on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ next_version:
7
+ description: |
8
+ Next release version. Possible values: x.y.z, major, minor, patch or pre|rc|etc
9
+ required: true
10
+ default: 'patch'
4
11
  push:
5
12
  tags: [ v* ]
6
- workflow_dispatch:
7
13
 
8
14
  jobs:
15
+ bump:
16
+ runs-on: ubuntu-18.04
17
+ steps:
18
+ - uses: actions/checkout@v2
19
+ with:
20
+ submodules: recursive
21
+
22
+ - uses: ruby/setup-ruby@v1
23
+ with:
24
+ ruby-version: '2.6'
25
+
26
+ - if: ${{ github.event_name == 'workflow_dispatch' }} # unfortunatelly cannot keep this condition on job level
27
+ run: |
28
+ git config user.name github-actions
29
+ git config user.email github-actions@github.com
30
+ gem install gem-release
31
+ gem bump --version ${{ github.event.inputs.next_version }} --tag --push
32
+
9
33
  pack:
10
34
  runs-on: ubuntu-18.04
35
+ needs: bump
11
36
  strategy:
12
37
  fail-fast: false
13
38
  matrix:
@@ -20,9 +45,12 @@ jobs:
20
45
  - uses: ruby/setup-ruby@v1
21
46
  with:
22
47
  ruby-version: '2.6'
48
+ # bundler-cache: true important to not use cache because it leads to "cannot find -lrice"
49
+ # more info https://github.com/lutaml/expressir/runs/2097658383?check_suite_focus=true#step:7:2126
23
50
 
24
51
  - run: bundle install --jobs 4 --retry 3
25
52
 
53
+ # build gem WITHOUT pre-built native extension
26
54
  - run: gem build expressir.gemspec
27
55
 
28
56
  - if: matrix.host == 'linux'
@@ -31,6 +59,7 @@ jobs:
31
59
  name: pkg-ruby
32
60
  path: expressir-*.gem
33
61
 
62
+ # build gem WITH pre-built native extension
34
63
  - run: bundle exec rake gem:${{ matrix.host }}
35
64
 
36
65
  - uses: actions/upload-artifact@v2
@@ -38,8 +67,7 @@ jobs:
38
67
  name: pkg-${{ matrix.host }}
39
68
  path: pkg/*.gem
40
69
 
41
-
42
- release:
70
+ publish:
43
71
  runs-on: ubuntu-18.04
44
72
  needs: pack
45
73
  steps:
data/README.adoc CHANGED
@@ -1,8 +1,8 @@
1
1
  = Expressir: EXPRESS in Ruby
2
2
 
3
- image:https://github.com/lutaml/expressir/workflows/ubuntu/badge.svg[ubuntu]
4
- image:https://github.com/lutaml/expressir/workflows/macos/badge.svg[macos]
5
- image:https://github.com/lutaml/expressir/workflows/windows/badge.svg[windows]
3
+ image:https://img.shields.io/gem/v/expressir.svg["Gem Version", link="https://rubygems.org/gems/expressir"]
4
+ // image:https://codeclimate.com/github/lutaml/expressir/badges/gpa.svg["Code Climate", link="https://codeclimate.com/github/lutaml/expressir"]
5
+ image:https://github.com/lutaml/expressir/workflows/rake/badge.svg["Build Status", link="https://github.com/lutaml/expressir/actions?workflow=rake"]
6
6
 
7
7
  == Purpose
8
8
 
data/exe/format CHANGED
@@ -1,10 +1,12 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require "yaml"
4
+ require "tempfile"
4
5
  require "expressir/express_exp/parser"
5
6
  require "expressir/express_exp/formatter"
6
7
  require "expressir/express_exp/schema_head_formatter"
7
8
  require "expressir/express_exp/hyperlink_formatter"
9
+ require "expressir/express_exp/cache"
8
10
 
9
11
  exp_files = [
10
12
  # basic test
@@ -22,44 +24,58 @@ exp_files = [
22
24
  # '../iso-10303-stepmod/data/resources/iso13584_expressions_schema/iso13584_expressions_schema.exp',
23
25
  # annotated-express test (12s)
24
26
  # see https://github.com/metanorma/annotated-express/blob/master/data/documents/resources/fundamentals_of_product_description_and_support/sections/04-schemas.adoc
25
- # '../iso-10303-stepmod/data/resources/action_schema/action_schema_annotated.exp',
26
- # '../iso-10303-stepmod/data/resources/application_context_schema/application_context_schema_annotated.exp',
27
- # '../iso-10303-stepmod/data/resources/approval_schema/approval_schema_annotated.exp',
28
- # '../iso-10303-stepmod/data/resources/basic_attribute_schema/basic_attribute_schema_annotated.exp',
29
- # '../iso-10303-stepmod/data/resources/certification_schema/certification_schema_annotated.exp',
30
- # '../iso-10303-stepmod/data/resources/contract_schema/contract_schema_annotated.exp',
31
- # '../iso-10303-stepmod/data/resources/date_time_schema/date_time_schema_annotated.exp',
32
- # '../iso-10303-stepmod/data/resources/document_schema/document_schema.exp',
33
- # '../iso-10303-stepmod/data/resources/effectivity_schema/effectivity_schema_annotated.exp',
34
- # '../iso-10303-stepmod/data/resources/experience_schema/experience_schema_annotated.exp',
35
- # '../iso-10303-stepmod/data/resources/external_reference_schema/external_reference_schema_annotated.exp',
36
- # '../iso-10303-stepmod/data/resources/group_schema/group_schema_annotated.exp',
37
- # '../iso-10303-stepmod/data/resources/language_schema/language_schema_annotated.exp',
38
- # '../iso-10303-stepmod/data/resources/location_schema/location_schema_annotated.exp',
39
- # '../iso-10303-stepmod/data/resources/management_resources_schema/management_resources_schema_annotated.exp',
40
- # '../iso-10303-stepmod/data/resources/measure_schema/measure_schema_annotated.exp',
41
- # '../iso-10303-stepmod/data/resources/person_organization_schema/person_organization_schema_annotated.exp',
42
- # '../iso-10303-stepmod/data/resources/process_property_schema/process_property_schema_annotated.exp',
43
- # '../iso-10303-stepmod/data/resources/product_definition_schema/product_definition_schema_annotated.exp',
44
- # '../iso-10303-stepmod/data/resources/product_property_definition_schema/product_property_definition_schema_annotated.exp',
45
- # '../iso-10303-stepmod/data/resources/product_property_representation_schema/product_property_representation_schema_annotated.exp',
46
- # '../iso-10303-stepmod/data/resources/qualifications_schema/qualifications_schema_annotated.exp',
47
- # '../iso-10303-stepmod/data/resources/security_classification_schema/security_classification_schema_annotated.exp',
48
- # '../iso-10303-stepmod/data/resources/support_resource_schema/support_resource_schema_annotated.exp',
27
+ '../iso-10303-stepmod/data/resources/action_schema/action_schema_annotated.exp',
28
+ '../iso-10303-stepmod/data/resources/application_context_schema/application_context_schema_annotated.exp',
29
+ '../iso-10303-stepmod/data/resources/approval_schema/approval_schema_annotated.exp',
30
+ '../iso-10303-stepmod/data/resources/basic_attribute_schema/basic_attribute_schema_annotated.exp',
31
+ '../iso-10303-stepmod/data/resources/certification_schema/certification_schema_annotated.exp',
32
+ '../iso-10303-stepmod/data/resources/contract_schema/contract_schema_annotated.exp',
33
+ '../iso-10303-stepmod/data/resources/date_time_schema/date_time_schema_annotated.exp',
34
+ '../iso-10303-stepmod/data/resources/document_schema/document_schema.exp',
35
+ '../iso-10303-stepmod/data/resources/effectivity_schema/effectivity_schema_annotated.exp',
36
+ '../iso-10303-stepmod/data/resources/experience_schema/experience_schema_annotated.exp',
37
+ '../iso-10303-stepmod/data/resources/external_reference_schema/external_reference_schema_annotated.exp',
38
+ '../iso-10303-stepmod/data/resources/group_schema/group_schema_annotated.exp',
39
+ '../iso-10303-stepmod/data/resources/language_schema/language_schema_annotated.exp',
40
+ '../iso-10303-stepmod/data/resources/location_schema/location_schema_annotated.exp',
41
+ '../iso-10303-stepmod/data/resources/management_resources_schema/management_resources_schema_annotated.exp',
42
+ '../iso-10303-stepmod/data/resources/measure_schema/measure_schema_annotated.exp',
43
+ '../iso-10303-stepmod/data/resources/person_organization_schema/person_organization_schema_annotated.exp',
44
+ '../iso-10303-stepmod/data/resources/process_property_schema/process_property_schema_annotated.exp',
45
+ '../iso-10303-stepmod/data/resources/product_definition_schema/product_definition_schema_annotated.exp',
46
+ '../iso-10303-stepmod/data/resources/product_property_definition_schema/product_property_definition_schema_annotated.exp',
47
+ '../iso-10303-stepmod/data/resources/product_property_representation_schema/product_property_representation_schema_annotated.exp',
48
+ '../iso-10303-stepmod/data/resources/qualifications_schema/qualifications_schema_annotated.exp',
49
+ '../iso-10303-stepmod/data/resources/security_classification_schema/security_classification_schema_annotated.exp',
50
+ '../iso-10303-stepmod/data/resources/support_resource_schema/support_resource_schema_annotated.exp',
49
51
  # full test (6m18s + 8s = 6m26s)
50
- *`bundle exec ../stepmod-utils/exe/stepmod-find-express-files ../iso-10303-stepmod`.strip.split("\n").map{|file| File.exists?(file.sub(/\.exp$/, '_annotated.exp')) ? file.sub(/\.exp$/, '_annotated.exp') : file}
52
+ # *`bundle exec ../stepmod-utils/exe/stepmod-find-express-files ../iso-10303-stepmod`.strip.split("\n").map{|file| File.exists?(file.sub(/\.exp$/, '_annotated.exp')) ? file.sub(/\.exp$/, '_annotated.exp') : file}
51
53
  ]
52
54
 
53
55
  start = Time.now
54
56
  repository = Expressir::ExpressExp::Parser.from_files(exp_files)
55
- puts "Parsing time: #{Time.now - start}"
56
- start2 = Time.now
57
+ puts "Parser.from_files time: #{(Time.now - start).round(2)}s"
58
+
59
+ temp_file = Tempfile.new
60
+ begin
61
+ start = Time.now
62
+ Expressir::ExpressExp::Cache.to_file(temp_file, repository)
63
+ puts "Cache.to_file time: #{(Time.now - start).round(2)}s"
64
+
65
+ start = Time.now
66
+ repository = Expressir::ExpressExp::Cache.from_file(temp_file)
67
+ puts "Cache.from_file time: #{(Time.now - start).round(2)}s"
68
+ ensure
69
+ temp_file.close
70
+ temp_file.unlink
71
+ end
72
+
73
+ start = Time.now
57
74
  formatter = Class.new(Expressir::ExpressExp::Formatter) do
58
75
  include Expressir::ExpressExp::SchemaHeadFormatter
59
76
  include Expressir::ExpressExp::HyperlinkFormatter
60
77
  end
61
78
  result = repository.to_hash(formatter: formatter, skip_empty: true)
62
- puts "Formatting & serializing time: #{Time.now - start2}"
63
- puts "Total time: #{Time.now - start}"
79
+ puts "Repository.to_hash time: #{(Time.now - start).round(2)}s"
64
80
 
65
81
  # puts YAML.dump(result)
@@ -0,0 +1,48 @@
1
+ require 'yaml'
2
+ require 'zlib'
3
+ require 'expressir/model'
4
+
5
+ module Expressir
6
+ module ExpressExp
7
+ class Cache
8
+ def self.to_file(file, content, options = {})
9
+ root_path = options[:root_path]
10
+ test_overwrite_version = options[:test_overwrite_version] # don't use, only for tests
11
+
12
+ version = test_overwrite_version || VERSION
13
+
14
+ cache = Model::Cache.new({
15
+ version: version,
16
+ content: content
17
+ })
18
+
19
+ hash = cache.to_hash(root_path: root_path, skip_empty: true)
20
+ yaml = YAML.dump(hash)
21
+ yaml_compressed = Zlib::Deflate.deflate(yaml)
22
+
23
+ File.binwrite(file, yaml_compressed)
24
+ end
25
+
26
+ def self.from_file(file, options = {})
27
+ root_path = options[:root_path]
28
+ test_overwrite_version = options[:test_overwrite_version] # don't use, only for tests
29
+
30
+ version = test_overwrite_version || VERSION
31
+
32
+ yaml_compressed = File.binread(file)
33
+ yaml = Zlib::Inflate.inflate(yaml_compressed)
34
+ hash = YAML.load(yaml)
35
+ cache = Model::ModelElement.from_hash(hash, root_path: root_path)
36
+
37
+ if cache.version != version
38
+ raise CacheLoadError.new("Cache version mismatch, cache version is #{cache.version}, Expressir version is #{version}")
39
+ end
40
+
41
+ cache.content
42
+ end
43
+ end
44
+
45
+ class CacheLoadError < StandardError
46
+ end
47
+ end
48
+ end
@@ -1502,7 +1502,7 @@ module Expressir
1502
1502
  [
1503
1503
  '(*',
1504
1504
  '"',
1505
- node.path,
1505
+ node.path || node.id,
1506
1506
  '"',
1507
1507
  ].join(''),
1508
1508
  remark,
@@ -1512,7 +1512,7 @@ module Expressir
1512
1512
  [
1513
1513
  '--',
1514
1514
  '"',
1515
- node.path,
1515
+ node.path || node.id,
1516
1516
  '"',
1517
1517
  ' ',
1518
1518
  remark
@@ -2,25 +2,20 @@ module Expressir
2
2
  module ExpressExp
3
3
  module HyperlinkFormatter
4
4
  def format_expressions_simple_reference(node)
5
- return node.id if node.parent.is_a? Model::Expressions::AttributeReference
5
+ return node.id unless node.base_path
6
6
 
7
- # skip hyperlink if target node can't be found
8
- target_node = if node.parent.is_a? Model::InterfaceItem
9
- node.find("#{node.parent.parent.schema.id}.#{node.parent.ref.id}")
10
- else
11
- node.find(node.id)
7
+ # find closest node with path
8
+ current_node = node
9
+ while !current_node.path
10
+ current_node = current_node.parent
12
11
  end
13
- return node.id unless target_node
14
12
 
15
- # skip hyperlink for implicit scopes
16
- return node.id if target_node.is_a? Model::Statements::Alias or target_node.is_a? Model::Statements::Repeat or target_node.is_a? Model::Expressions::QueryExpression
13
+ # skip if this reference and target node are in the same node with path
14
+ node_base_path_parts = node.base_path.split(".")
15
+ current_node_path_parts = current_node.path.split(".")
16
+ return node.id if node_base_path_parts[0..1] == current_node_path_parts[0..1]
17
17
 
18
- # skip hyperlink if this node and target node are in the same main item
19
- node_path_parts = node.path.split(".")
20
- target_node_path_parts = target_node.path.split(".")
21
- return node.id if node_path_parts[0..1] == target_node_path_parts[0..1]
22
-
23
- "{{{<<express:#{target_node.path},#{node.id}>>}}}"
18
+ "{{{<<express:#{node.base_path},#{node.id}>>}}}"
24
19
  end
25
20
  end
26
21
  end
@@ -0,0 +1,23 @@
1
+ require "expressir/model"
2
+
3
+ module Expressir
4
+ module ExpressExp
5
+ class ModelVisitor
6
+ def visit(node)
7
+ node.class.model_attrs.each do |variable|
8
+ value = node.send(variable)
9
+
10
+ if value.is_a? Array
11
+ value.each do |value|
12
+ if value.is_a? Model::ModelElement
13
+ visit(value)
14
+ end
15
+ end
16
+ elsif value.is_a? Model::ModelElement
17
+ visit(value)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -5,6 +5,7 @@ rescue LoadError
5
5
  require_relative "express_parser"
6
6
  end
7
7
  require 'expressir/express_exp/visitor'
8
+ require 'expressir/express_exp/resolve_references_model_visitor'
8
9
 
9
10
  =begin
10
11
  char_stream = Antlr4::Runtime::CharStreams.from_string(input, 'String')
@@ -25,6 +26,8 @@ module Expressir
25
26
  module ExpressExp
26
27
  class Parser
27
28
  def self.from_file(file, options = {})
29
+ skip_references = options[:skip_references]
30
+
28
31
  input = File.read(file)
29
32
 
30
33
  parser = ::ExpressParser::Parser.parse(input)
@@ -34,15 +37,24 @@ module Expressir
34
37
  visitor = Visitor.new(parser.tokens, options)
35
38
  repository = visitor.visit(parse_tree)
36
39
 
37
- repository.schemas.each{|schema| schema.file = file}
40
+ repository.schemas.each do |schema|
41
+ schema.file = file.to_s
42
+ end
43
+
44
+ unless skip_references
45
+ resolve_references_model_visitor = ResolveReferencesModelVisitor.new
46
+ resolve_references_model_visitor.visit(repository)
47
+ end
38
48
 
39
49
  repository
40
50
  end
41
51
 
42
52
  def self.from_files(files, options = {})
53
+ skip_references = options[:skip_references]
54
+
43
55
  schemas = files.each_with_index.map do |file, i|
44
56
  # start = Time.now
45
- repository = self.from_file(file, options)
57
+ repository = self.from_file(file, options.merge(skip_references: true))
46
58
  # STDERR.puts "#{i+1}/#{files.length} #{file} #{Time.now - start}"
47
59
  repository.schemas
48
60
  end.flatten
@@ -51,7 +63,10 @@ module Expressir
51
63
  schemas: schemas
52
64
  })
53
65
 
54
- repository.schemas.each{|schema| schema.parent = repository}
66
+ unless skip_references
67
+ resolve_references_model_visitor = ResolveReferencesModelVisitor.new
68
+ resolve_references_model_visitor.visit(repository)
69
+ end
55
70
 
56
71
  repository
57
72
  end
@@ -0,0 +1,33 @@
1
+ require "expressir/express_exp/model_visitor"
2
+ require "expressir/model"
3
+
4
+ module Expressir
5
+ module ExpressExp
6
+ class ResolveReferencesModelVisitor < ModelVisitor
7
+ def visit(node)
8
+ if node.is_a? Model::Expressions::SimpleReference
9
+ visit_expressions_simple_reference(node)
10
+ end
11
+
12
+ super
13
+ end
14
+
15
+ def visit_expressions_simple_reference(node)
16
+ return if node.parent.is_a? Model::Expressions::AttributeReference
17
+
18
+ if node.parent.is_a? Model::InterfaceItem
19
+ base_item = node.find("#{node.parent.parent.schema.id}.#{node.parent.ref.id}")
20
+ else
21
+ base_item = node.find(node.id)
22
+ end
23
+ return unless base_item
24
+
25
+ if base_item.is_a? Model::InterfacedItem
26
+ base_item = base_item.base_item
27
+ end
28
+
29
+ node.base_path = base_item.path
30
+ end
31
+ end
32
+ end
33
+ end
@@ -107,27 +107,28 @@ module Expressir
107
107
  target_node = node.find(path)
108
108
  return target_node if target_node
109
109
 
110
- # check if path should create implicit informal proposal
111
- # see https://github.com/lutaml/expressir/issues/50
110
+ # check if path can create implicit remark item
111
+ # see https://github.com/lutaml/expressir/issues/78
112
112
  rest, _, current_path = path.rpartition(".") # get last path part
113
113
  _, _, current_path = current_path.rpartition(":") # ignore prefix
114
+ parent_node = node.find(rest)
115
+ if parent_node and parent_node.class.method_defined? :remark_items
116
+ remark_item = Model::RemarkItem.new({
117
+ id: current_path
118
+ })
119
+ remark_item.parent = parent_node
114
120
 
115
- # match informal proposition id
116
- informal_proposition_id = current_path.match(/^IP\d+$/).to_a[0]
117
- return unless informal_proposition_id
118
-
119
- # find informal proposition target
120
- target_node = node.find(rest)
121
- return unless target_node and target_node.class.method_defined? :informal_propositions
122
-
123
- # create implicit informal proposition
124
- informal_proposition = Model::InformalProposition.new({
125
- id: informal_proposition_id
126
- })
127
- target_node.informal_propositions << informal_proposition
128
- target_node.reset_children_by_id
129
- informal_proposition.parent = target_node
130
- informal_proposition
121
+ # check if path can create implicit informal proposition
122
+ # see https://github.com/lutaml/expressir/issues/50
123
+ if parent_node.class.method_defined? :informal_propositions and current_path.match(/^IP\d+$/)
124
+ parent_node.informal_propositions << remark_item
125
+ else
126
+ parent_node.remark_items << remark_item
127
+ end
128
+ parent_node.reset_children_by_id
129
+
130
+ remark_item
131
+ end
131
132
  end
132
133
 
133
134
  def attach_remarks(ctx, node)