cleversafe 1.1.3 → 1.1.12

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: 23cdeb4413138a140c55c5acc0212e31a314e24d
4
+ data.tar.gz: 7f48cd073f7d718acab1c7e5d777a467be03f606
5
+ SHA512:
6
+ metadata.gz: fd07fddb0146cccbb6dcc80f86e80a7d17ed89c38890ad8898f36e44431717891fead101761783d5faee20804a1dca4835cd701705f84d7c476e868818812d66
7
+ data.tar.gz: a159ddfba16c2861efa06cf34eff9dd59863a5da1b545bfb5a90579fe15cc8b85a91f16109140a5b01ea8503687e8f871507dc40e560fe653a2dba783a143bcf
data/Gemfile CHANGED
@@ -1,2 +1,2 @@
1
- source :rubygems
2
- gemspec
1
+ source 'https://rubygems.org'
2
+ gemspec
data/Gemfile.lock CHANGED
@@ -1,24 +1,34 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- cleversafe (1.1.1)
4
+ cleversafe (1.1.12)
5
5
  json
6
- rest-client (~> 1.6.7)
6
+ rest-client (>= 1.6.8)
7
7
 
8
8
  GEM
9
- remote: http://rubygems.org/
9
+ remote: https://rubygems.org/
10
10
  specs:
11
- json (1.7.7)
12
- mime-types (1.23)
13
- minitest (4.5.0)
14
- rake (10.0.3)
15
- rest-client (1.6.7)
16
- 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)
17
26
 
18
27
  PLATFORMS
19
28
  ruby
20
29
 
21
30
  DEPENDENCIES
22
31
  cleversafe!
23
- minitest
32
+ minitest (~> 5)
24
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/cleversafe.gemspec CHANGED
@@ -3,13 +3,16 @@ 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.1.3"
6
+ s.version = "1.1.12"
7
7
 
8
8
  s.add_dependency 'json'
9
- s.add_dependency 'rest-client', '~> 1.6.7'
9
+
10
+ # N.B. rest-client 1.7+ drops support for Ruby 1.8.
11
+ s.add_dependency 'rest-client', '>= 1.6.8'
10
12
 
11
13
  s.add_development_dependency 'rake'
12
- s.add_development_dependency 'minitest'
14
+ s.add_development_dependency 'minitest', '~> 5'
15
+ s.add_development_dependency 'webmock', '~> 1.7'
13
16
 
14
17
  s.files = Dir["#{File.dirname(__FILE__)}/**/*"]
15
18
  end
@@ -1,57 +1,33 @@
1
1
  require 'json'
2
+ require 'forwardable'
2
3
 
3
4
  module Cleversafe
4
5
  class Connection
5
- def initialize(url, options = {})
6
- @http = build_http_client(url, options)
7
- end
6
+ extend Forwardable
8
7
 
9
- def url
10
- @http.url
11
- end
12
-
13
- def url_for(*paths)
14
- [ url, *paths ].join('/')
15
- end
16
-
17
- def vault(name)
18
- Cleversafe::Vault.new(self, name)
19
- end
8
+ def_delegators :@http, :url, :url_for, :get, :head, :put, :delete
20
9
 
21
- def vaults
22
- @vaults ||= begin
23
- data = JSON.parse get.to_s
24
- data['vaults'].map { |v| v['vault_name'] }
25
- end
10
+ def initialize(url, options = {})
11
+ @http = Cleversafe::HttpClient.new(url, options)
26
12
  end
27
13
 
28
14
  def ping
29
- head
15
+ head '/'
30
16
  true
31
- rescue RestClient::Exception
17
+ rescue Exception
32
18
  false
33
19
  end
34
20
 
35
- def head(path = '', options = {})
36
- @http[path].head options
37
- end
38
-
39
- def get(path = '', options = {})
40
- @http[path].get options
21
+ def status
22
+ JSON.parse(get('/').to_s)
41
23
  end
42
24
 
43
- def put(path, payload, options = {})
44
- @http[path].put payload, options
25
+ def vaults
26
+ status['vaults'].map { |v| v['vault_name'] }
45
27
  end
46
28
 
47
- def delete(path)
48
- @http[path].delete
29
+ def vault(name)
30
+ Cleversafe::Vault.new(self, name)
49
31
  end
50
-
51
- private
52
- def build_http_client(url, options = {})
53
- defaults = { :open_timeout => 0.5 }
54
- RestClient::Resource.new(url, defaults.merge(options).merge(:raw_response => true))
55
- end
56
32
  end
