Sha256: cd089b84ac76490d86e47be92b906f3dd1a09fc8210d73cc3f7f1f3e857fad39

Contents?: true

Size: 1.5 KB

Versions: 38

Compression:

Stored size: 1.5 KB

Contents

module Pio
  # User options utility.
  class Options
    def self.mandatory_option(name)
      if const_defined?(:MANDATORY_OPTIONS)
        const_get(:MANDATORY_OPTIONS) << name
      else
        const_set(:MANDATORY_OPTIONS, [name])
      end
    end

    def self.option(name)
      const_set(:OPTIONS, []) unless const_defined?(:OPTIONS)
      const_get(:OPTIONS) << name
    end

    private

    def validate(user_options)
      check_unknown user_options
      check_mandatory user_options
    end

    def mandatory_options
      klass = self.class
      if klass.const_defined?(:MANDATORY_OPTIONS)
        klass.const_get(:MANDATORY_OPTIONS)
      else
        []
      end
    end

    def options
      klass = self.class
      if klass.const_defined?(:OPTIONS)
        klass.const_get(:OPTIONS)
      else
        []
      end
    end

    def check_unknown(user_options)
      valid_options = mandatory_options + options
      user_options.keys.each do |each|
        fail "Unknown option: #{each}." unless valid_options.include?(each)
      end
    end

    def check_mandatory(user_options)
      self.class.const_get(:MANDATORY_OPTIONS).each do |each|
        check_existence(user_options, each)
      end
    end

    def check_existence(user_options, key)
      value = user_options.fetch(key) do |missing_key|
        fail ArgumentError, "The #{missing_key} option should be passed."
      end
      return if value
      fail(ArgumentError, "The #{key} option shouldn't be #{value.inspect}.")
    end
  end
end

Version data entries

38 entries across 38 versions & 1 rubygems

Version Path
pio-0.30.0 lib/pio/options.rb
pio-0.29.0 lib/pio/options.rb
pio-0.28.1 lib/pio/options.rb
pio-0.28.0 lib/pio/options.rb
pio-0.27.2 lib/pio/options.rb
pio-0.27.1 lib/pio/options.rb
pio-0.27.0 lib/pio/options.rb
pio-0.26.0 lib/pio/options.rb
pio-0.25.0 lib/pio/options.rb
pio-0.24.2 lib/pio/options.rb
pio-0.24.1 lib/pio/options.rb
pio-0.24.0 lib/pio/options.rb
pio-0.23.1 lib/pio/options.rb
pio-0.23.0 lib/pio/options.rb
pio-0.22.0 lib/pio/options.rb
pio-0.21.1 lib/pio/options.rb
pio-0.21.0 lib/pio/options.rb
pio-0.20.1 lib/pio/options.rb
pio-0.20.0 lib/pio/options.rb
pio-0.19.0 lib/pio/options.rb