Sha256: 7033248a1349dc6dc500a8a20e5bc71221fd2e8d5b2c5e82775475c0d778bf68

Contents?: true

Size: 1.31 KB

Versions: 3

Compression:

Stored size: 1.31 KB

Contents

# -*- coding: utf-8 -*-
# vim:ft=ruby:enc=utf-8

require 'pathname'
require 'yaml'

# The AlgorithmReader's primary API is to load the rules from a YAML-file
# into a Hash.
#
# Algorithms are searched in the following locations
#
# 1. ~/.to_pass/algorithms
# 2. bundled algorithms of gem
#
class ToPass::AlgorithmReader
  attr_reader :load_path

  def initialize(algorithm) # :nodoc:
    @algorithm = algorithm
    @load_path = []
    [
      '~/.to_pass/algorithms',
      "#{File.dirname(__FILE__)}/algorithms"
    ].each do |dir|
      dir = Pathname.new(dir).expand_path
      @load_path << dir if dir.exist?
    end
  end

  class << self
    # load an algorithm with a given identifier
    def load(algorithm)
      new(algorithm).load_from_file
    end

    # searches for available algorithms
    def discover
      new(nil).load_path.collect do |dir|
        Dir["#{dir}/*.yml"]
      end.flatten.compact.map do |fn|
        File.basename(fn).gsub('.yml', '')
      end
    end
  end

  def load_from_file # :nodoc:
    fn = load_path.map do |dir|
      file = Pathname.new("#{dir}/#{@algorithm}.yml")

      if file.exist?
        file
      else
        next
      end
    end.compact.first

    raise LoadError, "algorithm #{@algorithm} could not be found in #{load_path}" if fn.nil?

    YAML.load_file(fn.expand_path)
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
to_pass-0.5.2 lib/to_pass/algorithm_reader.rb
to_pass-0.5.0 lib/to_pass/algorithm_reader.rb
to_pass-0.4.0 lib/to_pass/algorithm_reader.rb