spearly-sdk-ruby 0.2.4 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 67814c681befa771a269e339b41cd446c68bdc242dd3a61900c3a1f507165167
4
- data.tar.gz: ae7c1f34d649ebc34c0bd8ec4d1e468542c5c7c13bbf351fc0c9e3c294010996
3
+ metadata.gz: b08e74792de34fcc6c4e74ff511041fe8da3f689bb61c9923e1497d6d5bfd546
4
+ data.tar.gz: dd8486d9492fe690cd3aae7a48960931313e4718285848364a5926cf077df2e4
5
5
  SHA512:
6
- metadata.gz: b5e943c498662cd93bcaaa2a5db68e5f16129a337860f8f35637a3d4056bcda54684a5f542201017ac1642ca9dab50549a77324d5d1c7c0354178eaa92b9c88c
7
- data.tar.gz: a7fff0b9890ee300d37a958cfd714057d5684dbd534fb05e7a8cd24b6f7f59c1e45fd084ab64a457da3fcbf5c2a51c437e7d11704174db4fb00b1db30040e855
6
+ metadata.gz: 6e1a7c46099f4a227892d2400ea8625a9b2ded28aa9a3cc178d64ba6bd6de91b17521e4174c0f72a8b5dec71bf7ecd1a795814f37c535fd4ce7fa6e17da8a99d
7
+ data.tar.gz: 32829ececead704d08c8ed4b43b84d23c28322ec695543d28b190e790aa51717924afdfc095cbd69dfb5b2454fb86ccae72e508774f2ab9280361ff4bdb2e019
data/.gitignore CHANGED
@@ -1,11 +1,12 @@
1
- /.bundle/
2
- /.yardoc
3
- /_yardoc/
4
- /coverage/
5
- /doc/
6
- /pkg/
7
- /spec/reports/
8
- /tmp/
9
-
10
- # rspec failure tracking
1
+ .bundle
11
2
  .rspec_status
3
+ .ruby-version
4
+ .yardoc
5
+ _yardoc/
6
+ coverage/
7
+ doc/
8
+ Gemfile.local
9
+ Gemfile.lock
10
+ pkg/
11
+ spec/reports/
12
+ tmp/
data/CHANGELOG.md CHANGED
@@ -1,3 +1,24 @@
1
+ ## [0.6.0] - 2022-01-20
2
+
3
+ - `Spearly::Auth::Client#get_team_features`
4
+
5
+ ## [0.5.0] - 2021-12-13
6
+
7
+ - `Spearly::Auth::Client`
8
+
9
+ ## [0.4.0] - 2021-09-13
10
+
11
+ - Error handling improvements
12
+
13
+ ## [0.3.2] - 2021-09-13
14
+
15
+ - Use the new `Spearly API v2`
16
+ - Refactors parsing `JSON` data
17
+
18
+ ## [0.2.4] - 2021-07-16
19
+
20
+ - Rescue `Signet::AuthorizationError` on `Spearly::Auth::Authorizer`
21
+
1
22
  ## [0.2.3] - 2021-06-18
2
23
 
3
24
  - Raise `Spearly::Auth::AuthorizationError` and `Spearly::Auth::ServerError` from `Spearly::Auth::User` and `Spearly::Auth::Token`
data/README.md CHANGED
@@ -20,29 +20,42 @@ Or install it manually:
20
20
  gem install spearly-sdk-ruby
21
21
  ```
22
22
 
23
- ## Publish
23
+ ## Contribute
24
24
  ### Increment version
25
25
  ```sh
26
26
  vim lib/spearly/version.rb
27
27
  ```
28
28
 
29
- ### Build
29
+ ### Update CHANGELOG
30
30
  ```sh
31
- rake build
31
+ vim CHANGELOG.md
32
32
  ```
33
33
 
34
- ### Push to RubyGems
34
+ ### Update Gemfile.lock
35
35
  ```sh
36
- new_version=$(ruby -e "require 'spearly/version'; puts Spearly::VERSION")
37
-
38
- gem push pkg/spearly-sdk-ruby-$new_version.gem
36
+ bundle install
39
37
  ```
40
38
 
41
- ## Contribute
42
39
  ### New version commit
43
40
  ```sh
