expressir 1.3.0.pre.1-x86_64-linux-gnu

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 (146) hide show
  1. checksums.yaml +7 -0
  2. data/.cross_rubies +20 -0
  3. data/.github/workflows/rake.yml +312 -0
  4. data/.github/workflows/release.yml +124 -0
  5. data/.gitignore +23 -0
  6. data/.gitmodules +6 -0
  7. data/.hound.yml +3 -0
  8. data/.rspec +2 -0
  9. data/.rubocop.yml +18 -0
  10. data/.yardopts +11 -0
  11. data/Gemfile +4 -0
  12. data/README.adoc +155 -0
  13. data/Rakefile +17 -0
  14. data/bin/console +11 -0
  15. data/bin/rspec +29 -0
  16. data/bin/setup +8 -0
  17. data/docs/development.md +90 -0
  18. data/exe/expressir +22 -0
  19. data/exe/format +18 -0
  20. data/exe/format-test +81 -0
  21. data/exe/generate-parser +51 -0
  22. data/expressir.gemspec +48 -0
  23. data/lib/expressir/cli/ui.rb +36 -0
  24. data/lib/expressir/cli.rb +21 -0
  25. data/lib/expressir/config.rb +23 -0
  26. data/lib/expressir/express/2.7/express_parser.so +0 -0
  27. data/lib/expressir/express/3.0/express_parser.so +0 -0
  28. data/lib/expressir/express/3.1/express_parser.so +0 -0
  29. data/lib/expressir/express/3.2/express_parser.so +0 -0
  30. data/lib/expressir/express/cache.rb +51 -0
  31. data/lib/expressir/express/extension.rb +30 -0
  32. data/lib/expressir/express/formatter.rb +1608 -0
  33. data/lib/expressir/express/hyperlink_formatter.rb +36 -0
  34. data/lib/expressir/express/model_visitor.rb +24 -0
  35. data/lib/expressir/express/parser.rb +79 -0
  36. data/lib/expressir/express/resolve_references_model_visitor.rb +31 -0
  37. data/lib/expressir/express/schema_head_formatter.rb +23 -0
  38. data/lib/expressir/express/visitor.rb +2581 -0
  39. data/lib/expressir/model/cache.rb +17 -0
  40. data/lib/expressir/model/data_type.rb +9 -0
  41. data/lib/expressir/model/data_types/aggregate.rb +31 -0
  42. data/lib/expressir/model/data_types/array.rb +31 -0
  43. data/lib/expressir/model/data_types/bag.rb +25 -0
  44. data/lib/expressir/model/data_types/binary.rb +22 -0
  45. data/lib/expressir/model/data_types/boolean.rb +10 -0
  46. data/lib/expressir/model/data_types/enumeration.rb +25 -0
  47. data/lib/expressir/model/data_types/enumeration_item.rb +26 -0
  48. data/lib/expressir/model/data_types/generic.rb +26 -0
  49. data/lib/expressir/model/data_types/generic_entity.rb +26 -0
  50. data/lib/expressir/model/data_types/integer.rb +10 -0
  51. data/lib/expressir/model/data_types/list.rb +28 -0
  52. data/lib/expressir/model/data_types/logical.rb +10 -0
  53. data/lib/expressir/model/data_types/number.rb +10 -0
  54. data/lib/expressir/model/data_types/real.rb +19 -0
  55. data/lib/expressir/model/data_types/select.rb +28 -0
  56. data/lib/expressir/model/data_types/set.rb +25 -0
  57. data/lib/expressir/model/data_types/string.rb +22 -0
  58. data/lib/expressir/model/declaration.rb +9 -0
  59. data/lib/expressir/model/declarations/attribute.rb +47 -0
  60. data/lib/expressir/model/declarations/constant.rb +34 -0
  61. data/lib/expressir/model/declarations/entity.rb +53 -0
  62. data/lib/expressir/model/declarations/function.rb +67 -0
  63. data/lib/expressir/model/declarations/interface.rb +28 -0
  64. data/lib/expressir/model/declarations/interface_item.rb +23 -0
  65. data/lib/expressir/model/declarations/interfaced_item.rb +37 -0
  66. data/lib/expressir/model/declarations/parameter.rb +34 -0
  67. data/lib/expressir/model/declarations/procedure.rb +64 -0
  68. data/lib/expressir/model/declarations/remark_item.rb +21 -0
  69. data/lib/expressir/model/declarations/rule.rb +71 -0
  70. data/lib/expressir/model/declarations/schema.rb +117 -0
  71. data/lib/expressir/model/declarations/schema_version.rb +22 -0
  72. data/lib/expressir/model/declarations/schema_version_item.rb +22 -0
  73. data/lib/expressir/model/declarations/subtype_constraint.rb +40 -0
  74. data/lib/expressir/model/declarations/type.rb +45 -0
  75. data/lib/expressir/model/declarations/unique_rule.rb +31 -0
  76. data/lib/expressir/model/declarations/variable.rb +34 -0
  77. data/lib/expressir/model/declarations/where_rule.rb +31 -0
  78. data/lib/expressir/model/expression.rb +9 -0
  79. data/lib/expressir/model/expressions/aggregate_initializer.rb +19 -0
  80. data/lib/expressir/model/expressions/aggregate_initializer_item.rb +22 -0
  81. data/lib/expressir/model/expressions/binary_expression.rb +53 -0
  82. data/lib/expressir/model/expressions/entity_constructor.rb +22 -0
  83. data/lib/expressir/model/expressions/function_call.rb +22 -0
  84. data/lib/expressir/model/expressions/interval.rb +34 -0
  85. data/lib/expressir/model/expressions/query_expression.rb +35 -0
  86. data/lib/expressir/model/expressions/unary_expression.rb +27 -0
  87. data/lib/expressir/model/identifier.rb +34 -0
  88. data/lib/expressir/model/literal.rb +9 -0
  89. data/lib/expressir/model/literals/binary.rb +19 -0
  90. data/lib/expressir/model/literals/integer.rb +19 -0
  91. data/lib/expressir/model/literals/logical.rb +23 -0
  92. data/lib/expressir/model/literals/real.rb +19 -0
  93. data/lib/expressir/model/literals/string.rb +22 -0
  94. data/lib/expressir/model/model_element.rb +208 -0
  95. data/lib/expressir/model/reference.rb +9 -0
  96. data/lib/expressir/model/references/attribute_reference.rb +22 -0
  97. data/lib/expressir/model/references/group_reference.rb +22 -0
  98. data/lib/expressir/model/references/index_reference.rb +27 -0
  99. data/lib/expressir/model/references/simple_reference.rb +24 -0
  100. data/lib/expressir/model/repository.rb +23 -0
  101. data/lib/expressir/model/statement.rb +9 -0
  102. data/lib/expressir/model/statements/alias.rb +35 -0
  103. data/lib/expressir/model/statements/assignment.rb +22 -0
  104. data/lib/expressir/model/statements/case.rb +25 -0
  105. data/lib/expressir/model/statements/case_action.rb +22 -0
  106. data/lib/expressir/model/statements/compound.rb +19 -0
  107. data/lib/expressir/model/statements/escape.rb +10 -0
  108. data/lib/expressir/model/statements/if.rb +25 -0
  109. data/lib/expressir/model/statements/null.rb +10 -0
  110. data/lib/expressir/model/statements/procedure_call.rb +22 -0
  111. data/lib/expressir/model/statements/repeat.rb +47 -0
  112. data/lib/expressir/model/statements/return.rb +19 -0
  113. data/lib/expressir/model/statements/skip.rb +10 -0
  114. data/lib/expressir/model/supertype_expression.rb +9 -0
  115. data/lib/expressir/model/supertype_expressions/binary_supertype_expression.rb +29 -0
  116. data/lib/expressir/model/supertype_expressions/oneof_supertype_expression.rb +19 -0
  117. data/lib/expressir/model.rb +79 -0
  118. data/lib/expressir/version.rb +3 -0
  119. data/lib/expressir.rb +24 -0
  120. data/rakelib/antlr4-native.rake +161 -0
  121. data/rakelib/cross-ruby.rake +383 -0
  122. data/spec/acceptance/version_spec.rb +27 -0
  123. data/spec/expressir/express/cache_spec.rb +89 -0
  124. data/spec/expressir/express/formatter_spec.rb +173 -0
  125. data/spec/expressir/express/parser_spec.rb +141 -0
  126. data/spec/expressir/model/model_element_spec.rb +318 -0
  127. data/spec/spec_helper.rb +24 -0
  128. data/spec/support/console_helper.rb +29 -0
  129. data/spec/syntax/multiple.exp +23 -0
  130. data/spec/syntax/multiple.yaml +198 -0
  131. data/spec/syntax/multiple_formatted.exp +71 -0
  132. data/spec/syntax/multiple_hyperlink_formatted.exp +71 -0
  133. data/spec/syntax/multiple_schema_head_hyperlink_formatted.exp +13 -0
  134. data/spec/syntax/remark.exp +193 -0
  135. data/spec/syntax/remark.yaml +471 -0
  136. data/spec/syntax/remark_formatted.exp +228 -0
  137. data/spec/syntax/single.exp +4 -0
  138. data/spec/syntax/single.yaml +18 -0
  139. data/spec/syntax/single_formatted.exp +10 -0
  140. data/spec/syntax/single_formatted.yaml +36 -0
  141. data/spec/syntax/syntax.exp +333 -0
  142. data/spec/syntax/syntax.yaml +3509 -0
  143. data/spec/syntax/syntax_formatted.exp +902 -0
  144. data/spec/syntax/syntax_hyperlink_formatted.exp +902 -0
  145. data/spec/syntax/syntax_schema_head_formatted.exp +18 -0
  146. metadata +391 -0
