precursor 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: a330cda13b62eafd9c37e48f3d0e5fee928b9d0ac4e1a1a034f4b2df6cb8c3ef
4
+ data.tar.gz: 1c36ffb97fdd50bfebd093db7ca61c2ae9fe83c1b5b6f835c733acec986da79d
5
+ SHA512:
6
+ metadata.gz: fcfb70401efcfcf80cb2f988c0b796b0f501d34da997ac4adb59d1f3969186b7093d76825f8a7889393acaa80eb5c04ca56cf7633d6567bc480449774f6ee4e6
7
+ data.tar.gz: 24f13b6e7911b0197250a6af8fdc936ef84c67dc6f3abe11c530b62fb20e728495fdb45208d08304ee03508e3ce3bdb2aa65d6f40fef2e2345de57ee68c56feb
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Precursor
4
+ class ConfigKeyBuilder
5
+ def initialize
6
+ @key_options = {}
7
+ end
8
+
9
+ def default(value)
10
+ @key_options[:default] = value
11
+ end
12
+
13
+ def build
14
+ @key_options
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Precursor
4
+ class ConfigRoot
5
+ def initialize(vaults, key_options)
6
+ @vaults = vaults
7
+ @key_options = key_options
8
+ end
9
+
10
+ def [](key)
11
+ found = false
12
+ value = nil
13
+ @vaults.each do |v|
14
+ if v.key? key
15
+ found = true
16
+ value = v.value key
17
+ break
18
+ end
19
+ end
20
+
21
+ if !found && @key_options.key?(key) && @key_options[key].key?(:default)
22
+ found = true
23
+ value = @key_options[key][:default]
24
+ end
25
+
26
+ raise KeyError, "key #{key} not found" unless found
27
+ value
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'config_key_builder'
4
+ require_relative 'config_root'
5
+
6
+ module Precursor
7
+ class ConfigRootBuilder
8
+ def initialize
9
+ @vaults = []
10
+ @key_builders = {}
11
+ end
12
+
13
+ def vault(vault)
14
+ @vaults.push(vault)
15
+ end
16
+
17
+ def key(key_name)
18
+ builder = ConfigKeyBuilder.new
19
+ @key_builders[key_name] = builder
20
+ yield builder
21
+ end
22
+
23
+ def build
24
+ key_options = @key_builders.transform_values(&:build)
25
+ ConfigRoot.new(@vaults, key_options)
26
+ end
27
+ end
28
+ end
data/lib/env_vault.rb ADDED
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'vault'
4
+
5
+ module Precursor
6
+ # Vault that provides config values from environment variables
7
+ class EnvVault < Vault
8
+ # Initializes new instance of [EnvVault]
9
+ # @param separator [String] separator for hierarchical config entries
10
+ # @param allow_list [Array<String>] list of allowed env vars to prevent leaking of sensitive or unrelated vars
11
+ def initialize(separator: '__', allow_list: [])
12
+ @separator = '__'
13
+
14
+ allow_set = Set.new(allow_list)
15
+
16
+ @env_vars = ENV.select { |n, _| allow_set.empty? || allow_set.include?(n) }.to_h do |name, value|
17
+ [name.sub(@separator, '.').to_sym, value]
18
+ end
19
+ end
20
+
21
+ def key?(key)
22
+ @env_vars.key? key
23
+ end
24
+
25
+ def value(key)
26
+ @env_vars[key]
27
+ end
28
+ end
29
+ end
data/lib/precursor.rb ADDED
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'config_root_builder'
4
+
5
+ require_relative 'env_vault'
6
+
7
+ module Precursor
8
+ class << self
9
+ # Creates a new instance of [Precursor::ConfigRoot]
10
+ def create
11
+ builder = ConfigRootBuilder.new
12
+ yield builder
13
+ builder.build
14
+ end
15
+ end
16
+ end
data/lib/vault.rb ADDED
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal
2
+
3
+ module Precursor
4
+ # Base class for config vaults
5
+ class Vault
6
+ # Returns true if the vault has a value for the given key, otherwise false
7
+ # @return [Boolean] true if the vault has a value for the given key, otherwise false
8
+ def key?
9
+ false
10
+ end
11
+
12
+ # Returns a value fot the given key, nil if key is not available
13
+ # @return [Object|Nil] a value for the given key
14
+ def value(key)
15
+ nil
16
+ end
17
+ end
18
+ end
data/lib/version.rb ADDED
@@ -0,0 +1,3 @@
1
+ module Precursor
2
+ VERSION = '0.2.0'
3
+ end
metadata ADDED
@@ -0,0 +1,64 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: precursor
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ platform: ruby
6
+ authors:
7
+ - Andrey Maraev
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-09-06 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: debug
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description:
28
+ email:
29
+ - the_vk@thevk.net
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - lib/config_key_builder.rb
35
+ - lib/config_root.rb
36
+ - lib/config_root_builder.rb
37
+ - lib/env_vault.rb
38
+ - lib/precursor.rb
39
+ - lib/vault.rb
40
+ - lib/version.rb
41
+ homepage: https://github.com/the-vk/precursor
42
+ licenses:
43
+ - MIT
44
+ metadata: {}
45
+ post_install_message:
46
+ rdoc_options: []
47
+ require_paths:
48
+ - lib
49
+ required_ruby_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '3.0'
54
+ required_rubygems_version: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ requirements: []
60
+ rubygems_version: 3.3.3
61
+ signing_key:
62
+ specification_version: 4
63
+ summary: Extensible config system
64
+ test_files: []