keyp 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: b14d1fd77f310af5875fcb9ad4ccd985a04c5abc
4
+ data.tar.gz: 78815bce0d5db5bb66103fb60132960256d9ba5c
5
+ SHA512:
6
+ metadata.gz: 1db7713dbf1a667967d3d5d76c7de9587cf961e6f816cd4059c7145424bcb5e9b3ec1e9129fe4ed23ebdeeb41a80e13475d7a96208fa940a1ff059a9d7accbc2
7
+ data.tar.gz: 49cadf1084cfad53323fdfbc9af3d1bb238e4ab40c838dc9c937ec422df87a5bda95efcc2221821a6eb3d8e77994afb6306d355e274ae16e22b3999d1c770dd6
data/.gitignore ADDED
@@ -0,0 +1,18 @@
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
18
+ .idea
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in keyp.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,13 @@
1
+ Copyright 2014 John Baldwin
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
data/README.md ADDED
@@ -0,0 +1,112 @@
1
+ # Keyp
2
+
3
+ Keyp is an executable Ruby gem that manages user/machine specific key/value pairs for your Ruby application.
4
+
5
+ Web applications generally need sensitive information, like salts and keys. Managing these generally involves writing
6
+ a custom solution for your application. Approaches are typically environment variables, custom data files, or
7
+ environment setting scripts. Following best practices, we don't want to store these in version control with our
8
+ application source. So I'm creating Keyp to make it simple to manage keys for your application across the development,
9
+ testing, and production environments.
10
+
11
+ ## Important
12
+
13
+ Keyp is still in early development and is experimental. As such it is very much a work in progress. Not all features
14
+ expressed in the documentation may be working. The documentation may be plain wrong. I don't recommend you use Keyp
15
+ for any kind of production code at this point in this gem's lifecycle.
16
+
17
+ ## Quick Tour
18
+
19
+ Keyp manages key value pairs in collections. As of version 0.0.1, Keyp refers to collections as *bags*. There is a
20
+ default bag called *default*. Unless you specify a bag name, *default* will be used.
21
+
22
+ Here are some command line examples showing some basic Keyp functionality using the default bag. Here we set a couple
23
+ of keys, list all the key/value pairs in the default bag, and finally get the value for a single key.
24
+
25
+ $ keyp set cloud_access_id=BMT216AF63958
26
+ $ keyp set cloud_secret_key=eabca9a58834aec15af0578ac84abfbdab7c3795
27
+
28
+ $ keyp list
29
+ * bag:default
30
+ cloud_access_id: BMT216AF63958
31
+ cloud_secret_key: eabca9a58834aec15af0578ac84abfbdab7c3795
32
+
33
+ $ keyp get cloud_access_id
34
+ BMT216AF63958
35
+
36
+ In your Ruby application, you can use Keyp as follows:
37
+
38
+ # get keys from the default key collection and use
39
+ bag = Keyp.bag
40
+ my_account.authenticate(bag['cloud_access_id'],bag['cloud_secret_key'])
41
+
42
+ # or update ENV
43
+ bag = Keyp.bag
44
+ Keyp::add_to_env(bag)
45
+
46
+ my_account.authenticate(ENV['cloud_access_id'],ENV['cloud_secret_key'])
47
+
48
+ Keyp is not limited to just access keys. Any kind of string based name/value pair can be used.
49
+
50
+ TODO: Improve description
51
+
52
+ _CAVEAT:_ This gem is at a very early stage in development. Any and all functionality is subject to change.
53
+
54
+ ## Installation
55
+
56
+ Add this line to your application's Gemfile:
57
+
58
+ gem 'keyp'
59
+
60
+ And then execute:
61
+
62
+ $ bundle
63
+
64
+ Or install it yourself as:
65
+
66
+ $ gem install keyp
67
+
68
+ ## Setup
69
+
70
+ Run the following to set up default installation
71
+ $ keyp init
72
+ This will create a $HOME/.keyp directory if one does not already exist, configure this director for use with Keyp.
73
+
74
+ ### Customization
75
+
76
+ Keyp uses the ~/.keyp directory by default. To override, set the environment variable, KEYP_HOME to your choice
77
+ of directory.
78
+
79
+ TODO: add Bash config setting to export Keyp ENV vars to the ENV or make ENV vars accessible via Keyp hashes
80
+
81
+ ## Usage
82
+
83
+ TODO: Write detailed usage instructions here
84
+
85
+ ###
86
+
87
+
88
+ ### Command line interface
89
+
90
+ TODO: Write more detailed documentation, For now, see the quick start above and run the following to see CLI options
91
+ $ keyp --help
92
+
93
+ ## Development plan/Features to implement
94
+
95
+ * Get basic functionality working soundly backed with effective tests
96
+ * Implement .keyp directory setup
97
+ * Add ENV vars to bag
98
+ * Add bag vars to ENV
99
+ * Incorporate with shell configuration
100
+ * Write very clear documentation
101
+ * Implement import/Export to YAML and/or JSON
102
+ * Add API interfaces for other language, starting with Python
103
+ * Consider: Add configuration options for storage (YAML,JSON, SQLITE)
104
+
105
+
106
+ ## Contributing
107
+
108
+ 1. Fork it ( http://github.com/<my-github-username>/keyp/fork )
109
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
110
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
111
+ 4. Push to the branch (`git push origin my-new-feature`)
112
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,3 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
3
+ RSpec::Core::RakeTask.new('spec')
data/bin/keyp ADDED
@@ -0,0 +1,195 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ #
5
+ # NOTE: This is my first ruby gem and first executable ruby gem. I see a bunch of different
6
+ # implementations. A good number and a few well known use Thor, so seems like a good idea to
7
+ # figure out how to use Thor as well.
8
+ #
9
+ # I'm trying out some of the different impementations for Keyp, learning how they work, pros and cons
10
+ # Then I'll pick a single approach after exploring them
11
+
12
+ # TO run in the project dir:
13
+ # ruby -Ilib ./bin/keyp
14
+
15
+ # resolve bin path, ignoring symlinks
16
+ require 'pathname'
17
+ bin_file = Pathname.new(__FILE__).realpath
18
+
19
+ # http://davetron5000.github.io/gli/
20
+ require 'gli'
21
+
22
+ require 'pp'
23
+
24
+ require 'keyp'
25
+ include GLI::App
26
+
27
+ # keyp set key=value
28
+ # keyp get key
29
+ # keyp
30
+
31
+
32
+ # keyp create bag
33
+
34
+ program_desc 'A command line linterface for the Keyp key/value manager'
35
+
36
+ flag [:b,:bag], default_value: 'default'
37
+ switch [:d, :debug]
38
+
39
+ # TODO: fix this because this implies that we either already have a bag or it will create a new one
40
+ pre do |global_options, command, options, args|
41
+ # initialize our store
42
+ $debug = global_options[:debug]
43
+ if $debug
44
+ puts "pre-hook"
45
+ puts "command:"
46
+ pp command
47
+ puts "options:"
48
+ puts options
49
+ puts "args: #{args}"
50
+ puts "args.class=#{args.class}"
51
+ puts "---- end prehook ---"
52
+ end
53
+
54
+ unless command.name == :setup
55
+
56
+ # check if we are configured
57
+ unless Keyp.configured?
58
+ puts "Please run setup to use Keyp. Run with --help to view help menu"
59
+ exit 1
60
+ end
61
+
62
+ $bag = Keyp.bag(global_options[:bag])
63
+ else
64
+ $bag = nil
65
+ end
66
+ true # hack to prevent
67
+ end
68
+
69
+ #
70
+ # Key,value commands
71
+ #arg_name 'keys', :multiple
72
+ command :get do |c|
73
+ c.action do |global_options,options,args|
74
+ puts "--- get args= #{args}" if $debug
75
+ if args.length == 0
76
+ puts "Usage: keyp get KEY"
77
+ puts "Must specify a key."
78
+ else
79
+ val = $bag.data[args[0]]
80
+ unless val.nil?
81
+ puts val
82
+ else
83
+ puts ''
84
+ end
85
+ end
86
+ end
87
+ end
88
+
89
+ # TODO: set is not optimal. Right now it only handles a single key/value pair and
90
+ # any global or command parameters after the key=value will be sucked into the value
91
+ # Se we'll need to implement values in quotes if the value contains whitespace
92
+
93
+ arg_name 'values', :multiple
94
+ command :set do |c|
95
+ c.action do |global_options,options,args|
96
+ # When/if implementing multiple key assignments
97
+ # check args.length % 2
98
+ # parse the args,
99
+
100
+ # concatenate all the args
101
+ # then parse on =
102
+ buff = ''
103
+ args.each do |arg|
104
+ buff << arg << ' '
105
+ buff
106
+ end
107
+
108
+ nvp = Keyp.parse_arg_string buff
109
+
110
+ if nvp
111
+ $bag[nvp[:key]] = nvp[:value]
112
+ else
113
+ # puts "Usage keyp set KEY1=VALUE1 [KEY2=VALUE2 ...]"
114
+ puts "Usage: keyp set KEY=VALUE"
115
+ end
116
+
117
+ # $bag.data[]
118
+ end
119
+ end
120
+
121
+ command :unset do |c|
122
+ c.action do |global_options,options, args|
123
+ if args.length == 0
124
+ # puts 'Usage: keyp unset KEY1 [KEY2 ...]'
125
+ puts 'Usage: keyp unset KEY1'
126
+ puts 'Must specify a key to unset.'
127
+ else
128
+ printf "Unsetting #{args[0]}..."
129
+ # if delete
130
+ val = $bag.delete(args[0])
131
+ if val
132
+ puts "unset #{args[0]}: #{val}"
133
+ printf "done.\n"
134
+ else
135
+ puts "key \"#{args[0]}\" not found"
136
+ end
137
+
138
+ end
139
+ end
140
+ end
141
+
142
+ command :list do |c|
143
+ c.action do
144
+ puts "* bag:#{$bag.name}"
145
+
146
+ unless $bag.empty?
147
+ $bag.data.each do |key,value|
148
+ #printf("$s : $s\n", key,value)
149
+ puts "#{key}: #{value}"
150
+ end
151
+ else
152
+ puts "You have an empty bag."
153
+ end
154
+
155
+ end
156
+ end
157
+
158
+
159
+ command :setup do |c|
160
+ c.action do |global_options, options, args|
161
+ puts "keyp setup..."
162
+ Keyp::setup
163
+ $bag = Keyp::create_store 'default'
164
+ end
165
+ end
166
+
167
+ post do |global_options, command, options, args|
168
+ # if bag.data is dirty, then save
169
+ if $debug
170
+ puts "post-hook, state of bag.dirty = #{$bag.dirty}"
171
+ end
172
+
173
+ unless command.name == :setup
174
+ $bag.save
175
+ else
176
+ true
177
+ end
178
+
179
+
180
+
181
+ end
182
+ # bag management commands
183
+
184
+ # create a bag
185
+ # command :create
186
+
187
+ # delete a bag (with confirmation)
188
+
189
+ # show bags
190
+ # command :show
191
+
192
+
193
+
194
+
195
+ exit run(ARGV)
data/keyp.gemspec ADDED
@@ -0,0 +1,27 @@
1
+ # encoding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'keyp/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "keyp"
8
+ spec.version = Keyp::VERSION
9
+ spec.authors = ["John Baldwin"]
10
+ spec.email = ["jlbaldwin@gmail.com"]
11
+ spec.summary = %q{Manage environment/machine specific key/value pairs for your Ruby application.}
12
+ spec.description = spec.summary=
13
+ spec.homepage = "https://github.com/johnbaldwin/keyp-ruby"
14
+ spec.license = "Apache v2"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ #spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency 'bundler', '~> 1.5'
22
+ spec.add_development_dependency 'rake', '~> 10.1'
23
+ spec.add_development_dependency 'gli', '~> 2.9'
24
+ spec.add_development_dependency 'rspec', '~> 2.14'
25
+ spec.executables = 'keyp'
26
+
27
+ end
data/lib/keyp/cli.rb ADDED
@@ -0,0 +1,11 @@
1
+ module Keyp
2
+
3
+ # Manage the processing of command line options
4
+ class CLI
5
+
6
+
7
+
8
+
9
+
10
+ end
11
+ end
@@ -0,0 +1,3 @@
1
+ module Keyp
2
+ VERSION = "0.0.2"
3
+ end
data/lib/keyp.rb ADDED
@@ -0,0 +1,298 @@
1
+ require "keyp/version"
2
+ require 'json'
3
+ require 'yaml'
4
+
5
+ #
6
+ # TODO: build out cli.rb to trim the exe script, keyp to its bare minimum
7
+ #
8
+ module Keyp
9
+ # Your code goes here...
10
+ ORIGINAL_ENV = ENV.to_hash
11
+
12
+ # TODO:
13
+ # Put this in initializer so testing can create its own directory and not muck
14
+ # up the operational default
15
+
16
+
17
+ KEYP_HOME = File.join(ENV['HOME'], '.keyp')
18
+ DEFAULT_STORE = 'default'
19
+ DEFAULT_EXT = '.yml'
20
+ # This method sets up the keyp director
21
+ #def self.setup
22
+ # # check if keyp directory exists. If not, set it up
23
+ # unless Dir.exist?(File.join(DEFAULT_KEYP_DIRNAME))
24
+ #
25
+ # end
26
+ #end
27
+
28
+ def self.configured?
29
+ Dir.exist?(KEYP_HOME)
30
+ end
31
+
32
+ def self.setup(options ={})
33
+
34
+ # check if keyp directory exists
35
+
36
+ unless Dir.exist?(KEYP_HOME)
37
+ puts "making directory #{KEYP_HOME}"
38
+ Dir.mkdir(KEYP_HOME, 0700)
39
+ else
40
+ Puts "#{KEYP_HOME} already exists"
41
+ end
42
+
43
+ KEYP_HOME
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 {}
52
+ else
53
+ raise "Non default stores not yet implemented"
54
+ 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
+ end
73
+
74
+ # Convenience method to create a new Bag
75
+ def self.bag(name='default', options = {})
76
+ keyper = Keyper.new(name, options)
77
+ keyper
78
+ end
79
+
80
+
81
+ def self.add_to_env(bag)
82
+ # TODO: Add checking, upcase
83
+ bag.data.each do |key,value|
84
+ ENV[key] = value
85
+ end
86
+ end
87
+
88
+ def self.create_store(name, options = {} )
89
+ filepath = File.join(KEYP_HOME, name + DEFAULT_EXT)
90
+
91
+ time_now = Time.now.utc.iso8601
92
+ file_data = {}
93
+ file_data['meta'] = {
94
+ 'name' => name,
95
+ 'description' => '',
96
+ 'created_at' => time_now,
97
+ 'updated_at' => time_now
98
+ }
99
+ file_data['data'] = nil
100
+ unless File.exist? filepath
101
+ File.open(filepath, 'w') do |f|
102
+ f.write file_data.to_yaml
103
+ f.chmod(0600)
104
+ end
105
+ else
106
+ raise "Unable to create a new store at #{filepath}. One already exists."
107
+ end
108
+ bag name
109
+ end
110
+
111
+ def self.parse_arg_string(arg_string, options={})
112
+
113
+ mode = options[:token_mode] || :default
114
+
115
+ case mode
116
+ when :unstable
117
+ arg_re = /(?<key>\w*)\=(?<value>.*)/
118
+ nvp = arg_re.match(arg_string)
119
+ when :default
120
+ parsed = arg_string.partition('=')
121
+ if parsed[1] == '='
122
+ nvp = { key: parsed[0], value: parsed[2] }
123
+ else
124
+ # Consider: adding token_mode to error message
125
+ raise "unable to create a key/value pair from #{arg_string}"
126
+ end
127
+ else
128
+ raise "parse_arg_string unsupported mode #{mode}"
129
+ end
130
+ nvp
131
+ end
132
+
133
+
134
+ # ----------------------------------------------
135
+
136
+ # Some inspiration:
137
+ # http://stackoverflow.com/questions/2680523/dry-ruby-initialization-with-hash-argument
138
+ #
139
+ # TODO: add handling so that keys (hierarchical keys too) are accessed as members instead of
140
+ # hash access
141
+ #
142
+ # TODO: move to own file, rename to "Bag"
143
+ # TODO: i18n error messages
144
+ #
145
+ class Keyper
146
+
147
+ attr_reader :keypdir, :dirty
148
+ attr_accessor :name, :data, :file_hash
149
+
150
+ def config_path
151
+ File.join(@keypdir, @name)
152
+ end
153
+
154
+ # We expect
155
+ # I'm not happy with how creating instance variables works. There must be a cleaner way
156
+ def initialize(name, options = {})
157
+ @name = name
158
+ options.each do |k,v|
159
+ puts "processing options #{k} = #{v}"
160
+ instance_variable_set("@#{k}", v) unless v.nil?
161
+ end
162
+ # set attributes not set by params
163
+
164
+ @keypdir ||= Keyp::KEYP_HOME
165
+ @read_only ||= false
166
+ @ext ||= '.yml'
167
+ @keypfile = config_path+@ext
168
+ # load our resource
169
+
170
+ # load config file into hashes
171
+ # not the most efficient thing, but simpler and safe enough for now
172
+
173
+ unless File.exist? @keypfile
174
+ puts "Keuper.initialize, create_store #{@keypfile}"
175
+ Keyp::create_store(@keypfile)
176
+ end
177
+ file_data = load(@keypfile)
178
+
179
+ @meta = file_data[:meta]
180
+ @data = file_data[:data]|| {}
181
+ @file_hash = file_data[:file_hash]
182
+ @dirty = false
183
+ end
184
+
185
+ def [](key)
186
+ @data[key]
187
+ end
188
+
189
+ def []=(key, value)
190
+ set_prop(key, value)
191
+ end
192
+
193
+ def set_prop(key, value)
194
+ unless @read_only
195
+ # TODO: check if data has been modified
196
+ # maybe there is a way hash tells us its been modified. If not then
197
+ # just check if key,val is already in hash and matches
198
+ @data[key] = value
199
+ @dirty = true
200
+ else
201
+ raise "Keyper #{@name} is read only"
202
+ end
203
+ end
204
+
205
+ def delete(key)
206
+ unless @read_only
207
+ if @data.key? key
208
+ @dirty = true
209
+ end
210
+ val = @data.delete(key)
211
+ else
212
+ raise "Bag #{@name} is read only"
213
+ end
214
+ val
215
+ end
216
+
217
+ def empty?
218
+ @data.empty?
219
+ end
220
+
221
+ # Give full path, attempt to load
222
+ # sticking with YAML format for now
223
+ # May add new file format later in which case we'll
224
+ # TODO: consider changing to class method
225
+ def load (config_path)
226
+ #config_data = {}
227
+ # Get extension
228
+ file_ext = File.extname(config_path)
229
+
230
+ # check
231
+ # only YAML supported for initial version. Will consider adapters to
232
+ # abstract the persistence layer
233
+
234
+
235
+ # TODO: make this hardcoded case a hash of helpers
236
+ # TODO: Add two sections: Meta and data, then return as hash
237
+
238
+ if file_ext.downcase == '.yml'
239
+
240
+ # Either we are arbitrarily creating directories when
241
+ # given a path for a file that doesn't exist
242
+ # or we have special behavior for the default dir
243
+ # or we just fault and let the caller deal with it
244
+ unless File.exist? config_path
245
+ raise "Keyp config file not found: #{config_path}"
246
+ end
247
+
248
+ file_data = YAML.load_file(config_path)
249
+
250
+ else
251
+ raise "Keyp version x only supports YAML for config files. You tried a #{file_ext}"
252
+ end
253
+ { meta: file_data['meta'], data: file_data['data']||{}, file_hash: file_data.hash }
254
+ end
255
+
256
+ # NOT thread safe
257
+ # TODO: make thread safe
258
+ def save
259
+ if @read_only
260
+ raise "This bag instance is read only"
261
+ end
262
+ if @dirty
263
+ # lock file
264
+ # read checksum
265
+ # if checksum matches our saved checksum then update file and release lock
266
+ # otherwise, raise
267
+ # TODO: implement merge from updated file and raise only if conflict
268
+ begin
269
+ file_data = { 'meta' => @meta, 'data' => @data }
270
+
271
+ if File.exist? @keypfile
272
+ read_file_data = load(@keypfile)
273
+ unless @file_hash == read_file_data[:file_hash]
274
+ raise "Will not write to #{@keypfile}\nHashes differ. Expected hash =#{@file_hash}\n" +
275
+ "found hash #{read_file_data[:file_hash]}"
276
+ end
277
+ end
278
+ File.open(@keypfile, 'w') do |f|
279
+ f.write file_data.to_yaml
280
+ end
281
+ @dirty = false
282
+ rescue
283
+ # TODO: log error
284
+
285
+ end
286
+ end
287
+ end
288
+ end
289
+
290
+
291
+ # Hmm, do we really need this or can we suffice with the meta hash in the bag
292
+ class Meta
293
+ attr_accessor :name, :description, :created, :updated
294
+ def initialize(hash, options = {})
295
+
296
+ end
297
+ end
298
+ end
data/spec/keyp_spec.rb ADDED
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
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
+
9
+ it 'should return correct default keyp dir' do
10
+ # DEFAULT_KEYP_DIRNAME = ENV['KEYP_DIRNAME'] || '.keyp'
11
+ Keyp::KEYP_HOME.should == File.join(ENV['HOME'], '.keyp')
12
+ end
13
+
14
+ it 'should specify default store' do
15
+ Keyp::DEFAULT_STORE.should == 'default'
16
+ end
17
+ it 'should specify default store file' do
18
+ Keyp::DEFAULT_STORE_FILE.should == 'default.yml'
19
+ end
20
+
21
+ it 'should be able to override default keyp dir'
22
+
23
+ it 'should return default bag' do
24
+ keyper = Keyp::bag
25
+ keyper.bag.should == 'default'
26
+ end
27
+
28
+ it 'should return a key with data member'
29
+ it 'should return a key acting as a hash'
30
+ it 'should allow assigning a key if not read only'
31
+ it 'should not allow assigning a key if read only'
32
+ it 'should set the dirty flag if a new key is created'
33
+ it 'should set the dirty flag if a key is given a new value'
34
+ it 'should not set the dirty flag if a key is assigned a value equal to its existing value'
35
+
36
+ # Braindump of tests
37
+ # Should show no keys if empty bag
38
+ # should create default.yml if .keyp already exists but default.yml does not when run from command line
39
+ end
@@ -0,0 +1,7 @@
1
+ require 'rspec'
2
+ require 'keyp'
3
+
4
+ RSpec.configure do |config|
5
+ config.color_enabled = true
6
+ config.formatter = 'documentation'
7
+ end
metadata ADDED
@@ -0,0 +1,115 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: keyp
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - John Baldwin
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-03-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.5'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.5'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '10.1'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '10.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: gli
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '2.9'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '2.9'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '2.14'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '2.14'
69
+ description: https://github.com/johnbaldwin/keyp-ruby
70
+ email:
71
+ - jlbaldwin@gmail.com
72
+ executables:
73
+ - keyp
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - .gitignore
78
+ - Gemfile
79
+ - LICENSE
80
+ - README.md
81
+ - Rakefile
82
+ - bin/keyp
83
+ - keyp.gemspec
84
+ - lib/keyp.rb
85
+ - lib/keyp/cli.rb
86
+ - lib/keyp/version.rb
87
+ - spec/keyp_spec.rb
88
+ - spec/spec_helper.rb
89
+ homepage: https://github.com/johnbaldwin/keyp-ruby
90
+ licenses:
91
+ - Apache v2
92
+ metadata: {}
93
+ post_install_message:
94
+ rdoc_options: []
95
+ require_paths:
96
+ - lib
97
+ required_ruby_version: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ required_rubygems_version: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - '>='
105
+ - !ruby/object:Gem::Version
106
+ version: '0'
107
+ requirements: []
108
+ rubyforge_project:
109
+ rubygems_version: 2.2.1
110
+ signing_key:
111
+ specification_version: 4
112
+ summary: https://github.com/johnbaldwin/keyp-ruby
113
+ test_files:
114
+ - spec/keyp_spec.rb
115
+ - spec/spec_helper.rb