Class: Knowledge::Learner

Inherits:
Object
  • Object
show all
Defined in:
lib/knowledge/learner.rb

Overview

Description

Knowledge is something that needs some learning.

Usage

@example:

learner = Knowledge::Learner.new

Attributes

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeLearner

Just sets default value for instance variables.



53
54
55
56
57
58
59
# File 'lib/knowledge/learner.rb', line 53

def initialize
  @additionnal_params = {}
  @available_adapters = {}
  @enabled_adapters = {}
  @setter = ::Knowledge::Setters.default.new
  @variables = {}
end

Class Attribute Details

.adaptersObject (readonly)

Returns the value of attribute adapters.



63
64
65
# File 'lib/knowledge/learner.rb', line 63

def adapters
  @adapters
end

Instance Attribute Details

#additionnal_paramsObject (readonly)

Additionnal params to be passed to the adapter



30
31
32
# File 'lib/knowledge/learner.rb', line 30

def additionnal_params
  @additionnal_params
end

#available_adaptersObject (readonly)

List of available adapters



30
31
32
# File 'lib/knowledge/learner.rb', line 30

def available_adapters
  @available_adapters
end

#enabled_adaptersObject (readonly)

List of enabled adapters



30
31
32
# File 'lib/knowledge/learner.rb', line 30

def enabled_adapters
  @enabled_adapters
end

#setterObject

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



30
31
32
# File 'lib/knowledge/learner.rb', line 30

def setter
  @setter
end

#variablesObject

Descriptor object for the variables to set/fetch



30
31
32
# File 'lib/knowledge/learner.rb', line 30

def variables
  @variables
end

Class Method Details

.register_default_adapter(names:, klass:) ⇒ Object

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

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

Parameters:

  • :names (Array<String | Symbol>)

    The supported names

  • :klass (Class)

    The actual adapter class

See Also:



90
91
92
93
94
# File 'lib/knowledge/learner.rb', line 90

def register_default_adapter(names:, klass:)
  @adapters ||= {}

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

Instance Method Details

#add_adapter_param(adapter:, name:, value:) ⇒ Object

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

Parameters:

  • :adapter (String | Symbol)

    The adapter’s name

  • :name (String | Symbol)

    The parameter’s name

  • :value (any)

    The parameter’s value



167
168
169
170
# 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:) ⇒ Object

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

Parameters:

  • :adapter (String | Symbol)

    Adapter’s name

  • :params (any)

    Params to pass



187
188
189
# File 'lib/knowledge/learner.rb', line 187

def add_adapter_params(adapter:, params:)
  @additionnal_params[adapter.to_sym] = params
end

#backup!(path:) ⇒ Object

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

Parameters:

  • :path (String)

    Path to the YAML file where to backup the config



115
116
117
118
119
120
121
122
123
124
125
126
# 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:) ⇒ Object

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

Parameters:

  • :name (String | Symbol)


208
209
210
# File 'lib/knowledge/learner.rb', line 208

def disable_adapter(name:)
  @enabled_adapters.delete(name.to_sym)
end

#enable_adapter(name:, variables: nil) ⇒ Object

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

Parameters

Parameters:

  • :name (String | Symbol)
  • :variables (Hash | String | nil)

Raises:



235
236
237
238
239
240
241
242
# 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!Object

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!


140
141
142
143
144
145
146
147
# 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) ⇒ Object

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

Parameters:

  • :name (String | Symbol)
  • :klass (Class)
  • :enable (Boolean)
  • :variables (Hash | String | nil)


261
262
263
264
265
# 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) ⇒ Object

Sets variables for a given adapter.

Usage

@example:

learner = Knowledge::Learner.new

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

Parameters

Parameters:

  • :name (String | Symbol)
  • :variables (Hash | nil)


282
283
284
285
286
287
288
289
290
291
292
293
294
295
# 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:) ⇒ Object

Sets variables as a hash for a given adapter.

Usage

Parameters

Examples:

learner = Knowledge::Learner.new

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

Parameters:

  • :name (String | Symbol)
  • :variables (Hash)


312
313
314
315
316
# 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:) ⇒ Object

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

Parameters:

  • :name (String | Symbol)


335
336
337
338
# 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) ⇒ Object

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

Parameters:

  • :name (String | Symbol)
  • :enable (Boolean)

Raises:



358
359
360
361
362
363
364
# 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