class Knowledge::Learner

Description

Knowledge is something that needs some learning.

Usage

@example:

learner = Knowledge::Learner.new

Attributes

@attr_reader [Hash] additionnal_params @attr_reader [Hash{Symbol => Class}] available_adapters @attr_reader [Hash{Symbol => Class}] enabled_adapters @attr [Class] setter @attr_reader [Hash] variables

Attributes

adapters[R]
additionnal_params[R]

Additionnal params to be passed to the adapter

available_adapters[R]

List of available adapters

enabled_adapters[R]

List of enabled adapters

setter[RW]

Config variables setter - can be overridden from outside of the object

variables[R]

Descriptor object for the variables to set/fetch

Public Class Methods

new() click to toggle source

Just sets default value for instance variables.

# File lib/knowledge/learner.rb, line 53
def initialize
  @additionnal_params = {}
  @available_adapters = {}
  @enabled_adapters = {}
  @setter = ::Knowledge::Setters.default.new
  @variables = {}
end
register_default_adapter(names:, klass:) click to toggle source

Registers given adapter as a default one. This method is meant to be used only by libraries adding adapters to the lib.

@see Knowledge::Learner#use for more details on how details are used.

Usage

@example:

# Define your adapter
class SuperServiceAdapter < ::Knowledge::Adapters::Base; end

# Register your adapter
Knowledge::Learner.register_default_adapter(names: %i[super_service service], klass: SuperServiceAdapter)

# Now you can use it the same way every other default adapters
learner = Knowledge::Learner.new

learner.use(name: :super_service)

Parameters

@param :names [Array<String | Symbol>] The supported names @param :klass [Class] The actual adapter class

# File lib/knowledge/learner.rb, line 90
def register_default_adapter(names:, klass:)
  @adapters ||= {}

  names.each { |name| @adapters[name.to_sym] = klass }
end

Public Instance Methods

add_adapter_param(adapter:, name:, value:) click to toggle source

Sets additional params to be passed to the adapter through params option.

Usage

@example:

learner = Knowledge::Learner.new

learner.add_adapter_param(adapter: :custom, name: :base_path, value: '/base/path')

Parameters

@param :adapter [String | Symbol] The adapter's name @param :name [String | Symbol] The parameter's name @param :value [any] The parameter's value

# File lib/knowledge/learner.rb, line 167
def add_adapter_param(adapter:, name:, value:)
  @additionnal_params[adapter.to_sym] ||= {}
  @additionnal_params[adapter.to_sym][name] = value
end
add_adapter_params(adapter:, params:) click to toggle source

Sets additional params to be passed to the adapter through params option.

Usage

@example:

learner = Knowledge::Learner.new

learner.add_adapter_param(name: :base_path, value: '/base/path')

Parameters

@param :adapter [String | Symbol] Adapter's name @param :params [any] Params to pass

# File lib/knowledge/learner.rb, line 187
def add_adapter_params(adapter:, params:)
  @additionnal_params[adapter.to_sym] = params
end
backup!(path:) click to toggle source

Gathers all the knowledge and backups it

Usage

@example:

learner = Knowledge::Learner.new

# Do some config (add adapters, define your setter, etc.)

learner.backup!

Parameters

@param :path [String] Path to the YAML file where to backup the config

# File lib/knowledge/learner.rb, line 115
def backup!(path:)
  backupper = ::Knowledge::Backupper.new(path: path)

  ::Knowledge::Initializer.new(
    adapters: enabled_adapters,
    params: additionnal_params,
    setter: backupper,
    variables: variables
  ).run

  backupper.backup!
end
disable_adapter(name:) click to toggle source

Disables an adapter.

Usage

@example:

learner = Knowledge::Learner.new

learner.register_adapter(name: :my_adapter, klass: MyAdapter, enable: true)

# Somewhere else in the code
learner.disable_adapter(name: :my_adapter) if should_disable_custom_adapter?

Parameters

@param :name [String | Symbol]

# File lib/knowledge/learner.rb, line 208
def disable_adapter(name:)
  @enabled_adapters.delete(name.to_sym)
end
enable_adapter(name:, variables: nil) click to toggle source

Enables an adapter.

Usage

@example:

learner = Knowledge::Learner.new

# Register your adapter
learner.register_adapter(name: :my_adapter, klass: MyAdapter)

# Now you can enable it
learner.enable_adapter(name: :my_adapter)

Errors

@raises [Knowledge::AdapterNotFound] if adapter is not available

Parameters

@param :name [String | Symbol] @param :variables [Hash | String | nil]

# File lib/knowledge/learner.rb, line 235
def enable_adapter(name:, variables: nil)
  _key, klass = available_adapters.find { |key, _klass| key.to_sym == name.to_sym }

  raise Knowledge::AdapterNotFound, "Cannot find \"#{name}\" in available adapters" if klass.nil?

  @enabled_adapters[name.to_sym] = klass
  set_adapter_variables(name: name, variables: variables)
end
gather!() click to toggle source

Gathers all the knowledge and put it into your app.

