key_store 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 +7 -0
- data/lib/key_store.rb +55 -0
- data/lib/key_store/key.rb +52 -0
- data/lib/key_store/version.rb +3 -0
- data/test/key_store_test.rb +45 -0
- data/test/key_test.rb +84 -0
- data/test/test_helper.rb +2 -0
- metadata +96 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d9f84301f0857cc3b7b0090b554914a680ada02b
|
4
|
+
data.tar.gz: 49de7e8df07c0730d79fbbca051742e282956abe
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 79b5ad463d132b39486f9fa7e82150f764861d74823b1e3595b8c7ae2c43001939c3394038edb8728407b91208c3c238415db5691c0a820aabc7cd82f86e5fb5
|
7
|
+
data.tar.gz: 76f666c6ca5375da6e83df7b01f162182bb354142a3ef9626f418a97c639082993ae93f2c840bdd472be1e1ef7cbb38c4c46b55dd8cc492ac71edcf4ba1046da
|
data/lib/key_store.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
require "yaml/store"
|
2
|
+
require "thread"
|
3
|
+
require "fileutils"
|
4
|
+
require_relative "key_store/key"
|
5
|
+
require_relative "key_store/version"
|
6
|
+
|
7
|
+
module KeyStore
|
8
|
+
|
9
|
+
class << self
|
10
|
+
|
11
|
+
attr_reader :file_path
|
12
|
+
|
13
|
+
def set_file_path(value)
|
14
|
+
@file_path = value
|
15
|
+
end
|
16
|
+
|
17
|
+
def file
|
18
|
+
if @file.nil? || modified?
|
19
|
+
Mutex.new.synchronize do
|
20
|
+
@file = begin
|
21
|
+
raise "file_path not set" if file_path.nil?
|
22
|
+
FileUtils.touch(file_path) unless File.exists?(file_path)
|
23
|
+
self.mtime = File.mtime(file_path)
|
24
|
+
YAML::Store.new(file_path, true)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
@file
|
29
|
+
end
|
30
|
+
|
31
|
+
def exists?(name)
|
32
|
+
!!(file.transaction { file[name.to_s] })
|
33
|
+
end
|
34
|
+
|
35
|
+
def find(name)
|
36
|
+
exists?(name) ? KeyStore::Key.new(name) : nil
|
37
|
+
end
|
38
|
+
|
39
|
+
def delete!(name)
|
40
|
+
file.transaction { file.delete(name.to_s) }
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
attr_accessor :mtime
|
46
|
+
|
47
|
+
def modified?
|
48
|
+
return true if mtime.nil? || !File.exists?(file_path)
|
49
|
+
File.mtime(file_path) != mtime
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require "forwardable"
|
2
|
+
|
3
|
+
module KeyStore
|
4
|
+
class Key
|
5
|
+
extend Forwardable
|
6
|
+
|
7
|
+
def_delegators :KeyStore, :file, :exists?
|
8
|
+
attr_reader :name, :roles
|
9
|
+
attr_accessor :notes
|
10
|
+
alias_method :to_s, :name
|
11
|
+
|
12
|
+
def initialize(name, roles: nil, notes: nil)
|
13
|
+
@name = name.to_s
|
14
|
+
|
15
|
+
if exists?(name)
|
16
|
+
set_roles_from_file if roles.nil?
|
17
|
+
set_notes_from_file if notes.nil?
|
18
|
+
end
|
19
|
+
|
20
|
+
@roles ||= (roles || []).map(&:to_s)
|
21
|
+
@notes ||= notes.to_s
|
22
|
+
end
|
23
|
+
|
24
|
+
def http_header
|
25
|
+
"Authorization: Token token=\"#{name}\""
|
26
|
+
end
|
27
|
+
|
28
|
+
def save!
|
29
|
+
file.transaction do
|
30
|
+
file[name] ||= {}
|
31
|
+
file[name][:roles] = roles.map(&:to_s)
|
32
|
+
file[name][:notes] = notes.to_s
|
33
|
+
file[name][:http_header] = http_header
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def set_roles_from_file
|
40
|
+
file.transaction do
|
41
|
+
@roles = file[name][:roles]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def set_notes_from_file
|
46
|
+
file.transaction do
|
47
|
+
@notes = file[name][:notes]
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require_relative "test_helper"
|
2
|
+
|
3
|
+
class KeyStoreTest < MicroTest::Test
|
4
|
+
|
5
|
+
before do
|
6
|
+
@file_path = File.expand_path("../keys.yml", __FILE__)
|
7
|
+
KeyStore.set_file_path @file_path
|
8
|
+
KeyStore.delete!(:foobar)
|
9
|
+
end
|
10
|
+
|
11
|
+
test "set_file_path" do
|
12
|
+
assert KeyStore.file_path == @file_path
|
13
|
+
end
|
14
|
+
|
15
|
+
test "file errors with nil file_path" do
|
16
|
+
KeyStore.instance_eval do
|
17
|
+
@file_path = @file = nil
|
18
|
+
end
|
19
|
+
|
20
|
+
begin
|
21
|
+
assert KeyStore.file
|
22
|
+
rescue Exception => e
|
23
|
+
error = e
|
24
|
+
end
|
25
|
+
|
26
|
+
assert !error.nil?
|
27
|
+
end
|
28
|
+
|
29
|
+
test "file success with valid file_path" do
|
30
|
+
assert KeyStore.file
|
31
|
+
end
|
32
|
+
|
33
|
+
test "unknown key does not exist" do
|
34
|
+
assert KeyStore.exists?(:foobar) == false
|
35
|
+
end
|
36
|
+
|
37
|
+
test "find returns nil on unknown key" do
|
38
|
+
assert KeyStore.find(:foobar).nil?
|
39
|
+
end
|
40
|
+
|
41
|
+
test "ok to call delete! on unknown key" do
|
42
|
+
assert KeyStore.delete!(:foobar).nil?
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
data/test/key_test.rb
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
require_relative "test_helper"
|
2
|
+
|
3
|
+
class KeyTest < MicroTest::Test
|
4
|
+
|
5
|
+
before do
|
6
|
+
@file_path = File.expand_path("../keys.yml", __FILE__)
|
7
|
+
KeyStore.set_file_path @file_path
|
8
|
+
KeyStore.delete!(:foobar)
|
9
|
+
end
|
10
|
+
|
11
|
+
test "name set on initialize" do
|
12
|
+
key = KeyStore::Key.new(:foobar)
|
13
|
+
assert key.name == "foobar"
|
14
|
+
end
|
15
|
+
|
16
|
+
test "initialize doesn't save key" do
|
17
|
+
assert KeyStore.exists?(:foobar) == false
|
18
|
+
KeyStore::Key.new(:foobar)
|
19
|
+
assert KeyStore.exists?(:foobar) == false
|
20
|
+
end
|
21
|
+
|
22
|
+
test "initialize with roles" do
|
23
|
+
roles = [:foo, :bar, :baz]
|
24
|
+
key = KeyStore::Key.new(:foobar, roles: roles)
|
25
|
+
assert key.roles == roles.map(&:to_s)
|
26
|
+
end
|
27
|
+
|
28
|
+
test "initialize with notes" do
|
29
|
+
notes = "There are notes."
|
30
|
+
key = KeyStore::Key.new(:foobar, notes: notes)
|
31
|
+
assert key.notes == notes
|
32
|
+
end
|
33
|
+
|
34
|
+
test "http_header after initialize" do
|
35
|
+
key = KeyStore::Key.new(:foobar)
|
36
|
+
assert key.http_header == "Authorization: Token token=\"foobar\""
|
37
|
+
end
|
38
|
+
|
39
|
+
test "basic save" do
|
40
|
+
key = KeyStore::Key.new(:foobar)
|
41
|
+
key.save!
|
42
|
+
assert KeyStore.exists?(:foobar)
|
43
|
+
end
|
44
|
+
|
45
|
+
test "save with roles" do
|
46
|
+
roles = [:foo, :bar, :baz]
|
47
|
+
key = KeyStore::Key.new(:foobar, roles: roles)
|
48
|
+
key.save!
|
49
|
+
key = KeyStore.find(:foobar)
|
50
|
+
assert key.roles == roles.map(&:to_s)
|
51
|
+
end
|
52
|
+
|
53
|
+
test "save with notes" do
|
54
|
+
notes = "There are notes."
|
55
|
+
key = KeyStore::Key.new(:foobar, notes: notes)
|
56
|
+
key.save!
|
57
|
+
key = KeyStore.find(:foobar)
|
58
|
+
assert key.notes == notes
|
59
|
+
end
|
60
|
+
|
61
|
+
test "append roles & multiple saves" do
|
62
|
+
key = KeyStore::Key.new(:foobar, roles: [:foo])
|
63
|
+
key.save!
|
64
|
+
key = KeyStore.find(:foobar)
|
65
|
+
key.roles << :bar
|
66
|
+
key.roles << :baz
|
67
|
+
key.save!
|
68
|
+
key = KeyStore.find(:foobar)
|
69
|
+
assert key.roles == [:foo, :bar, :baz].map(&:to_s)
|
70
|
+
end
|
71
|
+
|
72
|
+
test "update notes" do
|
73
|
+
key = KeyStore::Key.new(:foobar, notes: "note 1")
|
74
|
+
key.save!
|
75
|
+
key = KeyStore.find(:foobar)
|
76
|
+
assert key.notes == "note 1"
|
77
|
+
key.notes = "note 2"
|
78
|
+
key.save!
|
79
|
+
key = KeyStore.find(:foobar)
|
80
|
+
assert key.notes == "note 2"
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
|
data/test/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: key_store
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.3
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Nathan Hopkins
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-02-12 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.3'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: micro_test
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.4.0
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.4.0
|
55
|
+
description: A simple api-key storage engine
|
56
|
+
email:
|
57
|
+
- natehop@gmail.com
|
58
|
+
executables: []
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- lib/key_store/key.rb
|
63
|
+
- lib/key_store/version.rb
|
64
|
+
- lib/key_store.rb
|
65
|
+
- test/key_store_test.rb
|
66
|
+
- test/key_test.rb
|
67
|
+
- test/test_helper.rb
|
68
|
+
homepage: https://github.com/hopsoft/key_store
|
69
|
+
licenses:
|
70
|
+
- MIT
|
71
|
+
metadata: {}
|
72
|
+
post_install_message:
|
73
|
+
rdoc_options: []
|
74
|
+
require_paths:
|
75
|
+
- lib
|
76
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
77
|
+
requirements:
|
78
|
+
- - '>='
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: 2.0.0
|
81
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
82
|
+
requirements:
|
83
|
+
- - '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
requirements: []
|
87
|
+
rubyforge_project:
|
88
|
+
rubygems_version: 2.0.3
|
89
|
+
signing_key:
|
90
|
+
specification_version: 4
|
91
|
+
summary: A simple api-key storage engine
|
92
|
+
test_files:
|
93
|
+
- test/key_store_test.rb
|
94
|
+
- test/key_test.rb
|
95
|
+
- test/test_helper.rb
|
96
|
+
has_rdoc:
|