Sha256: 7ad12ebf1dd90f475db333d1c5646bd34a2381e851da35f251051e2ab27d2c03

Contents?: true

Size: 1.47 KB

Versions: 2

Compression:

Stored size: 1.47 KB

Contents

module Lapidarius
  class Gem
    class KindError < ArgumentError; end

    LEVEL_DEPTH = 5

    def self.factory(name)
      name.match(/Gem ([a-z0-9\-_]+)-(\d{1,2}\.\d{1,3}\.\d{1,2})/) do |m|
        return new(name: m[1], version: m[2])
      end
      name.match(/([a-z0-9\-_]+) \(([0-9~<>=, \.]+)\)/) do |m|
        return new(name: m[1], version: m[2])
      end
    end

    attr_reader :name, :version, :deps

    def initialize(name:, version:, deps: [])
      @name = name
      @version = version
      @deps = deps
    end

    def <<(dep)
      fail KindError, "#{dep.inspect} is not a valid gem" unless gem?(dep)
      @deps << dep
    end

    def ==(gem)
      return false unless gem?(gem)
      gem.name == name && gem.version == version
    end

    def to_s(recursive: false)
      return fullname unless recursive
      fullname.tap do |s|
        deps.each do |dep|
          s << "\n"
          s << indentation
          s << dep.to_s(recursive: recursive)
        end
      end
    end

    def fullname
      "#{name} (#{version})"
    end

    def deep_count
      flatten_deps.size
    end

    protected def flatten_deps
      deps.reduce(deps) do |acc, dep|
        acc.concat dep.flatten_deps
      end.tap do |deps|
        deps.flatten!
        deps.uniq!(&:name)
      end
    end

    private def indentation
      " " * (caller.size / LEVEL_DEPTH)
    end

    private def gem?(gem)
      %i{name version deps}.all? { |msg| gem.respond_to?(msg) }
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
lapidarius-1.1.0 lib/lapidarius/gem.rb
lapidarius-1.0.0 lib/lapidarius/gem.rb