cleversafe 1.0.8 → 1.1.11

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 8f03c57c69ee3a91b75c581ef1242bace7254961
4
+ data.tar.gz: 1d0c163b97b2edf66159fd87cfe5486a8c1829db
5
+ SHA512:
6
+ metadata.gz: 0df80cd07ed30340690fedd24e2f8bd9090816b4b2a5f888d7bd7d9cd7f846c43f12c718c1bd2f268c654bb0e846bc817c252384a3b113c10b3f3c04ea2f0bd7
7
+ data.tar.gz: 4224dae346c95382b6a88c335c2e7a841097ae747fe88d85b49581d1196f63e3d5a47d2944981549852ed1ad5fcbab7bf7749216de5d12c00c4e8ab767ba5046
data/Gemfile CHANGED
@@ -1,2 +1,2 @@
1
- source :rubygems
2
- gemspec
1
+ source 'https://rubygems.org'
2
+ gemspec
data/Gemfile.lock CHANGED
@@ -1,18 +1,34 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- cleversafe (1.0.7)
5
- rest-client (~> 1.6.7)
4
+ cleversafe (1.1.11)
5
+ json
6
+ rest-client (>= 1.6.8)
6
7
 
7
8
  GEM
8
- remote: http://rubygems.org/
9
+ remote: https://rubygems.org/
9
10
  specs:
10
- mime-types (1.22)
11
- rest-client (1.6.7)
12
- mime-types (>= 1.16)
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)
13
26
 
14
27
  PLATFORMS
15
28
  ruby
16
29
 
17
30
  DEPENDENCIES
18
31
  cleversafe!
32
+ minitest (~> 5)
33
+ rake
34
+ webmock (~> 1.7)
data/README.md CHANGED
@@ -10,47 +10,21 @@ This is a Ruby interface into the Cleversafe's SOH API.
10
10
  ## Todo
11
11
  * Support range requests for getting an object
12
12
 
13
- ## Examples
13
+ ## Usage
14
14
 
15
15
  ```ruby
16
- #Setup Conection
17
- request = Cleversafe::Connection.new("USERNAME", "PASSWORD", "HOSTNAME")
16
+ # Connect to Cleversafe
17
+ connection = Cleversafe::Connection.new('http://127.0.0.1:1234')
18
18
 
19
- #Does a vault exist?
20
- request.vault_exists?("VAULTNAME")
19
+ # Open a vault
20
+ vault = connection.vault('pictures')
21
21
 
22
- # load vault
23
- vault = request.vault("VAULTNAME")
22
+ # Upload, download, delete
23
+ key = vault.create_object(open('~/cat.jpg'))
24
24
 
25
- # bytes used in vault
26
- vault.bytes_used
27
-
28
- # list objects in vault
29
- vault.objects(:limit => 10, :start_id => "1f1665dce23b515cedf29edaf1d033730000")
30
-
31
- # load object
32
- object = "1f1665dce23b515cedf29edaf1d033730000"
33
-
34
- # get etag of object
35
- vault.object(object).etag
36
-
37
- # download object
38
- File.open("downloaded.file", 'w') {|f| f.write(vault.object(object).data) }
39
-
40
- # upload object, don't use multipart, it is not supported
41
- uploaded_object = vault.create_object File.new("upload.file", "r"), :multipart => false, 'X-Digest' => "md5"
42
-
43
- # uploaded object's digest
44
- uploaded_object[:id]
45
-
46
- # object's digest
47
- uploaded_object[:x_content_digest]
48
-
49
- # uploaded object exists?
50
- vault.object_exists?(uploaded_object[:id])
51
-
52
- # deleting the uploaded object
53
- vault.delete_object(uploaded_object[:id])
25
+ vault[key].exists?
26
+ vault[key].size
27
+ vault[key].open { |io| ... }
28
+ vault[key].delete
54
29
 
55
30
  ```
56
-
data/Rakefile CHANGED
@@ -1,4 +1,11 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'rake'
1
4
  require 'rake/testtask'
2
5
 
3
- Rake::TestTask.new
4
- task :default => :test
6
+ task :default => :test
7
+
8
+ Rake::TestTask.new do |t|
9
+ t.libs << 'test/lib'
10
+ t.pattern = 'test/*_test.rb'
11
+ end
Binary file
data/cleversafe.gemspec CHANGED
@@ -3,9 +3,14 @@ Gem::Specification.new do |s|
3
3
  s.summary = "A Ruby API into Cleversafe's REST interface."
