leoniv/ass_launcher

View on GitHub
lib/ass_launcher/enterprise/cli/spec_dsl/dsl_helpers.rb

Summary

Maintainability
A
45 mins
Test Coverage
# encoding: utf-8

module AssLauncher
  module Enterprise
    module Cli
      module SpecDsl
        # @api private
        module DslHelpers
          # Translating stub
          def _t(s)
            s
          end

          def defined_modes
            AssLauncher::Enterprise::Cli::DEFINED_MODES
          end
          private :defined_modes

          def described_modes
            @described_modes ||= {}
          end

          def parameters_groups
            @parameters_groups ||= {}
          end

          def parameters
            @parameters ||= Parameters::AllParameters.new
          end

          attr_accessor :current_modes
          private :current_modes, :current_modes=

          attr_accessor :current_group
          private :current_group, :current_group=

          def parents_stack
            @parents_stack ||= []
          end
          private :parents_stack

          def current_parent
            parents_stack[0]
          end
          private :current_parent

          def new_param(klass, name, desc, clients = [], options = {}, &block)
            fail 'Group must be specifed' if current_group.nil?
            fail 'Modes must be specifed' if current_modes.nil?
            p = klass.new(name, desc,
                          new_binary_matcher(clients),
                          current_group,
                          current_modes, current_parent, **options)
            add_parameter(p)
            eval_sub_params(p, &block) if block_given?
          end
          private :new_param

          def new_binary_matcher(clients)
            return (inherid_binary_matcher || auto_binary_matcher) if\
              clients.size == 0
            BinaryMatcher.new(clients, from_current_version)
          end
          private :new_binary_matcher

          def auto_binary_matcher
            BinaryMatcher.auto(current_modes, from_current_version)
          end
          private :auto_binary_matcher

          def inherid_binary_matcher
            BinaryMatcher.new(current_parent.binary_matcher.clients,
                              from_current_version) if current_parent
          end
          private :inherid_binary_matcher

          def change_param(name, &block)
            p = get_parameter(name)
            old_g = current_group
            old_m = current_modes
            self.current_group = p.group
            self.current_modes = p.modes
            eval_sub_params(p, &block) if block_given?
            self.current_group = old_g
            self.current_modes = old_m
          end
          private :change_param

          def get_parameter(name)
            p = parameters.find_for_version(name,
                                            current_parent,
                                            current_version)
            fail "Parameter #{name} not found for #{current_version}." unless p
            p
          end
          private :get_parameter

          def add_parameter(p)
            parameters.add p, current_version
          end
          private :add_parameter

          # @return [nil]
          def restrict_params(name, v)
            get_parameters(name).each do |p|
              p.restrict_from(v)
            end
            nil
          end
          private :restrict_params

          def get_parameters(name)
            p = parameters.find(name, current_parent)
            fail "Parameter #{name} not found." if p.size == 0
            p
          end
          private :get_parameters

          def eval_sub_params(p, &block)
            parents_stack.unshift p
            instance_eval(&block)
            parents_stack.shift
          end
          private :eval_sub_params

          def enterprise_versions
            @enterprise_versions ||= []
          end

          def add_enterprise_versions(v)
            fail ArgumentError, 'Invalid version sequences. Expects version >'\
              " #{current_version} but given #{v}" unless v > current_version
            enterprise_versions << v
          end
          private :add_enterprise_versions

          def reset_all
            reset_group
            reset_modes
          end
          private :reset_all

          def reset_group
            self.current_group = nil
          end
          private :reset_group

          def reset_modes
            self.current_modes = nil
          end
          private :reset_modes

          def current_version
            return Gem::Version.new('0') if enterprise_versions.last.nil?
            enterprise_versions.last
          end
          private :current_version

          def from_current_version
            from_version current_version
          end
          private :from_current_version

          def from_version(v)
            Gem::Version::Requirement.new ">= #{v}"
          end
          private :from_version
        end
      end
    end
  end
end