class Lexicon::Common::Package::DirectoryPackageLoader

Attributes

root_dir[R]

@return [Pathname]

Public Class Methods

new(root_dir, schema_validator:) click to toggle source

@param [Pathname] root_dir @param [JSONSchemer::Schema::Base] schema_validator

# File lib/lexicon/common/package/directory_package_loader.rb, line 14
def initialize(root_dir, schema_validator:)
  @root_dir = root_dir
  @schema_validator = schema_validator
end

Public Instance Methods

load_package(name) click to toggle source

@param [String] name @return [Package::Package, nil]

# File lib/lexicon/common/package/directory_package_loader.rb, line 21
def load_package(name)
  package_dir = root_dir.join(name.to_s)

  if package_dir.directory?
    load_from_dir(package_dir)
  else
    nil
  end
end

Protected Instance Methods

load_from_dir(dir) click to toggle source
# File lib/lexicon/common/package/directory_package_loader.rb, line 33
def load_from_dir(dir)
  # @type [Pathname]
  spec_file = dir.join(Package::SPEC_FILE_NAME)
  # @type [Pathname]
  checksum_file = dir.join(Package::CHECKSUM_FILE_NAME)

  if spec_file.exist? && checksum_file.exist?
    json = JSON.parse(spec_file.read)

    if @schema_validator.valid?(json)
      package_version = json.fetch('schema_version', 1)
      case package_version
      when 1
        load_v1(dir: dir, spec_file: spec_file, checksum_file: checksum_file, json: json)
      when 2
        load_v2(dir: dir, spec_file: spec_file, checksum_file: checksum_file, json: json)
      else
        log("Package version #{package_version} is not supported")

        nil
      end
    else
      log("Package at path #{dir} has invalid manifest")

      nil
    end
  else
    nil
  end
end
load_v1(dir:, spec_file:, checksum_file:, json:) click to toggle source

@param [Pathname] checksum_file @param [Pathname] dir @param [Hash] json @param [Pathname] spec_file @return [V1::Package]

# File lib/lexicon/common/package/directory_package_loader.rb, line 69
def load_v1(dir:, spec_file:, checksum_file:, json:)
  version = Semantic::Version.new(json.fetch('version'))
  file_sets = json.fetch('content').map do |id, values|
    V1::SourceFileSet.new(
      id: id,
      name: values.fetch('name'),
      structure: values.fetch('structure'),
      data: values.fetch('data', nil),
      tables: values.fetch('tables', [])
    )
  end

  V1::Package.new(file_sets: file_sets, version: version, dir: dir, checksum_file: checksum_file, spec_file: spec_file)
end
load_v2(dir:, spec_file:, checksum_file:, json:) click to toggle source

@param [Pathname] checksum_file @param [Pathname] dir @param [Hash] json @param [Pathname] spec_file @return [V2::Package]

# File lib/lexicon/common/package/directory_package_loader.rb, line 89
def load_v2(dir:, spec_file:, checksum_file:, json:)
  version = Semantic::Version.new(json.fetch('version'))
  file_sets = json.fetch('content').map do |id, values|
    V2::SourceFileSet.new(
      id: id,
      name: values.fetch('name'),
      structure: values.fetch('structure'),
      tables: values.fetch('tables', {})
    )
  end

  V2::Package.new(
    file_sets: file_sets,
    version: version,
    dir: dir,
    checksum_file: checksum_file,
    spec_file: spec_file
  )
end