@@ -0,0 +1,36 @@
1
+ module Expressir
2
+ module Express
3
+ # Formatter module - format references as hyperlinks
4
+ # @example Include into Formatter subclass
5
+ # formatter = Class.new(Expressir::Express::Formatter) do
6
+ # include Expressir::Express::HyperlinkFormatter
7
+ # end
8
+ module HyperlinkFormatter
9
+ # @!visibility private
10
+ def self.included(mod)
11
+ if !mod.superclass.private_method_defined? :format_references_simple_reference
12
+ raise 'Missing method'
13
+ end
14
+ end
15
+
16
+ private
17
+
18
+ def format_references_simple_reference(node)
19
+ return node.id unless node.base_path
20
+
21
+ # find closest node with path
22
+ current_node = node
23
+ while !current_node.path
24
+ current_node = current_node.parent
25
+ end
26
+
27
+ # skip if this reference and target node are in the same node with path
28
+ node_base_path_parts = node.base_path.split(".")
29
+ current_node_path_parts = current_node.path.split(".")
30
+ return node.id if node_base_path_parts[0..1] == current_node_path_parts[0..1]
31
+
32
+ "{{{<<express:#{node.base_path},#{node.id}>>}}}"
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,24 @@
1
+ require "expressir/model"
2
+
3
+ module Expressir
4
+ module Express
5
+ # @abstract
6
+ class ModelVisitor
7
+ def visit(node)
8
+ node.class.model_attrs.each do |variable|
9
+ value = node.send(variable)
10
+
11
+ if value.is_a? Array
12
+ value.each do |value|
13
+ if value.is_a? Model::ModelElement
14
+ visit(value)
15
+ end
16
+ end
17
+ elsif value.is_a? Model::ModelElement
18
+ visit(value)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,79 @@
1
+ require_relative 'extension'
2
+ require 'expressir/express/visitor'
3
+ require 'expressir/express/resolve_references_model_visitor'
4
+
5
+ =begin
6
+ char_stream = Antlr4::Runtime::CharStreams.from_string(input, 'String')
7
+ lexer = ::ExpressParser::Lexer.new(char_stream)
8
+ token_stream = Antlr4::Runtime::CommonTokenStream.new(lexer)
9
+ parser = ::ExpressParser::Parser.new(token_stream)
10
+
11
+ # don't attempt to recover from any parsing error
12
+ parser.instance_variable_set(:@_err_handler, Antlr4::Runtime::BailErrorStrategy.new)
13
+
14
+ parse_tree = parser.syntax()
15
+
16
+ visitor = Visitor.new(token_stream)
17
+ repo = visitor.visit(parse_tree)
18
+ =end
19
+
20
+ module Expressir
21
+ module Express
22
+ class Parser
23
+ # Parses Express file into an Express model
24
+ # @param [String] file Express file path
25
+ # @param [Boolean] skip_references skip resolving references
26
+ # @param [Boolean] include_source attach original source code to model elements
27
+ # @return [Model::Repository]
28
+ def self.from_file(file, skip_references: nil, include_source: nil)
29
+ raise Errno::ENOENT, "File not found: #{file}" unless File.exist?(file)
30
+
31
+ # An important note re memory management
32
+ # parse, syntax, visitor methods return complex tree structures created in native (C++) extension
33
+ # visit method references nodes and leaves of this structures but it is totally untransparent for Ruby GarbageCllector
34
+ # so in this class we keep those C++ structure marked for GC so they are not freed
35
+ @parser = ::ExpressParser::ParserExt.new(file.to_s)
36
+ @parse_tree = @parser.syntax()
37
+
38
+ @visitor = Visitor.new(@parser.tokens, include_source: include_source)
39
+ @repository = @visitor.visit(@parse_tree)
40
+
41
+ @repository.schemas.each do |schema|
42
+ schema.file = file.to_s
43
+ end
44
+
45
+ unless skip_references
46
+ @resolve_references_model_visitor = ResolveReferencesModelVisitor.new
47
+ @resolve_references_model_visitor.visit(@repository)
48
+ end
49
+
50
+ @repository
51
+ end
52
+
53
+ # Parses Express files into an Express model
54
+ # @param [Array<String>] files Express file paths
55
+ # @param [Boolean] skip_references skip resolving references
56
+ # @param [Boolean] include_source attach original source code to model elements
57
+ # @return [Model::Repository]
58
+ def self.from_files(files, skip_references: nil, include_source: nil)
59
+ schemas = files.each_with_index.map do |file, i|
60
+ # start = Time.now
61
+ repository = self.from_file(file, skip_references: true)
62
+ # STDERR.puts "#{i+1}/#{files.length} #{file} #{Time.now - start}"
63
+ repository.schemas
64
+ end.flatten
65
+
66
+ @repository = Model::Repository.new(
67
+ schemas: schemas
68
+ )
69
+
70
+ unless @skip_references
71
+ @resolve_references_model_visitor = ResolveReferencesModelVisitor.new
72
+ @resolve_references_model_visitor.visit(@repository)
73
+ end
74
+
75
+ @repository
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,31 @@
1
+ require "expressir/express/model_visitor"
2
+ require "expressir/model"
3
+
4
+ module Expressir
5
+ module Express
6
+ class ResolveReferencesModelVisitor < ModelVisitor
7
+ def visit(node)
8
+ if node.is_a? Model::References::SimpleReference
9
+ visit_references_simple_reference(node)
10
+ end
11
+
12
+ super
13
+ end
14
+
15
+ private
16
+
17
+ def visit_references_simple_reference(node)
18
+ return if node.parent.is_a? Model::References::AttributeReference
19
+
20
+ if node.parent.is_a? Model::Declarations::InterfaceItem
21
+ base_item = node.find("#{node.parent.parent.schema.id}.#{node.parent.ref.id}")
22
+ else
23
+ base_item = node.find(node.id)
24
+ end
25
+ return unless base_item
26
+
27
+ node.base_path = base_item.path
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,23 @@
1
+ module Expressir
2
+ module Express
3
+ # Formatter module - format schema as schema head only
4
+ # @example Include into Formatter subclass
5
+ # formatter = Class.new(Expressir::Express::Formatter) do
6
+ # include Expressir::Express::SchemaHeadFormatter
7
+ # end
8
+ module SchemaHeadFormatter
9
+ # @!visibility private
10
+ def self.included(mod)
11
+ if !mod.superclass.private_method_defined? :format_declarations_schema or !mod.superclass.private_method_defined? :format_declarations_schema_head
12
+ raise 'Missing method'
13
+ end
14
+ end
15
+
16
+ private
17
+
18
+ def format_declarations_schema(node)
19
+ format_declarations_schema_head(node)
20
+ end
21
+ end
22
+ end
23
+ end