Sha256: 8c434610100a23a3e11b89e9f4327c96f33a20408802e20217d3d116ee416464

Contents?: true

Size: 1.88 KB

Versions: 4

Compression:

Stored size: 1.88 KB

Contents

require 'set'
require 'concurrent/array'
require 'dry/configurable/settings/argument_parser'
require 'dry/configurable/setting'
require 'dry/configurable/config'

module Dry
  module Configurable
    # A collection of settings. This is not part of the public API.
    #
    # @private
    class Settings
      Parser = ArgumentParser.new.freeze

      class DSL
        def self.call(&block)
          new.instance_exec do
            instance_exec(&block)
            @settings
          end
        end

        def initialize
          @settings = Settings.new
        end

        def setting(*args, &block)
          @settings.add(*args, &block)
        end
      end

      # Capture nested config definition
      #
      # @return [Dry::Configurable::Setting]
      def self.capture(&block)
        DSL.(&block)
      end

      attr_reader :settings

      attr_reader :config_class

      attr_reader :names

      def initialize(settings = ::Concurrent::Array.new)
        @settings = settings
        @config_class = Config[self]
        @names = Set.new(settings.map(&:name))
        yield(self) if block_given?
      end

      def add(key, value = Undefined, options = Undefined, &block)
        extended = singleton_class < Configurable
        raise_already_defined_config(key) if extended && configured?

        Setting.new(key, *Parser.(value, options, block)).tap do |s|
          settings << s
          names << s.name
        end
      end

      def each
        settings.each { |s| yield(s) }
      end

      def empty?
        settings.empty?
      end

      def name?(name)
        names.include?(name)
      end

      def dup
        Settings.new(settings.dup)
      end

      def freeze
        settings.freeze
        super
      end

      def create_config
        config_class.new
      end

      def config_defined?
        config_class.config_defined?
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
dry-configurable-0.8.3 lib/dry/configurable/settings.rb
dry-configurable-0.8.2 lib/dry/configurable/settings.rb
dry-configurable-0.8.1 lib/dry/configurable/settings.rb
dry-configurable-0.8.0 lib/dry/configurable/settings.rb