expressir 1.3.3-x86_64-linux-musl
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 +7 -0
 - data/.cross_rubies +28 -0
 - data/.github/workflows/codeql.yml +47 -0
 - data/.github/workflows/rake.yml +448 -0
 - data/.github/workflows/release.yml +189 -0
 - data/.github/workflows/stress.yml +53 -0
 - data/.gitignore +23 -0
 - data/.gitmodules +6 -0
 - data/.hound.yml +3 -0
 - data/.rspec +2 -0
 - data/.rubocop.yml +18 -0
 - data/.yardopts +11 -0
 - data/Gemfile +4 -0
 - data/README.adoc +155 -0
 - data/Rakefile +17 -0
 - data/bin/console +11 -0
 - data/bin/rspec +29 -0
 - data/bin/setup +8 -0
 - data/docs/development.md +90 -0
 - data/exe/expressir +22 -0
 - data/exe/format +18 -0
 - data/exe/format-test +81 -0
 - data/exe/generate-parser +51 -0
 - data/expressir.gemspec +48 -0
 - data/lib/expressir/cli/ui.rb +36 -0
 - data/lib/expressir/cli.rb +21 -0
 - data/lib/expressir/config.rb +23 -0
 - data/lib/expressir/express/2.7/express_parser.so +0 -0
 - data/lib/expressir/express/3.0/express_parser.so +0 -0
 - data/lib/expressir/express/3.1/express_parser.so +0 -0
 - data/lib/expressir/express/3.2/express_parser.so +0 -0
 - data/lib/expressir/express/cache.rb +51 -0
 - data/lib/expressir/express/formatter.rb +1608 -0
 - data/lib/expressir/express/hyperlink_formatter.rb +36 -0
 - data/lib/expressir/express/model_visitor.rb +24 -0
 - data/lib/expressir/express/parser.rb +83 -0
 - data/lib/expressir/express/resolve_references_model_visitor.rb +31 -0
 - data/lib/expressir/express/schema_head_formatter.rb +23 -0
 - data/lib/expressir/express/visitor.rb +2591 -0
 - data/lib/expressir/model/cache.rb +17 -0
 - data/lib/expressir/model/data_type.rb +9 -0
 - data/lib/expressir/model/data_types/aggregate.rb +31 -0
 - data/lib/expressir/model/data_types/array.rb +31 -0
 - data/lib/expressir/model/data_types/bag.rb +25 -0
 - data/lib/expressir/model/data_types/binary.rb +22 -0
 - data/lib/expressir/model/data_types/boolean.rb +10 -0
 - data/lib/expressir/model/data_types/enumeration.rb +25 -0
 - data/lib/expressir/model/data_types/enumeration_item.rb +26 -0
 - data/lib/expressir/model/data_types/generic.rb +26 -0
 - data/lib/expressir/model/data_types/generic_entity.rb +26 -0
 - data/lib/expressir/model/data_types/integer.rb +10 -0
 - data/lib/expressir/model/data_types/list.rb +28 -0
 - data/lib/expressir/model/data_types/logical.rb +10 -0
 - data/lib/expressir/model/data_types/number.rb +10 -0
 - data/lib/expressir/model/data_types/real.rb +19 -0
 - data/lib/expressir/model/data_types/select.rb +28 -0
 - data/lib/expressir/model/data_types/set.rb +25 -0
 - data/lib/expressir/model/data_types/string.rb +22 -0
 - data/lib/expressir/model/declaration.rb +9 -0
 - data/lib/expressir/model/declarations/attribute.rb +47 -0
 - data/lib/expressir/model/declarations/constant.rb +34 -0
 - data/lib/expressir/model/declarations/entity.rb +53 -0
 - data/lib/expressir/model/declarations/function.rb +67 -0
 - data/lib/expressir/model/declarations/interface.rb +28 -0
 - data/lib/expressir/model/declarations/interface_item.rb +23 -0
 - data/lib/expressir/model/declarations/interfaced_item.rb +37 -0
 - data/lib/expressir/model/declarations/parameter.rb +34 -0
 - data/lib/expressir/model/declarations/procedure.rb +64 -0
 - data/lib/expressir/model/declarations/remark_item.rb +21 -0
 - data/lib/expressir/model/declarations/rule.rb +71 -0
 - data/lib/expressir/model/declarations/schema.rb +117 -0
 - data/lib/expressir/model/declarations/schema_version.rb +22 -0
 - data/lib/expressir/model/declarations/schema_version_item.rb +22 -0
 - data/lib/expressir/model/declarations/subtype_constraint.rb +40 -0
 - data/lib/expressir/model/declarations/type.rb +45 -0
 - data/lib/expressir/model/declarations/unique_rule.rb +31 -0
 - data/lib/expressir/model/declarations/variable.rb +34 -0
 - data/lib/expressir/model/declarations/where_rule.rb +31 -0
 - data/lib/expressir/model/expression.rb +9 -0
 - data/lib/expressir/model/expressions/aggregate_initializer.rb +19 -0
 - data/lib/expressir/model/expressions/aggregate_initializer_item.rb +22 -0
 - data/lib/expressir/model/expressions/binary_expression.rb +53 -0
 - data/lib/expressir/model/expressions/entity_constructor.rb +22 -0
 - data/lib/expressir/model/expressions/function_call.rb +22 -0
 - data/lib/expressir/model/expressions/interval.rb +34 -0
 - data/lib/expressir/model/expressions/query_expression.rb +35 -0
 - data/lib/expressir/model/expressions/unary_expression.rb +27 -0
 - data/lib/expressir/model/identifier.rb +34 -0
 - data/lib/expressir/model/literal.rb +9 -0
 - data/lib/expressir/model/literals/binary.rb +19 -0
 - data/lib/expressir/model/literals/integer.rb +19 -0
 - data/lib/expressir/model/literals/logical.rb +23 -0
 - data/lib/expressir/model/literals/real.rb +19 -0
 - data/lib/expressir/model/literals/string.rb +22 -0
 - data/lib/expressir/model/model_element.rb +208 -0
 - data/lib/expressir/model/reference.rb +9 -0
 - data/lib/expressir/model/references/attribute_reference.rb +22 -0
 - data/lib/expressir/model/references/group_reference.rb +22 -0
 - data/lib/expressir/model/references/index_reference.rb +27 -0
 - data/lib/expressir/model/references/simple_reference.rb +24 -0
 - data/lib/expressir/model/repository.rb +23 -0
 - data/lib/expressir/model/statement.rb +9 -0
 - data/lib/expressir/model/statements/alias.rb +35 -0
 - data/lib/expressir/model/statements/assignment.rb +22 -0
 - data/lib/expressir/model/statements/case.rb +25 -0
 - data/lib/expressir/model/statements/case_action.rb +22 -0
 - data/lib/expressir/model/statements/compound.rb +19 -0
 - data/lib/expressir/model/statements/escape.rb +10 -0
 - data/lib/expressir/model/statements/if.rb +25 -0
 - data/lib/expressir/model/statements/null.rb +10 -0
 - data/lib/expressir/model/statements/procedure_call.rb +22 -0
 - data/lib/expressir/model/statements/repeat.rb +47 -0
 - data/lib/expressir/model/statements/return.rb +19 -0
 - data/lib/expressir/model/statements/skip.rb +10 -0
 - data/lib/expressir/model/supertype_expression.rb +9 -0
 - data/lib/expressir/model/supertype_expressions/binary_supertype_expression.rb +29 -0
 - data/lib/expressir/model/supertype_expressions/oneof_supertype_expression.rb +19 -0
 - data/lib/expressir/model.rb +79 -0
 - data/lib/expressir/version.rb +3 -0
 - data/lib/expressir.rb +44 -0
 - data/rakelib/antlr4-native.rake +173 -0
 - data/rakelib/cross-ruby.rake +403 -0
 - data/spec/acceptance/version_spec.rb +30 -0
 - data/spec/expressir/express/cache_spec.rb +89 -0
 - data/spec/expressir/express/formatter_spec.rb +171 -0
 - data/spec/expressir/express/parser_spec.rb +141 -0
 - data/spec/expressir/model/model_element_spec.rb +318 -0
 - data/spec/spec_helper.rb +24 -0
 - data/spec/support/console_helper.rb +29 -0
 - data/spec/syntax/multiple.exp +23 -0
 - data/spec/syntax/multiple.yaml +198 -0
 - data/spec/syntax/multiple_formatted.exp +71 -0
 - data/spec/syntax/multiple_hyperlink_formatted.exp +71 -0
 - data/spec/syntax/multiple_schema_head_hyperlink_formatted.exp +13 -0
 - data/spec/syntax/remark.exp +193 -0
 - data/spec/syntax/remark.yaml +471 -0
 - data/spec/syntax/remark_formatted.exp +228 -0
 - data/spec/syntax/single.exp +4 -0
 - data/spec/syntax/single.yaml +18 -0
 - data/spec/syntax/single_formatted.exp +10 -0
 - data/spec/syntax/single_formatted.yaml +36 -0
 - data/spec/syntax/syntax.exp +333 -0
 - data/spec/syntax/syntax.yaml +3509 -0
 - data/spec/syntax/syntax_formatted.exp +902 -0
 - data/spec/syntax/syntax_hyperlink_formatted.exp +902 -0
 - data/spec/syntax/syntax_schema_head_formatted.exp +18 -0
 - metadata +392 -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,83 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            begin
         
     | 
