secret_data 0.0.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.
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
@@ -0,0 +1,18 @@
1
+ language: ruby
2
+ bundler_args: --without development darwin linux
3
+ rvm:
4
+ - 1.9.3
5
+ - 1.9.2
6
+ - jruby-18mode
7
+ - jruby-19mode
8
+ - rbx-18mode
9
+ - rbx-19mode
10
+ - ruby-head
11
+ - jruby-head
12
+ - ree
13
+ script:
14
+ - bundle exec rspec
15
+ branch:
16
+ only:
17
+ - master
18
+ - develop
data/Gemfile ADDED
@@ -0,0 +1,24 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in secret_data.gemspec
4
+ gemspec
5
+
6
+ group :test, :development do
7
+ gem 'rspec'
8
+ gem 'fakefs'
9
+ end
10
+
11
+ group :development do
12
+ gem 'rake'
13
+ gem 'simplecov'
14
+ gem 'redcarpet'
15
+
16
+ gem 'guard-bundler'
17
+ gem 'guard-rspec'
18
+ gem 'guard-yard'
19
+
20
+ # Watch file change events instead of polling
21
+ gem 'rb-fsevent', :require => false, :group => :darwin # OSX
22
+ gem 'rb-inotify', :require => false, :group => :linux # Linux
23
+ gem 'wdm', :require => false, :platforms => [:mswin, :mingw] # Windows
24
+ end
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # A sample Guardfile
4
+ # More info at https://github.com/guard/guard#readme
5
+
6
+ guard 'bundler' do
7
+ watch('Gemfile')
8
+ # Uncomment next line if Gemfile contain `gemspec' command
9
+ # watch(/^.+\.gemspec/)
10
+ end
11
+
12
+ guard 'rspec' do
13
+ watch(%r{^spec/.+_spec\.rb$})
14
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
15
+ watch('spec/spec_helper.rb') { "spec" }
16
+
17
+ # Rails example
18
+ watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
19
+ watch(%r{^app/(.*)(\.erb|\.haml)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
20
+ watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
21
+ watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
22
+ watch('config/routes.rb') { "spec/routing" }
23
+ watch('app/controllers/application_controller.rb') { "spec/controllers" }
24
+
25
+ # Capybara request specs
26
+ watch(%r{^app/views/(.+)/.*\.(erb|haml)$}) { |m| "spec/requests/#{m[1]}_spec.rb" }
27
+
28
+ # Turnip features and steps
29
+ watch(%r{^spec/acceptance/(.+)\.feature$})
30
+ watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' }
31
+ end
32
+
33
+
34
+ guard 'yard' do
35
+ watch(%r{app/.+\.rb})
36
+ watch(%r{lib/.+\.rb})
37
+ watch(%r{ext/.+\.c})
38
+ end
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Alexander Wenzowski
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,58 @@
1
+ [![Build Status](https://secure.travis-ci.org/wenzowski/secret-data.png)](http://travis-ci.org/wenzowski/secret-data)
2
+
3
+ SecretData
4
+ ==========
5
+
6
+ A helper class for silencing secret data.
7
+
8
+
9
+ Installation
10
+ ------------
11
+
12
+ Add this line to your application's Gemfile:
13
+
14
+ gem 'secret_data'
15
+
16
+ And then execute:
17
+
18
+ $ bundle
19
+
20
+ Or install it yourself as:
21
+
22
+ $ gem install secret_data
23
+
24
+
25
+ Usage
26
+ -----
27
+
28
+ Example usage with VCR gem to silence api credentials.
29
+
30
+ require 'secret_data'
31
+ require 'vcr'
32
+
33
+ secret_data = SecretData.new(:yml_path => 'your_config.yml')
34
+ VCR.configure do |c|
35
+ secret_data.silence! do |find, replace|
36
+ c.filter_sensitive_data(replace) { find }
37
+ end
38
+ end
39
+
40
+ Configuration via block is also allowed.
41
+
42
+ SecretData.new.configure {|config|
43
+ config.message = '~*~GOODBYE_{{var}}~*~' # optional
44
+ config.add_from_env('API_SECRET') # reads ENV['API_SECRET']
45
+ }.silence!{|secret, message|
46
+ puts "Have some ultra-confidential data: #{secret}!"
47
+ puts "...whoops, I should have shown you #{message}."
48
+ }
49
+
50
+
51
+ Contributing
52
+ ------------
53
+
54
+ 1. Fork it
55
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
56
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
57
+ 4. Push to the branch (`git push origin my-new-feature`)
58
+ 5. Create new Pull Request
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
@@ -0,0 +1,4 @@
1
+ ---
2
+ description: secret
3
+ nested:
4
+ another: secret2
@@ -0,0 +1,9 @@
1
+ require 'secret_data/version'
2
+ require 'secret_data/silencer'
3
+
4
+ ##
5
+ # This class is intended as a helper for keeping track of
6
+ # pairs of secret data and generating unique, human-readable
7
+ # placeholders suitable for public release.
8
+ class SecretData
9
+ end
@@ -0,0 +1,70 @@
1
+ require 'yaml'
2
+ require 'erb'
3
+
4
+ class SecretData
5
+ attr_accessor :message
6
+
7
+ def initialize(opts={})
8
+ @message = '____SILENCED_{{var}}____'
9
+ @secrets = {}
10
+
11
+ load_yaml!(opts[:yml_path]) if opts[:yml_path]
12
+ end
13
+
14
+ def configure(&block)
15
+ block.call(self)
16
+ self
17
+ end
18
+
19
+ ##
20
+ # Iterates through each secret and display message pair.
21
+ #
22
+ def silence(&block)
23
+ @secrets.each_pair do |secret, message|
24
+ block.call secret, message
25
+ end
26
+ end
27
+
28
+ ##
29
+ # Loads a secret from ENV using the environment variable name
30
+ # to generate an appropriate display message.
31
+ def add_from_env(var_name)
32
+ recursive_load(var_name => ENV[var_name])
33
+ end
34
+
35
+ ##
36
+ # Loads secrets from a hash of variable name keys and
37
+ # corresponding secrets.
38
+ def add(hash)
39
+ recursive_load(nested_hash)
40
+ end
41
+
42
+ ##
43
+ # Loads secrets from a YAML file of nested hashes, eg.
44
+ #
45
+ # ---
46
+ # variable_name: secret_value
47
+ # nested_hash:
48
+ # another_variable: another_secret
49
+ def load_yaml!(yml_path)
50
+ nested_hash = YAML.load(ERB.new(File.read(yml_path)).result)
51
+ recursive_load(nested_hash)
52
+ end
53
+
54
+ private
55
+
56
+ def recursive_load(nested_hash, context='')
57
+ nested_hash.each_pair do |key, val|
58
+ case val
59
+ when String
60
+ @secrets[val] = message_for("#{context}#{key}")
61
+ when Hash
62
+ recursive_load(val, "#{context}#{key}_")
63
+ end
64
+ end
65
+ end
66
+
67
+ def message_for(key)
68
+ @message.gsub /\{\{var\}\}/, "#{key.to_s}"
69
+ end
70
+ end
@@ -0,0 +1,3 @@
1
+ class SecretData
2
+ VERSION = '0.0.1'
3
+ end
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/secret_data/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Alexander Wenzowski"]
6
+ gem.email = ["alexander@wenzowski.com"]
7
+ gem.description = %q{A helper class for silencing secret data.}
8
+ gem.summary = <<-EOF
9
+ SecretData loads sensitives strings from YAML, ENV, or Hash and
10
+ automatically generates a placeholder string that is safe to publsh
11
+ publicly, yet descriptive enough not to inhibit debugging.
12
+ EOF
13
+ gem.homepage = "https://github.com/wenzowski/secret_data"
14
+
15
+ gem.files = `git ls-files`.split($\)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.name = "secret_data"
19
+ gem.require_paths = ["lib"]
20
+ gem.version = SecretData::VERSION
21
+ end
@@ -0,0 +1,65 @@
1
+ require 'spec_helper'
2
+
3
+ describe SecretData do
4
+
5
+ context '#initialize' do
6
+ context 'with YAML', :fakefs do
7
+ subject { SecretData.new :yml_path => 'config.yml' }
8
+
9
+ before :each do
10
+ File.open('config.yml', 'w') do |f|
11
+ f.write({
12
+ 'description' => 'secret',
13
+ 'nested' => {
14
+ 'another' => 'secret2'
15
+ }
16
+ }.to_yaml)
17
+ end
18
+ end
19
+
20
+ it do
21
+ subject.instance_variable_get('@secrets').should == {
22
+ 'secret' => "____SILENCED_description____",
23
+ 'secret2' => "____SILENCED_nested_another____"
24
+ }
25
+ end
26
+ end
27
+ end
28
+
29
+ context '#silence' do
30
+ subject {
31
+ ENV['VAR'] = 'secret data'
32
+ SecretData.new.configure{|c| c.add_from_env('VAR') }
33
+ }
34
+
35
+ it do
36
+ subject.silence {|secret, message|
37
+ secret.should == 'secret data'
38
+ message.should == '____SILENCED_VAR____'
39
+ }
40
+ end
41
+ end
42
+
43
+ context '#message_for' do
44
+ subject { SecretData.new }
45
+
46
+ context 'default message' do
47
+ it do
48
+ subject.send(
49
+ :message_for, 'FOO'
50
+ ).should == '____SILENCED_FOO____'
51
+ end
52
+ end
53
+
54
+ context 'custom message' do
55
+ it do
56
+ subject.configure do |config|
57
+ config.message = '{{var}}'
58
+ end
59
+ subject.send(:message_for, 'FOO').should == 'FOO'
60
+ end
61
+ end
62
+ end
63
+
64
+
65
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe SecretData do
4
+ it { SecretData::VERSION.should eq('0.0.1'), "Please don't bump the version." }
5
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe SecretData do
4
+ it do
5
+ expect { SecretData.new }.to_not raise_error
6
+ end
7
+ end
@@ -0,0 +1,30 @@
1
+ # This file was generated by the `rspec --init` command. Conventionally, all
2
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
+ # Require this file using `require "spec_helper"` to ensure that it is only
4
+ # loaded once.
5
+ #
6
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
7
+
8
+ begin
9
+ require 'simplecov'
10
+ SimpleCov.start
11
+ rescue LoadError
12
+ end
13
+
14
+ require 'secret_data'
15
+ require 'fakefs/safe'
16
+ require 'fakefs/spec_helpers'
17
+
18
+ RSpec.configure do |config|
19
+ config.treat_symbols_as_metadata_keys_with_true_values = true
20
+ config.run_all_when_everything_filtered = true
21
+ config.filter_run :focus
22
+
23
+ # Run specs in random order to surface order dependencies. If you find an
24
+ # order dependency and want to debug it, you can fix the order by providing
25
+ # the seed, which is printed after each run.
26
+ # --seed 1234
27
+ config.order = 'random'
28
+
29
+ config.include FakeFS::SpecHelpers, :fakefs => true
30
+ end
metadata ADDED
@@ -0,0 +1,75 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: secret_data
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Alexander Wenzowski
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-11-02 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: A helper class for silencing secret data.
15
+ email:
16
+ - alexander@wenzowski.com
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - .gitignore
22
+ - .rspec
23
+ - .travis.yml
24
+ - Gemfile
25
+ - Guardfile
26
+ - LICENSE
27
+ - README.md
28
+ - Rakefile
29
+ - config.yml
30
+ - lib/secret_data.rb
31
+ - lib/secret_data/silencer.rb
32
+ - lib/secret_data/version.rb
33
+ - secret_data.gemspec
34
+ - spec/lib/secret_data/silencer_spec.rb
35
+ - spec/lib/secret_data/version_spec.rb
36
+ - spec/lib/secret_data_spec.rb
37
+ - spec/spec_helper.rb
38
+ homepage: https://github.com/wenzowski/secret_data
39
+ licenses: []
40
+ post_install_message:
41
+ rdoc_options: []
42
+ require_paths:
43
+ - lib
44
+ required_ruby_version: !ruby/object:Gem::Requirement
45
+ none: false
46
+ requirements:
47
+ - - ! '>='
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
50
+ segments:
51
+ - 0
52
+ hash: -2849534964713371609
53
+ required_rubygems_version: !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ! '>='
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ segments:
60
+ - 0
61
+ hash: -2849534964713371609
62
+ requirements: []
63
+ rubyforge_project:
64
+ rubygems_version: 1.8.24
65
+ signing_key:
66
+ specification_version: 3
67
+ summary: SecretData loads sensitives strings from YAML, ENV, or Hash and automatically
68
+ generates a placeholder string that is safe to publsh publicly, yet descriptive
69
+ enough not to inhibit debugging.
70
+ test_files:
71
+ - spec/lib/secret_data/silencer_spec.rb
72
+ - spec/lib/secret_data/version_spec.rb
73
+ - spec/lib/secret_data_spec.rb
74
+ - spec/spec_helper.rb
75
+ has_rdoc: