vault 0.1.0 → 0.1.1
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/.gitignore +41 -0
- data/.rspec +2 -0
- data/.travis.yml +6 -0
- data/CHANGELOG.md +5 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +32 -0
- data/LICENSE +362 -0
- data/README.md +80 -54
- data/Rakefile +4 -40
- data/lib/vault.rb +33 -46
- data/lib/vault/api.rb +9 -0
- data/lib/vault/api/auth_token.rb +90 -0
- data/lib/vault/api/help.rb +23 -0
- data/lib/vault/api/logical.rb +66 -0
- data/lib/vault/api/secret.rb +23 -0
- data/lib/vault/api/sys.rb +24 -0
- data/lib/vault/api/sys/audit.rb +60 -0
- data/lib/vault/api/sys/auth.rb +58 -0
- data/lib/vault/api/sys/init.rb +46 -0
- data/lib/vault/api/sys/leader.rb +25 -0
- data/lib/vault/api/sys/lease.rb +51 -0
- data/lib/vault/api/sys/mount.rb +75 -0
- data/lib/vault/api/sys/policy.rb +76 -0
- data/lib/vault/api/sys/seal.rb +49 -0
- data/lib/vault/client.rb +285 -0
- data/lib/vault/configurable.rb +48 -0
- data/lib/vault/defaults.rb +68 -0
- data/lib/vault/errors.rb +48 -0
- data/lib/vault/request.rb +19 -0
- data/lib/vault/response.rb +20 -0
- data/lib/vault/version.rb +1 -6
- data/vault.gemspec +25 -0
- metadata +97 -98
- data/MIT-LICENSE +0 -20
- data/lib/vault/associations.rb +0 -39
- data/lib/vault/attribute_accessors.rb +0 -29
- data/lib/vault/bulk_attributes.rb +0 -17
- data/lib/vault/dirty.rb +0 -37
- data/lib/vault/finders.rb +0 -24
- data/lib/vault/persistance.rb +0 -47
- data/lib/vault/properties.rb +0 -68
- data/lib/vault/scoping.rb +0 -64
- data/lib/vault/storage.rb +0 -4
- data/lib/vault/storage/in_memory_store.rb +0 -14
- data/lib/vault/storage/yaml_store.rb +0 -52
- data/lib/vault/validations.rb +0 -13
- data/spec/active_model_compliance_spec.rb +0 -33
- data/spec/spec_helper.rb +0 -8
- data/spec/support/helpers.rb +0 -16
- data/spec/support/storage_api.rb +0 -14
- data/spec/vault/associations_spec.rb +0 -73
- data/spec/vault/finders_spec.rb +0 -69
- data/spec/vault/persistance_spec.rb +0 -126
- data/spec/vault/properties_spec.rb +0 -59
- data/spec/vault/scoping_spec.rb +0 -53
- data/spec/vault/storage/in_memory_store_spec.rb +0 -5
- data/spec/vault/storage/yaml_store_spec.rb +0 -29
- data/spec/vault_spec.rb +0 -33
data/lib/vault/dirty.rb
DELETED
@@ -1,37 +0,0 @@
|
|
1
|
-
module Vault
|
2
|
-
module Dirty
|
3
|
-
extend ActiveSupport::Concern
|
4
|
-
|
5
|
-
included do
|
6
|
-
include ActiveModel::Dirty
|
7
|
-
end
|
8
|
-
|
9
|
-
def save(*)
|
10
|
-
super.tap do |saved|
|
11
|
-
if saved
|
12
|
-
if attribute_changed?(self.class.key)
|
13
|
-
self.class.store.delete(attribute_was(self.class.key))
|
14
|
-
end
|
15
|
-
|
16
|
-
@previously_changed = changes
|
17
|
-
changed_attributes.clear
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def write_attribute(name, value)
|
23
|
-
name = name.to_s
|
24
|
-
|
25
|
-
if attribute_changed?(name)
|
26
|
-
old = changed_attributes[name]
|
27
|
-
changed_attributes.delete(name) if old == value
|
28
|
-
else
|
29
|
-
old = read_attribute(name)
|
30
|
-
old = old.dup if old.duplicable?
|
31
|
-
changed_attributes[name] = old if old != value
|
32
|
-
end
|
33
|
-
|
34
|
-
super(name, value)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
data/lib/vault/finders.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
module Vault
|
2
|
-
module Finders
|
3
|
-
delegate :size, :to => :store
|
4
|
-
alias_method :count, :size
|
5
|
-
|
6
|
-
def all(query={})
|
7
|
-
query.delete(key)
|
8
|
-
store.filter(query).map do |key_value, properties|
|
9
|
-
build(key_value, properties)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
def [](key_value)
|
14
|
-
properties = store[key_value]
|
15
|
-
build(key_value, properties) if properties
|
16
|
-
end
|
17
|
-
|
18
|
-
private
|
19
|
-
|
20
|
-
def build(key_value, properties)
|
21
|
-
new(properties.update(key => key_value))
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
data/lib/vault/persistance.rb
DELETED
@@ -1,47 +0,0 @@
|
|
1
|
-
module Vault
|
2
|
-
module Persistance
|
3
|
-
extend ActiveSupport::Concern
|
4
|
-
|
5
|
-
included do
|
6
|
-
cattr_accessor :store
|
7
|
-
extend Storage
|
8
|
-
|
9
|
-
store_objects_in Vault::Storage::InMemoryStore.new
|
10
|
-
end
|
11
|
-
|
12
|
-
module Storage
|
13
|
-
def store_objects_in(store)
|
14
|
-
self.store = store
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def initialize(*)
|
19
|
-
@_new = true
|
20
|
-
@_destroyed = false
|
21
|
-
super
|
22
|
-
end
|
23
|
-
|
24
|
-
def persisted?
|
25
|
-
!@_new && !@_destroyed
|
26
|
-
end
|
27
|
-
|
28
|
-
def save(run_validations=true)
|
29
|
-
return false if run_validations && !valid?
|
30
|
-
self.class.store[key] = attributes_except_key
|
31
|
-
@_new = false
|
32
|
-
true
|
33
|
-
end
|
34
|
-
|
35
|
-
def destroy
|
36
|
-
self.class.store.delete(key)
|
37
|
-
@_destroyed = true
|
38
|
-
freeze
|
39
|
-
end
|
40
|
-
|
41
|
-
private
|
42
|
-
|
43
|
-
def attributes_except_key
|
44
|
-
attributes.except(self.class.key)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
data/lib/vault/properties.rb
DELETED
@@ -1,68 +0,0 @@
|
|
1
|
-
module Vault
|
2
|
-
module Properties
|
3
|
-
def key(key=nil)
|
4
|
-
return @_key if key.nil?
|
5
|
-
@_key = property(key, true).name
|
6
|
-
end
|
7
|
-
|
8
|
-
def property(name, primary=false, &block)
|
9
|
-
Property.new(name, primary, &block).tap do |prop|
|
10
|
-
properties << prop
|
11
|
-
define_property_methods(prop.name)
|
12
|
-
|
13
|
-
# FIXME: Ugh, ActiveModel fails with this, I can't do incremental method
|
14
|
-
# definition, you have to define them all at once (so undefine/define
|
15
|
-
# each time if you don't know all the properties upfront, like here.)
|
16
|
-
undefine_attribute_methods
|
17
|
-
define_attribute_methods(property_names)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def properties
|
22
|
-
@_properties ||= Set.new
|
23
|
-
end
|
24
|
-
|
25
|
-
def property_names
|
26
|
-
properties.map(&:name)
|
27
|
-
end
|
28
|
-
|
29
|
-
def define_property_methods(name)
|
30
|
-
class_eval <<-ruby, __FILE__, __LINE__
|
31
|
-
def #{name}
|
32
|
-
read_attribute(:#{name})
|
33
|
-
end
|
34
|
-
|
35
|
-
def #{name}=(value)
|
36
|
-
write_attribute(:#{name}, value)
|
37
|
-
end
|
38
|
-
ruby
|
39
|
-
end
|
40
|
-
|
41
|
-
class Property
|
42
|
-
attr_reader :name
|
43
|
-
|
44
|
-
def initialize(name, primary=false, &default)
|
45
|
-
@name = name.to_s
|
46
|
-
@default = default || lambda {}
|
47
|
-
@primary = primary
|
48
|
-
end
|
49
|
-
|
50
|
-
def primary?
|
51
|
-
@primary
|
52
|
-
end
|
53
|
-
|
54
|
-
def default
|
55
|
-
@default.call
|
56
|
-
end
|
57
|
-
|
58
|
-
# Set requires both #hash and #eql? to check for inclusion
|
59
|
-
def hash # :nodoc:
|
60
|
-
name.hash
|
61
|
-
end
|
62
|
-
|
63
|
-
def eql?(other) # :nodoc:
|
64
|
-
name == other.name
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
data/lib/vault/scoping.rb
DELETED
@@ -1,64 +0,0 @@
|
|
1
|
-
module Vault
|
2
|
-
module Scoping
|
3
|
-
extend ActiveSupport::Concern
|
4
|
-
|
5
|
-
def scopes
|
6
|
-
@_scopes ||= Hash.new
|
7
|
-
end
|
8
|
-
|
9
|
-
def scope(name, &conditions)
|
10
|
-
name = name.to_s
|
11
|
-
scopes[name] = Scope.new(self, conditions.call)
|
12
|
-
define_scope_method(name)
|
13
|
-
end
|
14
|
-
|
15
|
-
private
|
16
|
-
|
17
|
-
def define_scope_method(name)
|
18
|
-
singleton_class.instance_eval do
|
19
|
-
define_method name do
|
20
|
-
scopes[name]
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
class Scope
|
26
|
-
include Finders
|
27
|
-
|
28
|
-
delegate :new, :key, :model_name, :to => :model
|
29
|
-
|
30
|
-
attr_reader :conditions, :model
|
31
|
-
|
32
|
-
def initialize(model, conditions)
|
33
|
-
@model = model
|
34
|
-
@conditions = conditions.stringify_keys
|
35
|
-
end
|
36
|
-
|
37
|
-
def store
|
38
|
-
@store ||= @model.store.filter(conditions)
|
39
|
-
end
|
40
|
-
|
41
|
-
def method_missing(method, *)
|
42
|
-
if model_has_scope?(method)
|
43
|
-
merge(model.scopes[method.to_s])
|
44
|
-
else
|
45
|
-
super
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
def respond_to?(method, include_private=false)
|
50
|
-
model_has_scope?(method) || super
|
51
|
-
end
|
52
|
-
|
53
|
-
private
|
54
|
-
|
55
|
-
def model_has_scope?(name)
|
56
|
-
model.scopes.include?(name.to_s)
|
57
|
-
end
|
58
|
-
|
59
|
-
def merge(scope)
|
60
|
-
Scope.new(model, conditions.merge(scope.conditions))
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
data/lib/vault/storage.rb
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
module Vault
|
2
|
-
module Storage
|
3
|
-
class InMemoryStore < Hash
|
4
|
-
def filter(query)
|
5
|
-
return self if query.blank?
|
6
|
-
|
7
|
-
inject(InMemoryStore.new) do |result, (key, properties)|
|
8
|
-
result[key] = properties if properties.merge(query) == properties
|
9
|
-
result
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
@@ -1,52 +0,0 @@
|
|
1
|
-
require "yaml"
|
2
|
-
require "active_support/core_ext/module/delegation"
|
3
|
-
|
4
|
-
module Vault
|
5
|
-
module Storage
|
6
|
-
class YamlStore
|
7
|
-
include Enumerable
|
8
|
-
|
9
|
-
delegate :[], :[]=, :size, :each, :delete, :to => :doc
|
10
|
-
|
11
|
-
def initialize(file=nil)
|
12
|
-
@file = file
|
13
|
-
at_exit { flush if @file.present? }
|
14
|
-
end
|
15
|
-
|
16
|
-
def initialize_copy(*)
|
17
|
-
@file = nil
|
18
|
-
end
|
19
|
-
|
20
|
-
def filter(query)
|
21
|
-
return filtered_copy(@doc) if query.blank?
|
22
|
-
|
23
|
-
results = doc.inject(ActiveSupport::OrderedHash.new) do |result, (key, properties)|
|
24
|
-
result[key] = properties if properties.merge(query) == properties
|
25
|
-
result
|
26
|
-
end
|
27
|
-
|
28
|
-
filtered_copy(results)
|
29
|
-
end
|
30
|
-
|
31
|
-
def flush
|
32
|
-
File.open(@file, "w+") {|f| YAML.dump(@doc, f) }
|
33
|
-
end
|
34
|
-
|
35
|
-
protected
|
36
|
-
|
37
|
-
def doc=(doc)
|
38
|
-
@doc = doc
|
39
|
-
end
|
40
|
-
|
41
|
-
private
|
42
|
-
|
43
|
-
def filtered_copy(doc)
|
44
|
-
dup.tap {|store| store.doc = doc }
|
45
|
-
end
|
46
|
-
|
47
|
-
def doc
|
48
|
-
@doc ||= ActiveSupport::OrderedHash.new(YAML.load_file(@file))
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
data/lib/vault/validations.rb
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
describe "ActiveModel compliance" do
|
4
|
-
class Person
|
5
|
-
include Vault
|
6
|
-
|
7
|
-
key :id
|
8
|
-
property :first_name
|
9
|
-
property :last_name
|
10
|
-
end
|
11
|
-
|
12
|
-
include ActiveModel::Lint::Tests
|
13
|
-
|
14
|
-
instance_methods.grep(/^test_/).each do |method|
|
15
|
-
it method.gsub("_", " ").gsub(/to (\w+)/, 'to_\1') do
|
16
|
-
send method
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
private
|
21
|
-
|
22
|
-
def model
|
23
|
-
Person.new
|
24
|
-
end
|
25
|
-
|
26
|
-
def assert(cond, msg=nil)
|
27
|
-
flunk msg unless cond
|
28
|
-
end
|
29
|
-
|
30
|
-
def assert_kind_of(kind, object, msg=nil)
|
31
|
-
flunk msg unless object.kind_of?(kind)
|
32
|
-
end
|
33
|
-
end
|
data/spec/spec_helper.rb
DELETED
data/spec/support/helpers.rb
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
module SpecHelpers
|
2
|
-
def model(&block)
|
3
|
-
Class.new do
|
4
|
-
include Vault
|
5
|
-
class_eval(&block) if block
|
6
|
-
end
|
7
|
-
end
|
8
|
-
|
9
|
-
def named_model(name, &block)
|
10
|
-
model = model(&block)
|
11
|
-
self.class.class_eval do
|
12
|
-
remove_const(name) if const_defined?(name)
|
13
|
-
const_set(name, model)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
data/spec/support/storage_api.rb
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
shared_examples_for "A storage adapter" do
|
2
|
-
it { should respond_to(:size) }
|
3
|
-
it { should respond_to(:delete) }
|
4
|
-
it { should respond_to(:[]) }
|
5
|
-
it { should respond_to(:[]=) }
|
6
|
-
|
7
|
-
it { should respond_to(:each) }
|
8
|
-
it { should be_an(Enumerable) }
|
9
|
-
|
10
|
-
it { should respond_to(:filter) }
|
11
|
-
it "is closed under #filter" do
|
12
|
-
subject.filter({}).should be_a(described_class)
|
13
|
-
end
|
14
|
-
end
|
@@ -1,73 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
describe Vault, "model" do
|
4
|
-
class Book
|
5
|
-
include Vault
|
6
|
-
key :title
|
7
|
-
has_many :authors
|
8
|
-
end
|
9
|
-
|
10
|
-
class Author
|
11
|
-
include Vault
|
12
|
-
key :name
|
13
|
-
belongs_to :book
|
14
|
-
end
|
15
|
-
|
16
|
-
let(:pickaxe_book) { Book.new(:title => "Programming Ruby") }
|
17
|
-
|
18
|
-
let(:dave_thomas) { Author.new(:name => "Dave Thomas") }
|
19
|
-
let(:chad_fowler) { Author.new(:name => "Chad Fowler") }
|
20
|
-
let(:andy_hunt) { Author.new(:name => "Andy Hunt") }
|
21
|
-
let(:sam_ruby) { Author.new(:name => "Sam Ruby") }
|
22
|
-
|
23
|
-
describe ".belongs_to" do
|
24
|
-
before do
|
25
|
-
dave_thomas.save
|
26
|
-
pickaxe_book.save
|
27
|
-
end
|
28
|
-
|
29
|
-
it "can assign the associated object directly" do
|
30
|
-
dave_thomas.book = pickaxe_book
|
31
|
-
dave_thomas.book.should == pickaxe_book
|
32
|
-
end
|
33
|
-
|
34
|
-
it "can assign the key" do
|
35
|
-
dave_thomas.book_key = pickaxe_book.key
|
36
|
-
dave_thomas.book.should == pickaxe_book
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
describe ".has_many" do
|
41
|
-
before do
|
42
|
-
dave_thomas.book = pickaxe_book
|
43
|
-
chad_fowler.book = pickaxe_book
|
44
|
-
|
45
|
-
dave_thomas.save
|
46
|
-
chad_fowler.save
|
47
|
-
|
48
|
-
pickaxe_book.save
|
49
|
-
end
|
50
|
-
|
51
|
-
subject { pickaxe_book.authors.all }
|
52
|
-
|
53
|
-
it "can find all associated objects" do
|
54
|
-
should include(dave_thomas, chad_fowler)
|
55
|
-
end
|
56
|
-
|
57
|
-
it "doesn't find objects that haven't been associated to the model" do
|
58
|
-
should_not include(sam_ruby)
|
59
|
-
end
|
60
|
-
|
61
|
-
context "adding objects directly to the association" do
|
62
|
-
it "persists both the container and containee" do
|
63
|
-
pickaxe_book.authors << andy_hunt
|
64
|
-
should include(andy_hunt)
|
65
|
-
end
|
66
|
-
|
67
|
-
it "can chain additions" do
|
68
|
-
pickaxe_book.authors << andy_hunt << sam_ruby
|
69
|
-
should include(andy_hunt, sam_ruby)
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|