knowledge 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.circleci/config.yml +53 -0
- data/.gitignore +2 -1
- data/.rubocop.yml +3 -0
- data/README.md +42 -2
- data/lib/knowledge.rb +5 -5
- data/lib/knowledge/adapters.rb +1 -1
- data/lib/knowledge/adapters/base.rb +23 -10
- data/lib/knowledge/adapters/environment.rb +9 -5
- data/lib/knowledge/adapters/file.rb +10 -3
- data/lib/knowledge/adapters/key_value.rb +9 -5
- data/lib/knowledge/backupper.rb +78 -0
- data/lib/knowledge/configuration.rb +8 -4
- data/lib/knowledge/exceptions.rb +6 -6
- data/lib/knowledge/initializer.rb +35 -16
- data/lib/knowledge/learner.rb +150 -78
- data/lib/knowledge/setter.rb +14 -8
- data/lib/knowledge/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 26d7ecee28ecca4444ab9b42c7f98a0a429783fcb4692dbf13db06d30382bbef
|
4
|
+
data.tar.gz: e4775687f169d0171b5b9ab97afb0b676a0222bc90046862e4cddb248d715145
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e338eb5b0dc2b621d66a1370c10f5080218a949c8dbf1ab1f6729b37bc48dc60288cbb09f8467898b4ccf2e496d2f8bc5a76323b27e450e3e764749b80549021
|
7
|
+
data.tar.gz: 5849a2224c0f9a436d323e868d7e69f4105d3d9c088b4c67846e886536caf35b78fbdf81946a392c5eb90094696f52e42bf80d199852999e5e248b4de501fdc2
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# Ruby CircleCI 2.0 configuration file
|
2
|
+
#
|
3
|
+
# Check https://circleci.com/docs/2.0/language-ruby/ for more details
|
4
|
+
#
|
5
|
+
version: 2
|
6
|
+
jobs:
|
7
|
+
build:
|
8
|
+
docker:
|
9
|
+
- image: circleci/ruby:2.5
|
10
|
+
|
11
|
+
working_directory: ~/repo
|
12
|
+
|
13
|
+
steps:
|
14
|
+
- checkout
|
15
|
+
|
16
|
+
# Download and cache dependencies
|
17
|
+
- restore_cache:
|
18
|
+
keys:
|
19
|
+
- v1-dependencies-{{ checksum "Gemfile.lock" }}
|
20
|
+
# fallback to using the latest cache if no exact match is found
|
21
|
+
- v1-dependencies-
|
22
|
+
|
23
|
+
- run:
|
24
|
+
name: install dependencies
|
25
|
+
command: |
|
26
|
+
bundle install --jobs=4 --retry=3 --path vendor/bundle
|
27
|
+
|
28
|
+
- save_cache:
|
29
|
+
paths:
|
30
|
+
- ./vendor/bundle
|
31
|
+
key: v1-dependencies-{{ checksum "Gemfile.lock" }}
|
32
|
+
|
33
|
+
- run:
|
34
|
+
name: RSpec specs
|
35
|
+
command: |
|
36
|
+
mkdir /tmp/test-results
|
37
|
+
TEST_FILES="$(circleci tests glob "spec/**/*_spec.rb" | circleci tests split --split-by=timings)"
|
38
|
+
|
39
|
+
bundle exec rspec --format progress \
|
40
|
+
--out /tmp/test-results/rspec.xml \
|
41
|
+
--format progress \
|
42
|
+
$TEST_FILES
|
43
|
+
|
44
|
+
# collect reports
|
45
|
+
- store_test_results:
|
46
|
+
path: /tmp/test-results
|
47
|
+
- store_artifacts:
|
48
|
+
path: /tmp/test-results
|
49
|
+
destination: test-results
|
50
|
+
|
51
|
+
- run:
|
52
|
+
name: Rubocop linting
|
53
|
+
command: bundle exec rubocop
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
data/README.md
CHANGED
@@ -2,11 +2,14 @@
|
|
2
2
|
|
3
3
|
Configuration variables are a project's knowledge. This gem is here to help your projects learn what they need to work properly.
|
4
4
|
|
5
|
+
Knowledge is a multi-source highly customizable configuration variables manager.
|
6
|
+
|
7
|
+
|
5
8
|
## Disclaimer
|
6
9
|
|
7
|
-
The full documentation is currently being written. You should be able to find a better documentation in a few hours.
|
10
|
+
The full documentation is currently being written. You should be able to find a better documentation in a few hours / days.
|
8
11
|
|
9
|
-
Waiting for the full documentation, you can have a look at the code which is already well-documented.
|
12
|
+
Waiting for the full documentation, you can have a look at the code which is already well-documented or at the [wiki](https://github.com/knowledge-ruby/knowledge/wiki)
|
10
13
|
|
11
14
|
## Installation
|
12
15
|
|
@@ -40,6 +43,43 @@ knowledge.gather!
|
|
40
43
|
Knowledge::Configuration.key # => "value"
|
41
44
|
```
|
42
45
|
|
46
|
+
**Using a config file**:
|
47
|
+
|
48
|
+
```yml
|
49
|
+
key: value
|
50
|
+
```
|
51
|
+
|
52
|
+
```ruby
|
53
|
+
knowledge = Knowledge::Learner.new
|
54
|
+
|
55
|
+
knowledge.use(name: :file)
|
56
|
+
knowledge.variables = 'path/to/file.yml'
|
57
|
+
knowledge.gather!
|
58
|
+
|
59
|
+
Knowledge::Configuration.key # => "value"
|
60
|
+
```
|
61
|
+
|
62
|
+
Or
|
63
|
+
|
64
|
+
```yml
|
65
|
+
development:
|
66
|
+
key: value
|
67
|
+
production:
|
68
|
+
key: other_value
|
69
|
+
```
|
70
|
+
|
71
|
+
```ruby
|
72
|
+
Knowledge.config.environment = :production
|
73
|
+
|
74
|
+
knowledge = Knowledge::Learner.new
|
75
|
+
|
76
|
+
knowledge.use(name: :file)
|
77
|
+
knowledge.variables = 'path/to/file.yml'
|
78
|
+
knowledge.gather!
|
79
|
+
|
80
|
+
Knowledge::Configuration.key # => "other_value"
|
81
|
+
```
|
82
|
+
|
43
83
|
**Using your own setter**:
|
44
84
|
|
45
85
|
```ruby
|
data/lib/knowledge.rb
CHANGED
@@ -7,11 +7,11 @@ require 'knowledge/exceptions'
|
|
7
7
|
require 'knowledge/learner'
|
8
8
|
|
9
9
|
#
|
10
|
-
# === Description
|
10
|
+
# === Description
|
11
11
|
#
|
12
12
|
# Configuration is your project's knowledge, let's make it very simple!
|
13
13
|
#
|
14
|
-
# === Configuration
|
14
|
+
# === Configuration
|
15
15
|
#
|
16
16
|
# Funny but quite normal, this gem needs some config.
|
17
17
|
# If you're familiar with dry-configurable, it should be very understandable for you.
|
@@ -27,7 +27,7 @@ require 'knowledge/learner'
|
|
27
27
|
# config.environment = ENV['RACK_ENV'] || Rails.env || ENV['APP_ENV'] # Or whatever you want
|
28
28
|
# end
|
29
29
|
#
|
30
|
-
# === Usage
|
30
|
+
# === Usage
|
31
31
|
#
|
32
32
|
# @example:
|
33
33
|
# Knowledge.configure do |config|
|
@@ -47,9 +47,9 @@ require 'knowledge/learner'
|
|
47
47
|
# learner.gather!
|
48
48
|
#
|
49
49
|
module Knowledge
|
50
|
-
# == Behaviors
|
50
|
+
# == Behaviors =======================================================================================================
|
51
51
|
extend Dry::Configurable
|
52
52
|
|
53
|
-
# == Settings
|
53
|
+
# == Settings ========================================================================================================
|
54
54
|
setting :environment, :development
|
55
55
|
end
|
data/lib/knowledge/adapters.rb
CHANGED
@@ -3,29 +3,43 @@
|
|
3
3
|
module Knowledge
|
4
4
|
module Adapters
|
5
5
|
#
|
6
|
-
# === Description
|
6
|
+
# === Description
|
7
7
|
#
|
8
8
|
# This adapter is the base adapter.
|
9
9
|
# It does nothing specific but is meant to manage all generic stuff.
|
10
10
|
#
|
11
|
-
# === Usage
|
11
|
+
# === Usage
|
12
12
|
#
|
13
13
|
# Just inherit from it
|
14
14
|
#
|
15
|
-
#
|
15
|
+
# @example:
|
16
|
+
#
|
17
|
+
# class MySuperAdapter < Knowledge::Adapters::Base; end
|
18
|
+
#
|
19
|
+
# === Attributes
|
16
20
|
#
|
17
21
|
# @attr_reader [Class] setter
|
18
22
|
# @attr_reader [Hash] variables
|
19
23
|
#
|
20
24
|
class Base
|
21
25
|
# == Attributes ==================================================================================================
|
22
|
-
|
26
|
+
|
27
|
+
# Setter object used to set variables once retrieved
|
28
|
+
attr_reader :setter
|
29
|
+
|
30
|
+
# Variables descriptor
|
31
|
+
attr_reader :variables
|
23
32
|
|
24
33
|
# == Constructor =================================================================================================
|
34
|
+
|
25
35
|
#
|
26
|
-
#
|
27
|
-
#
|
28
|
-
#
|
36
|
+
# Just initializes instance variables with given params
|
37
|
+
#
|
38
|
+
# === Parameters
|
39
|
+
#
|
40
|
+
# @param :variables [Hash]
|
41
|
+
# @param :setter [Class]
|
42
|
+
# @param :params [Hash]
|
29
43
|
#
|
30
44
|
def initialize(variables:, setter:, params: nil) # rubocop:disable Lint/UnusedMethodArgument
|
31
45
|
@variables = variables
|
@@ -33,13 +47,12 @@ module Knowledge
|
|
33
47
|
end
|
34
48
|
|
35
49
|
# == Instance Methods ============================================================================================
|
36
|
-
|
37
|
-
# === Description ===
|
50
|
+
|
38
51
|
#
|
39
52
|
# Should run the actual adapter.
|
40
53
|
# This method is meant to be overriden
|
41
54
|
#
|
42
|
-
# === Errors
|
55
|
+
# === Errors
|
43
56
|
#
|
44
57
|
# @raise [Knowledge::AdapterRunMethodNotImplemented] if not overridden by subclasses
|
45
58
|
#
|
@@ -3,26 +3,30 @@
|
|
3
3
|
module Knowledge
|
4
4
|
module Adapters
|
5
5
|
#
|
6
|
-
# === Description
|
6
|
+
# === Description
|
7
7
|
#
|
8
8
|
# This adapter takes some vars in ENV vars and put it in your project's config.
|
9
9
|
#
|
10
|
-
# === Usage
|
10
|
+
# === Usage
|
11
11
|
#
|
12
12
|
# @example:
|
13
|
+
# # Define your vars with the name of the variable as key and the name of the env var as value
|
14
|
+
# my_vars = { application_token: 'APPLICATION_TOKEN', aws_secret: 'AWS_SECRET_KEY' }
|
15
|
+
#
|
16
|
+
# # Instanciate the adapter
|
13
17
|
# adapter = Knowledge::Adapters::Environment.new(setter: MySetter, variables: my_vars)
|
14
18
|
#
|
19
|
+
# # And run it
|
15
20
|
# adapter.run
|
16
21
|
#
|
17
|
-
# === Attributes
|
22
|
+
# === Attributes
|
18
23
|
#
|
19
24
|
# @attr_reader [Class] setter
|
20
25
|
# @attr_reader [Hash] variables
|
21
26
|
#
|
22
27
|
class Environment < Base
|
23
28
|
# == Instance Methods ============================================================================================
|
24
|
-
|
25
|
-
# === Description ===
|
29
|
+
|
26
30
|
#
|
27
31
|
# Runs the actual adapter.
|
28
32
|
#
|
@@ -3,19 +3,26 @@
|
|
3
3
|
module Knowledge
|
4
4
|
module Adapters
|
5
5
|
#
|
6
|
-
# === Description
|
6
|
+
# === Description
|
7
7
|
#
|
8
8
|
# This adapter takes some vars in a config file and put it in your project's config.
|
9
9
|
# The config file should provide some YAML with key=value format.
|
10
10
|
#
|
11
|
-
#
|
11
|
+
# It works exactly like the KeyValue adapter, just pass a path to the learner as variables descriptor.
|
12
|
+
#
|
13
|
+
# === Usage
|
12
14
|
#
|
13
15
|
# @example:
|
16
|
+
# # Define your vars with the name of the variable as key and the value as value
|
17
|
+
# my_vars = { application_token: 's3cret', aws_secret: 's3cret' }
|
18
|
+
#
|
19
|
+
# # Initializes the adapter
|
14
20
|
# adapter = Knowledge::Adapters::File.new(setter: MySetter, variables: my_vars)
|
15
21
|
#
|
22
|
+
# # And run it
|
16
23
|
# adapter.run
|
17
24
|
#
|
18
|
-
# === Attributes
|
25
|
+
# === Attributes
|
19
26
|
#
|
20
27
|
# @attr_reader [Class] setter
|
21
28
|
# @attr_reader [Hash] variables
|
@@ -3,27 +3,31 @@
|
|
3
3
|
module Knowledge
|
4
4
|
module Adapters
|
5
5
|
#
|
6
|
-
# === Description
|
6
|
+
# === Description
|
7
7
|
#
|
8
8
|
# This adapter takes some vars in a config object and put it in your project's config.
|
9
9
|
# The config object should provide a hash with key=value format.
|
10
10
|
#
|
11
|
-
# === Usage
|
11
|
+
# === Usage
|
12
12
|
#
|
13
13
|
# @example:
|
14
|
+
# # Define your vars with the name of the variable as key and the value as value
|
15
|
+
# my_vars = { application_token: 's3cret', aws_secret: 's3cret' }
|
16
|
+
#
|
17
|
+
# # Instanciate the adapter
|
14
18
|
# adapter = Knowledge::Adapters::KeyValue.new(setter: MySetter, variables: my_vars)
|
15
19
|
#
|
20
|
+
# # And run it
|
16
21
|
# adapter.run
|
17
22
|
#
|
18
|
-
# === Attributes
|
23
|
+
# === Attributes
|
19
24
|
#
|
20
25
|
# @attr_reader [Class] setter
|
21
26
|
# @attr_reader [Hash] variables
|
22
27
|
#
|
23
28
|
class KeyValue < Base
|
24
29
|
# == Instance Methods ============================================================================================
|
25
|
-
|
26
|
-
# === Description ===
|
30
|
+
|
27
31
|
#
|
28
32
|
# Runs the actual adapter.
|
29
33
|
#
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
require 'knowledge/configuration'
|
6
|
+
|
7
|
+
module Knowledge
|
8
|
+
#
|
9
|
+
# === Description
|
10
|
+
#
|
11
|
+
# Object used to backup configuration variables.
|
12
|
+
#
|
13
|
+
# === Usage
|
14
|
+
#
|
15
|
+
# @example:
|
16
|
+
#
|
17
|
+
# backupper = Knowledge::Backupper.new
|
18
|
+
#
|
19
|
+
# backupper.register(name: :foo, value: 'bar')
|
20
|
+
# backupper.register(name: :bar, value: 'baz')
|
21
|
+
#
|
22
|
+
# backupper.backup!
|
23
|
+
#
|
24
|
+
# === Attributes
|
25
|
+
#
|
26
|
+
# @attr_reader [Hash] configuration
|
27
|
+
# @attr_reader [String] path
|
28
|
+
#
|
29
|
+
class Backupper
|
30
|
+
# == Attributes ====================================================================================================
|
31
|
+
|
32
|
+
# Configuration hash
|
33
|
+
attr_reader :configuration
|
34
|
+
|
35
|
+
# Backup file path
|
36
|
+
attr_reader :path
|
37
|
+
|
38
|
+
# == Constructor ===================================================================================================
|
39
|
+
|
40
|
+
#
|
41
|
+
# Just sets the basic configuration object.
|
42
|
+
#
|
43
|
+
# === Parameters
|
44
|
+
#
|
45
|
+
# @param :path [String] Path to the YAML file where to backup the config
|
46
|
+
#
|
47
|
+
def initialize(path:)
|
48
|
+
@configuration = {}
|
49
|
+
@path = path
|
50
|
+
end
|
51
|
+
|
52
|
+
# == Instance methods ==============================================================================================
|
53
|
+
|
54
|
+
#
|
55
|
+
# Backups the configuration.
|
56
|
+
#
|
57
|
+
def backup!
|
58
|
+
f = File.new(path, 'w')
|
59
|
+
|
60
|
+
f.write(configuration.to_yaml)
|
61
|
+
|
62
|
+
f.close
|
63
|
+
end
|
64
|
+
|
65
|
+
#
|
66
|
+
# Sets the variable before backuping everything.
|
67
|
+
#
|
68
|
+
# === Parameters
|
69
|
+
#
|
70
|
+
# @param :name [String | Symbol]
|
71
|
+
# @param :value [Any]
|
72
|
+
#
|
73
|
+
def set(name:, value:)
|
74
|
+
configuration[name.to_sym] = value
|
75
|
+
end
|
76
|
+
alias register set
|
77
|
+
end
|
78
|
+
end
|
@@ -2,14 +2,14 @@
|
|
2
2
|
|
3
3
|
module Knowledge
|
4
4
|
#
|
5
|
-
# === Description
|
5
|
+
# === Description
|
6
6
|
#
|
7
7
|
# If the project has no defined way to manage its config, why not providing it our way?
|
8
8
|
#
|
9
9
|
class Configuration
|
10
10
|
class << self
|
11
11
|
#
|
12
|
-
# === Description
|
12
|
+
# === Description
|
13
13
|
#
|
14
14
|
# We're doing black magic (a.k.a metaprogramming) to set variables directly on this class.
|
15
15
|
# When programmers do black magic, they should redefine some basic things that are broken as a side effect.
|
@@ -18,21 +18,25 @@ module Knowledge
|
|
18
18
|
#
|
19
19
|
# It allows us to see every variable that has been defined on the class by metaprogramming.
|
20
20
|
#
|
21
|
-
# === Usage
|
21
|
+
# === Usage
|
22
22
|
#
|
23
23
|
# @example:
|
24
24
|
# # Do some magic before
|
25
25
|
# Knowledge.config.environment = :development
|
26
26
|
# learner = Knowledge::Learner.new
|
27
|
+
#
|
27
28
|
# learner.use name: :default
|
28
29
|
# learner.variables = { foo: :bar }
|
30
|
+
#
|
29
31
|
# learner.gather!
|
32
|
+
#
|
30
33
|
# # And then inspect it
|
31
34
|
# puts Knowledge::Configuration.inspect
|
32
35
|
# # => #<Knowledge::Configuration:0x000047116740290980 @foo="bar">
|
36
|
+
#
|
33
37
|
# # Wonderful, isn't it?
|
34
38
|
#
|
35
|
-
# === Parameters
|
39
|
+
# === Parameters
|
36
40
|
#
|
37
41
|
# @return [String] as expected
|
38
42
|
#
|
data/lib/knowledge/exceptions.rb
CHANGED
@@ -2,13 +2,13 @@
|
|
2
2
|
|
3
3
|
module Knowledge
|
4
4
|
#
|
5
|
-
# === Description
|
5
|
+
# === Description
|
6
6
|
#
|
7
7
|
# This error class should be considered as the lib's standard error.
|
8
8
|
# All error classes inherit from this one.
|
9
9
|
# The goal is to be able to rescue Knowledge::Error outside the lib and catch them all.
|
10
10
|
#
|
11
|
-
# === Usage
|
11
|
+
# === Usage
|
12
12
|
#
|
13
13
|
# You have many examples behind. Just inherit from this class and it's ok.
|
14
14
|
#
|
@@ -18,28 +18,28 @@ module Knowledge
|
|
18
18
|
class Error < ::StandardError; end
|
19
19
|
|
20
20
|
#
|
21
|
-
# === Description
|
21
|
+
# === Description
|
22
22
|
#
|
23
23
|
# This error is used when, at some point, we can't find the adapter we're looking for
|
24
24
|
#
|
25
25
|
class AdapterNotFound < Error; end
|
26
26
|
|
27
27
|
#
|
28
|
-
# === Description
|
28
|
+
# === Description
|
29
29
|
#
|
30
30
|
# This error is used when an adapter has no #run method declared
|
31
31
|
#
|
32
32
|
class AdapterRunMethodNotImplemented < Error; end
|
33
33
|
|
34
34
|
#
|
35
|
-
# === Description
|
35
|
+
# === Description
|
36
36
|
#
|
37
37
|
# This error is pretty generic and is meant to be used when we're not able to gather infos in order to set vars.
|
38
38
|
#
|
39
39
|
class LearnError < Error; end
|
40
40
|
|
41
41
|
#
|
42
|
-
# === Description
|
42
|
+
# === Description
|
43
43
|
#
|
44
44
|
# This error is used when we fail registering an adapter.
|
45
45
|
#
|
@@ -2,19 +2,21 @@
|
|
2
2
|
|
3
3
|
module Knowledge
|
4
4
|
#
|
5
|
-
# === Description
|
5
|
+
# === Description
|
6
6
|
#
|
7
7
|
# We all need an initializer, here's this lib's initializer.
|
8
8
|
# Its role is to gather all informations and run the enabled adapters.
|
9
9
|
#
|
10
|
-
# === Usage
|
10
|
+
# === Usage
|
11
11
|
#
|
12
12
|
# @example:
|
13
13
|
# Knowledge::Initializer.new(adapters: adapters, params: { foo: :bar }, setter: setter, variables: variables).run
|
14
14
|
#
|
15
|
+
# # or
|
16
|
+
#
|
15
17
|
# Knowledge::Initializer.run(adapters: adapters, params: { foo: :bar }, setter: setter, variables: variables)
|
16
18
|
#
|
17
|
-
# === Attributes
|
19
|
+
# === Attributes
|
18
20
|
#
|
19
21
|
# @attr_reader [Array<String | Symbol>] adapters
|
20
22
|
# @attr_reader [Hash] params
|
@@ -22,15 +24,31 @@ module Knowledge
|
|
22
24
|
# @attr_reader [Hash] variables
|
23
25
|
#
|
24
26
|
class Initializer
|
25
|
-
# == Attributes
|
26
|
-
|
27
|
+
# == Attributes ====================================================================================================
|
28
|
+
|
29
|
+
# Adapters that will be used to retrieve variables' values
|
30
|
+
attr_reader :adapters
|
31
|
+
|
32
|
+
# Additionnal parameters to pass to the adapters
|
33
|
+
attr_reader :params
|
34
|
+
|
35
|
+
# Setter used to set variables after having retrieved their values
|
36
|
+
attr_reader :setter
|
37
|
+
|
38
|
+
# Descriptor for the variables to retrieve/fetch
|
39
|
+
attr_reader :variables
|
27
40
|
|
28
41
|
# == Constructor =================================================================================================
|
42
|
+
|
43
|
+
#
|
44
|
+
# Just initializes instance variables with given params.
|
29
45
|
#
|
30
|
-
#
|
31
|
-
#
|
32
|
-
# @
|
33
|
-
# @
|
46
|
+
# === Parameters
|
47
|
+
#
|
48
|
+
# @param :adapters [Array<Class>]
|
49
|
+
# @param :params [Hash]
|
50
|
+
# @param :setter [Class]
|
51
|
+
# @param :variables [Hash]
|
34
52
|
#
|
35
53
|
def initialize(adapters:, params:, setter:, variables:)
|
36
54
|
@adapters = adapters
|
@@ -42,16 +60,16 @@ module Knowledge
|
|
42
60
|
# == Class methods ===============================================================================================
|
43
61
|
class << self
|
44
62
|
#
|
45
|
-
# === Description
|
63
|
+
# === Description
|
46
64
|
#
|
47
65
|
# Instanciates the current class and runs all registered adapters.
|
48
66
|
#
|
49
|
-
# === Parameters
|
67
|
+
# === Parameters
|
50
68
|
#
|
51
|
-
# @
|
52
|
-
# @
|
53
|
-
# @
|
54
|
-
# @
|
69
|
+
# @param :adapters [Hash{Symbol => Class}]
|
70
|
+
# @param :params [Hash]
|
71
|
+
# @param :setter [Class]
|
72
|
+
# @param :variables [Hash]
|
55
73
|
#
|
56
74
|
def run(adapters:, params:, setter:, variables: {})
|
57
75
|
new(adapters: adapters, params: params, setter: setter, variables: variables).run
|
@@ -59,8 +77,9 @@ module Knowledge
|
|
59
77
|
end
|
60
78
|
|
61
79
|
# == Instance methods ============================================================================================
|
80
|
+
|
62
81
|
#
|
63
|
-
# === Description
|
82
|
+
# === Description
|
64
83
|
#
|
65
84
|
# Runs all registered adapters.
|
66
85
|
#
|
data/lib/knowledge/learner.rb
CHANGED
@@ -5,20 +5,21 @@ require 'yaml'
|
|
5
5
|
require 'knowledge/initializer'
|
6
6
|
require 'knowledge/adapters'
|
7
7
|
require 'knowledge/setter'
|
8
|
+
require 'knowledge/backupper'
|
8
9
|
|
9
10
|
module Knowledge
|
10
11
|
#
|
11
|
-
# === Description
|
12
|
+
# === Description
|
12
13
|
#
|
13
14
|
# Knowledge is something that needs some learning.
|
14
15
|
#
|
15
|
-
# === Usage
|
16
|
+
# === Usage
|
16
17
|
#
|
17
18
|
# @example:
|
18
19
|
#
|
19
20
|
# learner = Knowledge::Learner.new
|
20
21
|
#
|
21
|
-
# === Attributes
|
22
|
+
# === Attributes
|
22
23
|
#
|
23
24
|
# @attr_reader [Hash] additionnal_params
|
24
25
|
# @attr_reader [Hash{Symbol => Class}] available_adapters
|
@@ -28,10 +29,27 @@ module Knowledge
|
|
28
29
|
#
|
29
30
|
class Learner
|
30
31
|
# == Attributes ====================================================================================================
|
32
|
+
|
33
|
+
# Config variables setter - can be overridden from outside of the object
|
31
34
|
attr_accessor :setter
|
32
|
-
|
35
|
+
|
36
|
+
# Additionnal params to be passed to the adapter
|
37
|
+
attr_reader :additionnal_params
|
38
|
+
|
39
|
+
# List of available adapters
|
40
|
+
attr_reader :available_adapters
|
41
|
+
|
42
|
+
# List of enabled adapters
|
43
|
+
attr_reader :enabled_adapters
|
44
|
+
|
45
|
+
# Descriptor object for the variables to set/fetch
|
46
|
+
attr_reader :variables
|
33
47
|
|
34
48
|
# == Constructor ===================================================================================================
|
49
|
+
|
50
|
+
#
|
51
|
+
# Just sets default value for instance variables.
|
52
|
+
#
|
35
53
|
def initialize
|
36
54
|
@additionnal_params = {}
|
37
55
|
@available_adapters = {}
|
@@ -44,6 +62,31 @@ module Knowledge
|
|
44
62
|
class << self
|
45
63
|
attr_reader :adapters
|
46
64
|
|
65
|
+
#
|
66
|
+
# Registers given adapter as a default one.
|
67
|
+
# This method is meant to be used only by libraries adding adapters to the lib.
|
68
|
+
#
|
69
|
+
# @see Knowledge::Learner#use for more details on how details are used.
|
70
|
+
#
|
71
|
+
# === Usage
|
72
|
+
#
|
73
|
+
# @example:
|
74
|
+
# # Define your adapter
|
75
|
+
# class SuperServiceAdapter < ::Knowledge::Adapters::Base; end
|
76
|
+
#
|
77
|
+
# # Register your adapter
|
78
|
+
# Knowledge::Learner.register_default_adapter(names: %i[super_service service], klass: SuperServiceAdapter)
|
79
|
+
#
|
80
|
+
# # Now you can use it the same way every other default adapters
|
81
|
+
# learner = Knowledge::Learner.new
|
82
|
+
#
|
83
|
+
# learner.use(name: :super_service)
|
84
|
+
#
|
85
|
+
# === Parameters
|
86
|
+
#
|
87
|
+
# @param :names [Array<String | Symbol>] The supported names
|
88
|
+
# @param :klass [Class] The actual adapter class
|
89
|
+
#
|
47
90
|
def register_default_adapter(names:, klass:)
|
48
91
|
@adapters ||= {}
|
49
92
|
|
@@ -52,16 +95,46 @@ module Knowledge
|
|
52
95
|
end
|
53
96
|
|
54
97
|
# == Instance methods ==============================================================================================
|
98
|
+
|
99
|
+
#
|
100
|
+
# Gathers all the knowledge and backups it
|
101
|
+
#
|
102
|
+
# === Usage
|
103
|
+
#
|
104
|
+
# @example:
|
105
|
+
# learner = Knowledge::Learner.new
|
106
|
+
#
|
107
|
+
# # Do some config (add adapters, define your setter, etc.)
|
108
|
+
#
|
109
|
+
# learner.backup!
|
110
|
+
#
|
111
|
+
# === Parameters
|
112
|
+
#
|
113
|
+
# @param :path [String] Path to the YAML file where to backup the config
|
55
114
|
#
|
56
|
-
|
115
|
+
def backup!(path:)
|
116
|
+
backupper = ::Knowledge::Backupper.new(path: path)
|
117
|
+
|
118
|
+
::Knowledge::Initializer.new(
|
119
|
+
adapters: enabled_adapters,
|
120
|
+
params: additionnal_params,
|
121
|
+
setter: backupper,
|
122
|
+
variables: variables
|
123
|
+
).run
|
124
|
+
|
125
|
+
backupper.backup!
|
126
|
+
end
|
127
|
+
|
57
128
|
#
|
58
129
|
# Gathers all the knowledge and put it into your app.
|
59
130
|
#
|
60
|
-
# === Usage
|
131
|
+
# === Usage
|
61
132
|
#
|
62
133
|
# @example:
|
63
134
|
# learner = Knowledge::Learner.new
|
135
|
+
#
|
64
136
|
# # Do some config (add adapters, define your setter, etc.)
|
137
|
+
#
|
65
138
|
# learner.gather!
|
66
139
|
#
|
67
140
|
def gather!
|
@@ -74,89 +147,90 @@ module Knowledge
|
|
74
147
|
end
|
75
148
|
|
76
149
|
# == Adapters methods ============================================================================================
|
77
|
-
|
78
|
-
# === Description ===
|
150
|
+
|
79
151
|
#
|
80
152
|
# Sets additional params to be passed to the adapter through params option.
|
81
153
|
#
|
82
|
-
# === Usage
|
154
|
+
# === Usage
|
83
155
|
#
|
84
156
|
# @example:
|
85
157
|
# learner = Knowledge::Learner.new
|
158
|
+
#
|
86
159
|
# learner.add_adapter_param(adapter: :custom, name: :base_path, value: '/base/path')
|
87
160
|
#
|
88
|
-
# === Parameters
|
161
|
+
# === Parameters
|
89
162
|
#
|
90
|
-
# @
|
91
|
-
# @
|
92
|
-
# @
|
163
|
+
# @param :adapter [String | Symbol] The adapter's name
|
164
|
+
# @param :name [String | Symbol] The parameter's name
|
165
|
+
# @param :value [any] The parameter's value
|
93
166
|
#
|
94
167
|
def add_adapter_param(adapter:, name:, value:)
|
95
168
|
@additionnal_params[adapter.to_sym] ||= {}
|
96
169
|
@additionnal_params[adapter.to_sym][name] = value
|
97
170
|
end
|
98
171
|
|
99
|
-
#
|
100
|
-
# === Description ===
|
101
172
|
#
|
102
173
|
# Sets additional params to be passed to the adapter through params option.
|
103
174
|
#
|
104
|
-
# === Usage
|
175
|
+
# === Usage
|
105
176
|
#
|
106
177
|
# @example:
|
107
178
|
# learner = Knowledge::Learner.new
|
179
|
+
#
|
108
180
|
# learner.add_adapter_param(name: :base_path, value: '/base/path')
|
109
181
|
#
|
110
|
-
# === Parameters
|
182
|
+
# === Parameters
|
111
183
|
#
|
112
|
-
# @
|
113
|
-
# @
|
184
|
+
# @param :adapter [String | Symbol] Adapter's name
|
185
|
+
# @param :params [any] Params to pass
|
114
186
|
#
|
115
187
|
def add_adapter_params(adapter:, params:)
|
116
188
|
@additionnal_params[adapter.to_sym] = params
|
117
189
|
end
|
118
190
|
|
119
|
-
#
|
120
|
-
# === Description ===
|
121
191
|
#
|
122
192
|
# Disables an adapter.
|
123
193
|
#
|
124
|
-
# === Usage
|
194
|
+
# === Usage
|
125
195
|
#
|
126
196
|
# @example:
|
127
197
|
# learner = Knowledge::Learner.new
|
198
|
+
#
|
128
199
|
# learner.register_adapter(name: :my_adapter, klass: MyAdapter, enable: true)
|
200
|
+
#
|
129
201
|
# # Somewhere else in the code
|
130
202
|
# learner.disable_adapter(name: :my_adapter) if should_disable_custom_adapter?
|
131
203
|
#
|
132
|
-
# === Parameters
|
204
|
+
# === Parameters
|
133
205
|
#
|
134
|
-
# @
|
206
|
+
# @param :name [String | Symbol]
|
135
207
|
#
|
136
208
|
def disable_adapter(name:)
|
137
209
|
@enabled_adapters.delete(name.to_sym)
|
138
210
|
end
|
139
211
|
|
140
|
-
#
|
141
|
-
# === Description ===
|
142
212
|
#
|
143
213
|
# Enables an adapter.
|
144
214
|
#
|
145
|
-
# === Usage
|
215
|
+
# === Usage
|
146
216
|
#
|
147
217
|
# @example:
|
148
218
|
# learner = Knowledge::Learner.new
|
219
|
+
#
|
220
|
+
# # Register your adapter
|
149
221
|
# learner.register_adapter(name: :my_adapter, klass: MyAdapter)
|
222
|
+
#
|
223
|
+
# # Now you can enable it
|
150
224
|
# learner.enable_adapter(name: :my_adapter)
|
151
225
|
#
|
152
|
-
# === Errors
|
226
|
+
# === Errors
|
153
227
|
#
|
154
228
|
# @raises [Knowledge::AdapterNotFound] if adapter is not available
|
155
229
|
#
|
156
|
-
# === Parameters
|
230
|
+
# === Parameters
|
157
231
|
#
|
158
|
-
# @
|
159
|
-
# @
|
232
|
+
# @param :name [String | Symbol]
|
233
|
+
# @param :variables [Hash | String | nil]
|
160
234
|
#
|
161
235
|
def enable_adapter(name:, variables: nil)
|
162
236
|
_key, klass = available_adapters.find { |key, _klass| key.to_sym == name.to_sym }
|
@@ -167,23 +241,22 @@ module Knowledge
|
|
167
241
|
set_adapter_variables(name: name, variables: variables)
|
168
242
|
end
|
169
243
|
|
170
|
-
#
|
171
|
-
# === Description ===
|
172
244
|
#
|
173
245
|
# Registers an adapter and enable it if asked.
|
174
246
|
#
|
175
|
-
# === Usage
|
247
|
+
# === Usage
|
176
248
|
#
|
177
249
|
# @example:
|
178
250
|
# learner = Knowledge::Learner.new
|
251
|
+
#
|
179
252
|
# learner.register_adapter(name: :my_adapter, klass: MyAdapter, enable: true)
|
180
253
|
#
|
181
|
-
# === Parameters
|
254
|
+
# === Parameters
|
182
255
|
#
|
183
|
-
# @
|
184
|
-
# @
|
185
|
-
# @
|
186
|
-
# @
|
256
|
+
# @param :name [String | Symbol]
|
257
|
+
# @param :klass [Class]
|
258
|
+
# @param :enable [Boolean]
|
259
|
+
# @param :variables [Hash | String | nil]
|
187
260
|
#
|
188
261
|
def register_adapter(name:, klass:, enable: false, variables: nil)
|
189
262
|
@available_adapters[name.to_sym] = klass
|
@@ -192,20 +265,19 @@ module Knowledge
|
|
192
265
|
end
|
193
266
|
|
194
267
|
#
|
195
|
-
#
|
196
|
-
#
|
197
|
-
# Sets variables for a given adapter
|
268
|
+
# Sets variables for a given adapter.
|
198
269
|
#
|
199
|
-
# === Usage
|
270
|
+
# === Usage
|
200
271
|
#
|
201
272
|
# @example:
|
202
273
|
# learner = Knowledge::Learner.new
|
274
|
+
#
|
203
275
|
# learner.set_adapter_variables(name: :default, variables: { foo: :bar })
|
204
276
|
#
|
205
|
-
# ===
|
277
|
+
# === Parameters
|
206
278
|
#
|
207
|
-
# @
|
208
|
-
# @
|
279
|
+
# @param :name [String | Symbol]
|
280
|
+
# @param :variables [Hash | nil]
|
209
281
|
#
|
210
282
|
def set_adapter_variables(name:, variables: nil)
|
211
283
|
return unless variables
|
@@ -223,20 +295,19 @@ module Knowledge
|
|
223
295
|
end
|
224
296
|
|
225
297
|
#
|
226
|
-
#
|
298
|
+
# Sets variables as a hash for a given adapter.
|
227
299
|
#
|
228
|
-
#
|
229
|
-
#
|
230
|
-
# === Usage ===
|
300
|
+
# === Usage
|
231
301
|
#
|
232
302
|
# @example
|
233
303
|
# learner = Knowledge::Learner.new
|
304
|
+
#
|
234
305
|
# learner.set_adapter_variables_by_hash(name: :default, variables: { foo: :bar })
|
235
306
|
#
|
236
|
-
# ===
|
307
|
+
# === Parameters
|
237
308
|
#
|
238
|
-
# @
|
239
|
-
# @
|
309
|
+
# @param :name [String | Symbol]
|
310
|
+
# @param :variables [Hash]
|
240
311
|
#
|
241
312
|
def set_adapter_variables_by_hash(name:, variables:)
|
242
313
|
variables = variables[name.to_s] if variables.key?(name.to_s)
|
@@ -244,22 +315,22 @@ module Knowledge
|
|
244
315
|
@variables[name.to_sym] = variables
|
245
316
|
end
|
246
317
|
|
247
|
-
#
|
248
|
-
# === Description ===
|
249
318
|
#
|
250
319
|
# Unregisters an adapter and disable it.
|
251
320
|
#
|
252
|
-
# === Usage
|
321
|
+
# === Usage
|
253
322
|
#
|
254
323
|
# @example:
|
255
324
|
# learner = Knowledge::Learner.new
|
325
|
+
#
|
256
326
|
# learner.register_adapter(name: :my_adapter, klass: MyAdapter)
|
327
|
+
#
|
257
328
|
# # somewhere else in the code
|
258
329
|
# learner.unregister_adapter(name: :my_adapter)
|
259
330
|
#
|
260
|
-
# === Parameters
|
331
|
+
# === Parameters
|
261
332
|
#
|
262
|
-
# @
|
333
|
+
# @param :name [String | Symbol]
|
263
334
|
#
|
264
335
|
def unregister_adapter(name:)
|
265
336
|
disable_adapter(name: name)
|
@@ -267,20 +338,22 @@ module Knowledge
|
|
267
338
|
end
|
268
339
|
|
269
340
|
#
|
270
|
-
#
|
341
|
+
# Registers & enables one of the lib's default adapters.
|
271
342
|
#
|
272
|
-
#
|
343
|
+
# If you're writing a gem to add an adapter to knowledge, please have a look at
|
344
|
+
# Knowledge::Learned#register_default_adapter
|
273
345
|
#
|
274
|
-
# === Usage
|
346
|
+
# === Usage
|
275
347
|
#
|
276
348
|
# @example:
|
277
349
|
# learner = Knowledge::Learner.new
|
350
|
+
#
|
278
351
|
# learner.use(name: :ssm)
|
279
352
|
#
|
280
|
-
# === Parameters
|
353
|
+
# === Parameters
|
281
354
|
#
|
282
|
-
# @
|
283
|
-
# @
|
355
|
+
# @param :name [String | Symbol]
|
356
|
+
# @param :enable [Boolean]
|
284
357
|
#
|
285
358
|
def use(name:, enable: true)
|
286
359
|
adapter = self.class.adapters[name.to_sym]
|
@@ -291,33 +364,36 @@ module Knowledge
|
|
291
364
|
end
|
292
365
|
|
293
366
|
# == Variables config ==============================================================================================
|
294
|
-
|
295
|
-
# === Description ===
|
367
|
+
|
296
368
|
#
|
297
369
|
# Setter for the variables config.
|
298
370
|
#
|
299
|
-
# === Usage
|
371
|
+
# === Usage
|
300
372
|
#
|
301
373
|
# @example:
|
302
374
|
# learner = Knowledge::Learner.new
|
375
|
+
#
|
303
376
|
# learner.variables = { name: 'value' }
|
304
377
|
#
|
305
378
|
# @example:
|
306
379
|
# learner = Knowledge::Learner.new
|
380
|
+
#
|
307
381
|
# learner.use(name: :env)
|
382
|
+
#
|
308
383
|
# learner.variables = { name: 'ENV_KEY' }
|
309
384
|
#
|
310
385
|
# @example:
|
311
386
|
# learner = Knowledge::Learner.new
|
387
|
+
#
|
312
388
|
# learner.variables = 'path/to/vars/config/file.yml'
|
313
389
|
#
|
314
|
-
# === Errors
|
390
|
+
# === Errors
|
315
391
|
#
|
316
392
|
# @raise [Knowledge::LearnError] if parameter isn't a hash or a string
|
317
393
|
#
|
318
394
|
# === Parameters
|
319
395
|
#
|
320
|
-
# @param [String | Hash]
|
396
|
+
# @param path_or_descriptor [String | Hash]
|
321
397
|
#
|
322
398
|
def variables=(path_or_descriptor)
|
323
399
|
case path_or_descriptor
|
@@ -332,14 +408,12 @@ module Knowledge
|
|
332
408
|
|
333
409
|
protected
|
334
410
|
|
335
|
-
#
|
336
|
-
# === Description ===
|
337
411
|
#
|
338
412
|
# Opens the config file and sets the variable config.
|
339
413
|
#
|
340
|
-
# === Parameters
|
414
|
+
# === Parameters
|
341
415
|
#
|
342
|
-
# @param [String]
|
416
|
+
# @param path [String]
|
343
417
|
#
|
344
418
|
def fetch_variables_config(path)
|
345
419
|
descriptor = yaml_content(path)
|
@@ -347,13 +421,11 @@ module Knowledge
|
|
347
421
|
end
|
348
422
|
|
349
423
|
#
|
350
|
-
#
|
424
|
+
# Loads YAML file content.
|
351
425
|
#
|
352
|
-
#
|
353
|
-
#
|
354
|
-
# === Parameters ===
|
426
|
+
# === Parameters
|
355
427
|
#
|
356
|
-
# @param [String]
|
428
|
+
# @param path [String]
|
357
429
|
#
|
358
430
|
# @return [Hash]
|
359
431
|
#
|
data/lib/knowledge/setter.rb
CHANGED
@@ -4,32 +4,38 @@ require 'knowledge/configuration'
|
|
4
4
|
|
5
5
|
module Knowledge
|
6
6
|
#
|
7
|
-
# === Description
|
7
|
+
# === Description
|
8
8
|
#
|
9
9
|
# If you don't have a defined strategy to manage config for your project, you can use Knowledge's one.
|
10
|
-
# This is the custom setter
|
10
|
+
# This is the custom setter.
|
11
11
|
#
|
12
|
-
# === Usage
|
12
|
+
# === Usage
|
13
13
|
#
|
14
14
|
# @example:
|
15
|
+
#
|
15
16
|
# Knowledge::Setter.new.set(name: :foo, value: 'bar')
|
16
17
|
#
|
17
18
|
class Setter
|
18
19
|
# == Constructor ===================================================================================================
|
20
|
+
|
21
|
+
#
|
22
|
+
# Just sets the basic configuration object.
|
23
|
+
#
|
19
24
|
def initialize
|
20
25
|
@configuration = ::Knowledge::Configuration
|
21
26
|
end
|
22
27
|
|
23
28
|
# == Instance methods ==============================================================================================
|
29
|
+
|
24
30
|
#
|
25
|
-
# === Description
|
31
|
+
# === Description
|
26
32
|
#
|
27
|
-
# Sets the variable by doing black magic on Knowledge::Configuration
|
33
|
+
# Sets the variable by doing black magic on Knowledge::Configuration.
|
28
34
|
#
|
29
|
-
# === Parameters
|
35
|
+
# === Parameters
|
30
36
|
#
|
31
|
-
# @
|
32
|
-
# @
|
37
|
+
# @param :name [String | Symbol]
|
38
|
+
# @param :value [Any]
|
33
39
|
#
|
34
40
|
def set(name:, value:)
|
35
41
|
@configuration.singleton_class.class_eval { attr_accessor name.to_sym } unless @configuration.respond_to?(name)
|
data/lib/knowledge/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: knowledge
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Johann Wilfrid-Calixte
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-12-
|
11
|
+
date: 2018-12-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dry-configurable
|
@@ -115,6 +115,7 @@ executables: []
|
|
115
115
|
extensions: []
|
116
116
|
extra_rdoc_files: []
|
117
117
|
files:
|
118
|
+
- ".circleci/config.yml"
|
118
119
|
- ".gitignore"
|
119
120
|
- ".rspec"
|
120
121
|
- ".rubocop.yml"
|
@@ -135,6 +136,7 @@ files:
|
|
135
136
|
- lib/knowledge/adapters/environment.rb
|
136
137
|
- lib/knowledge/adapters/file.rb
|
137
138
|
- lib/knowledge/adapters/key_value.rb
|
139
|
+
- lib/knowledge/backupper.rb
|
138
140
|
- lib/knowledge/configuration.rb
|
139
141
|
- lib/knowledge/exceptions.rb
|
140
142
|
- lib/knowledge/initializer.rb
|