4
4
  s.author = "John Williams"
5
5
  s.email = "john@37signals.com"
6
- s.version = "1.0.8"
6
+ s.version = "1.1.11"
7
7
 
8
- s.add_dependency 'rest-client', '~> 1.6.7'
8
+ s.add_dependency 'json'
9
+ s.add_dependency 'rest-client', '>= 1.6.8'
10
+
11
+ s.add_development_dependency 'rake'
12
+ s.add_development_dependency 'minitest', '~> 5'
13
+ s.add_development_dependency 'webmock', '~> 1.7'
9
14
 
10
15
  s.files = Dir["#{File.dirname(__FILE__)}/**/*"]
11
16
  end
@@ -1,75 +1,33 @@
1
+ require 'json'
2
+ require 'forwardable'
3
+
1
4
  module Cleversafe
2
5
  class Connection
3
- attr_reader :username, :password, :host, :protocol, :open_timeout
4
-
5
- def initialize(*args)
6
- if args[0].is_a?(Hash)
7
- options = args[0]
8
- @username = options[:username]
9
- @password = options[:password]
10
- @host = options[:host]
11
- @protocol = options[:protocol] || "http"
12
- @open_timeout = options[:open_timeout] || 10
13
- else
14
- @username = args[0]
15
- @password = args[1]
16
- @host = args[2]
17
- @protocol = args[3] || "http"
18
- @open_timeout = args[4] || 10
19
- end
20
- end
21
-
22
- def base_url
23
- "#{protocol}://#{host}/"
24
- end
6
+ extend Forwardable
25
7
 
26
- def url_for(vault, objectname, options={})
27
- protocol = options.fetch(:protocol, protocol)
28
- host = options.fetch(:host, host)
29
-
30
- "#{protocol}://#{host}/#{vault}/#{objectname}"
31
- end
32
-
33
- def vault(name)
34
- Cleversafe::Vault.new(self, name)
35
- end
8
+ def_delegators :@http, :url, :url_for, :get, :head, :put, :delete
36
9
 
37
- def vaults
38
- vaults = JSON.parse(get(nil))['vaults']
39
- vaults.collect{|v| v['vault_name']}
10
+ def initialize(url, options = {})
11
+ @http = Cleversafe::HttpClient.new(url, options)
40
12
  end
41
13
 
42
- def vault_exists?(vault_name)
43
- get(vault_name)
14
+ def ping
15
+ head '/'
44
16
  true
45
- rescue RestClient::ResourceNotFound
17
+ rescue Exception
46
18
  false
47
19
  end
48
20
 
49
- def get(path, options = {})
50
- connection[path].get options
51
- end
52
-
53
- def head(path, options = {})
54
- connection[path].head options
21
+ def status
22
+ JSON.parse(get('/').to_s)
55
23
  end
56
24
 
57
- def put(path, payload, options = {})
58
- connection[path].put payload, options
25
+ def vaults
26
+ status['vaults'].map { |v| v['vault_name'] }
59
27
  end
60
28
 
61
- def delete(path)
62
- connection[path].delete
29
+ def vault(name)
30
+ Cleversafe::Vault.new(self, name)
63
31
  end
64
-
65
- private
66
- def connection
67
- @connection ||= RestClient::Resource.new(base_url,
68
- :user => username,
69
- :password => password,
70
- :open_timeout => open_timeout,
71
- :raw_response => true
72
- )
73
- end
74
32
  end
75
33
  end
@@ -2,5 +2,6 @@ module Cleversafe
2
2
  module Errors
3
3
  class Base < RuntimeError; end
4
4
  class NotFound < Base; end
5
+ class VaultMisconfigured < Base; end
5
6
  end
6
7
  end
@@ -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
@@ -1,27 +1,29 @@
1
1
  require 'fileutils'
2
+ require 'cgi'
2
3
 
3
4
  module Cleversafe
4
5
  class Object
5
6
 
6
- attr_reader :connection, :vault, :name
7
+ attr_reader :vault, :key, :connection
7
8
 