57
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,48 @@
1
+ module Cleversafe
2
+ class HttpClient
3
+ # Disable HTTP client timeouts by default. Older versions of RestClient
4
+ # use a value of `-1` to disable timeouts; recent versions use `nil`.
5
+ if RestClient.version < '1.6.9'
6
+ DEFAULTS = { :timeout => -1, :open_timeout => -1 }
7
+ else
8
+ DEFAULTS = { :timeout => nil, :open_timeout => nil }
9
+ end
10
+
11
+ attr_reader :url
12
+
13
+ def initialize(url, options = {})
14
+ @url = url
15
+ @defaults = DEFAULTS.merge(options)
16
+ end
17
+
18
+ def url_for(*path)
19
+ File.join(url, *path)
20
+ end
21
+
22
+ def head(path, options = {})
23
+ request :head, path, options
24
+ end
25
+
26
+ def get(path, options = {})
27
+ request :get, path, options
28
+ end
29
+
30
+ def post(path, payload, options = {})
31
+ request :post, path, options.merge(:payload => payload)
32
+ end
33
+
34
+ def put(path, payload, options = {})
35
+ request :put, path, options.merge(:payload => payload)
36
+ end
37
+
38
+ def delete(path, options = {})
39
+ request :delete, path, options
40
+ end
41
+
42
+ private
43
+ def request(method, path, options = {})
44
+ options = @defaults.merge(options).merge(:method => method, :url => url_for(path))
45
+ RestClient::Request.execute(options)
46
+ end
47
+ end
48
+ end
@@ -1,28 +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
- raise ArgumentError, "name is required" unless name =~ /\S/
9
+ def initialize(vault, key)
10
+ raise ArgumentError, "key is required" unless key =~ /\S/
11
+ @vault = vault
12
+ @key = key
10
13
  @connection = vault.connection
11
- @vault = vault.name
12
- @name = name
13
14
  end
14
15
 
15
- def key
16
- "#{vault}/#{name}"
16
+ def path
17
+ "#{vault.path}/#{CGI.escape(key)}"
17
18
  end
18
19
 
19
20
  def url
20
- connection.url_for(vault, name)
21
+ connection.url_for(path)
21
22
  end
22
23
 
23
24
  def delete
24
25
  handle_errors do
25
- connection.delete(key)
26
+ connection.delete(path)
26
27
  end
27
28
  end
28
29
 
@@ -33,13 +34,13 @@ module Cleversafe
33
34
  false
34
35
  end
35
36
 
36
- def data(options={})
37
+ def data(options = {})
37
38
  open(options) { |io| io.read }
38
39
  end
39
40
 
40
- def open(options={})
41
+ def open(options = {})
41
42
  handle_errors do
42
- response = connection.get(key, options)
43
+ response = connection.get(path, options.merge(:raw_response => true))
43
44
  begin
44
45
  file = response.file
45
46
  file.open
@@ -53,7 +54,7 @@ module Cleversafe
53
54
 
54
55
  def metadata
55
56
  @metadata ||= handle_errors do
56
- connection.head(key).headers
57
+ connection.head(path).headers
57
58
  end
58
59
  end
59
60
 
@@ -66,11 +67,10 @@ module Cleversafe
66
67
  end
67
68
 
68
69
  private
69
-
70
- def handle_errors
71
- yield
72
- rescue RestClient::ResourceNotFound
73
- raise Cleversafe::Errors::NotFound, "object `#{name}' does not exist", caller[0..-2]
74
- 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
75
75
  end
76
76
  end
@@ -1,18 +1,21 @@
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).to_s
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
21
  def object(key)
@@ -20,23 +23,34 @@ module Cleversafe
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
37
+ handle_errors do
38
+ response = connection.put(path, payload, options)
39
+ id = response.to_s.strip
34
40
 
35
- if response.headers[:x_content_digest]
36
- { :id => id, :x_content_digest => response.headers[:x_content_digest] }
37
- else
38
- id
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
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
41
55
  end
42
56
  end
data/lib/cleversafe.rb CHANGED
@@ -1,9 +1,10 @@
1
- require 'cleversafe/errors'
1
+ require 'rest-client'
2
+
3
+ require 'cleversafe/connection'
4
+ require 'cleversafe/http_client'
2
5
  require 'cleversafe/vault'
3
6
  require 'cleversafe/object'
4
- require 'cleversafe/connection'
5
-
6
- require 'rest-client'
7
+ require 'cleversafe/errors'
7
8
 
8
9
  # Monkeypatch RestClient to prevent it from closing IO objects after they're
9
10
  # uploaded, which it really shouldn't do.
@@ -1,6 +1,6 @@
1
1
  require 'cleversafe/test_helper'
2
2
 
3
- class ConnectionTest < MiniTest::Unit::TestCase
3
+ class ConnectionTest < Minitest::Test
4
4
  def test_truth
5
5
  assert true
6
6
  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
@@ -2,6 +2,5 @@ require 'rubygems'
2
2
  require 'bundler/setup'
3
3
  require 'cleversafe'
4
4
 
5
- require 'minitest/unit'
6
-
7
- MiniTest::Unit.autorun
5
+ require 'minitest/autorun'
6
+ require 'webmock/minitest'
data/test/object_test.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  require 'cleversafe/test_helper'
2
2
 
3
- class ObjectTest < MiniTest::Unit::TestCase
3
+ class ObjectTest < Minitest::Test
4
4
  def setup
5
5
  connection = Cleversafe::Connection.new('http://test.host')
6
6
  @vault = Cleversafe::Vault.new(connection, 'test_vault')
