lib/hw/packages.rb

Summary

Maintainability
A
25 mins
Test Coverage
module HW
  class Packages
    extend Thor::Actions
    extend Thor::Shell
    extend Actions

    class << self
      @@packages = {}

      def add name
        Sources.all.each do |key, path|
          full_path = if HW::Sources.local_source?(path)
            File.join(path, "#{name}.rb")
          else
            File.join(SOURCES_PATH, key, "#{name}.rb")
          end

          @@packages[name] = full_path if File.exists?(full_path)
        end

        if reserved?(name)
          puts "'#{name}' is a reserved word and cannot be defined as a package"
          exit(1)
        end

        register(name, @@packages[name])
      end

      def register name, file
        raise LoadError if file.nil? # TODO: Don't use exception handling.
        require file
        klass = Packages::const_get(name.to_pkg)
        Thor.register(klass, name, "#{name} <command>", "")
      rescue LoadError
        puts "The package '#{name}' was not found in any of the sources"
        exit(1)
      end

      def list
        header "Listing available packages"

        Sources.all.keys.each do |directory|
          full_path = File.join(SOURCES_PATH, directory, "*.rb")

          Dir[full_path].each do |file|
            key             = File.basename(file, '.rb')
            @@packages[key] = file
          end
        end

        @@packages.merge!({ 'system' => nil, 'help' => nil })
        @@packages.keys.sort
      end

      def formatted_list
        print_in_columns(Packages.list)
      end

      def reserved? name
        RESERVED_WORDS.include?(name.downcase)
      end
    end
  end
end