| 
      
 2 
     | 
    
         
            +
              RUBY_VERSION =~ /(\d+\.\d+)/
         
     | 
| 
      
 3 
     | 
    
         
            +
              require_relative "#{$1}/express_parser"
         
     | 
| 
      
 4 
     | 
    
         
            +
            rescue LoadError
         
     | 
| 
      
 5 
     | 
    
         
            +
              require_relative "express_parser"
         
     | 
| 
      
 6 
     | 
    
         
            +
            end
         
     | 
| 
      
 7 
     | 
    
         
            +
            require 'expressir/express/visitor'
         
     | 
| 
      
 8 
     | 
    
         
            +
            require 'expressir/express/resolve_references_model_visitor'
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            =begin
         
     | 
| 
      
 11 
     | 
    
         
            +
            char_stream = Antlr4::Runtime::CharStreams.from_string(input, 'String')
         
     | 
| 
      
 12 
     | 
    
         
            +
            lexer = ::ExpressParser::Lexer.new(char_stream)
         
     | 
| 
      
 13 
     | 
    
         
            +
            token_stream = Antlr4::Runtime::CommonTokenStream.new(lexer)
         
     | 
| 
      
 14 
     | 
    
         
            +
            parser = ::ExpressParser::Parser.new(token_stream)
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            # don't attempt to recover from any parsing error
         
     | 
