loadout 0.1.0 → 0.2.0
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/CHANGELOG.md +6 -0
- data/README.md +26 -2
- data/lib/loadout/version.rb +1 -1
- data/lib/loadout.rb +43 -34
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6c35aa7a1b51f1a26726c71f263a05e57c3014944d54446e405aea8132885245
|
4
|
+
data.tar.gz: c69c4f2297f31499db694247daf03428666b31b1d728ff77638ef2d2dac46d36
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 68cd692af87709c29bcd547119b0930fae89f28e02f79b37b25babf6214823c07ed5f7edf4e4dd02bb480b815f660558b79fb9271a379258f3b54a4cdc0f3dbf
|
7
|
+
data.tar.gz: f9c5abe54da9dfc8fcd9e7e978fb0a90f38bd4a3b6cba675022fb93ee5f32239d84e87bcb1195202b7b691d8ab071e116991d620f09bd162736c38fe2d3c8b1c
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -55,18 +55,36 @@ If bundler is not being used to manage dependencies, install the gem by executin
|
|
55
55
|
config.key = cred(:key_name)
|
56
56
|
```
|
57
57
|
|
58
|
+
If you don't set this credential, you will get an error:
|
59
|
+
|
60
|
+
```ruby
|
61
|
+
Loadout::MissingConfigError: required credential (key_name) is not set
|
62
|
+
```
|
63
|
+
|
58
64
|
3. Or from ENV:
|
59
65
|
|
60
66
|
```ruby
|
61
67
|
config.key = env(:key_name)
|
62
68
|
```
|
63
69
|
|
64
|
-
|
70
|
+
If you don't set this env, you will get an error:
|
71
|
+
|
72
|
+
```ruby
|
73
|
+
Loadout::MissingConfigError: required environment variable (KEY_NAME) is not set
|
74
|
+
```
|
75
|
+
|
76
|
+
4. Look up ENV, then credentials, then fail:
|
65
77
|
|
66
78
|
```ruby
|
67
79
|
config.key = env.cred(:key_name)
|
68
80
|
```
|
69
81
|
|
82
|
+
If neither are set, you will get an error:
|
83
|
+
|
84
|
+
```ruby
|
85
|
+
Loadout::MissingConfigError: required environment variable (KEY_NAME) or credential (key_name) is not set
|
86
|
+
```
|
87
|
+
|
70
88
|
5. Or the other way around:
|
71
89
|
|
72
90
|
```ruby
|
@@ -98,6 +116,12 @@ If bundler is not being used to manage dependencies, install the gem by executin
|
|
98
116
|
config.some_flag = bool.cred.env(:key_name)
|
99
117
|
```
|
100
118
|
|
119
|
+
If you set an invalid value, you will get an error:
|
120
|
+
|
121
|
+
```ruby
|
122
|
+
Loadout::InvalidConfigError: invalid value for bool (`value`) in KEY_NAME
|
123
|
+
```
|
124
|
+
|
101
125
|
Note: because credentials come from YAML, they don't need to be parsed. Only ENV values are parsed.
|
102
126
|
|
103
127
|
9. Integers and floats are also supported:
|
@@ -117,7 +141,7 @@ If bundler is not being used to manage dependencies, install the gem by executin
|
|
117
141
|
11. You can set your own list separator (string or regex):
|
118
142
|
|
119
143
|
```ruby
|
120
|
-
# Parses 'foo0bar0baz'
|
144
|
+
# Parses 'foo0bar0baz' into ['foo', 'bar', 'baz']
|
121
145
|
config.some_list = list('0').env(:key_name)
|
122
146
|
```
|
123
147
|
|
data/lib/loadout/version.rb
CHANGED
data/lib/loadout.rb
CHANGED
@@ -32,26 +32,26 @@ module Loadout
|
|
32
32
|
|
33
33
|
class Config
|
34
34
|
protected attr_writer :type
|
35
|
-
protected attr_reader :
|
35
|
+
protected attr_reader :lookup_list
|
36
36
|
|
37
37
|
def initialize(env, creds)
|
38
38
|
@env = env
|
39
39
|
@creds = creds
|
40
40
|
@type = nil
|
41
41
|
@prefix_stack = []
|
42
|
-
@
|
42
|
+
@lookup_list = Set[]
|
43
43
|
@prefix_default = NONE
|
44
44
|
end
|
45
45
|
|
46
46
|
def env(*keys, &default)
|
47
|
-
return dup.tap { _1.
|
48
|
-
@
|
47
|
+
return dup.tap { _1.lookup_list << :env } if keys.empty?
|
48
|
+
@lookup_list << :env
|
49
49
|
lookup(keys, &default)
|
50
50
|
end
|
51
51
|
|
52
52
|
def cred(*keys, &default)
|
53
|
-
return dup.tap { _1.
|
54
|
-
@
|
53
|
+
return dup.tap { _1.lookup_list << :cred } if keys.empty?
|
54
|
+
@lookup_list << :cred
|
55
55
|
lookup(keys, &default)
|
56
56
|
end
|
57
57
|
|
@@ -67,10 +67,9 @@ module Loadout
|
|
67
67
|
def list(sep = DEFAULT_LIST_SEP) = dup.tap { _1.type = [:list, sep] }
|
68
68
|
|
69
69
|
def initialize_dup(other)
|
70
|
-
@
|
71
|
-
@
|
72
|
-
@
|
73
|
-
@lookup_stack = other.instance_variable_get(:@lookup_stack).dup
|
70
|
+
@type = other.instance_variable_get(:@type).dup
|
71
|
+
@prefix_stack = other.instance_variable_get(:@prefix_stack).dup
|
72
|
+
@lookup_list = other.instance_variable_get(:@lookup_list).dup
|
74
73
|
|
75
74
|
unless other.instance_variable_get(:@prefix_default).equal?(NONE)
|
76
75
|
@prefix_default = other.instance_variable_get(:@prefix_default).dup
|
@@ -85,7 +84,7 @@ module Loadout
|
|
85
84
|
value = NONE
|
86
85
|
keys = @prefix_stack.flatten + keys
|
87
86
|
|
88
|
-
@
|
87
|
+
@lookup_list.each do |source|
|
89
88
|
value =
|
90
89
|
case source
|
91
90
|
when :cred; lookup_cred(keys)
|
@@ -99,7 +98,7 @@ module Loadout
|
|
99
98
|
return @prefix_default.call unless @prefix_default.equal?(NONE)
|
100
99
|
raise_missing(keys)
|
101
100
|
ensure
|
102
|
-
@
|
101
|
+
@lookup_list.clear
|
103
102
|
end
|
104
103
|
|
105
104
|
def lookup_cred(keys)
|
@@ -116,41 +115,51 @@ module Loadout
|
|
116
115
|
|
117
116
|
def coerce(key, value)
|
118
117
|
case @type
|
119
|
-
in :bool
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
return true if %w[1 y yes t true].include?(value.downcase)
|
124
|
-
raise_invalid :bool, key, value
|
125
|
-
in :int; enhance_exception(:int, key, value) { Integer(value) }
|
126
|
-
in :float; enhance_exception(:float, key, value) { Float(value) }
|
127
|
-
in :list, sep; value.split(sep)
|
118
|
+
in :bool; parse_bool(key, value)
|
119
|
+
in :int; parse_int(key, value)
|
120
|
+
in :float; parse_float(key, value)
|
121
|
+
in :list, sep; parse_list(key, value, sep)
|
128
122
|
else; value
|
129
123
|
end
|
130
124
|
end
|
131
125
|
|
132
|
-
def
|
133
|
-
|
126
|
+
def parse_bool(key, value)
|
127
|
+
value = value.to_s
|
128
|
+
return false if value == ''
|
129
|
+
return false if %w[0 n no f false].include?(value.downcase)
|
130
|
+
return true if %w[1 y yes t true].include?(value.downcase)
|
131
|
+
raise_invalid :bool, key, value
|
132
|
+
end
|
133
|
+
|
134
|
+
def parse_int(key, val)
|
135
|
+
Integer(val.to_s)
|
134
136
|
rescue ArgumentError
|
135
|
-
raise_invalid
|
137
|
+
raise_invalid :int, key, val
|
138
|
+
end
|
139
|
+
|
140
|
+
def parse_float(key, val)
|
141
|
+
Float(val.to_s)
|
142
|
+
rescue ArgumentError
|
143
|
+
raise_invalid :float, key, val
|
144
|
+
end
|
145
|
+
|
146
|
+
def parse_list(key, val, sep)
|
147
|
+
val = val.to_s
|
148
|
+
raise_invalid(:list, key, val) if val == ''
|
149
|
+
val.split(sep)
|
136
150
|
end
|
137
151
|
|
138
152
|
def raise_missing(keys)
|
139
|
-
|
140
|
-
val = []
|
153
|
+
pairs = []
|
141
154
|
|
142
|
-
@
|
155
|
+
@lookup_list.each do |source|
|
143
156
|
case source
|
144
|
-
when :cred
|
145
|
-
|
146
|
-
val << keys.join('.')
|
147
|
-
when :env
|
148
|
-
src << "environment variable"
|
149
|
-
val << keys.join('_').upcase
|
157
|
+
when :cred; pairs << ["credential", keys.join('.')]
|
158
|
+
when :env; pairs << ["environment variable", keys.join('_').upcase]
|
150
159
|
end
|
151
160
|
end
|
152
161
|
|
153
|
-
msg =
|
162
|
+
msg = pairs.map { |s, v| "#{s} (#{v})" }.join(' or ')
|
154
163
|
raise MissingConfigError, "required #{msg} is not set"
|
155
164
|
end
|
156
165
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: loadout
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Max Chernyak
|
@@ -48,7 +48,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
48
48
|
- !ruby/object:Gem::Version
|
49
49
|
version: '0'
|
50
50
|
requirements: []
|
51
|
-
rubygems_version: 3.
|
51
|
+
rubygems_version: 3.5.17
|
52
52
|
signing_key:
|
53
53
|
specification_version: 4
|
54
54
|
summary: Rails configuration helpers
|