configliere 0.4.14 → 0.4.16
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/.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
|