Usage

@example:

learner = Knowledge::Learner.new

# Do some config (add adapters, define your setter, etc.)

learner.gather!
# File lib/knowledge/learner.rb, line 140
def gather!
  ::Knowledge::Initializer.new(
    adapters: enabled_adapters,
    params: additionnal_params,
    setter: setter,
    variables: variables
  ).run
end
register_adapter(name:, klass:, enable: false, variables: nil) click to toggle source

Registers an adapter and enable it if asked.

Usage

@example:

learner = Knowledge::Learner.new

learner.register_adapter(name: :my_adapter, klass: MyAdapter, enable: true)

Parameters

@param :name [String | Symbol] @param :klass [Class] @param :enable [Boolean] @param :variables [Hash | String | nil]

# File lib/knowledge/learner.rb, line 261
def register_adapter(name:, klass:, enable: false, variables: nil)
  @available_adapters[name.to_sym] = klass
  enable_adapter(name: name) if enable
  set_adapter_variables(name: name, variables: variables)
end
set_adapter_variables(name:, variables: nil) click to toggle source

Sets variables for a given adapter.

Usage

@example:

learner = Knowledge::Learner.new

learner.set_adapter_variables(name: :default, variables: { foo: :bar })

Parameters

@param :name [String | Symbol] @param :variables [Hash | nil]

# File lib/knowledge/learner.rb, line 282
def set_adapter_variables(name:, variables: nil)
  return unless variables

  case variables
  when Hash
    set_adapter_variables_by_hash(name: name, variables: variables)
  when String
    set_adapter_variables(name: name, variables: yaml_content(variables))
  else
    raise "Unknown variables type #{variables.class}"
  end
rescue StandardError => e
  raise ::Knowledge::LearnError, e.message
end
set_adapter_variables_by_hash(name:, variables:) click to toggle source

Sets variables as a hash for a given adapter.

Usage

@example

learner = Knowledge::Learner.new

learner.set_adapter_variables_by_hash(name: :default, variables: { foo: :bar })

Parameters

@param :name [String | Symbol] @param :variables [Hash]

# File lib/knowledge/learner.rb, line 312
def set_adapter_variables_by_hash(name:, variables:)
  variables = variables[name.to_s] if variables.key?(name.to_s)
  variables = variables[name.to_sym] if variables.key?(name.to_sym)
  @variables[name.to_sym] = variables
end
unregister_adapter(name:) click to toggle source

Unregisters an adapter and disable it.

Usage

@example:

learner = Knowledge::Learner.new

learner.register_adapter(name: :my_adapter, klass: MyAdapter)

# somewhere else in the code
learner.unregister_adapter(name: :my_adapter)

Parameters

@param :name [String | Symbol]

# File lib/knowledge/learner.rb, line 335
def unregister_adapter(name:)
  disable_adapter(name: name)
  @available_adapters.delete(name.to_sym)
end
use(name:, enable: true) click to toggle source

Registers & enables one of the lib's default adapters.

If you're writing a gem to add an adapter to knowledge, please have a look at Knowledge::Learned#register_default_adapter

Usage

@example:

learner = Knowledge::Learner.new

learner.use(name: :ssm)

Parameters

@param :name [String | Symbol] @param :enable [Boolean]

# File lib/knowledge/learner.rb, line 358
def use(name:, enable: true)
  adapter = self.class.adapters[name.to_sym]

  raise ::Knowledge::RegisterError, "Unable to register following: #{name}" if adapter.nil?

  register_adapter(name: name.to_sym, klass: adapter, enable: enable)
end
variables=(path_or_descriptor) click to toggle source

Setter for the variables config.

Usage

@example:

learner = Knowledge::Learner.new

learner.variables = { name: 'value' }

@example:

learner = Knowledge::Learner.new

learner.use(name: :env)

learner.variables = { name: 'ENV_KEY' }

@example:

learner = Knowledge::Learner.new

learner.variables = 'path/to/vars/config/file.yml'

Errors

@raise [Knowledge::LearnError] if parameter isn't a hash or a string

Parameters

@param path_or_descriptor [String | Hash]

# File lib/knowledge/learner.rb, line 398
def variables=(path_or_descriptor)
  case path_or_descriptor
  when Hash
    @variables = path_or_descriptor
  when String
    fetch_variables_config(path_or_descriptor)
  else
    raise ::Knowledge::LearnError, "Unable to understand following path or descriptor: #{path_or_descriptor}"
  end
end

Protected Instance Methods

fetch_variables_config(path) click to toggle source

Opens the config file and sets the variable config.

Parameters

@param path [String]

# File lib/knowledge/learner.rb, line 418
def fetch_variables_config(path)
  descriptor = yaml_content(path)
  @variables = descriptor[::Knowledge.environment.to_s] || descriptor
end
yaml_content(path) click to toggle source

Loads YAML file content.

Parameters

@param path [String]

@return [Hash]

# File lib/knowledge/learner.rb, line 432
def yaml_content(path)
  ::YAML.safe_load(::File.open(path))
end