with_cred 0.0.1 → 0.0.3
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.
- data/.gitignore +1 -0
- data/Gemfile +2 -0
- data/README.md +29 -5
- data/lib/with_cred/capistrano.rb +43 -0
- data/lib/with_cred/railtie.rb +4 -0
- data/lib/with_cred/recipes.rb +10 -0
- data/lib/with_cred/tasks/credentials.rake +18 -0
- data/lib/with_cred/version.rb +1 -1
- data/lib/with_cred.rb +172 -11
- data/spec/dummy/Gemfile +9 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/config/application.rb +16 -0
- data/spec/dummy/config/boot.rb +6 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +3 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/credentials/development/twitter/api.yaml +1 -0
- data/spec/dummy/credentials/github.yaml +1 -0
- data/spec/dummy/log/development.log +1 -0
- data/spec/env_credentials_spec.rb +53 -0
- data/spec/spec_helper.rb +8 -0
- data/spec/with_cred_spec.rb +19 -0
- data/spec/yaml_credentials_spec.rb +49 -0
- data/with_cred.gemspec +3 -1
- metadata +51 -5
data/.gitignore
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,8 +1,14 @@
|
|
1
1
|
# WithCred
|
2
2
|
|
3
|
-
Put your credentials in a standard convenient place. This place is
|
4
|
-
encrypted tarball, which
|
5
|
-
can commit them into your
|
3
|
+
Put your credentials in a standard convenient place. This place is
|
4
|
+
1) An encrypted tarball, which could decrypt on deploy. If you like, you
|
5
|
+
can commit them into your SCM/VCS, but this is not recommended.
|
6
|
+
2) A series of unencrypted YAML files. Like above, but you can't commit
|
7
|
+
them into your SCM/VCS
|
8
|
+
3) An encrypted environment variable and a password. This gem helps you
|
9
|
+
encrypt your credentials on deployment with capistrano and run commands
|
10
|
+
with the credentials as environment variables. The credentials may never
|
11
|
+
be persistently stored.
|
6
12
|
|
7
13
|
## Installation
|
8
14
|
|
@@ -22,7 +28,7 @@ Or install it yourself as:
|
|
22
28
|
|
23
29
|
(1) Add the directory credentials/ and credentials.* to your .gitignore
|
24
30
|
(2) Put your facebook credentials as follows in
|
25
|
-
credentials/facebook.yaml
|
31
|
+
credentials/production/facebook.yaml
|
26
32
|
api_token: "DEADBEEF543254738o25y437"
|
27
33
|
api_secret: "FEEBDAED3215432543523452"
|
28
34
|
(3) Add `config.credentials_mode = "production"` to your config/environments/production.rb
|
@@ -31,21 +37,39 @@ api_secret: "FEEBDAED3215432543523452"
|
|
31
37
|
WithCred.entials(:facebook) do |credentials|
|
32
38
|
#Set up the facebook API stuff
|
33
39
|
end
|
40
|
+
|
41
|
+
The credentials_mode is independent from Rails.env. If you want your
|
42
|
+
credentials to be available to all credentials_mode s, then you should
|
43
|
+
put your yaml in credentials/
|
34
44
|
```
|
35
45
|
|
36
46
|
Tasks
|
37
47
|
```
|
38
48
|
# Decrypt, asking for password
|
49
|
+
```
|
39
50
|
rake credentials:decrypt
|
40
51
|
|
41
52
|
# Decrypt, Looking in the file /etc/yourapp/.secret for the password
|
53
|
+
```
|
42
54
|
rake credentials:decrypt[/etc/yourapp/.secret]
|
43
55
|
|
44
56
|
# Encrypt, asking for the password
|
57
|
+
```
|
45
58
|
rake credentials:encrypt
|
46
59
|
|
47
60
|
# Encrypt, Looking in the file /etc/yourapp/.secret for the password
|
48
|
-
|
61
|
+
```
|
62
|
+
rake [[credentials:encrypt[/etc/yourapp/.secret]]]
|
63
|
+
|
64
|
+
# Output a lockfile, for credentials compatability checking. Use the
|
65
|
+
lockfile to check compatability of credentials with the app. Check
|
66
|
+
this file into your VCS/SCM.
|
67
|
+
```
|
68
|
+
rake credentials:lock
|
69
|
+
|
70
|
+
# Check that the credentials match what we expect from the lockfile.
|
71
|
+
```
|
72
|
+
rake credentials:check
|
49
73
|
|
50
74
|
## Contributing
|
51
75
|
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# Can't figure out how to require this file only for capistrano tasks.
|
2
|
+
# It's not required by default, so feel free to copypasta
|
3
|
+
|
4
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
5
|
+
|
6
|
+
def with_credentials_run(*args)
|
7
|
+
pwd = ENV['PASSWORD']
|
8
|
+
cred = WithCred.encrypted
|
9
|
+
|
10
|
+
if pwd
|
11
|
+
args[0] = "ENCRYPTED_CREDENTIALS='#{cred}' ; #{args[0]}"
|
12
|
+
end
|
13
|
+
|
14
|
+
if cred
|
15
|
+
args[0] = "PASSWORD='#{pwd}' ; #{args[0]}"
|
16
|
+
end
|
17
|
+
|
18
|
+
run(*args)
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
namespace :credentials do
|
23
|
+
desc "ask for credentials password"
|
24
|
+
task :password_prompt do
|
25
|
+
ENV['PASSWORD'] = Capistrano::CLI.password_prompt("Please enter password to decrypt credentials.")
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "check"
|
29
|
+
task :check do
|
30
|
+
credentials.password_prompt
|
31
|
+
with_credentials_run "bundle exec rake credentials:check"
|
32
|
+
end
|
33
|
+
|
34
|
+
desc "lock"
|
35
|
+
task :lock do
|
36
|
+
credentials.password_prompt
|
37
|
+
WithCred.lock
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
data/lib/with_cred/railtie.rb
CHANGED
@@ -0,0 +1,10 @@
|
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
|
+
|
3
|
+
namespace :password do
|
4
|
+
desc "ask for credentials password"
|
5
|
+
task :prompt do
|
6
|
+
WithCred::Deployment.password = Capistrano::CLI.password_prompt("Please enter password to decrypt credentials.")
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
end
|
@@ -20,4 +20,22 @@ namespace :credentials do
|
|
20
20
|
|
21
21
|
end
|
22
22
|
|
23
|
+
desc "Encrypt for use as an environment variable"
|
24
|
+
task :env_encrypt do |t, args|
|
25
|
+
password = ENV['PASSWORD']
|
26
|
+
raise "Please supply a password as an environment variable" unless password
|
27
|
+
|
28
|
+
puts WithCred.encrypted
|
29
|
+
end
|
30
|
+
|
31
|
+
desc "Check that the environment variable credentials are correct"
|
32
|
+
task :check => :environment do
|
33
|
+
WithCred.check!
|
34
|
+
end
|
35
|
+
|
36
|
+
desc "Output a lockfile unique to the credentials set"
|
37
|
+
task :lock => :environment do
|
38
|
+
WithCred.lock
|
39
|
+
end
|
40
|
+
|
23
41
|
end
|
data/lib/with_cred/version.rb
CHANGED
data/lib/with_cred.rb
CHANGED
@@ -1,28 +1,189 @@
|
|
1
1
|
require "with_cred/version"
|
2
|
+
require "with_cred/railtie" if defined?(::Rails)
|
3
|
+
#require "with_cred/capistrano" if defined?(::Capistrano)
|
4
|
+
require "base64"
|
5
|
+
require "encryptor"
|
2
6
|
|
3
7
|
class CredentialsNotFoundError < StandardError ; end
|
4
8
|
|
5
9
|
module WithCred
|
6
|
-
def self.entials_for(file)
|
7
10
|
|
8
|
-
|
9
|
-
# Passes the credentials into the block as read from the credentials YAML file at "#{Rails.root}/credentials/#{file}.yaml"
|
11
|
+
class InvalidCredentialsError < StandardError ; end
|
10
12
|
|
11
|
-
|
13
|
+
class Configuration
|
14
|
+
attr_accessor :credentials_dir, :credententials_mode, :credentials_hash, :password
|
12
15
|
|
13
|
-
|
16
|
+
def initialize
|
17
|
+
@algorithm = 'aes-256-cbc'
|
18
|
+
@credentials_hash = {}
|
19
|
+
end
|
20
|
+
|
21
|
+
def add_from_encrypted(ciphertext)
|
22
|
+
if ciphertext && ciphertext.length > 0
|
23
|
+
encrypted_binary = Base64.urlsafe_decode64(ciphertext)
|
24
|
+
decrypted_yaml = Encryptor.decrypt(encrypted_binary, :key => @password, :algorithm => @algorithm)
|
25
|
+
decrypted_hash = YAML::load(decrypted_yaml)
|
26
|
+
@credentials_hash.merge!(decrypted_hash)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def encrypted
|
31
|
+
Base64.urlsafe_encode64(encrypted_binary)
|
32
|
+
end
|
33
|
+
|
34
|
+
def encrypted_binary
|
35
|
+
Encryptor.encrypt(sorted_credentials_hash.to_yaml, :key => @password, :algorithm => @algorithm)
|
36
|
+
end
|
37
|
+
|
38
|
+
def check!(fp)
|
39
|
+
check(fp) || raise(InvalidCredentialsError.new("The fingerprints do not match"))
|
40
|
+
end
|
41
|
+
|
42
|
+
def check(fp)
|
43
|
+
fingerprint == fp
|
44
|
+
end
|
45
|
+
|
46
|
+
def fingerprint
|
47
|
+
Digest::SHA256.hexdigest(Base64.urlsafe_decode64(encrypted))
|
48
|
+
end
|
49
|
+
|
50
|
+
def add_credentials(path = [], leaf = {})
|
51
|
+
|
52
|
+
key = path.pop
|
53
|
+
|
54
|
+
twig = path.inject(@credentials_hash) do |hash, key|
|
55
|
+
hash[key.to_sym] ||= {}
|
56
|
+
end
|
57
|
+
|
58
|
+
twig[key.to_sym] = leaf
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
def credentials_for_mode(mode)
|
63
|
+
our_mode_credentials = @credentials_hash[mode.to_sym] || {}
|
64
|
+
all_mode_credentials = @credentials_hash[:_all] || {}
|
65
|
+
all_mode_credentials.merge(our_mode_credentials)
|
66
|
+
end
|
67
|
+
|
68
|
+
def sorted_credentials_hash
|
69
|
+
def sorter(h)
|
70
|
+
result = {}
|
71
|
+
h.keys.sort.each do |k|
|
72
|
+
if h[k].is_a?(Hash)
|
73
|
+
result[k] = sorter(h[k])
|
74
|
+
else
|
75
|
+
result[k] = h[k]
|
76
|
+
end
|
77
|
+
end
|
78
|
+
result
|
79
|
+
end
|
80
|
+
|
81
|
+
sorter(@credentials_hash)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
class ApplicationConfiguration < Configuration
|
86
|
+
|
87
|
+
attr_accessor :credentials_dir, :credentials_mode
|
88
|
+
|
89
|
+
def initialize
|
90
|
+
|
91
|
+
super
|
92
|
+
if defined?(::Rails)
|
93
|
+
@src_root = ::Rails.root
|
94
|
+
else
|
95
|
+
@src_root = ENV['PWD']
|
96
|
+
end
|
97
|
+
|
98
|
+
if defined?(::Rails) && ::Rails.application.config.respond_to?(:credentials_mode)
|
99
|
+
@credentials_mode = ::Rails.application.config.credentials_mode
|
100
|
+
else
|
101
|
+
@credentials_mode = "production"
|
102
|
+
end
|
103
|
+
|
104
|
+
@credentials_dir = File.join(@src_root, 'credentials')
|
105
|
+
|
106
|
+
self.password = ENV['PASSWORD']
|
107
|
+
self.add_from_encrypted(ENV['ENCRYPTED_CREDENTIALS'])
|
108
|
+
add_from_files
|
109
|
+
|
110
|
+
end
|
111
|
+
|
112
|
+
def add_from_files
|
113
|
+
all_credentials_files = Dir[File.join(@credentials_dir, "**", "*.yaml")]
|
114
|
+
|
115
|
+
all_credentials_files.each do |path|
|
116
|
+
|
117
|
+
hash_path =
|
118
|
+
path.gsub(/\.[^\.]*$/, '').
|
119
|
+
gsub(/^#{self.credentials_dir}/, '').
|
120
|
+
split('/').
|
121
|
+
reject{|tok| tok.length == 0}
|
122
|
+
|
123
|
+
if File.join(File.dirname(path), "") == File.join(self.credentials_dir, "")
|
124
|
+
hash_path.unshift(:_all)
|
125
|
+
end
|
126
|
+
|
127
|
+
credentials = YAML::load_file(path)
|
128
|
+
|
129
|
+
add_credentials(hash_path, credentials)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
def check!(fp = nil)
|
134
|
+
super(fp || File.read(lock_file_name))
|
135
|
+
end
|
136
|
+
|
137
|
+
def lock
|
138
|
+
File.open(lock_file_name, 'w') do |f|
|
139
|
+
f.write fingerprint
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
def credentials_for_current_mode
|
144
|
+
credentials_for_mode(@credentials_mode)
|
145
|
+
end
|
146
|
+
|
147
|
+
private
|
148
|
+
def lock_file_name
|
149
|
+
File.join(@src_root, 'credentials.lock')
|
150
|
+
end
|
14
151
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
152
|
+
end
|
153
|
+
|
154
|
+
class << self
|
155
|
+
attr_accessor :application_config
|
156
|
+
|
157
|
+
[:encrypted, :check!, :lock].each do |m|
|
158
|
+
define_method m do |*args, &block|
|
159
|
+
self.application_config.public_send(m, *args, &block)
|
19
160
|
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
def self.configure
|
165
|
+
self.application_config ||= ApplicationConfiguration.new
|
166
|
+
yield application_config if block_given?
|
167
|
+
end
|
168
|
+
|
169
|
+
def self.deconfigure
|
170
|
+
self.application_config = nil
|
171
|
+
end
|
172
|
+
|
173
|
+
def self.entials_for(*hash_path)
|
20
174
|
|
21
|
-
|
175
|
+
hash_place = application_config.credentials_for_current_mode
|
176
|
+
|
177
|
+
# Delve
|
178
|
+
hash_path.each do |key|
|
179
|
+
key = key.to_sym
|
180
|
+
hash_place[key] ||= {}
|
181
|
+
hash_place = hash_place[key]
|
22
182
|
end
|
23
183
|
|
24
|
-
|
184
|
+
yield hash_place
|
25
185
|
|
26
186
|
end
|
187
|
+
|
27
188
|
end
|
28
189
|
|
data/spec/dummy/Gemfile
ADDED
data/spec/dummy/Rakefile
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
# Add your own tasks in files placed in lib/tasks ending in .rake,
|
3
|
+
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
|
4
|
+
|
5
|
+
require File.expand_path('../config/application', __FILE__)
|
6
|
+
|
7
|
+
Dummy::Application.load_tasks
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require File.expand_path('../boot', __FILE__)
|
2
|
+
|
3
|
+
require 'rails'
|
4
|
+
|
5
|
+
if defined?(Bundler)
|
6
|
+
# If you precompile assets before deploying to production, use this line
|
7
|
+
Bundler.require(*Rails.groups(:assets => %w(development test)))
|
8
|
+
# If you want your assets lazily compiled in production, use this line
|
9
|
+
# Bundler.require(:default, :assets, Rails.env)
|
10
|
+
end
|
11
|
+
|
12
|
+
module Dummy
|
13
|
+
class Application < Rails::Application
|
14
|
+
config.credentials_mode = "development"
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
:secret: some_token
|
@@ -0,0 +1 @@
|
|
1
|
+
:password: developer
|
@@ -0,0 +1 @@
|
|
1
|
+
Connecting to database specified by database.yml
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe WithCred do
|
4
|
+
context 'from environment variables' do
|
5
|
+
let(:password) { 'secret' }
|
6
|
+
let(:credentials) {
|
7
|
+
{
|
8
|
+
:development => {
|
9
|
+
:merchant_account => {
|
10
|
+
:api_key => "secret"
|
11
|
+
}
|
12
|
+
},
|
13
|
+
:_all => {
|
14
|
+
:gateway => {
|
15
|
+
:name => 'swipe'
|
16
|
+
}
|
17
|
+
}
|
18
|
+
}.to_yaml
|
19
|
+
}
|
20
|
+
let(:encrypted_credentials) {
|
21
|
+
Base64.urlsafe_encode64(Encryptor.encrypt(credentials, :key => password, :algorithm => 'aes-256-cbc'))
|
22
|
+
}
|
23
|
+
|
24
|
+
before do
|
25
|
+
ENV['ENCRYPTED_CREDENTIALS'] = encrypted_credentials
|
26
|
+
ENV['PASSWORD'] = password
|
27
|
+
|
28
|
+
# Simulate process reload
|
29
|
+
WithCred.configure
|
30
|
+
end
|
31
|
+
|
32
|
+
after do
|
33
|
+
WithCred.deconfigure
|
34
|
+
end
|
35
|
+
|
36
|
+
it "decrypts the credentials" do
|
37
|
+
WithCred.entials_for(:merchant_account) do |c|
|
38
|
+
c[:api_key].should == "secret"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
it "allows credentials for all environments" do
|
43
|
+
WithCred.entials_for(:gateway) do |c|
|
44
|
+
c[:name].should == "swipe"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
after do
|
49
|
+
ENV['ENCRYPTED_CREDENTIALS'] = nil
|
50
|
+
ENV['PASSWORD'] = nil
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
|
4
|
+
describe WithCred do
|
5
|
+
|
6
|
+
context "in a rails app" do
|
7
|
+
context "config" do
|
8
|
+
let(:config) {
|
9
|
+
config = WithCred::ApplicationConfiguration.new
|
10
|
+
}
|
11
|
+
it "configures based on credentials_mode" do
|
12
|
+
config.credentials_mode.should == "development"
|
13
|
+
config.credentials_dir.should == File.join(Rails.root, "credentials")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
|
4
|
+
describe WithCred do
|
5
|
+
|
6
|
+
context "in a rails app" do
|
7
|
+
before do
|
8
|
+
WithCred.configure
|
9
|
+
end
|
10
|
+
|
11
|
+
after do
|
12
|
+
WithCred.deconfigure
|
13
|
+
end
|
14
|
+
|
15
|
+
context "credentials from yaml files" do
|
16
|
+
it "loads credentials from a tree of nested files" do
|
17
|
+
WithCred.entials_for(:twitter) do |c|
|
18
|
+
c[:api][:secret].should == "some_token"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context "retrieving credentials" do
|
24
|
+
it "loads credentials for the correct environment" do
|
25
|
+
WithCred.entials_for(:twitter) do |c|
|
26
|
+
c.should_not be_empty
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
it "ignores credentials for other environments" do
|
31
|
+
Rails.application.config.stub(:credentials_mode).and_return("production")
|
32
|
+
|
33
|
+
WithCred.deconfigure
|
34
|
+
WithCred.configure
|
35
|
+
|
36
|
+
WithCred.entials_for(:twitter) do |c|
|
37
|
+
c.should be_empty
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
it "loads root credentials for all environments" do
|
42
|
+
WithCred.entials_for(:github) do |c|
|
43
|
+
c[:password].should == "developer"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
data/with_cred.gemspec
CHANGED
@@ -9,11 +9,13 @@ Gem::Specification.new do |gem|
|
|
9
9
|
gem.authors = ["John Cant"]
|
10
10
|
gem.email = ["a.johncant@gmail.com"]
|
11
11
|
gem.description = %q{Simple credentials storage}
|
12
|
-
gem.summary = %q{
|
12
|
+
gem.summary = %q{Credentials as environment variables or as files}
|
13
13
|
gem.homepage = "https://github.com/johncant/with_cred"
|
14
14
|
|
15
15
|
gem.files = `git ls-files`.split($/)
|
16
16
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
17
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
18
|
gem.require_paths = ["lib"]
|
19
|
+
|
20
|
+
gem.add_dependency 'encryptor'
|
19
21
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: with_cred
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,8 +9,24 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-05-
|
13
|
-
dependencies:
|
12
|
+
date: 2013-05-20 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: encryptor
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
14
30
|
description: Simple credentials storage
|
15
31
|
email:
|
16
32
|
- a.johncant@gmail.com
|
@@ -24,9 +40,25 @@ files:
|
|
24
40
|
- README.md
|
25
41
|
- Rakefile
|
26
42
|
- lib/with_cred.rb
|
43
|
+
- lib/with_cred/capistrano.rb
|
27
44
|
- lib/with_cred/railtie.rb
|
45
|
+
- lib/with_cred/recipes.rb
|
28
46
|
- lib/with_cred/tasks/credentials.rake
|
29
47
|
- lib/with_cred/version.rb
|
48
|
+
- spec/dummy/Gemfile
|
49
|
+
- spec/dummy/Rakefile
|
50
|
+
- spec/dummy/config.ru
|
51
|
+
- spec/dummy/config/application.rb
|
52
|
+
- spec/dummy/config/boot.rb
|
53
|
+
- spec/dummy/config/environment.rb
|
54
|
+
- spec/dummy/config/environments/development.rb
|
55
|
+
- spec/dummy/credentials/development/twitter/api.yaml
|
56
|
+
- spec/dummy/credentials/github.yaml
|
57
|
+
- spec/dummy/log/development.log
|
58
|
+
- spec/env_credentials_spec.rb
|
59
|
+
- spec/spec_helper.rb
|
60
|
+
- spec/with_cred_spec.rb
|
61
|
+
- spec/yaml_credentials_spec.rb
|
30
62
|
- with_cred.gemspec
|
31
63
|
homepage: https://github.com/johncant/with_cred
|
32
64
|
licenses: []
|
@@ -51,6 +83,20 @@ rubyforge_project:
|
|
51
83
|
rubygems_version: 1.8.24
|
52
84
|
signing_key:
|
53
85
|
specification_version: 3
|
54
|
-
summary:
|
55
|
-
test_files:
|
86
|
+
summary: Credentials as environment variables or as files
|
87
|
+
test_files:
|
88
|
+
- spec/dummy/Gemfile
|
89
|
+
- spec/dummy/Rakefile
|
90
|
+
- spec/dummy/config.ru
|
91
|
+
- spec/dummy/config/application.rb
|
92
|
+
- spec/dummy/config/boot.rb
|
93
|
+
- spec/dummy/config/environment.rb
|
94
|
+
- spec/dummy/config/environments/development.rb
|
95
|
+
- spec/dummy/credentials/development/twitter/api.yaml
|
96
|
+
- spec/dummy/credentials/github.yaml
|
97
|
+
- spec/dummy/log/development.log
|
98
|
+
- spec/env_credentials_spec.rb
|
99
|
+
- spec/spec_helper.rb
|
100
|
+
- spec/with_cred_spec.rb
|
101
|
+
- spec/yaml_credentials_spec.rb
|
56
102
|
has_rdoc:
|