global 1.1.0 → 2.0.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/.rubocop.yml +29 -10
- data/.ruby-version +1 -1
- data/.travis.yml +4 -10
- data/CODE_OF_CONDUCT.md +74 -0
- data/README.md +217 -68
- data/bin/console +15 -0
- data/global.gemspec +5 -10
- data/lib/global.rb +1 -1
- data/lib/global/backend/aws_parameter_store.rb +110 -0
- data/lib/global/backend/filesystem.rb +88 -0
- data/lib/global/backend/gcp_secret_manager.rb +137 -0
- data/lib/global/base.rb +38 -84
- data/lib/global/configuration.rb +9 -2
- data/lib/global/version.rb +1 -1
- data/spec/global/backend/aws_parameter_store_spec.rb +48 -0
- data/spec/global/backend/gcp_secret_manager_spec.rb +39 -0
- data/spec/global_spec.rb +5 -35
- data/spec/merge_backends_spec.rb +23 -0
- data/spec/spec_helper.rb +5 -2
- metadata +48 -29
- data/app/assets/javascripts/global-js.js.erb +0 -2
- data/lib/global/engine.rb +0 -84
- data/spec/global/global_js_spec.rb +0 -116
- data/spec/support/javascript_helper.rb +0 -27
data/lib/global/configuration.rb
CHANGED
@@ -22,6 +22,13 @@ module Global
|
|
22
22
|
hash.select { |key, _| keys.include?(key) }
|
23
23
|
end
|
24
24
|
|
25
|
+
def get_configuration_value(key)
|
26
|
+
return nil unless key?(key)
|
27
|
+
|
28
|
+
value = hash[key]
|
29
|
+
value.is_a?(Hash) ? Global::Configuration.new(value) : value
|
30
|
+
end
|
31
|
+
|
25
32
|
private
|
26
33
|
|
27
34
|
def filtered_keys_list(options)
|
@@ -30,6 +37,7 @@ module Global
|
|
30
37
|
|
31
38
|
return hash.keys if options[:only] == :all
|
32
39
|
return [] if options[:except] == :all
|
40
|
+
|
33
41
|
[]
|
34
42
|
end
|
35
43
|
|
@@ -43,8 +51,7 @@ module Global
|
|
43
51
|
def method_missing(method, *args, &block)
|
44
52
|
method = normalize_key_by_method(method)
|
45
53
|
if key?(method)
|
46
|
-
|
47
|
-
value.is_a?(Hash) ? Global::Configuration.new(value) : value
|
54
|
+
get_configuration_value(method)
|
48
55
|
else
|
49
56
|
super
|
50
57
|
end
|
data/lib/global/version.rb
CHANGED
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'aws-sdk-ssm'
|
5
|
+
require 'global/backend/aws_parameter_store'
|
6
|
+
|
7
|
+
RSpec.describe Global::Backend::AwsParameterStore do
|
8
|
+
let(:client) do
|
9
|
+
Aws::SSM::Client.new(stub_responses: true)
|
10
|
+
end
|
11
|
+
subject do
|
12
|
+
described_class.new(prefix: '/testapp/', client: client)
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'reads parameters from the parameter store' do
|
16
|
+
client.stub_responses(
|
17
|
+
:get_parameters_by_path,
|
18
|
+
[
|
19
|
+
lambda { |req_context|
|
20
|
+
expect(req_context.params[:next_token]).to be_nil
|
21
|
+
{
|
22
|
+
parameters: [
|
23
|
+
{ name: '/testapp/foo', value: 'foo-value' },
|
24
|
+
{ name: '/testapp/bar/baz', value: 'baz-value' }
|
25
|
+
],
|
26
|
+
next_token: 'next-token'
|
27
|
+
}
|
28
|
+
},
|
29
|
+
lambda { |req_context|
|
30
|
+
expect(req_context.params[:next_token]).to eq('next-token')
|
31
|
+
{
|
32
|
+
parameters: [
|
33
|
+
{ name: '/testapp/bar/qux', value: 'qux-value' }
|
34
|
+
],
|
35
|
+
next_token: nil
|
36
|
+
}
|
37
|
+
}
|
38
|
+
]
|
39
|
+
)
|
40
|
+
expect(subject.load).to eq(
|
41
|
+
foo: 'foo-value',
|
42
|
+
bar: {
|
43
|
+
baz: 'baz-value',
|
44
|
+
qux: 'qux-value'
|
45
|
+
}
|
46
|
+
)
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'google/cloud/secret_manager'
|
5
|
+
require 'global/backend/gcp_secret_manager'
|
6
|
+
|
7
|
+
RSpec.describe Global::Backend::GcpSecretManager do
|
8
|
+
let(:client) { double }
|
9
|
+
|
10
|
+
subject do
|
11
|
+
described_class.new(prefix: 'prod-myapp-', client: client, project_id: 'example')
|
12
|
+
end
|
13
|
+
|
14
|
+
before do
|
15
|
+
@match_item = double
|
16
|
+
allow(@match_item).to receive(:name).and_return('prod-myapp-example-test_key')
|
17
|
+
|
18
|
+
@secret_data = double
|
19
|
+
allow(@secret_data).to receive_message_chain(:payload, :data).and_return('secret value')
|
20
|
+
|
21
|
+
@not_match_item = double
|
22
|
+
allow(@not_match_item).to receive(:name).and_return('different_key')
|
23
|
+
|
24
|
+
@list = double
|
25
|
+
allow(@list).to receive(:next_page_token).and_return('')
|
26
|
+
allow(@list).to receive(:each).and_yield(@match_item).and_yield(@not_match_item)
|
27
|
+
|
28
|
+
allow(client).to receive(:project_path).and_return('projects/example')
|
29
|
+
allow(client).to receive(:secret_version_path)
|
30
|
+
.with(project: 'example', secret: 'prod-myapp-example-test_key', secret_version: 'latest')
|
31
|
+
.and_return('some_key_path')
|
32
|
+
allow(client).to receive(:access_secret_version).with(name: 'some_key_path').and_return(@secret_data)
|
33
|
+
allow(client).to receive(:list_secrets).and_return(@list)
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'reads parameters from the secret manager' do
|
37
|
+
expect(subject.load).to eq({ example: { test_key: 'secret value' }})
|
38
|
+
end
|
39
|
+
end
|
data/spec/global_spec.rb
CHANGED
@@ -4,34 +4,10 @@ require 'spec_helper'
|
|
4
4
|
|
5
5
|
RSpec.describe Global do
|
6
6
|
|
7
|
+
let(:config_path) { File.join(Dir.pwd, 'spec/files') }
|
7
8
|
before(:each) do
|
8
9
|
described_class.configure do |config|
|
9
|
-
config.environment
|
10
|
-
config.config_directory = File.join(Dir.pwd, 'spec/files')
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
describe '.environment' do
|
15
|
-
subject { described_class.environment }
|
16
|
-
|
17
|
-
it { is_expected.to eq('test') }
|
18
|
-
|
19
|
-
context 'when undefined' do
|
20
|
-
before { described_class.environment = nil }
|
21
|
-
|
22
|
-
it { expect { subject }.to raise_error('environment should be defined') }
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
describe '.config_directory' do
|
27
|
-
subject { described_class.config_directory }
|
28
|
-
|
29
|
-
it { is_expected.to eq(File.join(Dir.pwd, 'spec/files')) }
|
30
|
-
|
31
|
-
context 'when undefined' do
|
32
|
-
before { described_class.config_directory = nil }
|
33
|
-
|
34
|
-
it { expect { subject }.to raise_error('config_directory should be defined') }
|
10
|
+
config.backend :filesystem, path: config_path, environment: 'test'
|
35
11
|
end
|
36
12
|
end
|
37
13
|
|
@@ -51,10 +27,9 @@ RSpec.describe Global do
|
|
51
27
|
end
|
52
28
|
|
53
29
|
context 'when load from file' do
|
54
|
-
|
30
|
+
let(:config_path) { File.join(Dir.pwd, 'spec/files/rspec_config') }
|
55
31
|
|
56
32
|
describe '#rspec_config' do
|
57
|
-
subject { super().rspec_config }
|
58
33
|
describe '#to_hash' do
|
59
34
|
subject { super().to_hash }
|
60
35
|
it { is_expected.to eq('default_value' => 'default value', 'test_value' => 'test value') }
|
@@ -88,12 +63,8 @@ RSpec.describe Global do
|
|
88
63
|
|
89
64
|
before do
|
90
65
|
described_class.configuration
|
91
|
-
described_class.
|
92
|
-
|
93
|
-
|
94
|
-
after do
|
95
|
-
described_class.environment = 'test'
|
96
|
-
described_class.reload!
|
66
|
+
described_class.instance_variable_set('@backends', [])
|
67
|
+
described_class.backend :filesystem, path: config_path, environment: 'development'
|
97
68
|
end
|
98
69
|
|
99
70
|
it { is_expected.to be_instance_of(Global::Configuration) }
|
@@ -141,5 +112,4 @@ RSpec.describe Global do
|
|
141
112
|
end
|
142
113
|
|
143
114
|
end
|
144
|
-
|
145
115
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe Global do
|
6
|
+
describe 'merging backends' do
|
7
|
+
it 'merges data from two backends together' do
|
8
|
+
backend_alpha = double('backend_alpha')
|
9
|
+
allow(backend_alpha).to receive(:load).and_return(foo: 'foo', bar: 'bar-alpha')
|
10
|
+
described_class.backend backend_alpha
|
11
|
+
|
12
|
+
backend_beta = double('backend_beta')
|
13
|
+
allow(backend_beta).to receive(:load).and_return('bar' => 'bar-beta', 'baz' => 'baz')
|
14
|
+
described_class.backend backend_beta
|
15
|
+
|
16
|
+
expect(described_class.configuration.to_hash).to eq(
|
17
|
+
'foo' => 'foo',
|
18
|
+
'bar' => 'bar-beta',
|
19
|
+
'baz' => 'baz'
|
20
|
+
)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -5,7 +5,6 @@ $LOAD_PATH.unshift(File.dirname(__FILE__))
|
|
5
5
|
require 'rspec'
|
6
6
|
require 'global'
|
7
7
|
require 'simplecov'
|
8
|
-
require 'support/javascript_helper'
|
9
8
|
|
10
9
|
SimpleCov.start do
|
11
10
|
add_filter '/spec/'
|
@@ -39,5 +38,9 @@ RSpec.configure do |config|
|
|
39
38
|
config.filter_run :focus
|
40
39
|
|
41
40
|
config.order = 'random'
|
42
|
-
|
41
|
+
|
42
|
+
config.before do
|
43
|
+
Global.remove_instance_variable(:@backends) if Global.instance_variable_defined?(:@backends)
|
44
|
+
Global.remove_instance_variable(:@configuration) if Global.instance_variable_defined?(:@configuration)
|
45
|
+
end
|
43
46
|
end
|
metadata
CHANGED
@@ -1,15 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: global
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Railsware LLC
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-04-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: aws-sdk-ssm
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: google-cloud-secret_manager
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
13
41
|
- !ruby/object:Gem::Dependency
|
14
42
|
name: rake
|
15
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -44,14 +72,14 @@ dependencies:
|
|
44
72
|
requirements:
|
45
73
|
- - "~>"
|
46
74
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
75
|
+
version: 0.81.0
|
48
76
|
type: :development
|
49
77
|
prerelease: false
|
50
78
|
version_requirements: !ruby/object:Gem::Requirement
|
51
79
|
requirements:
|
52
80
|
- - "~>"
|
53
81
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
82
|
+
version: 0.81.0
|
55
83
|
- !ruby/object:Gem::Dependency
|
56
84
|
name: simplecov
|
57
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,20 +94,6 @@ dependencies:
|
|
66
94
|
- - "~>"
|
67
95
|
- !ruby/object:Gem::Version
|
68
96
|
version: 0.16.1
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: therubyracer
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ">="
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '0'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - ">="
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '0'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: activesupport
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,9 +108,10 @@ dependencies:
|
|
94
108
|
- - ">="
|
95
109
|
- !ruby/object:Gem::Version
|
96
110
|
version: '2.0'
|
97
|
-
description: Simple way to load your configs from yaml
|
111
|
+
description: Simple way to load your configs from yaml/aws/gcp
|
98
112
|
email: contact@railsware.com
|
99
|
-
executables:
|
113
|
+
executables:
|
114
|
+
- console
|
100
115
|
extensions: []
|
101
116
|
extra_rdoc_files: []
|
102
117
|
files:
|
@@ -105,16 +120,19 @@ files:
|
|
105
120
|
- ".rubocop.yml"
|
106
121
|
- ".ruby-version"
|
107
122
|
- ".travis.yml"
|
123
|
+
- CODE_OF_CONDUCT.md
|
108
124
|
- Gemfile
|
109
125
|
- LICENSE.txt
|
110
126
|
- README.md
|
111
127
|
- Rakefile
|
112
|
-
-
|
128
|
+
- bin/console
|
113
129
|
- global.gemspec
|
114
130
|
- lib/global.rb
|
131
|
+
- lib/global/backend/aws_parameter_store.rb
|
132
|
+
- lib/global/backend/filesystem.rb
|
133
|
+
- lib/global/backend/gcp_secret_manager.rb
|
115
134
|
- lib/global/base.rb
|
116
135
|
- lib/global/configuration.rb
|
117
|
-
- lib/global/engine.rb
|
118
136
|
- lib/global/version.rb
|
119
137
|
- spec/files/aws.test.yml
|
120
138
|
- spec/files/aws.yml
|
@@ -122,11 +140,12 @@ files:
|
|
122
140
|
- spec/files/nested_config.yml
|
123
141
|
- spec/files/rspec/config.yml
|
124
142
|
- spec/files/rspec_config.yml
|
143
|
+
- spec/global/backend/aws_parameter_store_spec.rb
|
144
|
+
- spec/global/backend/gcp_secret_manager_spec.rb
|
125
145
|
- spec/global/configuration_spec.rb
|
126
|
-
- spec/global/global_js_spec.rb
|
127
146
|
- spec/global_spec.rb
|
147
|
+
- spec/merge_backends_spec.rb
|
128
148
|
- spec/spec_helper.rb
|
129
|
-
- spec/support/javascript_helper.rb
|
130
149
|
homepage: https://github.com/railsware/global
|
131
150
|
licenses:
|
132
151
|
- MIT
|
@@ -146,11 +165,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
146
165
|
- !ruby/object:Gem::Version
|
147
166
|
version: '0'
|
148
167
|
requirements: []
|
149
|
-
|
150
|
-
rubygems_version: 2.7.6
|
168
|
+
rubygems_version: 3.0.3
|
151
169
|
signing_key:
|
152
170
|
specification_version: 4
|
153
|
-
summary: Simple way to load your configs from yaml
|
171
|
+
summary: Simple way to load your configs from yaml/aws/gcp
|
154
172
|
test_files:
|
155
173
|
- spec/files/aws.test.yml
|
156
174
|
- spec/files/aws.yml
|
@@ -158,8 +176,9 @@ test_files:
|
|
158
176
|
- spec/files/nested_config.yml
|
159
177
|
- spec/files/rspec/config.yml
|
160
178
|
- spec/files/rspec_config.yml
|
179
|
+
- spec/global/backend/aws_parameter_store_spec.rb
|
180
|
+
- spec/global/backend/gcp_secret_manager_spec.rb
|
161
181
|
- spec/global/configuration_spec.rb
|
162
|
-
- spec/global/global_js_spec.rb
|
163
182
|
- spec/global_spec.rb
|
183
|
+
- spec/merge_backends_spec.rb
|
164
184
|
- spec/spec_helper.rb
|
165
|
-
- spec/support/javascript_helper.rb
|
data/lib/global/engine.rb
DELETED
@@ -1,84 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Global
|
4
|
-
|
5
|
-
class SprocketsExtension
|
6
|
-
|
7
|
-
GLOBAL_JS_ASSET = 'global-js'
|
8
|
-
|
9
|
-
def initialize(filename)
|
10
|
-
@filename = filename
|
11
|
-
@source = yield
|
12
|
-
end
|
13
|
-
|
14
|
-
def render(context, _empty_hash_wtf)
|
15
|
-
self.class.run(@filename, @source, context)
|
16
|
-
end
|
17
|
-
|
18
|
-
def self.run(_filename, source, context)
|
19
|
-
if GLOBAL_JS_ASSET == context.logical_path
|
20
|
-
configs = Dir.glob("#{Global.config_directory}#{File::SEPARATOR}*.yml")
|
21
|
-
configs.map { |config| context.depend_on(config) }
|
22
|
-
end
|
23
|
-
source
|
24
|
-
end
|
25
|
-
|
26
|
-
def self.call(input)
|
27
|
-
filename = input[:filename]
|
28
|
-
source = input[:data]
|
29
|
-
context = input[:environment].context_class.new(input)
|
30
|
-
|
31
|
-
result = run(filename, source, context)
|
32
|
-
context.metadata.merge(data: result)
|
33
|
-
end
|
34
|
-
|
35
|
-
end
|
36
|
-
|
37
|
-
class Engine < ::Rails::Engine
|
38
|
-
|
39
|
-
require 'sprockets/version'
|
40
|
-
v2 = Gem::Dependency.new('', ' ~> 2')
|
41
|
-
vgte3 = Gem::Dependency.new('', ' >= 3')
|
42
|
-
sprockets_version = Gem::Version.new(::Sprockets::VERSION).release
|
43
|
-
initializer_args = case sprockets_version
|
44
|
-
when ->(v) { v2.match?('', v) }
|
45
|
-
{ after: 'sprockets.environment' }
|
46
|
-
when ->(v) { vgte3.match?('', v) }
|
47
|
-
{ after: :engines_blank_point, before: :finisher_hook }
|
48
|
-
else
|
49
|
-
raise StandardError.new("Sprockets version #{sprockets_version} is not supported")
|
50
|
-
end
|
51
|
-
|
52
|
-
is_running_rails = defined?(Rails) && Rails.respond_to?(:version)
|
53
|
-
is_running_rails32 = is_running_rails && Rails.version.match(/3\.2/)
|
54
|
-
|
55
|
-
initializer 'global-js.dependent_on_configs', initializer_args do
|
56
|
-
case sprockets_version
|
57
|
-
when ->(v) { v2.match?('', v) },
|
58
|
-
->(v) { vgte3.match?('', v) }
|
59
|
-
|
60
|
-
# It seems rails 3.2 is not working if
|
61
|
-
# `Rails.application.config.assets.configure` is used for
|
62
|
-
# registering preprocessor
|
63
|
-
if is_running_rails32
|
64
|
-
Rails.application.assets.register_preprocessor(
|
65
|
-
'application/javascript',
|
66
|
-
SprocketsExtension
|
67
|
-
)
|
68
|
-
elsif Rails.application.config.respond_to?(:assets)
|
69
|
-
# Other rails version, assumed newer
|
70
|
-
Rails.application.config.assets.configure do |config|
|
71
|
-
config.register_preprocessor(
|
72
|
-
'application/javascript',
|
73
|
-
SprocketsExtension
|
74
|
-
)
|
75
|
-
end
|
76
|
-
end
|
77
|
-
else
|
78
|
-
raise StandardError.new("Sprockets version #{sprockets_version} is not supported")
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
end
|
83
|
-
|
84
|
-
end
|