configliere 0.4.14 → 0.4.16
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +8 -1
- data/Gemfile +16 -19
- data/VERSION +1 -1
- data/configliere.gemspec +1 -5
- data/lib/configliere/commands.rb +1 -1
- data/lib/configliere/config_file.rb +3 -3
- data/lib/configliere/crypter.rb +20 -2
- data/lib/configliere/define.rb +1 -1
- data/lib/configliere/prompt.rb +9 -1
- data/spec/configliere/commandline_spec.rb +2 -2
- data/spec/configliere/commands_spec.rb +8 -20
- data/spec/configliere/config_block_spec.rb +1 -1
- data/spec/configliere/config_file_spec.rb +10 -10
- data/spec/configliere/deep_hash_spec.rb +1 -7
- data/spec/configliere/define_spec.rb +7 -1
- data/spec/configliere/encrypted_spec.rb +37 -7
- data/spec/configliere/prompt_spec.rb +3 -2
- data/spec/configliere_spec.rb +1 -1
- data/spec/spec_helper.rb +47 -0
- metadata +2 -19
- data/spec/configliere/crypter_spec.rb +0 -19
data/.travis.yml
CHANGED
@@ -2,8 +2,15 @@ language: ruby
|
|
2
2
|
rvm:
|
3
3
|
- 1.9.3
|
4
4
|
- 1.9.2
|
5
|
-
- jruby-19mode
|
5
|
+
- jruby-19mode
|
6
6
|
- rbx-19mode
|
7
|
+
- ruby-head
|
8
|
+
- jruby-head
|
9
|
+
# 1.8 still works! keep it that way
|
10
|
+
- jruby-18mode
|
11
|
+
- rbx-18mode
|
12
|
+
- 1.8.7
|
13
|
+
- ree
|
7
14
|
|
8
15
|
bundler_args: --without docs support
|
9
16
|
|
data/Gemfile
CHANGED
@@ -3,41 +3,38 @@ source 'http://rubygems.org'
|
|
3
3
|
gem 'multi_json', ">= 1.1"
|
4
4
|
|
5
5
|
# Only necessary if you want to use Configliere::Prompt
|
6
|
-
gem 'highline', ">= 1.5.2"
|
7
|
-
gem 'jruby-openssl', :platform => :jruby
|
8
|
-
|
9
|
-
puts [RUBY_PLATFORM, RUBY_ENGINE, RUBY_DESCRIPTION]
|
6
|
+
gem 'highline', ">= 1.5.2", :require => false
|
7
|
+
gem 'jruby-openssl', :platform => [:jruby] if RUBY_PLATFORM =~ /java/
|
10
8
|
|
11
9
|
# Only gems that you want listed as development dependencies in the gemspec
|
12
10
|
group :development do
|
13
11
|
gem 'bundler', "~> 1.1"
|
14
|
-
gem 'rake'
|
15
|
-
gem 'yard', ">= 0.7"
|
16
|
-
gem 'rspec', ">= 2.8"
|
17
|
-
gem 'jeweler', ">= 1.6"
|
12
|
+
gem 'rake', :require => false
|
13
|
+
gem 'yard', ">= 0.7", :require => false
|
14
|
+
gem 'rspec', ">= 2.8", :require => false
|
15
|
+
gem 'jeweler', ">= 1.6", :require => false
|
18
16
|
end
|
19
17
|
|
20
18
|
group :docs do
|
21
|
-
gem 'RedCloth', ">= 4.2",
|
22
|
-
gem 'redcarpet', ">= 2.1",
|
23
|
-
gem 'kramdown',
|
19
|
+
gem 'RedCloth', ">= 4.2", :require => "redcloth"
|
20
|
+
gem 'redcarpet', ">= 2.1", :platform => [:ruby]
|
21
|
+
gem 'kramdown', :platform => [:jruby]
|
24
22
|
end
|
25
23
|
|
26
24
|
# Gems for testing and coverage
|
27
25
|
group :test do
|
28
|
-
gem 'simplecov', ">= 0.5",
|
29
|
-
|
30
|
-
gem 'oj', ">= 1.2", :platform => [:mri, :rbx]
|
31
|
-
gem 'json', :platform => :jruby
|
26
|
+
gem 'simplecov', ">= 0.5", :platform => [:ruby_19], :require => false
|
27
|
+
gem 'json'
|
32
28
|
end
|
33
29
|
|
34
30
|
# Gems you would use if hacking on this gem (rather than with it)
|
35
31
|
group :support do
|
36
32
|
gem 'pry'
|
37
|
-
|
38
|
-
gem 'guard
|
39
|
-
gem 'guard-
|
33
|
+
#
|
34
|
+
gem 'guard', ">= 1.0", :platform => [:ruby_19]
|
35
|
+
gem 'guard-rspec', ">= 0.6", :platform => [:ruby_19]
|
36
|
+
gem 'guard-yard', :platform => [:ruby_19]
|
40
37
|
if RUBY_PLATFORM.include?('darwin')
|
41
|
-
gem 'rb-fsevent', ">= 0.9"
|
38
|
+
gem 'rb-fsevent', ">= 0.9", :platform => [:ruby_19]
|
42
39
|
end
|
43
40
|
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.4.
|
1
|
+
0.4.16
|
data/configliere.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "configliere"
|
8
|
-
s.version = "0.4.
|
8
|
+
s.version = "0.4.16"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Infochimps"]
|
@@ -62,7 +62,6 @@ Gem::Specification.new do |s|
|
|
62
62
|
"spec/configliere/commands_spec.rb",
|
63
63
|
"spec/configliere/config_block_spec.rb",
|
64
64
|
"spec/configliere/config_file_spec.rb",
|
65
|
-
"spec/configliere/crypter_spec.rb",
|
66
65
|
"spec/configliere/deep_hash_spec.rb",
|
67
66
|
"spec/configliere/define_spec.rb",
|
68
67
|
"spec/configliere/encrypted_spec.rb",
|
@@ -85,7 +84,6 @@ Gem::Specification.new do |s|
|
|
85
84
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
86
85
|
s.add_runtime_dependency(%q<multi_json>, [">= 1.1"])
|
87
86
|
s.add_runtime_dependency(%q<highline>, [">= 1.5.2"])
|
88
|
-
s.add_runtime_dependency(%q<jruby-openssl>, [">= 0"])
|
89
87
|
s.add_development_dependency(%q<bundler>, ["~> 1.1"])
|
90
88
|
s.add_development_dependency(%q<rake>, [">= 0"])
|
91
89
|
s.add_development_dependency(%q<yard>, [">= 0.7"])
|
@@ -94,7 +92,6 @@ Gem::Specification.new do |s|
|
|
94
92
|
else
|
95
93
|
s.add_dependency(%q<multi_json>, [">= 1.1"])
|
96
94
|
s.add_dependency(%q<highline>, [">= 1.5.2"])
|
97
|
-
s.add_dependency(%q<jruby-openssl>, [">= 0"])
|
98
95
|
s.add_dependency(%q<bundler>, ["~> 1.1"])
|
99
96
|
s.add_dependency(%q<rake>, [">= 0"])
|
100
97
|
s.add_dependency(%q<yard>, [">= 0.7"])
|
@@ -104,7 +101,6 @@ Gem::Specification.new do |s|
|
|
104
101
|
else
|
105
102
|
s.add_dependency(%q<multi_json>, [">= 1.1"])
|
106
103
|
s.add_dependency(%q<highline>, [">= 1.5.2"])
|
107
|
-
s.add_dependency(%q<jruby-openssl>, [">= 0"])
|
108
104
|
s.add_dependency(%q<bundler>, ["~> 1.1"])
|
109
105
|
s.add_dependency(%q<rake>, [">= 0"])
|
110
106
|
s.add_dependency(%q<yard>, [">= 0.7"])
|
data/lib/configliere/commands.rb
CHANGED
@@ -42,7 +42,7 @@ module Configliere
|
|
42
42
|
if command_name && commands[command_name]
|
43
43
|
sub_config = commands[command_name][:config]
|
44
44
|
adoptable = sub_config.send(:definitions).keys
|
45
|
-
merge!(sub_config.select{|k,v| adoptable.include?(k) } )
|
45
|
+
merge!( Hash[sub_config.select{|k,v| adoptable.include?(k) }] )
|
46
46
|
end
|
47
47
|
self
|
48
48
|
end
|
@@ -3,9 +3,9 @@ require 'pathname'
|
|
3
3
|
module Configliere
|
4
4
|
# Default locations where config files live
|
5
5
|
DEFAULT_CONFIG_LOCATION = {
|
6
|
-
machine
|
7
|
-
user
|
8
|
-
app
|
6
|
+
:machine => lambda{|scope| Pathname('/etc').join(scope) },
|
7
|
+
:user => lambda{|scope| Pathname(ENV['HOME'] || '/').join(".#{scope}") },
|
8
|
+
:app => lambda{|scope| app_dir = Pathname('/') ; Pathname(Dir.pwd).ascend{ |path| app_dir = path.join('config') if path.join('config').exist? } ; app_dir }
|
9
9
|
} unless defined?(DEFAULT_CONFIG_LOCATION)
|
10
10
|
|
11
11
|
#
|
data/lib/configliere/crypter.rb
CHANGED
@@ -1,6 +1,16 @@
|
|
1
1
|
module Configliere
|
2
2
|
# for encryption
|
3
|
-
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'openssl'
|
6
|
+
PLATFORM_ENCRYPTION_ERROR = nil
|
7
|
+
rescue LoadError => err
|
8
|
+
raise unless err.to_s.include?('openssl')
|
9
|
+
warn "Your ruby doesn't appear to have been built with OpenSSL."
|
10
|
+
warn "So you don't get to have Encryption."
|
11
|
+
PLATFORM_ENCRYPTION_ERROR = err
|
12
|
+
end
|
13
|
+
|
4
14
|
require 'digest/sha2'
|
5
15
|
# base64-encode the binary encrypted string
|
6
16
|
require "base64"
|
@@ -11,6 +21,11 @@ module Configliere
|
|
11
21
|
module Crypter
|
12
22
|
CIPHER_TYPE = "aes-256-cbc" unless defined?(CIPHER_TYPE)
|
13
23
|
|
24
|
+
def self.check_platform_can_encrypt!
|
25
|
+
return true unless PLATFORM_ENCRYPTION_ERROR
|
26
|
+
raise PLATFORM_ENCRYPTION_ERROR.class, "Encryption broken on this platform: #{PLATFORM_ENCRYPTION_ERROR}"
|
27
|
+
end
|
28
|
+
|
14
29
|
#
|
15
30
|
# Encrypt the given string
|
16
31
|
#
|
@@ -51,6 +66,7 @@ module Configliere
|
|
51
66
|
# @param [String] encrypt_pass secret passphrase to decrypt with
|
52
67
|
#
|
53
68
|
def self.new_cipher direction, encrypt_pass, options={}
|
69
|
+
check_platform_can_encrypt!
|
54
70
|
cipher = OpenSSL::Cipher::Cipher.new(CIPHER_TYPE)
|
55
71
|
case direction when :encrypt then cipher.encrypt when :decrypt then cipher.decrypt else raise "Bad cipher direction #{direction}" end
|
56
72
|
cipher.key = encrypt_key(encrypt_pass, options)
|
@@ -59,7 +75,9 @@ module Configliere
|
|
59
75
|
|
60
76
|
# prepend the initialization vector to the encoded message
|
61
77
|
def self.combine_iv_and_ciphertext iv, message
|
62
|
-
|
78
|
+
message.force_encoding("BINARY") if message.respond_to?(:force_encoding)
|
79
|
+
iv.force_encoding("BINARY") if iv.respond_to?(:force_encoding)
|
80
|
+
iv + message
|
63
81
|
end
|
64
82
|
# pull the initialization vector from the front of the encoded message
|
65
83
|
def self.separate_iv_and_ciphertext cipher, iv_and_ciphertext
|
data/lib/configliere/define.rb
CHANGED
@@ -131,7 +131,7 @@ module Configliere
|
|
131
131
|
when ((val.to_s == 'now') && (type == DateTime)) then val = DateTime.now
|
132
132
|
when ((val.to_s == 'now') && (type == Time)) then val = Time.now
|
133
133
|
when [Date, Time, DateTime].include?(type) then val = type.parse(val) rescue nil
|
134
|
-
else
|
134
|
+
else raise ArgumentError, "Unknown type #{type} given"
|
135
135
|
end
|
136
136
|
self[param] = val
|
137
137
|
end
|
data/lib/configliere/prompt.rb
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
# Settings.use :prompt
|
2
2
|
# you must install the highline gem
|
3
3
|
|
4
|
-
|
4
|
+
begin
|
5
|
+
require 'highline/import'
|
6
|
+
rescue LoadError, NameError => err
|
7
|
+
warn "************"
|
8
|
+
warn "Highline does not work with JRuby 1.7.0+ as of Mid 2012. See https://github.com/JEG2/highline/issues/41."
|
9
|
+
warn "************"
|
10
|
+
raise
|
11
|
+
end
|
12
|
+
|
5
13
|
module Configliere
|
6
14
|
#
|
7
15
|
# Method to prompt for
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__)
|
1
|
+
require File.expand_path('../spec_helper', File.dirname(__FILE__))
|
2
2
|
|
3
3
|
describe "Configliere::Commandline" do
|
4
4
|
before do
|
@@ -163,8 +163,8 @@ describe "Configliere::Commandline" do
|
|
163
163
|
@config.define :dest_time, :type => DateTime, :description => "Arrival time", :required => true
|
164
164
|
@config.define :takes_opt, :flag => 't', :description => "Takes a single-letter flag '-t'"
|
165
165
|
@config.define :foobaz, :internal => true, :description => "You won't see me"
|
166
|
-
@config.define 'delorean.power_source', :env_var => 'POWER_SOURCE', :description => 'Delorean subsytem supplying power to the Flux Capacitor.'
|
167
166
|
@config.define :password, :required => true, :encrypted => true
|
167
|
+
@config.define 'delorean.power_source', :env_var => 'POWER_SOURCE', :description => 'Delorean subsytem supplying power to the Flux Capacitor.'
|
168
168
|
@config.description = 'This is a sample script to demonstrate the help message. Notice how pretty everything lines up YAY'
|
169
169
|
|
170
170
|
stderr_output = capture_help_message{ @config.resolve! }
|
@@ -1,14 +1,14 @@
|
|
1
|
-
require 'spec_helper'
|
1
|
+
require File.expand_path('../spec_helper', File.dirname(__FILE__))
|
2
2
|
require 'configliere/commands'
|
3
3
|
|
4
4
|
describe Configliere::Commands do
|
5
|
-
|
5
|
+
|
6
6
|
subject{ Configliere::Param.new.use(:commands) }
|
7
7
|
|
8
8
|
after{ ::ARGV.replace [] }
|
9
9
|
|
10
10
|
context 'when no commands are defined' do
|
11
|
-
|
11
|
+
|
12
12
|
its(:commands){ should be_empty }
|
13
13
|
|
14
14
|
let(:args) { %w[ not_command_but_arg another_arg ] }
|
@@ -35,14 +35,14 @@ describe Configliere::Commands do
|
|
35
35
|
let(:args) { %w[ the_command --fuzziness=wuzzy extra_arg ] }
|
36
36
|
|
37
37
|
before do
|
38
|
-
subject.defaults(fuzziness
|
39
|
-
subject.define_command(:the_command, description
|
38
|
+
subject.defaults(:fuzziness => 'smooth')
|
39
|
+
subject.define_command(:the_command, :description => 'foobar')
|
40
40
|
end
|
41
41
|
|
42
42
|
it "should continue to parse flags when the command is given" do
|
43
43
|
::ARGV.replace args
|
44
44
|
subject.resolve!
|
45
|
-
subject.should == { fuzziness
|
45
|
+
subject.should == { :fuzziness => 'wuzzy' }
|
46
46
|
end
|
47
47
|
|
48
48
|
it "should continue to set args when the command is given" do
|
@@ -90,23 +90,11 @@ describe Configliere::Commands do
|
|
90
90
|
end
|
91
91
|
end
|
92
92
|
|
93
|
-
def capture_help_message
|
94
|
-
stderr_output = ''
|
95
|
-
subject.should_receive(:warn){|str| stderr_output << str }
|
96
|
-
begin
|
97
|
-
yield
|
98
|
-
fail('should exit via system exit')
|
99
|
-
rescue SystemExit
|
100
|
-
true # pass
|
101
|
-
end
|
102
|
-
stderr_output
|
103
|
-
end
|
104
|
-
|
105
93
|
describe "the help message" do
|
106
94
|
before do
|
107
95
|
subject.define_command :run, :description => "forrest"
|
108
96
|
subject.define_command :stop, :description => "hammertime"
|
109
|
-
subject.define
|
97
|
+
subject.define :reel, :type => Integer
|
110
98
|
end
|
111
99
|
|
112
100
|
it "displays a modified usage" do
|
@@ -115,7 +103,7 @@ describe Configliere::Commands do
|
|
115
103
|
stderr_output.should =~ %r{usage:.*\[command\]}m
|
116
104
|
end
|
117
105
|
|
118
|
-
it "displays the commands and their descriptions" do
|
106
|
+
it "displays the commands and their descriptions", :if => (RUBY_VERSION < "2.0") do
|
119
107
|
::ARGV.replace ['--help']
|
120
108
|
stderr_output = capture_help_message{ subject.resolve! }
|
121
109
|
stderr_output.should =~ %r{Available commands:\s+run\s*forrest\s+stop\s+hammertime}m
|
@@ -1,7 +1,7 @@
|
|
1
|
-
require 'spec_helper'
|
1
|
+
require File.expand_path('../spec_helper', File.dirname(__FILE__))
|
2
2
|
|
3
3
|
describe Configliere::ConfigFile do
|
4
|
-
let(:default_params) { { my_param
|
4
|
+
let(:default_params) { { :my_param => 'default_val', :also_a_param => true } }
|
5
5
|
|
6
6
|
subject{ Configliere::Param.new default_params }
|
7
7
|
|
@@ -10,7 +10,7 @@ describe Configliere::ConfigFile do
|
|
10
10
|
end
|
11
11
|
|
12
12
|
context '#read' do
|
13
|
-
let(:file_params) { { my_param
|
13
|
+
let(:file_params) { { :my_param => 'val_from_file' } }
|
14
14
|
let(:file_string) { file_params.to_yaml }
|
15
15
|
let(:file_path) { '/absolute/path.yaml' }
|
16
16
|
|
@@ -85,26 +85,26 @@ describe Configliere::ConfigFile do
|
|
85
85
|
end
|
86
86
|
|
87
87
|
context 'with options' do
|
88
|
-
let(:file_params) { { development
|
88
|
+
let(:file_params) { { :development => { :reload => true }, :production => { :reload => false } } }
|
89
89
|
|
90
|
-
before{ subject.merge!(reload
|
90
|
+
before{ subject.merge!(:reload => 'whatever') }
|
91
91
|
|
92
92
|
context ':env key' do
|
93
93
|
context 'valid :env' do
|
94
|
-
let(:opts) { { env
|
94
|
+
let(:opts) { { :env => :development } }
|
95
95
|
|
96
96
|
it 'slices out a subhash given by :env' do
|
97
97
|
subject.read(file_path, opts)
|
98
|
-
subject.should == default_params.merge(reload
|
98
|
+
subject.should == default_params.merge(:reload => true)
|
99
99
|
end
|
100
100
|
end
|
101
101
|
|
102
102
|
context 'invalid :env' do
|
103
|
-
let(:opts) { { env
|
103
|
+
let(:opts) { { :env => :not_there } }
|
104
104
|
|
105
105
|
it 'has no effect if the key given by :env option is absent' do
|
106
106
|
subject.read(file_path, opts)
|
107
|
-
subject.should == default_params.merge(reload
|
107
|
+
subject.should == default_params.merge(:reload => 'whatever')
|
108
108
|
end
|
109
109
|
end
|
110
110
|
end
|
@@ -114,7 +114,7 @@ describe Configliere::ConfigFile do
|
|
114
114
|
|
115
115
|
it 'does no slicing without the :env option' do
|
116
116
|
subject.read(file_path, opts)
|
117
|
-
subject.should == default_params.merge(reload
|
117
|
+
subject.should == default_params.merge(:reload => 'whatever').merge(file_params)
|
118
118
|
end
|
119
119
|
end
|
120
120
|
end
|
@@ -101,13 +101,7 @@ describe DeepHash do
|
|
101
101
|
subject['moon.non'].should be_nil
|
102
102
|
subject.should == orig_hash # shouldn't change from reading (specifically, shouldn't autovivify)
|
103
103
|
end
|
104
|
-
it 'indexing through a non-hash will raise an error' do
|
105
|
-
begin ; p subject['hat'] ; rescue StandardError => err ; p [err, err.class] ; end
|
106
|
-
begin ; p subject['hat.dog'] ; rescue StandardError => err ; p [err, err.class] ; end
|
107
|
-
begin ; p subject['hat']['dog'] ; rescue StandardError => err ; p [err, err.class] ; end
|
108
|
-
begin ; p :happy_sym['dog'] ; rescue StandardError => err ; p [err, err.class] ; end
|
109
|
-
end
|
110
|
-
it 'indexing through a non-hash will raise an error' do
|
104
|
+
it 'indexing through a non-hash will raise an error', :if => (defined?(RUBY_ENGINE) && (RUBY_ENGINE !~ /rbx/)) do
|
111
105
|
err_klass = (RUBY_VERSION >= "1.9.0") ? TypeError : NoMethodError
|
112
106
|
expect{ subject['hat.dog'] }.to raise_error(err_klass, /Symbol/)
|
113
107
|
subject.should == orig_hash # shouldn't change from reading (specifically, shouldn't autovivify)
|
@@ -92,13 +92,19 @@ describe "Configliere::Define" do
|
|
92
92
|
[Array, 'alone', ['alone'] ],
|
93
93
|
[Array, '', [] ],
|
94
94
|
[Array, nil, nil ],
|
95
|
-
['other', '5', '5'], ['other', 5, 5], ['other', nil, nil], ['other', '', nil],
|
96
95
|
].each do |type, orig, desired|
|
97
96
|
it "for #{type} converts #{orig.inspect} to #{desired.inspect}" do
|
98
97
|
@config.define :has_type, :type => type
|
99
98
|
@config[:has_type] = orig ; @config.resolve! ; @config[:has_type].should == desired
|
100
99
|
end
|
101
100
|
end
|
101
|
+
|
102
|
+
it 'raises an error (FIXME: on resolve, which is not that great) if you define an unknown type' do
|
103
|
+
@config.define :has_type, :type => 'bogus, man'
|
104
|
+
@config[:has_type] = "WHOA" ;
|
105
|
+
expect{ @config.resolve! }.to raise_error(ArgumentError, /Unknown type.*bogus, man/)
|
106
|
+
end
|
107
|
+
|
102
108
|
it 'converts :now to the current moment' do
|
103
109
|
@config.define :has_type, :type => DateTime
|
104
110
|
@config[:has_type] = 'now' ; @config.resolve! ; @config[:has_type].should be_within(4).of(DateTime.now)
|
@@ -1,6 +1,10 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
2
|
|
3
|
-
|
3
|
+
module Configliere ; module Crypter ; CIPHER_TYPE = 'aes-128-cbc' ; end ; end
|
4
|
+
|
5
|
+
describe "Configliere::Encrypted", :if => check_openssl do
|
6
|
+
require 'configliere/crypter'
|
7
|
+
|
4
8
|
before do
|
5
9
|
@config = Configliere::Param.new :secret => 'encrypt_me', :normal_param => 'normal'
|
6
10
|
@config.use :encrypted
|
@@ -8,6 +12,34 @@ describe "Configliere::Encrypted" do
|
|
8
12
|
@config[:encrypt_pass] = 'pass'
|
9
13
|
end
|
10
14
|
|
15
|
+
if Configliere::Crypter::CIPHER_TYPE == 'aes-256-cbc'
|
16
|
+
let(:encrypted_str){ "KohCTcXr1aAulopntmZ8f5Gqa7PzsBmz+R2vFGYrAeg=\n" }
|
17
|
+
let(:encrypted_foo_val){ "cc+Bp5jMUBHFCvPNZIfleeatB4IGaaXjVINl12HOpcs=\n" }
|
18
|
+
elsif Configliere::Crypter::CIPHER_TYPE == 'aes-128-cbc'
|
19
|
+
let(:encrypted_str){ "mHse6HRTANh8JpIfIuyANQ8b2rXAf0+/3pzQnYsd8LE=\n" }
|
20
|
+
let(:encrypted_foo_val){ "cc+Bp5jMUBHFCvPNZIfleZYRoDmLK1LSxPkAMemhDTQ=\n" }
|
21
|
+
else
|
22
|
+
warn "Can't make test strings for #{Configliere::Crypter::CIPHER_TYPE} cipher"
|
23
|
+
end
|
24
|
+
let(:foo_val_iv){ Base64.decode64(encrypted_foo_val)[0..15] }
|
25
|
+
|
26
|
+
|
27
|
+
describe "Crypter" do
|
28
|
+
it "encrypts" do
|
29
|
+
# Force the same initialization vector as used to prepare the test value
|
30
|
+
@cipher = Configliere::Crypter.send(:new_cipher, :encrypt, 'sekrit')
|
31
|
+
Configliere::Crypter.should_receive(:new_cipher).and_return(@cipher)
|
32
|
+
@cipher.should_receive(:random_iv).and_return foo_val_iv
|
33
|
+
# OK so do the test now.
|
34
|
+
Configliere::Crypter.encrypt('foo_val', 'sekrit').should == encrypted_foo_val
|
35
|
+
end
|
36
|
+
|
37
|
+
it "decrypts" do
|
38
|
+
Configliere::Crypter.decrypt(encrypted_foo_val, 'sekrit').should == 'foo_val'
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
|
11
43
|
describe 'defines encrypted params' do
|
12
44
|
it 'with :encrypted => true' do
|
13
45
|
@config.send(:encrypted_params).should include(:secret)
|
@@ -63,18 +95,16 @@ describe "Configliere::Encrypted" do
|
|
63
95
|
end
|
64
96
|
|
65
97
|
describe 'loading a file' do
|
66
|
-
before do
|
67
|
-
@encrypted_str = "KohCTcXr1aAulopntmZ8f5Gqa7PzsBmz+R2vFGYrAeg=\n"
|
68
|
-
end
|
69
98
|
it 'encrypts' do
|
70
|
-
Configliere::Crypter.should_receive(:encrypt).and_return(
|
99
|
+
Configliere::Crypter.should_receive(:encrypt).and_return(encrypted_str)
|
71
100
|
FileUtils.stub(:mkdir_p)
|
72
101
|
File.should_receive(:open).and_yield([])
|
73
|
-
YAML.should_receive(:dump).with({ :normal_param => "normal", :encrypted_secret =>
|
102
|
+
YAML.should_receive(:dump).with({ :normal_param => "normal", :encrypted_secret => encrypted_str })
|
74
103
|
@config.save! '/fake/file'
|
75
104
|
end
|
76
105
|
it 'decrypts' do
|
77
|
-
|
106
|
+
# encrypted_str = Configliere::Crypter.encrypt('decrypt_me', 'pass')
|
107
|
+
@hsh = { :loaded_param => "loaded", :encrypted_secret => encrypted_str }
|
78
108
|
File.stub(:open)
|
79
109
|
YAML.should_receive(:load).and_return(@hsh)
|
80
110
|
@config.read 'file.yaml'
|
@@ -1,6 +1,8 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
2
|
|
3
|
-
|
3
|
+
# Highline does not work with JRuby 1.7.0+ as of Mid 2012. See https://github.com/JEG2/highline/issues/41.
|
4
|
+
|
5
|
+
describe "Configliere::Prompt", :if => load_sketchy_lib('highline/import') do
|
4
6
|
before do
|
5
7
|
@config = Configliere::Param.new
|
6
8
|
@config.use :prompt
|
@@ -45,5 +47,4 @@ describe "Configliere::Prompt" do
|
|
45
47
|
Configliere::ParamParent.class_eval do def resolve!() self ; end ; end
|
46
48
|
end
|
47
49
|
end
|
48
|
-
|
49
50
|
end
|
data/spec/configliere_spec.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'bundler/setup' ; Bundler.require(:default, :development, :test)
|
2
2
|
require 'rspec/autorun'
|
3
3
|
|
4
|
+
puts "Running specs in version #{RUBY_VERSION} on #{RUBY_PLATFORM} #{RUBY_DESCRIPTION}"
|
5
|
+
|
4
6
|
if ENV['CONFIGLIERE_COV']
|
5
7
|
require 'simplecov'
|
6
8
|
SimpleCov.start
|
@@ -8,6 +10,51 @@ end
|
|
8
10
|
|
9
11
|
RSpec.configure do |config|
|
10
12
|
config.treat_symbols_as_metadata_keys_with_true_values = true
|
13
|
+
|
14
|
+
def load_sketchy_lib(lib)
|
15
|
+
begin
|
16
|
+
require lib
|
17
|
+
yield if block_given?
|
18
|
+
return true
|
19
|
+
rescue LoadError, StandardError => err
|
20
|
+
warn "#{RUBY_DESCRIPTION} doesn't seem to like #{lib}: got error"
|
21
|
+
warn " #{err.class} #{err}"
|
22
|
+
warn "Skipping specs on '#{caller(2).first}'"
|
23
|
+
return false
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def capture_help_message
|
28
|
+
stderr_output = ''
|
29
|
+
subject.should_receive(:warn){|str| stderr_output << str }
|
30
|
+
begin
|
31
|
+
yield
|
32
|
+
fail('should exit via system exit')
|
33
|
+
rescue SystemExit
|
34
|
+
true # pass
|
35
|
+
end
|
36
|
+
stderr_output
|
37
|
+
end
|
38
|
+
|
39
|
+
def check_openssl
|
40
|
+
load_sketchy_lib('openssl') do
|
41
|
+
cipher = OpenSSL::Cipher::Cipher.new('aes-128-cbc')
|
42
|
+
cipher.encrypt
|
43
|
+
cipher.key = Digest::SHA256.digest("HI JRUBY")
|
44
|
+
cipher.iv = iv = cipher.random_iv
|
45
|
+
ciphertext = cipher.update("O HAI TO YOU!")
|
46
|
+
ciphertext << cipher.final
|
47
|
+
# p [__LINE__, '128-bit encryption is OK', ciphertext]
|
48
|
+
# cipher = OpenSSL::Cipher::Cipher.new('aes-256-cbc')
|
49
|
+
# cipher.encrypt
|
50
|
+
# cipher.key = Digest::SHA256.digest("HI JRUBY")
|
51
|
+
# cipher.iv = iv = cipher.random_iv
|
52
|
+
# ciphertext = cipher.update("O HAI TO YOU!")
|
53
|
+
# ciphertext << cipher.final
|
54
|
+
# p [__LINE__, '256-bit encryption is OK', ciphertext]
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
11
58
|
end
|
12
59
|
|
13
60
|
require 'configliere'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: configliere
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.16
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -43,22 +43,6 @@ dependencies:
|
|
43
43
|
- - ! '>='
|
44
44
|
- !ruby/object:Gem::Version
|
45
45
|
version: 1.5.2
|
46
|
-
- !ruby/object:Gem::Dependency
|
47
|
-
name: jruby-openssl
|
48
|
-
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
|
-
requirements:
|
51
|
-
- - ! '>='
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
version: '0'
|
54
|
-
type: :runtime
|
55
|
-
prerelease: false
|
56
|
-
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
|
-
requirements:
|
59
|
-
- - ! '>='
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
46
|
- !ruby/object:Gem::Dependency
|
63
47
|
name: bundler
|
64
48
|
requirement: !ruby/object:Gem::Requirement
|
@@ -201,7 +185,6 @@ files:
|
|
201
185
|
- spec/configliere/commands_spec.rb
|
202
186
|
- spec/configliere/config_block_spec.rb
|
203
187
|
- spec/configliere/config_file_spec.rb
|
204
|
-
- spec/configliere/crypter_spec.rb
|
205
188
|
- spec/configliere/deep_hash_spec.rb
|
206
189
|
- spec/configliere/define_spec.rb
|
207
190
|
- spec/configliere/encrypted_spec.rb
|
@@ -226,7 +209,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
226
209
|
version: '0'
|
227
210
|
segments:
|
228
211
|
- 0
|
229
|
-
hash:
|
212
|
+
hash: 3171401032843387046
|
230
213
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
231
214
|
none: false
|
232
215
|
requirements:
|
@@ -1,19 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
-
require 'configliere/crypter'
|
3
|
-
include Configliere
|
4
|
-
|
5
|
-
describe "Crypter" do
|
6
|
-
ENCRYPTED_FOO_VAL = "cc+Bp5jMUBHFCvPNZIfleeatB4IGaaXjVINl12HOpcs=\n".force_encoding("BINARY")
|
7
|
-
FOO_VAL_IV = Base64.decode64(ENCRYPTED_FOO_VAL)[0..15]
|
8
|
-
it "encrypts" do
|
9
|
-
# Force the same initialization vector as used to prepare the test value
|
10
|
-
@cipher = Crypter.send(:new_cipher, :encrypt, 'sekrit')
|
11
|
-
Crypter.should_receive(:new_cipher).and_return(@cipher)
|
12
|
-
@cipher.should_receive(:random_iv).and_return FOO_VAL_IV
|
13
|
-
# OK so do the test now.
|
14
|
-
Crypter.encrypt('foo_val', 'sekrit').should == ENCRYPTED_FOO_VAL
|
15
|
-
end
|
16
|
-
it "decrypts" do
|
17
|
-
Crypter.decrypt(ENCRYPTED_FOO_VAL, 'sekrit').should == 'foo_val'
|
18
|
-
end
|
19
|
-
end
|