8
- def initialize(vault, name = {})
9
+ def initialize(vault, key)
10
+ raise ArgumentError, "key is required" unless key =~ /\S/
11
+ @vault = vault
12
+ @key = key
9
13
  @connection = vault.connection
10
- @vault = vault.name
11
- @name = name
12
14
  end
13
15
 
14
- def key
15
- "#{vault}/#{name}"
16
+ def path
17
+ "#{vault.path}/#{CGI.escape(key)}"
16
18
  end
17
19
 
18
- def url(options={})
19
- connection.url_for(vault, name, options)
20
+ def url
21
+ connection.url_for(path)
20
22
  end
21
23
 
22
24
  def delete
23
25
  handle_errors do
24
- connection.delete(key)
26
+ connection.delete(path)
25
27
  end
26
28
  end
27
29
 
@@ -32,34 +34,27 @@ module Cleversafe
32
34
  false
33
35
  end
34
36
 
35
- def data(options={})
36
- handle_errors do
37
- connection.get(key, options).to_s
38
- end
37
+ def data(options = {})
38
+ open(options) { |io| io.read }
39
39
  end
40
40
 
41
- def open(options={})
41
+ def open(options = {})
42
42
  handle_errors do
43
- response = connection.get(key, options)
43
+ response = connection.get(path, options.merge(:raw_response => true))
44
44
  begin
45
- yield response.file.open
45
+ file = response.file
46
+ file.open
47
+ file.binmode
48
+ yield file
46
49
  ensure
47
- response.file.unlink
50
+ file.unlink
48
51
  end
49
52
  end
50
53
  end
51
54
 
52
- def write_to(filename, options={})
53
- handle_errors do
54
- response = connection.get(key, options)
55
- FileUtils.cp(response.file.path, filename)
56
- FileUtils.rm(response.file.path)
57
- end
58
- end
59
-
60
55
  def metadata
61
56
  @metadata ||= handle_errors do
62
- connection.head(key).headers
57
+ connection.head(path).headers
63
58
  end
64
59
  end
65
60
 
@@ -72,11 +67,10 @@ module Cleversafe
72
67
  end
73
68
 
74
69
  private
75
-
76
- def handle_errors
77
- yield
78
- rescue RestClient::ResourceNotFound
79
- raise Cleversafe::Errors::NotFound, "object `#{name}' does not exist", caller[0..-2]
80
- end
70
+ def handle_errors
71
+ yield
72
+ rescue RestClient::ResourceNotFound
73
+ raise Cleversafe::Errors::NotFound, "object `#{key}' does not exist", caller[0..-2]
74
+ end
81
75
  end
82
76
  end
@@ -1,43 +1,56 @@
1
+ require 'cgi'
2
+
1
3
  module Cleversafe
2
4
  class Vault
3
- attr_reader :connection, :name
5
+ attr_reader :connection, :name, :path
4
6
 
5
7
  def initialize(connection, name)
6
8
  @connection = connection
7
9
  @name = name
10
+ @path = CGI.escape name
8
11
  end
9
12
 
10
13
  def metadata
11
- @metadata ||= JSON.parse(connection.get(name))
14
+ @metadata ||= JSON.parse(connection.get(path).to_s)
12
15
  end
13
16
 
14
- def bytes_used
15
- metadata['vault_usage']['used_size']
17
+ def usage
18
+ metadata['vault_usage']
16
19
  end
17
20
 
18
- def object(objectname)
19
- Cleversafe::Object.new(self, objectname)
21
+ def object(key)
22
+ Cleversafe::Object.new(self, key)
20
23
  end
21
24
  alias [] object
22
25
 
23
- def objects(params = {})
24
- options = {}
25
- options['X-Operation'] = "list"
26
- options['X-List-Length-Limit'] = params[:limit] if params[:limit]
27
- options['X-Start-Id'] = params[:start_id] if params[:start_id]
28
- connection.get(name, options).to_s.split("\n")
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")
29
34
  end
30
35
 
31
36
  def create_object(payload, options = {})
32
- response = connection.put(name, payload, options)
33
- id = response.to_s.strip
34
-
35
- if response.headers[:x_content_digest]
36
- { :id => id, :x_content_digest => response.headers[:x_content_digest] }
37
- else
38
- id
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
39
46
  end
40
47
  end
41
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
42
55
  end
43
56
  end
