shadow_db_credentials 1.0.2 → 1.1.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 +7 -0
- data/.idea/jenkinsSettings.xml +9 -0
- data/.idea/misc.xml +2 -1
- data/.idea/shadow_db_credentials.iml +22 -10
- data/.idea/workspace.xml +303 -75
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/CHANGES +9 -1
- data/Gemfile +8 -7
- data/README.md +125 -3
- data/Rakefile +14 -10
- data/lib/shadow_db_credentials.rb +1 -0
- data/lib/shadow_db_credentials/shadow_db_credentials.rb +24 -15
- data/lib/shadow_db_credentials/version.rb +2 -2
- data/shadow_db_credentials.gemspec +2 -1
- data/shadow_db_credentials.gemspec.erb +1 -1
- data/spec/shadow_db_credentials_spec.rb +29 -8
- data/spec/spec_helper.rb +0 -9
- metadata +14 -18
- data/.rvmrc +0 -4
data/.ruby-gemset
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
shadow_db_credentials
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.0.0
|
data/CHANGES
CHANGED
data/Gemfile
CHANGED
@@ -1,8 +1,4 @@
|
|
1
|
-
source
|
2
|
-
|
3
|
-
group :default do
|
4
|
-
|
5
|
-
end
|
1
|
+
source 'https://rubygems.org'
|
6
2
|
|
7
3
|
group :development do
|
8
4
|
gem "gemspec_deps_gen"
|
@@ -10,6 +6,11 @@ group :development do
|
|
10
6
|
end
|
11
7
|
|
12
8
|
group :test do
|
13
|
-
gem "rspec"
|
14
|
-
gem "mocha"
|
9
|
+
gem "rspec"
|
10
|
+
gem "mocha"
|
11
|
+
end
|
12
|
+
|
13
|
+
group :debug do
|
14
|
+
#gem "ruby-debug-base19x", "0.11.30.pre12"
|
15
|
+
gem "ruby-debug-ide", "0.4.17"
|
15
16
|
end
|
data/README.md
CHANGED
@@ -1,4 +1,126 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# Shadow DB Credentials
|
2
|
+
|
3
|
+
## Helps to keep DB credentials for rails app in private place
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to to your Gemfile:
|
8
|
+
|
9
|
+
gem "shadow_db_credentials"
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
## Usage
|
16
|
+
|
17
|
+
Create "shadowed" credentials file (**your_prod_credentials**) inside some directory (e.g. **~/.credentials**):
|
18
|
+
|
19
|
+
```yml
|
20
|
+
username: your_username
|
21
|
+
password: your_password
|
22
|
+
```
|
23
|
+
|
24
|
+
The location of your **credentials directory** is controlled by **CREDENTIALS_DIR** environment
|
25
|
+
variable. Register it in **config/initializers/env_variables.rb** file:
|
26
|
+
|
27
|
+
```ruby
|
28
|
+
ENV['CREDENTIALS_DIR'] ||= "#{ENV['HOME']}/.credentials"
|
29
|
+
```
|
30
|
+
|
31
|
+
If you want to have different **credentials directory** per environment, define it in corresponding env file:
|
32
|
+
|
33
|
+
```ruby
|
34
|
+
# config/environments/development.rb
|
35
|
+
...
|
36
|
+
ENV['CREDENTIALS_DIR'] ||= "#{ENV['HOME']}/.credentials"
|
37
|
+
```
|
38
|
+
|
39
|
+
Remove all the credentials (username/password) that you don't want to keep inside **config/database.yml**
|
40
|
+
and replace them with single **credentials** attriubute. It points to the name of credentials file
|
41
|
+
(**your_prod_credentials**):
|
42
|
+
|
43
|
+
```yml
|
44
|
+
development:
|
45
|
+
adapter: postgresql
|
46
|
+
database: your_dev_db
|
47
|
+
credentials: your_dev_credentials
|
48
|
+
|
49
|
+
production:
|
50
|
+
adapter: postgresql
|
51
|
+
database: your_prod_db
|
52
|
+
credentials: your_prod_credentials
|
53
|
+
```
|
54
|
+
|
55
|
+
If you want, you can also move other sensitive information, such as database name, url etc.
|
56
|
+
|
57
|
+
Next, you have to create code hook inside rails **config/application.rb** in order to call gem's API:
|
58
|
+
|
59
|
+
```ruby
|
60
|
+
require 'shadow_db_credentials'
|
61
|
+
|
62
|
+
...
|
63
|
+
|
64
|
+
module YourRailsApp
|
65
|
+
class Application < Rails::Application
|
66
|
+
...
|
67
|
+
|
68
|
+
def config.database_configuration
|
69
|
+
orig_db_configurations = super
|
70
|
+
|
71
|
+
processor = ShadowDbCredentials.new(ENV['CREDENTIALS_DIR'])
|
72
|
+
|
73
|
+
processor.process_configurations(orig_db_configurations)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
```
|
78
|
+
|
79
|
+
The hook will access original DB configuration and try to expand all **credentials** attributes
|
80
|
+
with corresponding values dynamically, at run time.
|
81
|
+
|
82
|
+
You can check result of your work:
|
83
|
+
|
84
|
+
```bash
|
85
|
+
$ rails console production
|
86
|
+
|
87
|
+
> ActiveRecord::Base.configurations["production"]
|
88
|
+
=> {"adapter"=>"postgresql", "username"=>"your_username", "password"=>"your_password"}
|
89
|
+
|
90
|
+
> Rails.application.config.database_configuration['production']
|
91
|
+
=> {"adapter"=>"postgresql", "username"=>"your_username", "password"=>"your_password"}
|
92
|
+
```
|
93
|
+
|
94
|
+
Or you can get it with API call:
|
95
|
+
|
96
|
+
```ruby
|
97
|
+
require 'shadow_db_credentials'
|
98
|
+
|
99
|
+
credentials_dir = ENV['CREDENTIALS_DIR']
|
100
|
+
processor = ShadowDbCredentials.new(credentials_dir)
|
101
|
+
|
102
|
+
# 1. get production hash, read configuration from default location
|
103
|
+
|
104
|
+
connection_hash1 = processor.retrieve_configuration "production"
|
105
|
+
connection_hash1.inspect
|
106
|
+
|
107
|
+
# 2. get development hash, read configuration from dynamic source
|
108
|
+
|
109
|
+
source = StringIO.new <<-TEXT
|
110
|
+
development:
|
111
|
+
adapter: postgresql
|
112
|
+
credentials: your_dev_db
|
113
|
+
TEXT
|
114
|
+
|
115
|
+
connection_hash2 = processor.retrieve_configuration 'development', source
|
116
|
+
connection_has2.inspect
|
117
|
+
```
|
118
|
+
|
119
|
+
## Contributing
|
120
|
+
|
121
|
+
1. Fork it
|
122
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
123
|
+
3. Commit your changes (`git commit -am 'Added some feature'`)
|
124
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
125
|
+
5. Create new Pull Request
|
3
126
|
|
4
|
-
Class that helps to keep database credentials for rails application in private place
|
data/Rakefile
CHANGED
@@ -6,20 +6,25 @@ require "rspec/core/rake_task"
|
|
6
6
|
require "shadow_db_credentials/version"
|
7
7
|
require "gemspec_deps_gen/gemspec_deps_gen"
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
version = ShadowDbCredentials::VERSION
|
10
|
+
project_name = File.basename(Dir.pwd)
|
11
|
+
|
12
|
+
task :gen do
|
13
|
+
generator = GemspecDepsGen.new project_name
|
12
14
|
|
13
|
-
|
14
|
-
File.basename(Dir.pwd)
|
15
|
+
generator.generate_dependencies "spec", "#{project_name}.gemspec.erb", "#{project_name}.gemspec"
|
15
16
|
end
|
16
17
|
|
17
|
-
task :build do
|
18
|
-
|
18
|
+
task :build => :gen do
|
19
|
+
system "gem build #{project_name}.gemspec"
|
20
|
+
end
|
19
21
|
|
20
|
-
|
22
|
+
task :install do
|
23
|
+
system "gem install #{project_name}-#{version}.gem"
|
24
|
+
end
|
21
25
|
|
22
|
-
|
26
|
+
task :uninstall do
|
27
|
+
system "gem uninstall #{project_name}"
|
23
28
|
end
|
24
29
|
|
25
30
|
task :release => :build do
|
@@ -31,4 +36,3 @@ RSpec::Core::RakeTask.new do |task|
|
|
31
36
|
task.verbose = false
|
32
37
|
end
|
33
38
|
|
34
|
-
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'erb'
|
2
|
+
|
1
3
|
class ShadowDbCredentials
|
2
4
|
|
3
5
|
def initialize credentials_dir
|
@@ -9,12 +11,12 @@ class ShadowDbCredentials
|
|
9
11
|
|
10
12
|
template = ERB.new file.read
|
11
13
|
|
12
|
-
config = YAML.load(template.result(binding))
|
14
|
+
config = indifferent_access(YAML.load(template.result(binding)))
|
13
15
|
|
14
|
-
process_credentials(config[rails_env])
|
16
|
+
process_credentials(config[rails_env.to_sym])
|
15
17
|
end
|
16
18
|
|
17
|
-
def
|
19
|
+
def process_configurations configurations
|
18
20
|
new_configurations = {}
|
19
21
|
|
20
22
|
configurations.each do |name, params|
|
@@ -24,24 +26,16 @@ class ShadowDbCredentials
|
|
24
26
|
new_configurations
|
25
27
|
end
|
26
28
|
|
27
|
-
def process_configuration configurations, rails_env
|
28
|
-
new_configurations = configurations.clone
|
29
|
-
|
30
|
-
new_configurations[rails_env] = process_credentials(configurations[rails_env])
|
31
|
-
|
32
|
-
new_configurations
|
33
|
-
end
|
34
|
-
|
35
29
|
private
|
36
30
|
|
37
31
|
def process_credentials params
|
38
|
-
if params[
|
39
|
-
credentials = params.delete(
|
32
|
+
if params[:credentials]
|
33
|
+
credentials = params.delete(:credentials)
|
40
34
|
|
41
|
-
file_name = "
|
35
|
+
file_name = "#{@credentials_dir}/#{credentials}"
|
42
36
|
|
43
37
|
if File.exist? file_name
|
44
|
-
params.merge!(YAML.load_file(file_name))
|
38
|
+
params.merge!(indifferent_access(YAML.load_file(file_name)))
|
45
39
|
else
|
46
40
|
puts "Missing credentials file: #{file_name}."
|
47
41
|
end
|
@@ -49,5 +43,20 @@ class ShadowDbCredentials
|
|
49
43
|
|
50
44
|
params
|
51
45
|
end
|
46
|
+
|
47
|
+
def indifferent_access hash
|
48
|
+
case hash
|
49
|
+
when Hash
|
50
|
+
Hash[
|
51
|
+
hash.map do |k, v|
|
52
|
+
[ k.respond_to?(:to_sym) ? k.to_sym : k, indifferent_access(v) ]
|
53
|
+
end
|
54
|
+
]
|
55
|
+
when Enumerable
|
56
|
+
hash.map { |v| indifferent_access(v) }
|
57
|
+
else
|
58
|
+
hash
|
59
|
+
end
|
60
|
+
end
|
52
61
|
end
|
53
62
|
|
@@ -1,3 +1,3 @@
|
|
1
|
-
|
2
|
-
VERSION = "1.0
|
1
|
+
class ShadowDbCredentials
|
2
|
+
VERSION = "1.1.0"
|
3
3
|
end
|
@@ -4,17 +4,38 @@ require 'shadow_db_credentials'
|
|
4
4
|
require 'yaml'
|
5
5
|
|
6
6
|
describe ShadowDbCredentials do
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
before do
|
8
|
+
@credentials_dir = 'some_credentials_dir'
|
9
|
+
|
10
|
+
credentials_file_name = "#{@credentials_dir}/your_dev_db"
|
11
|
+
|
12
|
+
YAML.expects(:load_file).with(credentials_file_name).returns(
|
13
|
+
{url: "some_url", username: "username", password: "password"}
|
10
14
|
)
|
15
|
+
File.expects(:exist? => true).with(credentials_file_name)
|
16
|
+
end
|
17
|
+
|
18
|
+
subject do
|
19
|
+
ShadowDbCredentials.new(@credentials_dir)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should process credentials attrubute" do
|
23
|
+
configurations = {production: { adapter: 'oracle_enhanced', credentials: 'your_dev_db'}}
|
11
24
|
|
12
|
-
|
25
|
+
result = subject.process_configurations configurations
|
26
|
+
|
27
|
+
result[:production][:url].should == 'some_url'
|
28
|
+
end
|
13
29
|
|
14
|
-
|
30
|
+
it "should retrieve given configuration" do
|
31
|
+
source = StringIO.new <<-TEXT
|
32
|
+
development:
|
33
|
+
adapter: postgresql
|
34
|
+
credentials: your_dev_db
|
35
|
+
TEXT
|
15
36
|
|
16
|
-
result = subject.
|
37
|
+
result = subject.retrieve_configuration "development", source
|
17
38
|
|
18
|
-
result[
|
39
|
+
result[:development][:url].should == 'some_url'
|
19
40
|
end
|
20
|
-
end
|
41
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,14 +1,5 @@
|
|
1
1
|
$: << File.expand_path(File.dirname(__FILE__) + '/../lib')
|
2
2
|
|
3
3
|
RSpec.configure do |config|
|
4
|
-
# ## Mock Framework
|
5
|
-
#
|
6
|
-
# If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
|
7
|
-
|
8
4
|
config.mock_with :mocha
|
9
|
-
#config.mock_with :rspec
|
10
|
-
|
11
|
-
# config.mock_with :flexmock
|
12
|
-
# config.mock_with :rr
|
13
|
-
|
14
5
|
end
|
metadata
CHANGED
@@ -1,46 +1,41 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shadow_db_credentials
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
5
|
-
prerelease:
|
4
|
+
version: 1.1.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Alexander Shvets
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2013-08-16 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: gemspec_deps_gen
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :development
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - '>='
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '0'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: gemcutter
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - '>='
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: '0'
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - '>='
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: '0'
|
46
41
|
description: Class that helps to keep database credentials for rails application in
|
@@ -55,13 +50,15 @@ files:
|
|
55
50
|
- .idea/.rakeTasks
|
56
51
|
- .idea/cssxfire.xml
|
57
52
|
- .idea/encodings.xml
|
53
|
+
- .idea/jenkinsSettings.xml
|
58
54
|
- .idea/misc.xml
|
59
55
|
- .idea/modules.xml
|
60
56
|
- .idea/scopes/scope_settings.xml
|
61
57
|
- .idea/shadow_db_credentials.iml
|
62
58
|
- .idea/vcs.xml
|
63
59
|
- .idea/workspace.xml
|
64
|
-
- .
|
60
|
+
- .ruby-gemset
|
61
|
+
- .ruby-version
|
65
62
|
- CHANGES
|
66
63
|
- Gemfile
|
67
64
|
- LICENSE
|
@@ -76,27 +73,26 @@ files:
|
|
76
73
|
- spec/spec_helper.rb
|
77
74
|
homepage: http://github.com/shvets/shadow_db_credentials
|
78
75
|
licenses: []
|
76
|
+
metadata: {}
|
79
77
|
post_install_message:
|
80
78
|
rdoc_options: []
|
81
79
|
require_paths:
|
82
80
|
- lib
|
83
81
|
required_ruby_version: !ruby/object:Gem::Requirement
|
84
|
-
none: false
|
85
82
|
requirements:
|
86
|
-
- -
|
83
|
+
- - '>='
|
87
84
|
- !ruby/object:Gem::Version
|
88
85
|
version: '0'
|
89
86
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
90
|
-
none: false
|
91
87
|
requirements:
|
92
|
-
- -
|
88
|
+
- - '>='
|
93
89
|
- !ruby/object:Gem::Version
|
94
90
|
version: '0'
|
95
91
|
requirements: []
|
96
92
|
rubyforge_project:
|
97
|
-
rubygems_version:
|
93
|
+
rubygems_version: 2.0.5
|
98
94
|
signing_key:
|
99
|
-
specification_version:
|
95
|
+
specification_version: 4
|
100
96
|
summary: Class that helps to keep database credentials for rails application in private
|
101
97
|
place
|
102
98
|
test_files:
|