knowledge 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|