leoniv/ass_launcher

View on GitHub
lib/ass_launcher/enterprise/cli/binary_matcher.rb

Summary

Maintainability
A
0 mins
Test Coverage
module AssLauncher
  module Enterprise
    module Cli
      # @api private
      class BinaryMatcher
        ALL_CLIENTS = [:thick, :thin, :web]

        def self.modes_for
          @modes_for ||= {
            web: Enterprise::WebClient.run_modes,
            thick: Enterprise::BinaryWrapper::ThickClient.run_modes,
            thin: Enterprise::BinaryWrapper::ThinClient.run_modes
          }
        end
        private_class_method :modes_for

        # Calculate matcher for +run_mode+
        def self.auto(run_modes, requirement = '> 0')
          new auto_client(run_modes), requirement
        end

        def self.auto_client(modes)
          r = []
          r << :web if satisfied? modes, :web
          r << :thick if satisfied? modes, :thick
          r << :thin if satisfied? modes, :thin
          r
        end
        private_class_method :auto_client

        def self.satisfied?(modes, client)
          (modes & modes_for[client]).size > 0
        end
        private_class_method :satisfied?

        attr_reader :clients, :requirement
        def initialize(clients_array = nil, requirement = '>= 0')
          @clients = nil_if_zsize(clients_array) || ALL_CLIENTS
          @requirement = Gem::Requirement.new requirement.to_s
        end

        def nil_if_zsize(array)
          return nil if (array || []).size == 0
          array
        end
        private :nil_if_zsize

        def requirement=(r)
          fail ArgumentError unless r.is_a? Gem::Version::Requirement
          @requirement = r
        end

        def match?(binary_wrapper)
          match_client?(binary_wrapper) && match_version?(binary_wrapper)
        end

        private
        def match_client?(bw)
          clients.include? bw.class.name.split('::').last.
            to_s.downcase.gsub(/client$/,'').to_sym
        end

        def match_version?(bw)
          requirement.satisfied_by? bw.version
        end
      end
    end
  end
end