Sha256: db7f6452a31e745e6cbf4a7e04955e23b7288647b3dc07a14f4d7fd94b003455

Contents?: true

Size: 1.66 KB

Versions: 1

Compression:

Stored size: 1.66 KB

Contents

module EagleLabels
  class Specification

    def initialize(spec=nil)
      if spec.is_a? Hash
        @spec = spec
      elsif spec.is_a?(String) && File.exist?(spec)
        @spec = YAML.load_file(spec)
      else
        @spec = YAML.load_file("#{File.dirname(__FILE__)}/../../config/default_categories.yml")
      end
    end

    def categories
      @spec.map { |k, v| Category.new(k, v) }
    end

    def all_labels
      categories.map(&:all_labels).flatten
    end

    def starts_with(prefix)
      if prefix.size == 0
        labels = all_labels
      else
        category = categories.detect { |c| c.code == prefix[0] }
        labels = category.all_labels
      end
      labels.select { |l| l.match("^#{prefix}") }
    end

    def tails(prefix)
      starts_with(prefix).map { |l| l.sub prefix, '' }
    end

    def next_codes(prefix)
      if prefix.size == 0
        categories.map(&:code)
      else
        category = categories.detect { |c| c.code == prefix[0] }
        category.features.size > prefix.size-1 ? category.features[prefix.size-1].codes : []
      end
    end

    def valid_label?(label)
      all_labels.include? label
    end

    def names_of(label)
      return [] unless valid_label? label

      codes = label.chars.to_a
      category_code = codes.shift
      category = categories.detect { |c| c.code == category_code }
      names = [category.name]

      category.features.each do |feature|
        feature_code = codes.shift
        if value = feature.values.detect { |v| v.code == feature_code }
          names << value.name
        end
      end

      names
    end

  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
eagle_labels-0.0.1 lib/eagle_labels/specification.rb