Sha256: 7b2b968df0a56b97f2b23b5cd5a312a409cbc651bb39dd10709f286ae83549de

Contents?: true

Size: 1.38 KB

Versions: 8

Compression:

Stored size: 1.38 KB

Contents

module UPM
  class Tool
    class << self

      def tools; @@tools; end

      def register_tools!
        Dir["#{__dir__}/tools/*.rb"].each { |lib| require_relative(lib) }
      end

      def os_release
        @os_release ||= begin
          open("/etc/os-release") do |io|
            io.read.scan(/^(\w+)="?(.+?)"?$/)
          end.to_h
        rescue Errno::ENOENT
          {}
        end
      end

      def current_os_names
        # eg: ID=ubuntu, ID_LIKE=debian
        if os_release
          os_release.values_at("ID", "ID_LIKE").compact
        else
          # `uname -s` => Darwin|FreeBSD|OpenBSD
          # `uname -o` => Android|Cygwin
          [`uname -s`, `uname -o`].map(&:chomp).uniq
        end
      end

      def nice_os_name
        os_release.values_at("PRETTY_NAME", "NAME", "ID", "ID_LIKE").first || 
          (`uname -o`.chomp rescue nil)
      end

      def installed
        @@tools.select { |tool| File.which(tool.identifying_binary) }
      end

      def for_os(os_names=nil)
        os_names = os_names ? [os_names].flatten : current_os_names

        tool = nil

        if os_names.any?
          tool = @@tools.find { |name, tool| os_names.any? { |name| tool.os.include? name } }&.last
        end

        if tool.nil?
          tool = @@tools.find { |name, tool| File.which(tool.identifying_binary) }&.last
        end

        tool
      end

    end
  end
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
upm-0.1.14 lib/upm/tool_class_methods.rb
upm-0.1.13 lib/upm/tool_class_methods.rb
upm-0.1.12 lib/upm/tool_class_methods.rb
upm-0.1.11 lib/upm/tool_class_methods.rb
upm-0.1.10 lib/upm/tool_class_methods.rb
upm-0.1.9 lib/upm/tool_class_methods.rb
upm-0.1.8 lib/upm/tool_class_methods.rb
upm-0.1.7 lib/upm/tool_class_methods.rb