Sha256: f2352ff66860a20ee4d298fc41f79fcc94e3fea48df15b7210307a4ad014c212

Contents?: true

Size: 1.27 KB

Versions: 7

Compression:

Stored size: 1.27 KB

Contents

require 'pg_query'

module PgObjects
  ##
  # Reads directives from SQL-comments
  #
  #    --!depends_on [name_of_dependency]
  #
  # name_of_dependency: short or full name of object as well as object_name
  #
  class Parser
    ROUTES = [
      ['DefineStmt', 'defnames', 0, 'String', 'str'],
      ['CreateFunctionStmt', 'funcname', 0, 'String', 'str'],
      %w[CreateTrigStmt trigname],
      %w[CreateEventTrigStmt trigname],
      %w[CompositeTypeStmt typevar RangeVar relname],
      %w[ViewStmt view RangeVar relname],
      ['CreateConversionStmt', 'conversion_name', 0, 'String', 'str'],
      %w[CreateTableAsStmt into IntoClause rel RangeVar relname],
      ['CreateOpClassStmt', 'opclassname', 0, 'String', 'str']
    ].freeze

    class << self
      def fetch_directives(text)
        {
          depends_on: fetch_dependencies(text)
        }
      end

      def fetch_object_name(text)
        parsed = PgQuery.parse(text).tree.dig(0, 'RawStmt', 'stmt')
        ROUTES.map { |route| parsed.dig(*route) }.compact[0]
      rescue PgQuery::ParseError, NoMethodError
        nil
      end

      private

      def fetch_dependencies(text)
        text.split("\n").select { |ln| ln =~ /^(--|#)!/ }.map { |ln| ln.split(' ')[1] if ln =~ /!depends_on/ }.compact
      end
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
pg_objects-0.5.6 lib/pg_objects/parser.rb
pg_objects-0.5.5 lib/pg_objects/parser.rb
pg_objects-0.5.4 lib/pg_objects/parser.rb
pg_objects-0.5.3 lib/pg_objects/parser.rb
pg_objects-0.5.2 lib/pg_objects/parser.rb
pg_objects-0.4.4 lib/pg_objects/parser.rb
pg_objects-0.4.3 lib/pg_objects/parser.rb