cleversafe 1.1.3 → 1.1.10

Sign up to get free protection for your applications and to get access to all the features.
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 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.10)
5
5
  json
6
- rest-client (~> 1.6.7)
6
+ rest-client (~> 1.6)
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
-
Binary file
Binary file
Binary file
data/cleversafe.gemspec CHANGED
@@ -3,13 +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.1.3"
6
+ s.version = "1.1.10"
7
7
 
8
8
  s.add_dependency 'json'
9
- s.add_dependency 'rest-client', '~> 1.6.7'
9
+ s.add_dependency 'rest-client', '~> 1.6'
10
10
 
11
11
  s.add_development_dependency 'rake'
12
- s.add_development_dependency 'minitest'
12
+ s.add_development_dependency 'minitest', '~> 5'
13
+ s.add_development_dependency 'webmock', '~> 1.7'
13
14
 
14
15
  s.files = Dir["#{File.dirname(__FILE__)}/**/*"]
15
16
  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,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,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,7 +1,8 @@
1
- require 'cleversafe/errors'
1
+ require 'cleversafe/connection'
2
+ require 'cleversafe/http_client'
2
3
  require 'cleversafe/vault'
3
4
  require 'cleversafe/object'
4
- require 'cleversafe/connection'
5
+ require 'cleversafe/errors'
5
6
 
6
7
  require 'rest-client'
7
8
 
@@ -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,131 @@
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.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
- 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'
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:
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:
51
45
  - - ">="
52
- - !ruby/object:Gem::Version
53
- segments:
54
- - 0
55
- version: "0"
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-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"
94
108
  homepage:
95
109
  licenses: []
96
-
110
+ metadata: {}
97
111
  post_install_message:
98
112
  rdoc_options: []
99
-
100
- require_paths:
113
+ require_paths:
101
114
  - lib
102
- required_ruby_version: !ruby/object:Gem::Requirement
103
- requirements:
115
+ required_ruby_version: !ruby/object:Gem::Requirement
116
+ requirements:
104
117
  - - ">="
105
- - !ruby/object:Gem::Version
106
- segments:
107
- - 0
108
- version: "0"
109
- required_rubygems_version: !ruby/object:Gem::Requirement
110
- requirements:
118
+ - !ruby/object:Gem::Version
119
+ version: '0'
120
+ required_rubygems_version: !ruby/object:Gem::Requirement
121
+ requirements:
111
122
  - - ">="
112
- - !ruby/object:Gem::Version
113
- segments:
114
- - 0
115
- version: "0"
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
116
125
  requirements: []
117
-
118
126
  rubyforge_project:
119
- rubygems_version: 1.3.6
127
+ rubygems_version: 2.5.2
120
128
  signing_key:
121
- specification_version: 3
129
+ specification_version: 4
122
130
  summary: A Ruby API into Cleversafe's REST interface.
123
131
  test_files: []
124
-