| 
      
 17 
     | 
    
         
            +
            parser.instance_variable_set(:@_err_handler, Antlr4::Runtime::BailErrorStrategy.new)
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
            parse_tree = parser.syntax()
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            visitor = Visitor.new(token_stream)
         
     | 
| 
      
 22 
     | 
    
         
            +
            repo = visitor.visit(parse_tree)
         
     | 
| 
      
 23 
     | 
    
         
            +
            =end
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
            module Expressir
         
     | 
| 
      
 26 
     | 
    
         
            +
              module Express
         
     | 
| 
      
 27 
     | 
    
         
            +
                class Parser
         
     | 
| 
      
 28 
     | 
    
         
            +
                  # Parses Express file into an Express model
         
     | 
| 
      
 29 
     | 
    
         
            +
                  # @param [String] file Express file path
         
     | 
| 
      
 30 
     | 
    
         
            +
                  # @param [Boolean] skip_references skip resolving references
         
     | 
| 
      
 31 
     | 
    
         
            +
                  # @param [Boolean] include_source attach original source code to model elements
         
     | 
| 
      
 32 
     | 
    
         
            +
                  # @return [Model::Repository]
         
     | 
| 
      
 33 
     | 
    
         
            +
                  def self.from_file(file, skip_references: nil, include_source: nil)
         
     | 
| 
      
 34 
     | 
    
         
            +
                    raise Errno::ENOENT, "File not found: #{file}" unless File.exist?(file)
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                  # An important note re memory management
         
     | 
