cleversafe 1.0.7 → 1.1.10
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/Gemfile +2 -0
- data/Gemfile.lock +34 -0
- data/README.md +30 -0
- data/Rakefile +11 -0
- data/cleversafe-1.1.10.gem +0 -0
- data/cleversafe-1.1.11.gem +0 -0
- data/cleversafe-1.1.12.gem +0 -0
- data/cleversafe.gemspec +16 -0
- data/lib/cleversafe/connection.rb +16 -66
- data/lib/cleversafe/errors.rb +2 -1
- data/lib/cleversafe/http_client.rb +42 -0
- data/lib/cleversafe/object.rb +30 -35
- data/lib/cleversafe/vault.rb +32 -21
- data/lib/cleversafe.rb +13 -9
- data/test/connection_test.rb +7 -0
- data/test/http_client_test.rb +14 -0
- data/test/lib/cleversafe/test_helper.rb +6 -0
- data/test/object_test.rb +19 -0
- data/test/vault_test.rb +18 -0
- metadata +105 -51
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 18677c6a6c521554741f3af8d8d1cb1b758e14c8
|
4
|
+
data.tar.gz: 13fc121e700597895df533e32cbc72235332ff6e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d50d22d53a7d2d1876d0a9827d34c5f7a6b2bf5d5106b35c52c7961cd5cd6c1ca383160946af8f602971e536156800cdefa7c7b6c4a586c563730ee53160329a
|
7
|
+
data.tar.gz: c94b1bdce16240613f90d1d2668fccd99f311650192c1aaf0ff75d9861a88eb8fce820a9e496e39d702e6c701936b26174445267de75ae71b835c6aa946931ad
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
cleversafe (1.1.10)
|
5
|
+
json
|
6
|
+
rest-client (~> 1.6)
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: https://rubygems.org/
|
10
|
+
specs:
|
11
|
+
addressable (2.3.7)
|
12
|
+
crack (0.4.2)
|
13
|
+
safe_yaml (~> 1.0.0)
|
14
|
+
json (1.8.2)
|
15
|
+
mime-types (2.4.3)
|
16
|
+
minitest (5.5.1)
|
17
|
+
netrc (0.10.2)
|
18
|
+
rake (10.4.2)
|
19
|
+
rest-client (1.7.3)
|
20
|
+
mime-types (>= 1.16, < 3.0)
|
21
|
+
netrc (~> 0.7)
|
22
|
+
safe_yaml (1.0.4)
|
23
|
+
webmock (1.20.4)
|
24
|
+
addressable (>= 2.3.6)
|
25
|
+
crack (>= 0.3.2)
|
26
|
+
|
27
|
+
PLATFORMS
|
28
|
+
ruby
|
29
|
+
|
30
|
+
DEPENDENCIES
|
31
|
+
cleversafe!
|
32
|
+
minitest (~> 5)
|
33
|
+
rake
|
34
|
+
webmock (~> 1.7)
|
data/README.md
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# Cleversafe SOH
|
2
|
+
|
3
|
+
## Description
|
4
|
+
This is a Ruby interface into the Cleversafe's SOH API.
|
5
|
+
|
6
|
+
## Notes
|
7
|
+
* Multipart uploads are not supported by Cleversafe's API. Coming soon.
|
8
|
+
* If you upload a file with "X-Digest" you will get back a hash that includes :id and :x_content_digest.
|
9
|
+
|
10
|
+
## Todo
|
11
|
+
* Support range requests for getting an object
|
12
|
+
|
13
|
+
## Usage
|
14
|
+
|
15
|
+
```ruby
|
16
|
+
# Connect to Cleversafe
|
17
|
+
connection = Cleversafe::Connection.new('http://127.0.0.1:1234')
|
18
|
+
|
19
|
+
# Open a vault
|
20
|
+
vault = connection.vault('pictures')
|
21
|
+
|
22
|
+
# Upload, download, delete
|
23
|
+
key = vault.create_object(open('~/cat.jpg'))
|
24
|
+
|
25
|
+
vault[key].exists?
|
26
|
+
vault[key].size
|
27
|
+
vault[key].open { |io| ... }
|
28
|
+
vault[key].delete
|
29
|
+
|
30
|
+
```
|
data/Rakefile
ADDED
Binary file
|
Binary file
|
Binary file
|
data/cleversafe.gemspec
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = "cleversafe"
|
3
|
+
s.summary = "A Ruby API into Cleversafe's REST interface."
|
4
|
+
s.author = "John Williams"
|
5
|
+
s.email = "john@37signals.com"
|
6
|
+
s.version = "1.1.10"
|
7
|
+
|
8
|
+
s.add_dependency 'json'
|
9
|
+
s.add_dependency 'rest-client', '~> 1.6'
|
10
|
+
|
11
|
+
s.add_development_dependency 'rake'
|
12
|
+
s.add_development_dependency 'minitest', '~> 5'
|
13
|
+
s.add_development_dependency 'webmock', '~> 1.7'
|
14
|
+
|
15
|
+
s.files = Dir["#{File.dirname(__FILE__)}/**/*"]
|
16
|
+
end
|
@@ -1,83 +1,33 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'forwardable'
|
3
|
+
|
1
4
|
module Cleversafe
|
2
5
|
class Connection
|
3
|
-
|
4
|
-
attr_accessor :password
|
5
|
-
attr_accessor :host
|
6
|
-
attr_accessor :protocol
|
7
|
-
attr_accessor :vault
|
8
|
-
attr_accessor :method
|
6
|
+
extend Forwardable
|
9
7
|
|
10
|
-
|
11
|
-
if args[0].is_a?(Hash)
|
12
|
-
options = args[0]
|
13
|
-
@username = options[:username]
|
14
|
-
@password = options[:password]
|
15
|
-
@host = options[:host]
|
16
|
-
@protocol = options[:protocol] || "http"
|
17
|
-
@open_timeout = options[:open_timeout] || 10
|
18
|
-
else
|
19
|
-
@username = args[0]
|
20
|
-
@password = args[1]
|
21
|
-
@host = args[2]
|
22
|
-
@protocol = args[3] || "http"
|
23
|
-
@open_timeout = args[4] || 10
|
24
|
-
end
|
8
|
+
def_delegators :@http, :url, :url_for, :get, :head, :put, :delete
|
25
9
|
|
26
|
-
|
27
|
-
|
28
|
-
end
|
29
|
-
return @connection
|
10
|
+
def initialize(url, options = {})
|
11
|
+
@http = Cleversafe::HttpClient.new(url, options)
|
30
12
|
end
|
31
13
|
|
32
|
-
def
|
33
|
-
|
34
|
-
|
14
|
+
def ping
|
15
|
+
head '/'
|
16
|
+
true
|
17
|
+
rescue Exception
|
18
|
+
false
|
35
19
|
end
|
36
20
|
|
37
|
-
def
|
38
|
-
|
21
|
+
def status
|
22
|
+
JSON.parse(get('/').to_s)
|
39
23
|
end
|
40
24
|
|
41
|
-
def
|
42
|
-
|
43
|
-
host = options.fetch(:host, @host)
|
44
|
-
|
45
|
-
"#{protocol}://#{host}/#{vault}/#{objectname}"
|
25
|
+
def vaults
|
26
|
+
status['vaults'].map { |v| v['vault_name'] }
|
46
27
|
end
|
47
28
|
|
48
29
|
def vault(name)
|
49
30
|
Cleversafe::Vault.new(self, name)
|
50
31
|
end
|
51
|
-
|
52
|
-
def vaults
|
53
|
-
vaults = JSON.parse(get(nil))['vaults']
|
54
|
-
vaults.collect{|v| v['vault_name']}
|
55
|
-
end
|
56
|
-
|
57
|
-
def vault_exists?(vault_name)
|
58
|
-
begin
|
59
|
-
response = get(vault_name)
|
60
|
-
true
|
61
|
-
rescue => e
|
62
|
-
false
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
def get(path, options = {})
|
67
|
-
@connection[path].get options
|
68
|
-
end
|
69
|
-
|
70
|
-
def head(path, options = {})
|
71
|
-
@connection[path].head options
|
72
|
-
end
|
73
|
-
|
74
|
-
def put(path, payload, options = {})
|
75
|
-
@connection[path].put payload, options
|
76
|
-
end
|
77
|
-
|
78
|
-
def delete(path)
|
79
|
-
@connection[path].delete
|
80
|
-
end
|
81
|
-
|
82
32
|
end
|
83
33
|
end
|
data/lib/cleversafe/errors.rb
CHANGED
@@ -0,0 +1,42 @@
|
|
1
|
+
module Cleversafe
|
2
|
+
class HttpClient
|
3
|
+
DEFAULTS = { :timeout => nil, :open_timeout => nil }
|
4
|
+
|
5
|
+
attr_reader :url
|
6
|
+
|
7
|
+
def initialize(url, options = {})
|
8
|
+
@url = url
|
9
|
+
@defaults = DEFAULTS.merge(options)
|
10
|
+
end
|
11
|
+
|
12
|
+
def url_for(*path)
|
13
|
+
File.join(url, *path)
|
14
|
+
end
|
15
|
+
|
16
|
+
def head(path, options = {})
|
17
|
+
request :head, path, options
|
18
|
+
end
|
19
|
+
|
20
|
+
def get(path, options = {})
|
21
|
+
request :get, path, options
|
22
|
+
end
|
23
|
+
|
24
|
+
def post(path, payload, options = {})
|
25
|
+
request :post, path, options.merge(:payload => payload)
|
26
|
+
end
|
27
|
+
|
28
|
+
def put(path, payload, options = {})
|
29
|
+
request :put, path, options.merge(:payload => payload)
|
30
|
+
end
|
31
|
+
|
32
|
+
def delete(path, options = {})
|
33
|
+
request :delete, path, options
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
def request(method, path, options = {})
|
38
|
+
options = @defaults.merge(options).merge(:method => method, :url => url_for(path))
|
39
|
+
RestClient::Request.execute(options)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/lib/cleversafe/object.rb
CHANGED
@@ -1,61 +1,61 @@
|
|
1
1
|
require 'fileutils'
|
2
|
+
require 'cgi'
|
2
3
|
|
3
4
|
module Cleversafe
|
4
5
|
class Object
|
5
6
|
|
6
|
-
attr_reader :
|
7
|
-
attr_reader :vault
|
7
|
+
attr_reader :vault, :key, :connection
|
8
8
|
|
9
|
-
def initialize(vault,
|
10
|
-
|
11
|
-
@
|
9
|
+
def initialize(vault, key)
|
10
|
+
raise ArgumentError, "key is required" unless key =~ /\S/
|
11
|
+
@vault = vault
|
12
|
+
@key = key
|
12
13
|
@connection = vault.connection
|
13
14
|
end
|
14
15
|
|
15
|
-
def
|
16
|
-
|
16
|
+
def path
|
17
|
+
"#{vault.path}/#{CGI.escape(key)}"
|
18
|
+
end
|
19
|
+
|
20
|
+
def url
|
21
|
+
connection.url_for(path)
|
17
22
|
end
|
18
23
|
|
19
24
|
def delete
|
20
25
|
handle_errors do
|
21
|
-
|
26
|
+
connection.delete(path)
|
22
27
|
end
|
23
28
|
end
|
24
29
|
|
25
30
|
def exists?
|
26
31
|
metadata
|
27
32
|
true
|
28
|
-
rescue
|
33
|
+
rescue Errors::NotFound
|
29
34
|
false
|
30
35
|
end
|
31
36
|
|
32
|
-
def data(options={})
|
33
|
-
|
34
|
-
@connection.get("#{@vault}/#{@name}", options).to_s
|
35
|
-
end
|
37
|
+
def data(options = {})
|
38
|
+
open(options) { |io| io.read }
|
36
39
|
end
|
37
40
|
|
38
|
-
def open(options={})
|
41
|
+
def open(options = {})
|
39
42
|
handle_errors do
|
40
|
-
response =
|
43
|
+
response = connection.get(path, options.merge(:raw_response => true))
|
41
44
|
begin
|
42
|
-
|
45
|
+
file = response.file
|
46
|
+
file.open
|
47
|
+
file.binmode
|
48
|
+
yield file
|
43
49
|
ensure
|
44
|
-
|
50
|
+
file.unlink
|
45
51
|
end
|
46
52
|
end
|
47
53
|
end
|
48
54
|
|
49
|
-
def write_to(filename, options={})
|
50
|
-
handle_errors do
|
51
|
-
response = @connection.get("#{@vault}/#{@name}", options)
|
52
|
-
FileUtils.cp(response.file.path, filename)
|
53
|
-
FileUtils.rm(response.file.path)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
55
|
def metadata
|
58
|
-
@metadata ||= handle_errors
|
56
|
+
@metadata ||= handle_errors do
|
57
|
+
connection.head(path).headers
|
58
|
+
end
|
59
59
|
end
|
60
60
|
|
61
61
|
def etag
|
@@ -67,15 +67,10 @@ module Cleversafe
|
|
67
67
|
end
|
68
68
|
|
69
69
|
private
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
if (e.http_code.to_s == "404")
|
75
|
-
raise Error::NotFound, "object `#{@name}' does not exist", caller[0..-2]
|
76
|
-
else
|
77
|
-
raise
|
70
|
+
def handle_errors
|
71
|
+
yield
|
72
|
+
rescue RestClient::ResourceNotFound
|
73
|
+
raise Cleversafe::Errors::NotFound, "object `#{key}' does not exist", caller[0..-2]
|
78
74
|
end
|
79
|
-
end
|
80
75
|
end
|
81
76
|
end
|
data/lib/cleversafe/vault.rb
CHANGED
@@ -1,45 +1,56 @@
|
|
1
|
+
require 'cgi'
|
2
|
+
|
1
3
|
module Cleversafe
|
2
4
|
class Vault
|
3
|
-
|
4
|
-
attr_reader :name
|
5
|
-
attr_reader :connection
|
5
|
+
attr_reader :connection, :name, :path
|
6
6
|
|
7
7
|
def initialize(connection, name)
|
8
8
|
@connection = connection
|
9
9
|
@name = name
|
10
|
+
@path = CGI.escape name
|
10
11
|
end
|
11
12
|
|
12
13
|
def metadata
|
13
|
-
@metadata ||= JSON.parse(
|
14
|
+
@metadata ||= JSON.parse(connection.get(path).to_s)
|
14
15
|
end
|
15
16
|
|
16
|
-
def
|
17
|
-
metadata['vault_usage']
|
17
|
+
def usage
|
18
|
+
metadata['vault_usage']
|
18
19
|
end
|
19
20
|
|
20
|
-
def object(
|
21
|
-
Cleversafe::Object.new(self,
|
21
|
+
def object(key)
|
22
|
+
Cleversafe::Object.new(self, key)
|
22
23
|
end
|
23
24
|
alias [] object
|
24
25
|
|
25
|
-
def objects(
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
26
|
+
def objects(options = {})
|
27
|
+
headers = {}
|
28
|
+
|
29
|
+
headers['X-Operation'] = 'list'
|
30
|
+
headers['X-Start-Id'] = options[:start_id] if options[:start_id]
|
31
|
+
headers['X-List-Length-Limit'] = options[:limit] if options[:limit]
|
32
|
+
|
33
|
+
connection.get(path, :headers => headers).to_s.split("\n")
|
31
34
|
end
|
32
35
|
|
33
36
|
def create_object(payload, options = {})
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
37
|
+
handle_errors do
|
38
|
+
response = connection.put(path, payload, options)
|
39
|
+
id = response.to_s.strip
|
40
|
+
|
41
|
+
if response.headers[:x_content_digest]
|
42
|
+
{ :id => id, :x_content_digest => response.headers[:x_content_digest] }
|
43
|
+
else
|
44
|
+
id
|
45
|
+
end
|
41
46
|
end
|
42
47
|
end
|
43
48
|
|
49
|
+
private
|
50
|
+
def handle_errors
|
51
|
+
yield
|
52
|
+
rescue RestClient::MethodNotAllowed
|
53
|
+
raise Cleversafe::Errors::VaultMisconfigured, "Vault has not been added to accessers.", caller[0..-2]
|
54
|
+
end
|
44
55
|
end
|
45
56
|
end
|
data/lib/cleversafe.rb
CHANGED
@@ -1,10 +1,14 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
require 'cleversafe/connection'
|
2
|
+
require 'cleversafe/http_client'
|
3
|
+
require 'cleversafe/vault'
|
4
|
+
require 'cleversafe/object'
|
5
|
+
require 'cleversafe/errors'
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
require 'rest-client'
|
8
|
+
|
9
|
+
# Monkeypatch RestClient to prevent it from closing IO objects after they're
|
10
|
+
# uploaded, which it really shouldn't do.
|
11
|
+
class RestClient::Payload::Streamed
|
12
|
+
def close
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'cleversafe/test_helper'
|
2
|
+
|
3
|
+
class HttpClientTest < Minitest::Test
|
4
|
+
def test_url_for
|
5
|
+
client = Cleversafe::HttpClient.new('http://example.com')
|
6
|
+
|
7
|
+
assert_equal 'http://example.com/', client.url_for('')
|
8
|
+
assert_equal 'http://example.com/', client.url_for('/')
|
9
|
+
assert_equal 'http://example.com/a/b', client.url_for('/a/b')
|
10
|
+
assert_equal 'http://example.com/a/b', client.url_for('a/b')
|
11
|
+
assert_equal 'http://example.com/a/b', client.url_for('a', 'b')
|
12
|
+
assert_equal 'http://example.com/a%2Fb', client.url_for('a%2Fb')
|
13
|
+
end
|
14
|
+
end
|
data/test/object_test.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'cleversafe/test_helper'
|
2
|
+
|
3
|
+
class ObjectTest < Minitest::Test
|
4
|
+
def setup
|
5
|
+
connection = Cleversafe::Connection.new('http://test.host')
|
6
|
+
@vault = Cleversafe::Vault.new(connection, 'test_vault')
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_name_is_required
|
10
|
+
assert_raises ArgumentError do
|
11
|
+
Cleversafe::Object.new(@vault, '')
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_path_is_escaped
|
16
|
+
object = Cleversafe::Object.new(@vault, 'foo/bar[1].png')
|
17
|
+
assert_equal 'test_vault/foo%2Fbar%5B1%5D.png', object.path
|
18
|
+
end
|
19
|
+
end
|
data/test/vault_test.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'cleversafe/test_helper'
|
2
|
+
|
3
|
+
class VaultTest < Minitest::Test
|
4
|
+
def setup
|
5
|
+
@connection = Cleversafe::Connection.new('http://test.host')
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_path_is_escaped
|
9
|
+
assert_equal 'test%2Fvault', Cleversafe::Vault.new(@connection, 'test/vault').path
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_vault_is_configured_correctly
|
13
|
+
stub_request(:put, "http://test.host/assets").with(:body => "foo").to_return(:status => 405, :body => "", :headers => {})
|
14
|
+
vault = Cleversafe::Vault.new(@connection, 'assets')
|
15
|
+
error = assert_raises(Cleversafe::Errors::VaultMisconfigured) { vault.create_object('foo') }
|
16
|
+
assert_equal 'Vault has not been added to accessers.', error.message
|
17
|
+
end
|
18
|
+
end
|
metadata
CHANGED
@@ -1,77 +1,131 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: cleversafe
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
segments:
|
6
|
-
- 1
|
7
|
-
- 0
|
8
|
-
- 7
|
9
|
-
version: 1.0.7
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.1.10
|
10
5
|
platform: ruby
|
11
|
-
authors:
|
6
|
+
authors:
|
12
7
|
- John Williams
|
13
8
|
autorequire:
|
14
9
|
bindir: bin
|
15
10
|
cert_chain: []
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
11
|
+
date: 2022-07-13 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: json
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
22
21
|
prerelease: false
|
23
|
-
|
24
|
-
requirements:
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
25
24
|
- - ">="
|
26
|
-
- !ruby/object:Gem::Version
|
27
|
-
|
28
|
-
|
29
|
-
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rest-client
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.6'
|
30
34
|
type: :runtime
|
31
|
-
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.6'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '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'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: minitest
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '5'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '5'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: webmock
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1.7'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '1.7'
|
32
83
|
description:
|
33
84
|
email: john@37signals.com
|
34
85
|
executables: []
|
35
|
-
|
36
86
|
extensions: []
|
37
|
-
|
38
87
|
extra_rdoc_files: []
|
39
|
-
|
40
|
-
|
41
|
-
-
|
42
|
-
-
|
43
|
-
-
|
44
|
-
-
|
45
|
-
-
|
46
|
-
|
88
|
+
files:
|
89
|
+
- "./Gemfile"
|
90
|
+
- "./Gemfile.lock"
|
91
|
+
- "./README.md"
|
92
|
+
- "./Rakefile"
|
93
|
+
- "./cleversafe-1.1.10.gem"
|
94
|
+
- "./cleversafe-1.1.11.gem"
|
95
|
+
- "./cleversafe-1.1.12.gem"
|
96
|
+
- "./cleversafe.gemspec"
|
97
|
+
- "./lib/cleversafe.rb"
|
98
|
+
- "./lib/cleversafe/connection.rb"
|
99
|
+
- "./lib/cleversafe/errors.rb"
|
100
|
+
- "./lib/cleversafe/http_client.rb"
|
101
|
+
- "./lib/cleversafe/object.rb"
|
102
|
+
- "./lib/cleversafe/vault.rb"
|
103
|
+
- "./test/connection_test.rb"
|
104
|
+
- "./test/http_client_test.rb"
|
105
|
+
- "./test/lib/cleversafe/test_helper.rb"
|
106
|
+
- "./test/object_test.rb"
|
107
|
+
- "./test/vault_test.rb"
|
47
108
|
homepage:
|
48
109
|
licenses: []
|
49
|
-
|
110
|
+
metadata: {}
|
50
111
|
post_install_message:
|
51
112
|
rdoc_options: []
|
52
|
-
|
53
|
-
require_paths:
|
113
|
+
require_paths:
|
54
114
|
- lib
|
55
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
56
|
-
requirements:
|
115
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
116
|
+
requirements:
|
57
117
|
- - ">="
|
58
|
-
- !ruby/object:Gem::Version
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
63
|
-
requirements:
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '0'
|
120
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
64
122
|
- - ">="
|
65
|
-
- !ruby/object:Gem::Version
|
66
|
-
|
67
|
-
- 0
|
68
|
-
version: "0"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
69
125
|
requirements: []
|
70
|
-
|
71
126
|
rubyforge_project:
|
72
|
-
rubygems_version:
|
127
|
+
rubygems_version: 2.5.2
|
73
128
|
signing_key:
|
74
|
-
specification_version:
|
129
|
+
specification_version: 4
|
75
130
|
summary: A Ruby API into Cleversafe's REST interface.
|
76
131
|
test_files: []
|
77
|
-
|