unifig-env 0.3.0 → 0.3.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/CHANGELOG.md +7 -0
- data/README.md +25 -2
- data/lib/unifig/env/parser.rb +64 -0
- data/lib/unifig/env/version.rb +1 -1
- data/lib/unifig/env.rb +4 -0
- data/lib/unifig/providers/env-file.rb +25 -0
- data/lib/unifig/providers/env.rb +1 -1
- data/spec/unifig/env/parser_spec.rb +89 -0
- data/spec/unifig/providers/env-file_spec.rb +45 -0
- data/spec/unifig/providers/env_spec.rb +6 -6
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4f2d1338c397c1f5c2ceaa7819cb67e06ed6eea4c54e225c8ed398dcc82bc107
|
4
|
+
data.tar.gz: 6a8df43fd3c7cab42cea78a768749d5ab83fbc60cc0570397d77efbcf5d09802
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: febd724191f72d90b8f26d075cb3f939803e0a8f975c3afb4e77836068fd41f5535d31401b697cdd18df986c4736f7c8757d84b6dacb8c70f1deca48cbd4e818
|
7
|
+
data.tar.gz: 75208b5aa9ffdac96cd7ab6f4bd91a7afacb7679720ef2fc9654d6331570e0f88f10297127c48ee304c6c892c54e82c6b3f53d14bbf0c7deac596b182ebd80d7
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
# [0.3.1][] (2022-10-18)
|
2
|
+
|
3
|
+
## Added
|
4
|
+
|
5
|
+
- An `env-file` provider for dotenv (e.g. `.env`) files.
|
6
|
+
|
1
7
|
# [0.3.0][] (2022-09-01)
|
2
8
|
|
3
9
|
## Changed
|
@@ -14,6 +20,7 @@
|
|
14
20
|
|
15
21
|
Initial release.
|
16
22
|
|
23
|
+
[0.3.1]: https://github.com/AaronLasseigne/unifig-env/compare/v0.3.0...v0.3.1
|
17
24
|
[0.3.0]: https://github.com/AaronLasseigne/unifig-env/compare/v0.2.0...v0.3.0
|
18
25
|
[0.2.0]: https://github.com/AaronLasseigne/unifig-env/compare/v0.1.0...v0.2.0
|
19
26
|
[0.1.0]: https://github.com/AaronLasseigne/unifig-env/compare/v0.0.0...v0.1.0
|
data/README.md
CHANGED
@@ -10,13 +10,13 @@ Adds a provider to support loading environment variables to [Unifig][].
|
|
10
10
|
Add it to your Gemfile:
|
11
11
|
|
12
12
|
``` rb
|
13
|
-
gem 'unifig-env', '~> 0.3.
|
13
|
+
gem 'unifig-env', '~> 0.3.1'
|
14
14
|
```
|
15
15
|
|
16
16
|
Or install it manually:
|
17
17
|
|
18
18
|
``` sh
|
19
|
-
$ gem install unifig-env --version '~> 0.3.
|
19
|
+
$ gem install unifig-env --version '~> 0.3.1'
|
20
20
|
```
|
21
21
|
|
22
22
|
This project uses [Semantic Versioning][].
|
@@ -24,6 +24,8 @@ Check out [GitHub releases][] for a detailed list of changes.
|
|
24
24
|
|
25
25
|
## Usage
|
26
26
|
|
27
|
+
### Environment
|
28
|
+
|
27
29
|
Use `env` as your provider or add it to your list of providers:
|
28
30
|
|
29
31
|
``` yml
|
@@ -35,6 +37,27 @@ HOST:
|
|
35
37
|
|
36
38
|
This will pull `"HOST"` from `ENV` and add it to Unifig.
|
37
39
|
|
40
|
+
### Environment File
|
41
|
+
|
42
|
+
Use `env-file` as your provider or add it to your list of providers:
|
43
|
+
|
44
|
+
``` yml
|
45
|
+
unifig:
|
46
|
+
providers: env-file
|
47
|
+
```
|
48
|
+
|
49
|
+
By default, it looks for `.env` in the local directory.
|
50
|
+
The file can be specified by passing `file` to the configuration.
|
51
|
+
|
52
|
+
``` yml
|
53
|
+
unifig:
|
54
|
+
providers:
|
55
|
+
list: env-file
|
56
|
+
config:
|
57
|
+
env-file:
|
58
|
+
file: my.env
|
59
|
+
```
|
60
|
+
|
38
61
|
## Contributing
|
39
62
|
|
40
63
|
If you want to contribute to Unifig:Env, please read [our contribution guidelines][].
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'strscan'
|
4
|
+
|
5
|
+
module Unifig
|
6
|
+
module Env
|
7
|
+
# @private
|
8
|
+
module Parser
|
9
|
+
Error = Class.new(Unifig::Error)
|
10
|
+
|
11
|
+
WHITESPACE = /\s*/.freeze
|
12
|
+
COMMENT = /\#.*$/.freeze
|
13
|
+
EXPORT = /export\s+/.freeze
|
14
|
+
KEY = /[^=\s]+/.freeze
|
15
|
+
ASSIGNMENT = /\s*=\s*/.freeze
|
16
|
+
SINGLE_LINE_VALUE = /\S+/.freeze
|
17
|
+
QUOTE = /['"]/.freeze
|
18
|
+
TO_END_OF_LINE = /\s*(?:\#.*)?$/.freeze
|
19
|
+
|
20
|
+
class << self
|
21
|
+
def call(file_path)
|
22
|
+
content = File.read(file_path)
|
23
|
+
|
24
|
+
vars = {}
|
25
|
+
parser = StringScanner.new(content.strip)
|
26
|
+
until parser.eos?
|
27
|
+
parser.skip(WHITESPACE)
|
28
|
+
|
29
|
+
next if parser.skip(COMMENT)
|
30
|
+
|
31
|
+
parser.skip(EXPORT)
|
32
|
+
key = extract!(parser, KEY, 'Missing env key on line %i')
|
33
|
+
extract!(parser, ASSIGNMENT, 'Missing env var assignment on line %i')
|
34
|
+
quote = parser.scan(QUOTE)
|
35
|
+
value =
|
36
|
+
if quote
|
37
|
+
parser.scan(/.*?#{quote}/m).chop
|
38
|
+
else
|
39
|
+
parser.scan(SINGLE_LINE_VALUE)
|
40
|
+
end
|
41
|
+
|
42
|
+
extract!(parser, TO_END_OF_LINE, 'Invalid env var value on line %i')
|
43
|
+
|
44
|
+
vars[key] = value
|
45
|
+
end
|
46
|
+
|
47
|
+
vars
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def line(parser)
|
53
|
+
parser.string[0...parser.pos].scan(/$/).count
|
54
|
+
end
|
55
|
+
|
56
|
+
def extract!(parser, pattern, error_msg)
|
57
|
+
parser.scan(pattern).tap do |match|
|
58
|
+
raise Error, error_msg % line(parser) if match.nil?
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
data/lib/unifig/env/version.rb
CHANGED
data/lib/unifig/env.rb
CHANGED
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Unifig
|
4
|
+
module Providers
|
5
|
+
# @private
|
6
|
+
module EnvFile
|
7
|
+
PATH = File.join(Dir.pwd, '.env')
|
8
|
+
private_constant :PATH
|
9
|
+
|
10
|
+
class << self
|
11
|
+
def name
|
12
|
+
:'env-file'
|
13
|
+
end
|
14
|
+
|
15
|
+
def retrieve(var_names, config)
|
16
|
+
env_vars = Unifig::Env::Parser.call(config.fetch(:file, PATH))
|
17
|
+
|
18
|
+
var_names.to_h do |name|
|
19
|
+
[name, env_vars[name.to_s]]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/unifig/providers/env.rb
CHANGED
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'tempfile'
|
2
|
+
|
3
|
+
RSpec.describe Unifig::Env::Parser do
|
4
|
+
describe '.call' do
|
5
|
+
let(:file_content) do
|
6
|
+
<<~ENV
|
7
|
+
# standalone comment
|
8
|
+
ONE=1
|
9
|
+
export TWO=2
|
10
|
+
THREE = 3 # in-line comment
|
11
|
+
|
12
|
+
MULTI_LINE="
|
13
|
+
first
|
14
|
+
second
|
15
|
+
"
|
16
|
+
ENV
|
17
|
+
end
|
18
|
+
let(:file) do
|
19
|
+
file = Tempfile.new('.env', Dir.pwd)
|
20
|
+
file.write(file_content)
|
21
|
+
file.close
|
22
|
+
file
|
23
|
+
end
|
24
|
+
let(:config) { { file: file.path } }
|
25
|
+
|
26
|
+
after do
|
27
|
+
file.unlink
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'returns a hash representing the env vars loaded from the file' do
|
31
|
+
result = described_class.call(file.path)
|
32
|
+
|
33
|
+
expect(result).to be_an_instance_of(Hash)
|
34
|
+
expect(result.keys.size).to be 4
|
35
|
+
expect(result['ONE']).to eql '1'
|
36
|
+
expect(result['TWO']).to eql '2'
|
37
|
+
expect(result['THREE']).to eql '3'
|
38
|
+
expect(result['MULTI_LINE']).to eql "\nfirst\nsecond\n"
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'with a missing key' do
|
42
|
+
let(:file_content) { '=1' }
|
43
|
+
|
44
|
+
it 'throws an error' do
|
45
|
+
expect do
|
46
|
+
described_class.call(file.path)
|
47
|
+
end.to raise_error Unifig::Env::Parser::Error, 'Missing env key on line 1'
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context 'with no equal sign' do
|
52
|
+
let(:file_content) { 'ONE' }
|
53
|
+
|
54
|
+
it 'throws an error' do
|
55
|
+
expect do
|
56
|
+
described_class.call(file.path)
|
57
|
+
end.to raise_error Unifig::Env::Parser::Error, 'Missing env var assignment on line 1'
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context 'with an invalid value' do
|
62
|
+
let(:file_content) { 'ONE=1 2' }
|
63
|
+
|
64
|
+
it 'throws an error' do
|
65
|
+
expect do
|
66
|
+
described_class.call(file.path)
|
67
|
+
end.to raise_error Unifig::Env::Parser::Error, 'Invalid env var value on line 1'
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
context 'an error later in the file' do
|
72
|
+
let(:file_content) do
|
73
|
+
<<~ENV
|
74
|
+
ONE=1
|
75
|
+
TWO=2
|
76
|
+
|
77
|
+
FOUR=4 invalid
|
78
|
+
FIVE=5
|
79
|
+
ENV
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'puts the correct line' do
|
83
|
+
expect do
|
84
|
+
described_class.call(file.path)
|
85
|
+
end.to raise_error Unifig::Env::Parser::Error, 'Invalid env var value on line 4'
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'tempfile'
|
2
|
+
|
3
|
+
RSpec.describe Unifig::Providers::EnvFile do
|
4
|
+
describe '.name' do
|
5
|
+
it 'returns the provider name' do
|
6
|
+
expect(described_class.name).to be :'env-file'
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
describe '.retrieve' do
|
11
|
+
let(:file) do
|
12
|
+
file = Tempfile.new('.env', Dir.pwd)
|
13
|
+
file.write <<~ENV
|
14
|
+
# standalone comment
|
15
|
+
ONE=1
|
16
|
+
export TWO=2
|
17
|
+
THREE = 3 # in-line comment
|
18
|
+
|
19
|
+
MULTI_LINE="
|
20
|
+
first
|
21
|
+
second
|
22
|
+
"
|
23
|
+
ENV
|
24
|
+
file.close
|
25
|
+
file
|
26
|
+
end
|
27
|
+
let(:config) { { file: file.path } }
|
28
|
+
|
29
|
+
after do
|
30
|
+
file.unlink
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'returns a hash of only the available vars' do
|
34
|
+
result = described_class.retrieve(%i[ONE TWO THREE MULTI_LINE INVALID], config)
|
35
|
+
|
36
|
+
expect(result).to be_an_instance_of(Hash)
|
37
|
+
expect(result.keys.size).to be 5
|
38
|
+
expect(result[:ONE]).to eql '1'
|
39
|
+
expect(result[:TWO]).to eql '2'
|
40
|
+
expect(result[:THREE]).to eql '3'
|
41
|
+
expect(result[:MULTI_LINE]).to eql "\nfirst\nsecond\n"
|
42
|
+
expect(result[:INVALID]).to be_nil
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -8,18 +8,18 @@ RSpec.describe Unifig::Providers::Env do
|
|
8
8
|
describe '.retrieve' do
|
9
9
|
before do
|
10
10
|
allow(ENV).to receive(:[]).and_return(nil)
|
11
|
-
allow(ENV).to receive(:[]).with('
|
12
|
-
allow(ENV).to receive(:[]).with('
|
11
|
+
allow(ENV).to receive(:[]).with('ONE').and_return('1')
|
12
|
+
allow(ENV).to receive(:[]).with('TWO').and_return('2')
|
13
13
|
end
|
14
14
|
|
15
15
|
it 'returns a hash of only the available vars' do
|
16
|
-
result = described_class.retrieve(%i[
|
16
|
+
result = described_class.retrieve(%i[ONE TWO INVALID], {})
|
17
17
|
|
18
18
|
expect(result).to be_an_instance_of(Hash)
|
19
19
|
expect(result.keys.size).to be 3
|
20
|
-
expect(result[:
|
21
|
-
expect(result[:
|
22
|
-
expect(result[:
|
20
|
+
expect(result[:ONE]).to eql '1'
|
21
|
+
expect(result[:TWO]).to eql '2'
|
22
|
+
expect(result[:INVALID]).to be_nil
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: unifig-env
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aaron Lasseigne
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-10-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: unifig
|
@@ -36,9 +36,13 @@ files:
|
|
36
36
|
- LICENSE.txt
|
37
37
|
- README.md
|
38
38
|
- lib/unifig/env.rb
|
39
|
+
- lib/unifig/env/parser.rb
|
39
40
|
- lib/unifig/env/version.rb
|
41
|
+
- lib/unifig/providers/env-file.rb
|
40
42
|
- lib/unifig/providers/env.rb
|
41
43
|
- spec/spec_helper.rb
|
44
|
+
- spec/unifig/env/parser_spec.rb
|
45
|
+
- spec/unifig/providers/env-file_spec.rb
|
42
46
|
- spec/unifig/providers/env_spec.rb
|
43
47
|
homepage: https://github.com/AaronLasseigne/unifig-env
|
44
48
|
licenses:
|
@@ -69,4 +73,6 @@ specification_version: 4
|
|
69
73
|
summary: Adds a provider to support loading environment variables to Unifig.
|
70
74
|
test_files:
|
71
75
|
- spec/spec_helper.rb
|
76
|
+
- spec/unifig/env/parser_spec.rb
|
77
|
+
- spec/unifig/providers/env-file_spec.rb
|
72
78
|
- spec/unifig/providers/env_spec.rb
|