keyp 0.0.2 → 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.
- checksums.yaml +4 -4
- data/bin/keyp +67 -9
- data/keyp.gemspec +5 -3
- data/lib/keyp/cli.rb +3 -0
- data/lib/keyp/version.rb +1 -1
- data/lib/keyp.rb +228 -76
- data/spec/keyp_spec.rb +42 -16
- data/spec/keyper_spec.rb +56 -0
- metadata +17 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f6fe1096a2986fb5e0c7294dde7465399487f46f
|
4
|
+
data.tar.gz: aa53557b7a5ef2a0ddaf83c5005f653f08e1de25
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9728123d215cafbf15881a10b8b43b3fad95e5b6a473fea52ac42f0d28d429b20a4295a1d0fd700f8c71224182fb59c58e122ac1ca308dfab803af7f77170114
|
7
|
+
data.tar.gz: 320ce0f3a9c587b577b5d7b6dd466aac857ecf99fec6208874232324b2d79b23867b1a188d4f22e76a3eb20613156a1e8d49ef1fe33a9f7ad87dc279536acab3
|
data/bin/keyp
CHANGED
@@ -31,11 +31,17 @@ include GLI::App
|
|
31
31
|
|
32
32
|
# keyp create bag
|
33
33
|
|
34
|
-
program_desc 'A command line
|
34
|
+
program_desc 'A command line interface for the Keyp key:value manager'
|
35
35
|
|
36
|
+
desc 'The Keyp bag to use'
|
36
37
|
flag [:b,:bag], default_value: 'default'
|
38
|
+
|
39
|
+
desc 'Enable debug mode'
|
37
40
|
switch [:d, :debug]
|
38
41
|
|
42
|
+
desc 'Suppress hints: If invalid parameters are set, no suggestive feedback will be provided'
|
43
|
+
switch [:s, :suppress]
|
44
|
+
|
39
45
|
# TODO: fix this because this implies that we either already have a bag or it will create a new one
|
40
46
|
pre do |global_options, command, options, args|
|
41
47
|
# initialize our store
|
@@ -66,13 +72,20 @@ pre do |global_options, command, options, args|
|
|
66
72
|
true # hack to prevent
|
67
73
|
end
|
68
74
|
|
75
|
+
|
76
|
+
desc 'Get the value for a key'
|
77
|
+
long_desc 'Shows the value for the supplied key'
|
69
78
|
#
|
70
79
|
# Key,value commands
|
71
80
|
#arg_name 'keys', :multiple
|
72
81
|
command :get do |c|
|
82
|
+
c.desc 'Shows the value for the supplied key.'
|
83
|
+
|
84
|
+
#c.switch [:v,:value]
|
73
85
|
c.action do |global_options,options,args|
|
74
|
-
|
75
|
-
if args.
|
86
|
+
|
87
|
+
#help_now!('key is required') if args.empty?
|
88
|
+
if args.empty? && !global_options[:suppress]
|
76
89
|
puts "Usage: keyp get KEY"
|
77
90
|
puts "Must specify a key."
|
78
91
|
else
|
@@ -90,8 +103,12 @@ end
|
|
90
103
|
# any global or command parameters after the key=value will be sucked into the value
|
91
104
|
# Se we'll need to implement values in quotes if the value contains whitespace
|
92
105
|
|
106
|
+
desc 'set the value for the supplied key'
|
107
|
+
long_desc 'Sets the value for the supplied key. If the key exists, the value will be overwritten'
|
108
|
+
|
93
109
|
arg_name 'values', :multiple
|
94
110
|
command :set do |c|
|
111
|
+
c.desc 'Set the value for the supplied key. If the key exists, the value will be overwritten'
|
95
112
|
c.action do |global_options,options,args|
|
96
113
|
# When/if implementing multiple key assignments
|
97
114
|
# check args.length % 2
|
@@ -109,7 +126,7 @@ command :set do |c|
|
|
109
126
|
|
110
127
|
if nvp
|
111
128
|
$bag[nvp[:key]] = nvp[:value]
|
112
|
-
|
129
|
+
elsif global_options[:suppress] == false
|
113
130
|
# puts "Usage keyp set KEY1=VALUE1 [KEY2=VALUE2 ...]"
|
114
131
|
puts "Usage: keyp set KEY=VALUE"
|
115
132
|
end
|
@@ -118,6 +135,7 @@ command :set do |c|
|
|
118
135
|
end
|
119
136
|
end
|
120
137
|
|
138
|
+
desc 'removes the key and value for the supplied key'
|
121
139
|
command :unset do |c|
|
122
140
|
c.action do |global_options,options, args|
|
123
141
|
if args.length == 0
|
@@ -139,8 +157,12 @@ command :unset do |c|
|
|
139
157
|
end
|
140
158
|
end
|
141
159
|
|
160
|
+
desc 'lists all the key:value pairs in the bag.'
|
142
161
|
command :list do |c|
|
143
|
-
c.action do
|
162
|
+
c.action do |global_options, options, args|
|
163
|
+
|
164
|
+
# TODO: implement display options
|
165
|
+
|
144
166
|
puts "* bag:#{$bag.name}"
|
145
167
|
|
146
168
|
unless $bag.empty?
|
@@ -156,11 +178,49 @@ command :list do |c|
|
|
156
178
|
end
|
157
179
|
|
158
180
|
|
181
|
+
setup_desc = 'Creates and configures the Keyp directory'
|
182
|
+
|
183
|
+
desc setup_desc
|
159
184
|
command :setup do |c|
|
185
|
+
c.desc setup_desc
|
160
186
|
c.action do |global_options, options, args|
|
161
187
|
puts "keyp setup..."
|
162
188
|
Keyp::setup
|
163
|
-
$bag = Keyp::
|
189
|
+
$bag = Keyp::create_bag 'default'
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
command :create do |c|
|
194
|
+
|
195
|
+
c.action do |global_options, options, args|
|
196
|
+
puts "keyp create"
|
197
|
+
# TODO: add checking in case store already exists
|
198
|
+
#Keyp::create
|
199
|
+
|
200
|
+
bag = Keyp.create_bag(args[0])
|
201
|
+
if bag
|
202
|
+
puts "created Keyp bag #{bag.name}"
|
203
|
+
else
|
204
|
+
puts "Unable to create Keyp bag #{args[0]}"
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
command :delete do |c|
|
210
|
+
c.action do |global_options, options, args|
|
211
|
+
puts "delete bag is not supported at this time"
|
212
|
+
# TODO: prompt for verification
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
command :show do |c|
|
217
|
+
c.action do |global_options, options, args|
|
218
|
+
# TODO: implement filtering, stats (like number of items in a bag, last updated, etc)
|
219
|
+
# and just filename
|
220
|
+
bags = Keyp.bag_names
|
221
|
+
bags.each do |bag|
|
222
|
+
puts "#{bag}"
|
223
|
+
end
|
164
224
|
end
|
165
225
|
end
|
166
226
|
|
@@ -175,10 +235,8 @@ post do |global_options, command, options, args|
|
|
175
235
|
else
|
176
236
|
true
|
177
237
|
end
|
178
|
-
|
179
|
-
|
180
|
-
|
181
238
|
end
|
239
|
+
|
182
240
|
# bag management commands
|
183
241
|
|
184
242
|
# create a bag
|
data/keyp.gemspec
CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.version = Keyp::VERSION
|
9
9
|
spec.authors = ["John Baldwin"]
|
10
10
|
spec.email = ["jlbaldwin@gmail.com"]
|
11
|
-
spec.summary = %q{Manage environment/machine specific key
|
12
|
-
spec.description =
|
11
|
+
spec.summary = %q{Manage environment/machine specific key:value pairs for your Ruby application.}
|
12
|
+
spec.description = %q{Keyp is a key:value manager with a command line tool and library API to make managing authentication and configuration information easier.}
|
13
13
|
spec.homepage = "https://github.com/johnbaldwin/keyp-ruby"
|
14
14
|
spec.license = "Apache v2"
|
15
15
|
|
@@ -18,9 +18,11 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
+
spec.add_runtime_dependency 'gli', '~> 2.9'
|
22
|
+
|
21
23
|
spec.add_development_dependency 'bundler', '~> 1.5'
|
22
24
|
spec.add_development_dependency 'rake', '~> 10.1'
|
23
|
-
spec.add_development_dependency 'gli', '~> 2.9'
|
25
|
+
#spec.add_development_dependency 'gli', '~> 2.9'
|
24
26
|
spec.add_development_dependency 'rspec', '~> 2.14'
|
25
27
|
spec.executables = 'keyp'
|
26
28
|
|
data/lib/keyp/cli.rb
CHANGED
data/lib/keyp/version.rb
CHANGED
data/lib/keyp.rb
CHANGED
@@ -1,93 +1,164 @@
|
|
1
|
-
require
|
1
|
+
require 'keyp/version'
|
2
|
+
require 'keyp/bag'
|
2
3
|
require 'json'
|
3
4
|
require 'yaml'
|
4
5
|
|
6
|
+
##
|
7
|
+
# This is the main module for the Keyp library
|
5
8
|
#
|
6
|
-
#
|
9
|
+
# = Overview
|
10
|
+
#
|
11
|
+
#
|
12
|
+
# Keyp is not yet supported on Windows
|
13
|
+
#
|
14
|
+
# = Developer notes
|
15
|
+
#
|
16
|
+
# NOTE: Do not implement a copy method to explicitly copy one bag to another.
|
17
|
+
# This is too prone to undesired overwriting.
|
18
|
+
# Instead, use create and pass in the other bag as a named parameter. This way
|
19
|
+
# we express
|
7
20
|
#
|
8
21
|
module Keyp
|
9
|
-
# Your code goes here...
|
10
|
-
ORIGINAL_ENV = ENV.to_hash
|
11
22
|
|
12
|
-
# TODO:
|
13
|
-
|
14
|
-
|
23
|
+
# TODO: Revisit constants. Make a submodule for constants
|
24
|
+
|
25
|
+
|
26
|
+
##
|
27
|
+
# Constant definitions
|
28
|
+
|
29
|
+
# Save the original environment before this module instantiates
|
30
|
+
ORIGINAL_ENV = ENV.to_hash
|
15
31
|
|
32
|
+
# This constant sets the default bag when one is not specified in methods that need to
|
33
|
+
# identify the bag
|
34
|
+
DEFAULT_BAG = 'default'
|
16
35
|
|
17
|
-
|
18
|
-
DEFAULT_STORE = 'default'
|
36
|
+
# Default file extension for the bags
|
19
37
|
DEFAULT_EXT = '.yml'
|
20
|
-
|
21
|
-
#
|
22
|
-
|
23
|
-
|
38
|
+
|
39
|
+
# Permissions for the KEYP_HOME directory
|
40
|
+
DEFAULT_KEYP_DIR_PERMISSIONS = 0700
|
41
|
+
|
42
|
+
# Default home directory that keyp uses to store bags
|
43
|
+
DEFAULT_KEYP_DIR = '.keyp'
|
44
|
+
|
45
|
+
#TODO: set this
|
46
|
+
#ENV_VAR_NAME_REGEX =
|
47
|
+
|
48
|
+
# Returns the directory used by Keyp to store the key bags
|
24
49
|
#
|
25
|
-
#
|
26
|
-
#
|
50
|
+
# By default, Keyp uses +$HOME/.keyp+ and sets permissions to 0700 to the +.keyp+ directory
|
51
|
+
#
|
52
|
+
# == Environment variable overrides
|
53
|
+
#
|
54
|
+
# You can override the default Keyp location by defining +KEYP_HOME+
|
55
|
+
#
|
56
|
+
# Keyp is currently designed to have a _per user_ configuration, but you should be able to
|
57
|
+
# set it up for system wide use if you desire.
|
27
58
|
|
59
|
+
# === Example
|
60
|
+
# +export KEYP_HOME=/var/lib/keyp+
|
61
|
+
#
|
62
|
+
# *Security note* If you do this *and* you are storing sensitive information, then
|
63
|
+
# it is recommended you restrict permissions
|
64
|
+
#
|
65
|
+
def self.home
|
66
|
+
ENV['KEPY_HOME'] || File.join(ENV['HOME'], DEFAULT_KEYP_DIR)
|
67
|
+
end
|
68
|
+
|
69
|
+
##
|
70
|
+
#
|
71
|
+
# Returns the file extension that Keyp uses for bags
|
72
|
+
# Should return '.yml'
|
73
|
+
#
|
74
|
+
def self.ext
|
75
|
+
DEFAULT_EXT
|
76
|
+
end
|
77
|
+
|
78
|
+
##
|
79
|
+
# Returns +true+ if the Keyp home diretory exists and is readable and writeable by the user
|
80
|
+
# running Keyp
|
28
81
|
def self.configured?
|
29
|
-
Dir.exist?(
|
82
|
+
Dir.exist?(home) && File.executable?(home) &&
|
83
|
+
File.readable_real?(home) && File.writable_real?(home)
|
30
84
|
end
|
31
85
|
|
86
|
+
##
|
87
|
+
# Creates the Keyp home directory and sets permissions if the directory does not exist
|
88
|
+
# See method +Keyp::home+
|
89
|
+
# === Options
|
90
|
+
# Not options yet
|
32
91
|
def self.setup(options ={})
|
33
92
|
|
34
93
|
# check if keyp directory exists
|
35
94
|
|
36
|
-
unless Dir.exist?(
|
37
|
-
puts "making directory #{
|
38
|
-
Dir.mkdir(
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
=begin
|
45
|
-
if config_path == DEFAULT_STORE
|
46
|
-
# create the default file
|
47
|
-
|
48
|
-
f = File.open(DEFAULT_STORE,'w')
|
49
|
-
#f.puts("default:")
|
50
|
-
f.close
|
51
|
-
return {}
|
95
|
+
unless Dir.exist?(home)
|
96
|
+
puts "making directory #{home}"
|
97
|
+
Dir.mkdir(home, 0700)
|
98
|
+
if Dir.exist?(home)
|
99
|
+
home
|
100
|
+
else
|
101
|
+
nil
|
102
|
+
end
|
52
103
|
else
|
53
|
-
|
104
|
+
Puts "#{home} already exists"
|
105
|
+
nil
|
54
106
|
end
|
55
|
-
=end
|
56
|
-
end
|
57
|
-
|
58
|
-
# NOTE: No copy method
|
59
|
-
# No method to explicitly copy one bag to another
|
60
|
-
# Too prone to unwanted overwriting
|
61
|
-
# Instead, use create and pass in the other bag as a
|
62
|
-
# named parameter
|
63
|
-
|
64
|
-
# create a new bag persist
|
65
|
-
# TODO: check options for a has to write to the bag
|
66
|
-
def self.create(bag, options={})
|
67
|
-
# two root sections in a bag
|
68
|
-
# meta:
|
69
|
-
# meta will contain information for use by keyp about this particular bag
|
70
|
-
# such as encoding rules, case sensitivity
|
71
|
-
# data:
|
72
107
|
end
|
73
108
|
|
109
|
+
##
|
74
110
|
# Convenience method to create a new Bag
|
111
|
+
#
|
112
|
+
# ==== Parameters
|
113
|
+
#
|
114
|
+
# * +name+ - bag name. 'default' is used if no bag name is provided
|
115
|
+
# * +options+ - options are passed through to Bag.new
|
116
|
+
#
|
75
117
|
def self.bag(name='default', options = {})
|
76
|
-
|
77
|
-
|
118
|
+
bag = Keyper.new(name, options)
|
119
|
+
bag
|
78
120
|
end
|
79
121
|
|
122
|
+
##
|
123
|
+
# Tells if a bag already exists for the keyp dir identified by the environment
|
124
|
+
#
|
125
|
+
def self.exist?(name)
|
126
|
+
path = bag_path(name)
|
127
|
+
File.exist? path
|
128
|
+
end
|
80
129
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
130
|
+
##
|
131
|
+
# returns the absolute path for the given bag
|
132
|
+
#
|
133
|
+
#
|
134
|
+
def self.bag_path(name)
|
135
|
+
path = File.join(home,name+ext)
|
86
136
|
end
|
87
137
|
|
88
|
-
|
89
|
-
|
138
|
+
##
|
139
|
+
# Returns an array of bag names
|
140
|
+
# This method returns a list of bag names for the active Keyp repository
|
141
|
+
# The default repository is $HOME/.keyp
|
142
|
+
# If the environment variable, KEYP_HOME is set, this directory will be used.
|
143
|
+
def self.bag_names(options = {})
|
144
|
+
#TODO: enable pattern matching
|
145
|
+
bags = []
|
146
|
+
reg = Regexp.new('\\'+ext+'$')
|
147
|
+
dir = Dir.new(home)
|
148
|
+
dir.each do |f|
|
149
|
+
# Filter for only
|
150
|
+
#if /\.yml$/.match(f)
|
151
|
+
if reg.match(f)
|
152
|
+
bags << File.basename(f,ext)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
bags
|
156
|
+
end
|
90
157
|
|
158
|
+
##
|
159
|
+
# Creates a new bag if one does not already exist with the given name
|
160
|
+
#
|
161
|
+
def self.create_bag(name, options = {} )
|
91
162
|
time_now = Time.now.utc.iso8601
|
92
163
|
file_data = {}
|
93
164
|
file_data['meta'] = {
|
@@ -97,8 +168,8 @@ module Keyp
|
|
97
168
|
'updated_at' => time_now
|
98
169
|
}
|
99
170
|
file_data['data'] = nil
|
100
|
-
unless
|
101
|
-
File.open(
|
171
|
+
unless exist? name
|
172
|
+
File.open(bag_path(name), 'w') do |f|
|
102
173
|
f.write file_data.to_yaml
|
103
174
|
f.chmod(0600)
|
104
175
|
end
|
@@ -108,6 +179,19 @@ module Keyp
|
|
108
179
|
bag name
|
109
180
|
end
|
110
181
|
|
182
|
+
##
|
183
|
+
# Deletes the bag matching the name
|
184
|
+
# Returns true if successful, false if not
|
185
|
+
def self.delete_bag(name, options = {})
|
186
|
+
if exist? name
|
187
|
+
# TODO: add exception handling
|
188
|
+
numfiles = File.delete(bag_path(name))
|
189
|
+
true
|
190
|
+
else
|
191
|
+
false
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
111
195
|
def self.parse_arg_string(arg_string, options={})
|
112
196
|
|
113
197
|
mode = options[:token_mode] || :default
|
@@ -130,6 +214,12 @@ module Keyp
|
|
130
214
|
nvp
|
131
215
|
end
|
132
216
|
|
217
|
+
# ---------------------------------------------
|
218
|
+
# Experimental stuff
|
219
|
+
|
220
|
+
def self.set_sys_env(key, value)
|
221
|
+
|
222
|
+
end
|
133
223
|
|
134
224
|
# ----------------------------------------------
|
135
225
|
|
@@ -147,8 +237,8 @@ module Keyp
|
|
147
237
|
attr_reader :keypdir, :dirty
|
148
238
|
attr_accessor :name, :data, :file_hash
|
149
239
|
|
150
|
-
def
|
151
|
-
File.join(@keypdir, @name)
|
240
|
+
def keypfile
|
241
|
+
File.join(@keypdir, @name+@ext)
|
152
242
|
end
|
153
243
|
|
154
244
|
# We expect
|
@@ -161,20 +251,20 @@ module Keyp
|
|
161
251
|
end
|
162
252
|
# set attributes not set by params
|
163
253
|
|
164
|
-
@keypdir ||= Keyp::
|
254
|
+
@keypdir ||= Keyp::home
|
165
255
|
@read_only ||= false
|
166
|
-
@ext ||=
|
167
|
-
|
256
|
+
@ext ||= Keyp::DEFAULT_EXT
|
257
|
+
#@keypfile = config_path
|
168
258
|
# load our resource
|
169
259
|
|
170
260
|
# load config file into hashes
|
171
261
|
# not the most efficient thing, but simpler and safe enough for now
|
172
262
|
|
173
|
-
unless File.exist?
|
174
|
-
puts "
|
175
|
-
Keyp::
|
263
|
+
unless File.exist? keypfile
|
264
|
+
puts "Keyper.initialize, create_bag #{keypfile}"
|
265
|
+
Keyp::create_bag(name)
|
176
266
|
end
|
177
|
-
file_data = load(
|
267
|
+
file_data = load(keypfile)
|
178
268
|
|
179
269
|
@meta = file_data[:meta]
|
180
270
|
@data = file_data[:data]|| {}
|
@@ -198,7 +288,7 @@ module Keyp
|
|
198
288
|
@data[key] = value
|
199
289
|
@dirty = true
|
200
290
|
else
|
201
|
-
raise "
|
291
|
+
raise "Bag #{@name} is read only"
|
202
292
|
end
|
203
293
|
end
|
204
294
|
|
@@ -218,6 +308,65 @@ module Keyp
|
|
218
308
|
@data.empty?
|
219
309
|
end
|
220
310
|
|
311
|
+
|
312
|
+
##
|
313
|
+
# Adds key/value pairs from this bag to the Ruby ENV
|
314
|
+
# NOTE: Currently in development.
|
315
|
+
# If no options are provided, then all of the bag's key/value pairs will be assigned.
|
316
|
+
#
|
317
|
+
# ==== Options
|
318
|
+
# TBD:
|
319
|
+
# +:sysvar+ Only use valid system environment vars
|
320
|
+
# +:selection+ Provide a list of keys to match
|
321
|
+
# +:overwrite+
|
322
|
+
# +:no_overwrite+ - This is enabled by default
|
323
|
+
# +:to_upper
|
324
|
+
|
325
|
+
# Returns a hash of the key/value pairs which have been set
|
326
|
+
# ==== Examples
|
327
|
+
# +add_to_env upper:+
|
328
|
+
# To assign keys matching a pattern:
|
329
|
+
# +add_to_env regex: '\A(_|[A-Z])[a-zA-Z\d]*'
|
330
|
+
|
331
|
+
def add_to_env(options = {})
|
332
|
+
# TODO: Add checking, upcase
|
333
|
+
|
334
|
+
# pattern matching valid env var
|
335
|
+
sys_env_reg = /\A(_|[a-zA-Z])\w*/
|
336
|
+
assigned = {}
|
337
|
+
overwrite = options[:overwrite] || false
|
338
|
+
pattern = options[:sysvar] if options.key?(:sysvar)
|
339
|
+
|
340
|
+
pattern ||= '(...)'
|
341
|
+
|
342
|
+
bag.data.each do |key,value|
|
343
|
+
if pattern.match(key)
|
344
|
+
# TODO: add overwrite checking
|
345
|
+
ENV[key] = value
|
346
|
+
assigned[key] = value
|
347
|
+
end
|
348
|
+
end
|
349
|
+
assigned
|
350
|
+
end
|
351
|
+
|
352
|
+
|
353
|
+
# TODO add from hash
|
354
|
+
|
355
|
+
|
356
|
+
def import(filename)
|
357
|
+
raise "import not yet supported"
|
358
|
+
end
|
359
|
+
|
360
|
+
def export(filename)
|
361
|
+
raise "export not yet supported"
|
362
|
+
end
|
363
|
+
|
364
|
+
|
365
|
+
# TODO: def to_yaml
|
366
|
+
# TODO: def to_json
|
367
|
+
# TODO: def to_s
|
368
|
+
|
369
|
+
##
|
221
370
|
# Give full path, attempt to load
|
222
371
|
# sticking with YAML format for now
|
223
372
|
# May add new file format later in which case we'll
|
@@ -235,7 +384,7 @@ module Keyp
|
|
235
384
|
# TODO: make this hardcoded case a hash of helpers
|
236
385
|
# TODO: Add two sections: Meta and data, then return as hash
|
237
386
|
|
238
|
-
if file_ext.downcase ==
|
387
|
+
if file_ext.downcase == Keyp::DEFAULT_EXT
|
239
388
|
|
240
389
|
# Either we are arbitrarily creating directories when
|
241
390
|
# given a path for a file that doesn't exist
|
@@ -253,6 +402,9 @@ module Keyp
|
|
253
402
|
{ meta: file_data['meta'], data: file_data['data']||{}, file_hash: file_data.hash }
|
254
403
|
end
|
255
404
|
|
405
|
+
##
|
406
|
+
# Saves the Bag to file
|
407
|
+
#
|
256
408
|
# NOT thread safe
|
257
409
|
# TODO: make thread safe
|
258
410
|
def save
|
@@ -268,14 +420,14 @@ module Keyp
|
|
268
420
|
begin
|
269
421
|
file_data = { 'meta' => @meta, 'data' => @data }
|
270
422
|
|
271
|
-
if File.exist?
|
272
|
-
read_file_data = load(
|
423
|
+
if File.exist? keypfile
|
424
|
+
read_file_data = load(keypfile)
|
273
425
|
unless @file_hash == read_file_data[:file_hash]
|
274
|
-
raise "Will not write to #{
|
426
|
+
raise "Will not write to #{keypfile}\nHashes differ. Expected hash =#{@file_hash}\n" +
|
275
427
|
"found hash #{read_file_data[:file_hash]}"
|
276
428
|
end
|
277
429
|
end
|
278
|
-
File.open(
|
430
|
+
File.open(keypfile, 'w') do |f|
|
279
431
|
f.write file_data.to_yaml
|
280
432
|
end
|
281
433
|
@dirty = false
|
data/spec/keyp_spec.rb
CHANGED
@@ -1,30 +1,56 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Keyp do
|
4
|
-
it 'should return correct version string' do
|
5
|
-
#Keyp.version_string.should == "Keyp version #{Keyp::VERSION}"
|
6
|
-
Keyp::VERSION.should == '0.0.1'
|
7
|
-
end
|
8
4
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
5
|
+
context "CONSTANTS" do
|
6
|
+
it 'should return correct version string' do
|
7
|
+
#Keyp.version_string.should == "Keyp version #{Keyp::VERSION}"
|
8
|
+
Keyp::VERSION.should == '0.0.3'
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'should specify default store' do
|
12
|
+
Keyp::DEFAULT_BAG.should == 'default'
|
13
|
+
end
|
13
14
|
|
14
|
-
|
15
|
-
|
15
|
+
it "should specifify default store extension" do
|
16
|
+
Keyp::DEFAULT_EXT.should == '.yml'
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should specify default keyp dir' do
|
20
|
+
Keyp::DEFAULT_KEYP_DIR.should == '.keyp'
|
21
|
+
end
|
16
22
|
end
|
17
|
-
|
18
|
-
|
23
|
+
|
24
|
+
context "Keyp directory" do
|
25
|
+
it 'should return correct default keyp dir' do
|
26
|
+
# DEFAULT_KEYP_DIRNAME = ENV['KEYP_DIRNAME'] || '.keyp'
|
27
|
+
Keyp::home.should == File.join(ENV['HOME'], '.keyp')
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should be able to override default keyp dir'
|
19
31
|
end
|
20
32
|
|
21
|
-
|
33
|
+
context "Bag management" do
|
34
|
+
it 'should return default bag' do
|
35
|
+
keyper = Keyp::bag
|
36
|
+
keyper.name.should == 'default'
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should say a bag exists" do
|
40
|
+
# get the default bag, should create it if it doesn't exist
|
41
|
+
keyper = Keyp::bag
|
42
|
+
Keyp.exist?(keyper.name).should == true
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should say a bag does not exist" do
|
46
|
+
# TODO: add bag name generation to a helper
|
47
|
+
bag_name = "grue_eats_you_when_it_is_dark_#{Time.now.strftime("%Y%m%d%H%M")}"
|
48
|
+
Keyp.exist?(bag_name).should_not == true
|
49
|
+
end
|
22
50
|
|
23
|
-
it 'should return default bag' do
|
24
|
-
keyper = Keyp::bag
|
25
|
-
keyper.bag.should == 'default'
|
26
51
|
end
|
27
52
|
|
53
|
+
|
28
54
|
it 'should return a key with data member'
|
29
55
|
it 'should return a key acting as a hash'
|
30
56
|
it 'should allow assigning a key if not read only'
|
data/spec/keyper_spec.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Keyp::Keyper do
|
4
|
+
|
5
|
+
context "is empty" do
|
6
|
+
before (:each) do
|
7
|
+
puts "before : is empty"
|
8
|
+
@bag = Keyp::Keyper.new 'testing123'
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should return an empty hash" do
|
12
|
+
|
13
|
+
@bag.data.size.should == 0
|
14
|
+
end
|
15
|
+
#it "should have metadata" do
|
16
|
+
# @bag.meta['created_on'].should_not == nil
|
17
|
+
#end
|
18
|
+
end
|
19
|
+
|
20
|
+
context "is not empty" do
|
21
|
+
before (:each) do
|
22
|
+
puts "before : is not empty"
|
23
|
+
@bag = Keyp::Keyper.new 'grue_eats_you'
|
24
|
+
@bag['LIGHTS'] = 'out'
|
25
|
+
end
|
26
|
+
it "should return a non-empty hash" do
|
27
|
+
@bag.data.size.should > 0
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context "environment variables" do
|
32
|
+
before (:each) do
|
33
|
+
# TODO: pseudo random bag name generation to a helper
|
34
|
+
bag_name = "grue_eats_you_when_it_is_dark_#{Time.now.strftime("%Y%m%d%H%M")}"
|
35
|
+
@bag = Keyp::Keyper.new bag_name
|
36
|
+
end
|
37
|
+
it "should copy all vars"
|
38
|
+
=begin
|
39
|
+
do
|
40
|
+
testvars = {
|
41
|
+
'ALPHA' => 'First in the phonetic alphabet',
|
42
|
+
'BRAVO' => 'Second in the phonetic alphabet',
|
43
|
+
'CHARLIE' => 'Third in the phonetic alphabet'
|
44
|
+
}
|
45
|
+
|
46
|
+
testvars.each { |key, value| @bag[key] = value }
|
47
|
+
|
48
|
+
@bag.add_to_env
|
49
|
+
testvars.each do |key, value|
|
50
|
+
ENV[key].should_not == nil
|
51
|
+
ENV[key].should == value
|
52
|
+
end
|
53
|
+
end
|
54
|
+
=end
|
55
|
+
end
|
56
|
+
end
|
metadata
CHANGED
@@ -1,57 +1,57 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: keyp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Baldwin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-03-
|
11
|
+
date: 2014-03-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: gli
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ~>
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
20
|
-
type: :
|
19
|
+
version: '2.9'
|
20
|
+
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '2.9'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ~>
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '1.5'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ~>
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '1.5'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - ~>
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '10.1'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '10.1'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rspec
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,7 +66,8 @@ dependencies:
|
|
66
66
|
- - ~>
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '2.14'
|
69
|
-
description:
|
69
|
+
description: Keyp is a key:value manager with a command line tool and library API
|
70
|
+
to make managing authentication and configuration information easier.
|
70
71
|
email:
|
71
72
|
- jlbaldwin@gmail.com
|
72
73
|
executables:
|
@@ -85,6 +86,7 @@ files:
|
|
85
86
|
- lib/keyp/cli.rb
|
86
87
|
- lib/keyp/version.rb
|
87
88
|
- spec/keyp_spec.rb
|
89
|
+
- spec/keyper_spec.rb
|
88
90
|
- spec/spec_helper.rb
|
89
91
|
homepage: https://github.com/johnbaldwin/keyp-ruby
|
90
92
|
licenses:
|
@@ -109,7 +111,8 @@ rubyforge_project:
|
|
109
111
|
rubygems_version: 2.2.1
|
110
112
|
signing_key:
|
111
113
|
specification_version: 4
|
112
|
-
summary:
|
114
|
+
summary: Manage environment/machine specific key:value pairs for your Ruby application.
|
113
115
|
test_files:
|
114
116
|
- spec/keyp_spec.rb
|
117
|
+
- spec/keyper_spec.rb
|
115
118
|
- spec/spec_helper.rb
|