data/lib/cleversafe.rb CHANGED
@@ -1,7 +1,14 @@
1
- require 'rest-client'
2
- require 'json'
3
-
4
- require 'cleversafe/errors'
1
+ require 'cleversafe/connection'
2
+ require 'cleversafe/http_client'
5
3
  require 'cleversafe/vault'
6
4
  require 'cleversafe/object'
7
- require 'cleversafe/connection'
5
+ require 'cleversafe/errors'
6
+
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,7 @@
1
+ require 'cleversafe/test_helper'
2
+
3
+ class ConnectionTest < Minitest::Test
4
+ def test_truth
5
+ assert true
6
+ end
7
+ 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
@@ -0,0 +1,6 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'cleversafe'
4
+
5
+ require 'minitest/autorun'
6
+ require 'webmock/minitest'
@@ -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
@@ -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,85 +1,129 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: cleversafe
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 1
7
- - 0
8
- - 8
9
- version: 1.0.8
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.11
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
- date: 2013-04-16 00:00:00 -05:00
18
- default_executable:
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
21
- name: rest-client
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
- requirement: &id001 !ruby/object:Gem::Requirement
24
- requirements:
25
- - - ~>
26
- - !ruby/object:Gem::Version
27
- segments:
28
- - 1
29
- - 6
30
- - 7
31
- version: 1.6.7
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
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.8
32
34
  type: :runtime
33
- version_requirements: *id001
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 1.6.8
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'
34
83
  description:
35
84
  email: john@37signals.com
36
85
  executables: []
37
-
38
86
  extensions: []
39
-
40
87
  extra_rdoc_files: []
41
-
42
- files:
43
- - ./cleversafe-1.0.7.gem
44
- - ./cleversafe.gemspec
45
- - ./Gemfile
46
- - ./Gemfile.lock
47
- - ./lib/cleversafe/connection.rb
48
- - ./lib/cleversafe/errors.rb
49
- - ./lib/cleversafe/object.rb
50
- - ./lib/cleversafe/vault.rb
51
- - ./lib/cleversafe.rb
52
- - ./Rakefile
53
- - ./README.md
54
- has_rdoc: true
88
+ files:
89
+ - "./Gemfile"
90
+ - "./Gemfile.lock"
91
+ - "./README.md"
92
+ - "./Rakefile"
93
+ - "./cleversafe-1.1.12.gem"
94
+ - "./cleversafe.gemspec"
95
+ - "./lib/cleversafe.rb"
96
+ - "./lib/cleversafe/connection.rb"
97
+ - "./lib/cleversafe/errors.rb"
98
+ - "./lib/cleversafe/http_client.rb"
99
+ - "./lib/cleversafe/object.rb"
100
+ - "./lib/cleversafe/vault.rb"
101
+ - "./test/connection_test.rb"
102
+ - "./test/http_client_test.rb"
103
+ - "./test/lib/cleversafe/test_helper.rb"
104
+ - "./test/object_test.rb"
105
+ - "./test/vault_test.rb"
55
106
  homepage:
56
107
  licenses: []
57
-
108
+ metadata: {}
58
109
  post_install_message:
59
110
  rdoc_options: []
60
-
61
- require_paths:
111
+ require_paths:
62
112
  - lib
63
- required_ruby_version: !ruby/object:Gem::Requirement
64
- requirements:
113
+ required_ruby_version: !ruby/object:Gem::Requirement
114
+ requirements:
65
115
  - - ">="
66
- - !ruby/object:Gem::Version
67
- segments:
68
- - 0
69
- version: "0"
70
- required_rubygems_version: !ruby/object:Gem::Requirement
71
- requirements:
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ required_rubygems_version: !ruby/object:Gem::Requirement
119
+ requirements:
72
120
  - - ">="
73
- - !ruby/object:Gem::Version
74
- segments:
75
- - 0
76
- version: "0"
121
+ - !ruby/object:Gem::Version
122
+ version: '0'
77
123
  requirements: []
78
-
79
124
  rubyforge_project:
80
- rubygems_version: 1.3.6
125
+ rubygems_version: 2.5.2
81
126
  signing_key:
82
- specification_version: 3
127
+ specification_version: 4
83
128
  summary: A Ruby API into Cleversafe's REST interface.
84
129
  test_files: []
85
-
data/cleversafe-1.0.7.gem DELETED
Binary file