| 
      
 37 
     | 
    
         
            +
                  # parse, syntax, visitor methods return complex tree structures created in native (C++) extension
         
     | 
| 
      
 38 
     | 
    
         
            +
                  # visit method references nodes and leaves of this structures but it is totally untransparent for Ruby GarbageCllector
         
     | 
| 
      
 39 
     | 
    
         
            +
                  # so in this class we keep those C++ structure marked for GC so they are not freed
         
     | 
| 
      
 40 
     | 
    
         
            +
                    @parser = ::ExpressParser::ParserExt.new(file.to_s)
         
     | 
| 
      
 41 
     | 
    
         
            +
                    @parse_tree = @parser.syntax()
         
     | 
| 
      
 42 
     | 
    
         
            +
                    @visitor = Visitor.new(@parser.tokens, include_source: include_source)
         
     | 
| 
      
 43 
     | 
    
         
            +
                    @repository = @visitor.visit(@parse_tree)
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
                    @repository.schemas.each do |schema|
         
     | 
| 
      
 46 
     | 
    
         
            +
                      schema.file = file.to_s
         
     | 
| 
      
 47 
     | 
    
         
            +
                    end
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
                    unless skip_references
         
     | 
| 
      
 50 
     | 
    
         
            +
                      @resolve_references_model_visitor = ResolveReferencesModelVisitor.new
         
     | 
| 
      
 51 
     | 
    
         
            +
                      @resolve_references_model_visitor.visit(@repository)
         
     | 
| 
      
 52 
     | 
    
         
            +
                    end
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
                    @repository
         
     | 
| 
      
 55 
     | 
    
         
            +
                  end
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
                  # Parses Express files into an Express model
         
     | 
| 
      
 58 
     | 
    
         
            +
                  # @param [Array<String>] files Express file paths
         
     | 
| 
      
 59 
     | 
    
         
            +
                  # @param [Boolean] skip_references skip resolving references
         
     | 
| 
      
 60 
     | 
    
         
            +
                  # @param [Boolean] include_source attach original source code to model elements
         
     | 
| 
      
 61 
     | 
    
         
            +
                  # @return [Model::Repository]
         
     | 
| 
      
 62 
     | 
    
         
            +
                  def self.from_files(files, skip_references: nil, include_source: nil)
         
     | 
| 
      
 63 
     | 
    
         
            +
                    schemas = files.each_with_index.map do |file, i|
         
     | 
| 
      
 64 
     | 
    
         
            +
                      # start = Time.now
         
     | 
| 
      
 65 
     | 
    
         
            +
                      repository = self.from_file(file, skip_references: true)
         
     | 
| 
      
 66 
     | 
    
         
            +
                      # STDERR.puts "#{i+1}/#{files.length} #{file} #{Time.now - start}"
         
     | 
| 
      
 67 
     | 
    
         
            +
                      repository.schemas
         
     | 
| 
      
 68 
     | 
    
         
            +
                    end.flatten
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
                    @repository = Model::Repository.new(
         
     | 
| 
      
 71 
     | 
    
         
            +
                      schemas: schemas
         
     | 
| 
      
 72 
     | 
    
         
            +
                    )
         
     | 
| 
      
 73 
     | 
    
         
            +
             
     | 
| 
      
 74 
     | 
    
         
            +
                    unless @skip_references
         
     | 
| 
      
 75 
     | 
    
         
            +
                      @resolve_references_model_visitor = ResolveReferencesModelVisitor.new
         
     | 
| 
      
 76 
     | 
    
         
            +
                      @resolve_references_model_visitor.visit(@repository)
         
     | 
| 
      
 77 
     | 
    
         
            +
                    end
         
     | 
| 
      
 78 
     | 
    
         
            +
             
     | 
| 
      
 79 
     | 
    
         
            +
                    @repository
         
     | 
| 
      
 80 
     | 
    
         
            +
                  end
         
     | 
| 
      
 81 
     | 
    
         
            +
                end
         
     | 
| 
      
 82 
     | 
    
         
            +
              end
         
     | 
| 
      
 83 
     | 
    
         
            +
            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
         
     |