@@ -11,4 +11,9 @@ class ObjectTest < MiniTest::Unit::TestCase
11
11
  Cleversafe::Object.new(@vault, '')
12
12
  end
13
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
14
19
  end
data/test/vault_test.rb CHANGED
@@ -1,7 +1,18 @@
1
1
  require 'cleversafe/test_helper'
2
2
 
3
- class VaultTest < MiniTest::Unit::TestCase
4
- def test_truth
5
- assert true
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
6
17
  end
7
18
  end
metadata CHANGED
@@ -1,124 +1,128 @@
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
- - 1
8
- - 3
9
- version: 1.1.3
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.12
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-05-14 00:00:00 -05:00
18
- default_executable:
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
11
+ date: 2022-07-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
21
14
  name: json
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
- requirements:
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
25
17
  - - ">="
26
- - !ruby/object:Gem::Version
27
- segments:
28
- - 0
29
- version: "0"
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
30
20
  type: :runtime
31
- version_requirements: *id001
32
- - !ruby/object:Gem::Dependency
33
- name: rest-client
34
21
  prerelease: false
35
- requirement: &id002 !ruby/object:Gem::Requirement
36
- requirements:
37
- - - ~>
38
- - !ruby/object:Gem::Version
39
- segments:
40
- - 1
41
- - 6
42
- - 7
43
- 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
44
34
  type: :runtime
45
- version_requirements: *id002
46
- - !ruby/object:Gem::Dependency
47
- name: rake
48
35
  prerelease: false
49
- requirement: &id003 !ruby/object:Gem::Requirement
50
- requirements:
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
51
38
  - - ">="
52
- - !ruby/object:Gem::Version
53
- segments:
54
- - 0
55
- version: "0"
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'
56
48
  type: :development
57
- version_requirements: *id003
58
- - !ruby/object:Gem::Dependency
59
- name: minitest
60
49
  prerelease: false
61
- requirement: &id004 !ruby/object:Gem::Requirement
62
- requirements:
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
63
52
  - - ">="
64
- - !ruby/object:Gem::Version
65
- segments:
66
- - 0
67
- version: "0"
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'
68
62
  type: :development
69
- version_requirements: *id004
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'
70
83
  description:
71
84
  email: john@37signals.com
72
85
  executables: []
73
-
74
86
  extensions: []
75
-
76
87
  extra_rdoc_files: []
77
-
78
- files:
79
- - ./cleversafe.gemspec
80
- - ./Gemfile
81
- - ./Gemfile.lock
82
- - ./lib/cleversafe/connection.rb
83
- - ./lib/cleversafe/errors.rb
84
- - ./lib/cleversafe/object.rb
85
- - ./lib/cleversafe/vault.rb
86
- - ./lib/cleversafe.rb
87
- - ./Rakefile
88
- - ./README.md
89
- - ./test/connection_test.rb
90
- - ./test/lib/cleversafe/test_helper.rb
91
- - ./test/object_test.rb
92
- - ./test/vault_test.rb
93
- has_rdoc: true
88
+ files:
89
+ - "./Gemfile"
90
+ - "./Gemfile.lock"
91
+ - "./README.md"
92
+ - "./Rakefile"
93
+ - "./cleversafe.gemspec"
94
+ - "./lib/cleversafe.rb"
95
+ - "./lib/cleversafe/connection.rb"
96
+ - "./lib/cleversafe/errors.rb"
97
+ - "./lib/cleversafe/http_client.rb"
98
+ - "./lib/cleversafe/object.rb"
99
+ - "./lib/cleversafe/vault.rb"
100
+ - "./test/connection_test.rb"
101
+ - "./test/http_client_test.rb"
102
+ - "./test/lib/cleversafe/test_helper.rb"
103
+ - "./test/object_test.rb"
104
+ - "./test/vault_test.rb"
94
105
  homepage:
95
106
  licenses: []
96
-
107
+ metadata: {}
97
108
  post_install_message:
98
109
  rdoc_options: []
99
-
100
- require_paths:
110
+ require_paths:
101
111
  - lib
102
- required_ruby_version: !ruby/object:Gem::Requirement
103
- requirements:
112
+ required_ruby_version: !ruby/object:Gem::Requirement
113
+ requirements:
104
114
  - - ">="
105
- - !ruby/object:Gem::Version
106
- segments:
107
- - 0
108
- version: "0"
109
- required_rubygems_version: !ruby/object:Gem::Requirement
110
- requirements:
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ required_rubygems_version: !ruby/object:Gem::Requirement
118
+ requirements:
111
119
  - - ">="
112
- - !ruby/object:Gem::Version
113
- segments:
114
- - 0
115
- version: "0"
120
+ - !ruby/object:Gem::Version
121
+ version: '0'
116
122
  requirements: []
117
-
118
123
  rubyforge_project:
119
- rubygems_version: 1.3.6
124
+ rubygems_version: 2.5.2
120
125
  signing_key:
121
- specification_version: 3
126
+ specification_version: 4
122
127
  summary: A Ruby API into Cleversafe's REST interface.
123
128
  test_files: []
124
-