44
- new_version=$(ruby -e "require 'spearly/version'; puts Spearly::VERSION")
41
+ new_version=$(ruby -e "require './lib/spearly/version'; puts Spearly::VERSION")
45
42
 
46
43
  git commit -m "v$new_version"
47
44
  git tag -a v$new_version -m "Release $new_version"
45
+
46
+ git push origin main
47
+ git push origin --tags
48
+ ```
49
+
50
+ ## Publish
51
+ ### Build
52
+ ```sh
53
+ rake build
54
+ ```
55
+
56
+ ### Push to RubyGems
57
+ ```sh
58
+ new_version=$(ruby -e "require './lib/spearly/version'; puts Spearly::VERSION")
59
+
60
+ gem push pkg/spearly-sdk-ruby-$new_version.gem
48
61
  ```
@@ -19,13 +19,19 @@ module Spearly
19
19
  private
20
20
 
21
21
  def initialize_client
22
+ Faraday.default_connection_options = {
23
+ headers: {
24
+ 'Accept' => 'application/vnd.spearly.v2+json'
25
+ }
26
+ }
27
+
22
28
  client = ::Signet::OAuth2::Client.new
23
29
  client.client_id = @params[:client_id] || @params['client_id']
24
30
  client.client_secret = @params[:client_secret] || @params['client_secret']
25
31
  client.code = @params[:code] || @params['code']
26
32
  client.grant_type = @params[:grant_type] || @params['grant_type']
27
- client.authorization_uri = "#{ENV['SPEARLY_AUTH_API_URL']}/api/v1/oauth/authorize"
28
- client.token_credential_uri = "#{ENV['SPEARLY_AUTH_API_URL']}/api/v1/oauth/token"
33
+ client.authorization_uri = "#{ENV['SPEARLY_API_URL']}/oauth/authorize"
34
+ client.token_credential_uri = "#{ENV['SPEARLY_API_URL']}/oauth/token"
29
35
  client.redirect_uri = @params[:redirect_uri] || @params['redirect_uri']
30
36
 
31
37
  client.access_token = @params[:access_token] || @params['access_token']
@@ -0,0 +1,145 @@
1
+ module Spearly
2
+ module Auth
3
+ class Client
4
+ def initialize(token)
5
+ @token = token
6
+ end
7
+
8
+ def create_team(params)
9
+ uri = "#{ENV['SPEARLY_API_URL']}/teams"
10
+ uri_parsed = Addressable::URI.parse(uri).normalize.to_s
11
+ client = Faraday.default_connection
12
+
13
+ res = client.post(uri_parsed,
14
+ params.as_json,
15
+ 'Accept' => 'application/vnd.spearly.v2+json',
16
+ 'Authorization' => @token)
17
+
18
+ if res.status == 201
19
+ JSON.parse(res.body)['data']
20
+ else
21
+ {}
22
+ end
23
+ end
24
+
25
+ def get_team(team_id)
26
+ uri = "#{ENV['SPEARLY_API_URL']}/teams/#{team_id}"
27
+ uri_parsed = Addressable::URI.parse(uri).normalize.to_s
28
+ client = Faraday.default_connection
29
+
30
+ res = client.get(uri_parsed,
31
+ nil,
32
+ 'Accept' => 'application/vnd.spearly.v2+json',
33
+ 'Authorization' => @token)
34
+
35
+ if res.status == 200
36
+ JSON.parse(res.body)['data']
37
+ else
38
+ {}
39
+ end
40
+ end
41
+
42
+ def get_teams(params = {})
43
+ uri = "#{ENV['SPEARLY_API_URL']}/teams"
44
+ uri_parsed = Addressable::URI.parse(uri).normalize.to_s
45
+ client = Faraday.default_connection
46
+
47
+ res = client.get(uri_parsed,
48
+ params.as_json,
49
+ 'Accept' => 'application/vnd.spearly.v2+json',
50
+ 'Authorization' => @token)
51
+
52
+ if res.status == 200
53
+ JSON.parse(res.body)['data']
54
+ else
55
+ []
56
+ end
57
+ end
58
+
59
+ def update_team(team_id, params)
60
+ uri = "#{ENV['SPEARLY_API_URL']}/teams/#{team_id}"
61
+ uri_parsed = Addressable::URI.parse(uri).normalize.to_s
62
+ client = Faraday.default_connection
63
+
64
+ res = client.put(uri_parsed,
65
+ params.as_json,
66
+ 'Accept' => 'application/vnd.spearly.v2+json',
67
+ 'Authorization' => @token)
68
+
69
+ if res.status == 200
70
+ JSON.parse(res.body)['data']
71
+ else
72
+ nil
73
+ end
74
+ end
75
+
76
+ def regenerate_team_api_access_token(team_id)
77
+ uri = "#{ENV['SPEARLY_API_URL']}/teams/#{team_id}/regenerate_api_access_token"
78
+ uri_parsed = Addressable::URI.parse(uri).normalize.to_s
79
+ client = Faraday.default_connection
80
+
81
+ res = client.post(uri_parsed,
82
+ nil,
83
+ 'Accept' => 'application/vnd.spearly.v2+json',
84
+ 'Authorization' => @token)
85
+
86
+ if res.status == 200
87
+ JSON.parse(res.body)['data']
88
+ else
89
+ nil
90
+ end
91
+ end
92
+
93
+ def invite_user_to_team(team_id, params)
94
+ uri = "#{ENV['SPEARLY_API_URL']}/teams/#{team_id}/invite"
95
+ uri_parsed = Addressable::URI.parse(uri).normalize.to_s
96
+ client = Faraday.default_connection
97
+
98
+ res = client.post(uri_parsed,
99
+ params.as_json,
100
+ 'Accept' => 'application/vnd.spearly.v2+json',
101
+ 'Authorization' => @token)
102
+
103
+ if res.status == 201
104
+ JSON.parse(res.body)['data']
105
+ else
106
+ nil
107
+ end
108
+ end
109
+
110
+ def get_team_members(team_id)
111
+ uri = "#{ENV['SPEARLY_API_URL']}/teams/#{team_id}/members"
112
+ uri_parsed = Addressable::URI.parse(uri).normalize.to_s
113
+ client = Faraday.default_connection
114
+
115
+ res = client.get(uri_parsed,
116
+ nil,
117
+ 'Accept' => 'application/vnd.spearly.v2+json',
118
+ 'Authorization' => @token)
119
+
120
+ if res.status == 200
121
+ JSON.parse(res.body)['data']
122
+ else
123
+ []
124
+ end
125
+ end
126
+
127
+ def get_team_features(team_id)
128
+ uri = "#{ENV['SPEARLY_API_URL']}/teams/#{team_id}/features"
129
+ uri_parsed = Addressable::URI.parse(uri).normalize.to_s
130
+ client = Faraday.default_connection
131
+
132
+ res = client.get(uri_parsed,
133
+ nil,
134
+ 'Accept' => 'application/vnd.spearly.v2+json',
135
+ 'Authorization' => @token)
136
+
137
+ if res.status == 200
138
+ JSON.parse(res.body)['data']
139
+ else
140
+ {}
141
+ end
142
+ end
143
+ end
144
+ end
145
+ end
@@ -6,22 +6,22 @@ require 'faraday'
6
6
  module Spearly
7
7
  module Auth
8
8
  class OauthUser
9
- attr_reader :attributes
9
+ attr_reader :data
10
10
 
11
- def initialize(attributes)
12
- @attributes = attributes
11
+ def initialize(data)
12
+ @data = data
13
13
  end
14
14
 
15
15
  def method_missing(name, *_args)
16
- @attributes[name.to_s]
16
+ @data[name.to_s]
17
17
  end
18
18
 
19
19
  def to_json(*_args)
20
- @attributes.to_json
20
+ @data.to_json
21
21
  end
22
22
 
23
23
  def as_json
24
- @attributes.as_json
24
+ @data.as_json
25
25
  end
26
26
  end
27
27
  end
@@ -1,27 +1,24 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'addressable/uri'
4
- require 'faraday'
5
-
6
3
  module Spearly
7
4
  module Auth
8
5
  class Team
9
- attr_reader :attributes
6
+ attr_reader :data
10
7
 
11
- def initialize(attributes)
12
- @attributes = attributes
8
+ def initialize(data)
9
+ @data = data
13
10
  end
14
11
 
15
12
  def method_missing(name, *_args)
16
- @attributes[name.to_s]
13
+ @data[name.to_s]
17
14
  end
18
15
 
19
16
  def to_json(*_args)
20
- @attributes.to_json
17
+ @data.to_json
21
18
  end
22
19
 
23
20
  def as_json
24
- @attributes.as_json
21
+ @data.as_json
25
22
  end
26
23
  end
27
24
  end
@@ -6,32 +6,33 @@ require 'faraday'
6
6
  module Spearly
7
7
  module Auth
8
8
  class Token
9
- attr_reader :attributes, :token
9
+ attr_reader :data, :token
10
10
 
11
11
  def initialize(token)
12
12
  @token = token
13
13
  end
14
14
 
15
15
  def method_missing(name, *_args)
16
- @attributes[name.to_s]
16
+ @data[name.to_s]
17
17
  end
18
18
 
19
19
  def info
20
- token_info_uri = "#{ENV['SPEARLY_AUTH_API_URL']}/api/v1/oauth/token/info"
20
+ token_info_uri = "#{ENV['SPEARLY_API_URL']}/oauth/token/info"
21
21
  url = Addressable::URI.parse(token_info_uri).normalize.to_s
22
22
  client = Faraday.default_connection
23
23
 
24
24
  res = client.get(url,
25
25
  nil,
26
+ 'Accept' => 'application/vnd.spearly.v2+json',
26
27
  'Authorization' => @token)
27
28
 
28
29
  return unless res.status == 200
29
30
 
30
- @attributes = JSON.parse(res.body)
31
+ @data = JSON.parse(res.body)
31
32
  end
32
33
 
33
34
  def revoke(params)
34
- token_revoke_uri = "#{ENV['SPEARLY_AUTH_API_URL']}/api/v1/oauth/revoke"
35
+ token_revoke_uri = "#{ENV['SPEARLY_API_URL']}/oauth/revoke"
35
36
  url = Addressable::URI.parse(token_revoke_uri).normalize.to_s
36
37
  client = Faraday.default_connection
37
38
 
@@ -46,11 +47,11 @@ module Spearly
46
47
  end
47
48
 
48
49
  def to_json(*_args)
49
- @attributes.to_json
50
+ @data.to_json
50
51
  end
51
52
 
52
53
  def as_json
53
- @attributes.as_json
54
+ @data.as_json
54
55
  end
55
56
  end
56
57
  end
@@ -6,72 +6,56 @@ require 'faraday'
6
6
  module Spearly
7
7
  module Auth
8
8
  class User
9
- attr_reader :attributes
9
+ attr_reader :data
10
10
 
11
11
  def initialize(token)
12
12
  @token = token
13
13
  end
14
14
 
15
15
  def method_missing(name, *_args)
16
- @attributes[name.to_s]
16
+ @data[name.to_s]
17
17
  end
18
18
 
19
19
  def find
20
- user_profile_uri = "#{ENV['SPEARLY_AUTH_API_URL']}/api/v1/oauth/profile"
20
+ user_profile_uri = "#{ENV['SPEARLY_API_URL']}/profile"
21
21
  url = Addressable::URI.parse(user_profile_uri).normalize.to_s
22
22
  client = Faraday.default_connection
23
23
 
24
24
  res = client.get(url,
25
25
  nil,
26
+ 'Accept' => 'application/vnd.spearly.v2+json',
26
27
  'Authorization' => @token)
27
28
 
28
29
  return unless res.status == 200
29
30
 
30
- @attributes = JSON.parse(res.body)['user']
31
+ @data = JSON.parse(res.body)['data']
31
32
  end
32
33
 
33
34
  def teams
34
- teams_uri = "#{ENV['SPEARLY_AUTH_API_URL']}/api/v1/teams"
35
+ teams_uri = "#{ENV['SPEARLY_API_URL']}/teams"
35
36
  url = Addressable::URI.parse(teams_uri).normalize.to_s
36
37
  client = Faraday.default_connection
37
38
 
38
39
  res = client.get(url,
39
40
  nil,
41
+ 'Accept' => 'application/vnd.spearly.v2+json',
40
42
  'Authorization' => @token)
41
43
 
42
44
  return [] unless res.status == 200
43
45
 
44
- team_hashes = JSON.parse(res.body)['teams']
46
+ team_hashes = JSON.parse(res.body)['data']
45
47
 
46
48
  team_hashes.map do |team_hash|
47
49
  Spearly::Auth::Team.new(team_hash)
48
50
  end
49
51
  end
50
52
 
51
- def oauth_users
52
- oauth_users_uri = "#{ENV['SPEARLY_AUTH_API_URL']}/api/v1/oauth_users"
53
- url = Addressable::URI.parse(oauth_users_uri).normalize.to_s
54
- client = Faraday.default_connection
55
-
56
- res = client.get(url,
57
- nil,
58
- 'Authorization' => @token)
59
-
60
- return [] unless res.status == 200
61
-
62
- oauth_user_hashes = JSON.parse(res.body)['oauth_users']
63
-
64
- oauth_user_hashes.map do |oauth_user_hash|
65
- Spearly::Auth::OauthUser.new(oauth_user_hash)
66
- end
67
- end
68
-
69
53
  def to_json(*_args)
70
- @attributes.to_json
54
+ @data.to_json
71
55
  end
72
56
 
73
57
  def as_json
74
- @attributes.as_json
58
+ @data.as_json
75
59
  end
76
60
  end
77
61
  end
data/lib/spearly/auth.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'auth/authorizer'
4
+ require_relative 'auth/client'
4
5
  require_relative 'auth/engine'
5
6
  require_relative 'auth/oauth_user'
6
7
  require_relative 'auth/team'
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Spearly
4
- VERSION = '0.2.4'
4
+ VERSION = '0.6.0'
5
5
  end
data/spearly.gemspec CHANGED
@@ -13,7 +13,7 @@ Gem::Specification.new do |gem|
13
13
  gem.required_ruby_version = Gem::Requirement.new('>= 2.7.2')
14
14
  gem.metadata['homepage_uri'] = gem.homepage
15
15
  gem.metadata['source_code_uri'] = 'https://github.com/unimal-jp/spearly-sdk-ruby'
16
- gem.metadata['changelog_uri'] = "https://github.com/unimal-jp/spearly-sdk-ruby/blob/#{Spearly::VERSION}/CHANGELOG.md"
16
+ gem.metadata['changelog_uri'] = "https://github.com/unimal-jp/spearly-sdk-ruby/blob/v#{Spearly::VERSION}/CHANGELOG.md"
17
17
 
18
18
  gem.files = `git ls-files`.split("\n")
19
19
  gem.executables = 'spearly'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spearly-sdk-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Spearly
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-07-16 00:00:00.000000000 Z
11
+ date: 2022-01-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -142,7 +142,6 @@ files:
142
142
  - ".rubocop.yml"
143
143
  - CHANGELOG.md
144
144
  - Gemfile
145
- - Gemfile.lock
146
145
  - README.md
147
146
  - Rakefile
148
147
  - bin/console
@@ -151,6 +150,7 @@ files:
151
150
  - lib/spearly.rb
152
151
  - lib/spearly/auth.rb
153
152
  - lib/spearly/auth/authorizer.rb
153
+ - lib/spearly/auth/client.rb
154
154
  - lib/spearly/auth/engine.rb
155
155
  - lib/spearly/auth/oauth_user.rb
156
156
  - lib/spearly/auth/rails/helpers.rb
@@ -166,7 +166,7 @@ licenses: []
166
166
  metadata:
167
167
  homepage_uri: https://github.com/unimal-jp/spearly-sdk-ruby
168
168
  source_code_uri: https://github.com/unimal-jp/spearly-sdk-ruby
169
- changelog_uri: https://github.com/unimal-jp/spearly-sdk-ruby/blob/0.2.4/CHANGELOG.md
169
+ changelog_uri: https://github.com/unimal-jp/spearly-sdk-ruby/blob/v0.6.0/CHANGELOG.md
170
170
  post_install_message:
171
171
  rdoc_options: []
172
172
  require_paths:
data/Gemfile.lock DELETED
@@ -1,93 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- spearly-sdk-ruby (0.2.3)
5
- addressable (~> 2.3)
6
- faraday (>= 0.17.4, < 2.0)
7
- rake (~> 13.0)
8
- signet (~> 0.15)
9
-
10
- GEM
11
- remote: https://rubygems.org/
12
- specs:
13
- addressable (2.7.0)
14
- public_suffix (>= 2.0.2, < 5.0)
15
- ast (2.4.2)
16
- coderay (1.1.3)
17
- diff-lcs (1.4.4)
18
- faraday (1.4.2)
19
- faraday-em_http (~> 1.0)
20
- faraday-em_synchrony (~> 1.0)
21
- faraday-excon (~> 1.1)
22
- faraday-net_http (~> 1.0)
23
- faraday-net_http_persistent (~> 1.1)
24
- multipart-post (>= 1.2, < 3)
25
- ruby2_keywords (>= 0.0.4)
26
- faraday-em_http (1.0.0)
27
- faraday-em_synchrony (1.0.0)
28
- faraday-excon (1.1.0)
29
- faraday-net_http (1.0.1)
30
- faraday-net_http_persistent (1.1.0)
31
- jwt (2.2.3)
32
- method_source (1.0.0)
33
- multi_json (1.15.0)
34
- multipart-post (2.1.1)
35
- parallel (1.20.1)
36
- parser (3.0.1.1)
37
- ast (~> 2.4.1)
38
- pry (0.13.1)
39
- coderay (~> 1.1)
40
- method_source (~> 1.0)
41
- public_suffix (4.0.6)
42
- rainbow (3.0.0)
43
- rake (13.0.3)
44
- regexp_parser (2.1.1)
45
- rexml (3.2.5)
46
- rspec (3.10.0)
47
- rspec-core (~> 3.10.0)
48
- rspec-expectations (~> 3.10.0)
49
- rspec-mocks (~> 3.10.0)
50
- rspec-core (3.10.1)
51
- rspec-support (~> 3.10.0)
52
- rspec-expectations (3.10.1)
53
- diff-lcs (>= 1.2.0, < 2.0)
54
- rspec-support (~> 3.10.0)
55
- rspec-mocks (3.10.2)
56
- diff-lcs (>= 1.2.0, < 2.0)
57
- rspec-support (~> 3.10.0)
58
- rspec-support (3.10.2)
59
- rubocop (1.15.0)
60
- parallel (~> 1.10)
61
- parser (>= 3.0.0.0)
62
- rainbow (>= 2.2.2, < 4.0)
63
- regexp_parser (>= 1.8, < 3.0)
64
- rexml
65
- rubocop-ast (>= 1.5.0, < 2.0)
66
- ruby-progressbar (~> 1.7)
67
- unicode-display_width (>= 1.4.0, < 3.0)
68
- rubocop-ast (1.5.0)
69
- parser (>= 3.0.1.1)
70
- rubocop-rspec (2.3.0)
71
- rubocop (~> 1.0)
72
- rubocop-ast (>= 1.1.0)
73
- ruby-progressbar (1.11.0)
74
- ruby2_keywords (0.0.4)
75
- signet (0.15.0)
76
- addressable (~> 2.3)
77
- faraday (>= 0.17.3, < 2.0)
78
- jwt (>= 1.5, < 3.0)
79
- multi_json (~> 1.10)
80
- unicode-display_width (2.0.0)
81
-
82
- PLATFORMS
83
- x86_64-darwin-20
84
-
85
- DEPENDENCIES
86
- pry (~> 0.13.1)
87
- rspec (~> 3.0)
88
- rubocop (~> 1.15)
89
- rubocop-rspec (~> 2.3)
90
- spearly-sdk-ruby!
91
-
92
- BUNDLED WITH
93
- 2.2.15