Class: Sinclair::ConfigFactory Private

Inherits:
Object
  • Object
show all
Defined in:
lib/sinclair/config_factory.rb

Overview

This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.

Class responsible for configuring the configuration class

Examples:

General usage

factory = Sinclair::ConfigFactory.new
factory.add_configs(:name)
factory.configure { |c| c.name 'John' }

config = factory.config

config.class.superclass       # returns Sinclair::Config
factory.config.equal?(config) # returns true
config.name                   # returns 'John'

Author:

  • darthjee

Constant Summary collapse

CONFIG_CLASS_WARNING =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Deprecation warning message

'Config class is expected to be ConfigClass. ' \
"In future releases this will be enforced.\n" \
'see more on https://github.com/darthjee/sinclair/blob/master/WARNINGS.md#usage-of-custom-config-classes'

Instance Method Summary collapse

Constructor Details

#initialize(config_class: Class.new(Config), config_attributes: []) ⇒ ConfigFactory

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a new instance of ConfigFactory.

Parameters:

  • config_class (Class) (defaults to: Class.new(Config))

    configuration class to be used

  • config_attributes (Array<Symbol,String>) (defaults to: [])

    list of possible configurations



29
30
31
32
33
34
35
36
# File 'lib/sinclair/config_factory.rb', line 29

def initialize(config_class: Class.new(Config), config_attributes: [])
  @config_class = config_class
  @config_attributes = config_attributes.dup

  return if config_class.is_a?(ConfigClass)

  warn CONFIG_CLASS_WARNING
end

Instance Method Details

#add_configs(*args) ⇒ Array<Symbol>

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

TODO:

remove class check once only ConfigClass are accepted

Adds possible configurations

It change the configuration class adding methods

and keeps track of those configurations so that
{ConfigBuilder} is able to set those values when invoked

Examples:

Adding configuration name

factory = Sinclair::ConfigFactory.new
config = factory.config

config.respond_to? :active
# returns false

factory.add_configs(:active)

config.respond_to? :active
# returns true

Returns:

  • (Array<Symbol>)

    all known config attributes



59
60
61
62
63
64
65
66
67
# File 'lib/sinclair/config_factory.rb', line 59

def add_configs(*args)
  builder = if config_class.is_a?(Sinclair::ConfigClass)
              config_class.add_configs(*args)
            else
              Config::MethodsBuilder.build(config_class, *args)
            end

  config_attributes.concat(builder.config_names.map(&:to_sym))
end

#childConfigFactory

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a new instance of ConfigFactory

the new instance will have the same config_attributes and for config_class a child of the current config_class

This method is called when initializing Sinclair::Configurable config_factory and the superclass is also configurable

This way, child classes from other Sinclair::Configurable classes will have a config_class that is a child from the original config_class

Returns:



138
139
140
141
142
143
# File 'lib/sinclair/config_factory.rb', line 138

def child
  self.class.new(
    config_class: Class.new(config_class),
    config_attributes: config_attributes
  )
end

#configConfig, Object

Returns current instance of config

the method returns the same instance until reset_config is called

Examples:

General usage

factory = Sinclair::ConfigFactory.new
factory.add_configs(:name)
factory.configure { |c| c.name 'John' }

config = factory.config

config.class.superclass       # returns Sinclair::Config
factory.config.equal?(config) # returns true
config.name                   # returns 'John'

Returns:

  • (Config, Object)

    the instance of given config_class. by default, this returns Class.new(Config).new

See Also:



74
75
76
# File 'lib/sinclair/config_factory.rb', line 74

def config
  @config ||= config_class.new
end

#configure(config_hash = {}) {|ConfigBuilder| ... } ⇒ Object

Set the values in the config

The block given is evaluated by the Sinclair::ConfigBuilder where each method missed will be used to set a variable in the config

Examples:

Setting name on config

class MyConfig
  extend Sinclair::ConfigClass

  attr_reader :name, :email
end

factory = Sinclair::ConfigFactory.new(
  config_class: MyConfig,
  config_attributes: %i[name email]
)

config = factory.config

factory.configure(email: '[email protected]') do
  name 'John'
end

config.name  # returns 'John'
config.email # returns '[email protected]'

Parameters:

  • config_hash (Hash) (defaults to: {})

    hash with keys and values for the configuration

Yields:

Returns:

  • (Object)

    the result of the block

See Also:



114
115
116
117
118
119
120
121
122
# File 'lib/sinclair/config_factory.rb', line 114

def configure(config_hash = {}, &block)
  config_builder.instance_eval(&block) if block

  config_builder.instance_eval do
    config_hash.each do |key, value|
      public_send(key, value)
    end
  end
end

#reset_configNilClass

Cleans the current config instance

After cleaning it, #config will generate a new instance

Examples:

factory = Sinclair::ConfigFactory.new

config = factory.config

factory.reset_config

factory.config == config # returns false

Returns:

  • (NilClass)

See Also:



88
89
90
# File 'lib/sinclair/config_factory.rb', line 88

def reset_config
  @config = nil
end