kamatera_api_wrapper 0.1.0
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/.gitignore +9 -0
- data/.rspec_status +4 -0
- data/Gemfile +9 -0
- data/Gemfile.lock +67 -0
- data/README.md +68 -0
- data/Rakefile +28 -0
- data/bin/console +7 -0
- data/kamatera_api_wrapper.gemspec +30 -0
- data/lib/kamatera_api_wrapper/client.rb +192 -0
- data/lib/kamatera_api_wrapper/errors.rb +10 -0
- data/lib/kamatera_api_wrapper/version.rb +5 -0
- data/lib/kamatera_api_wrapper.rb +11 -0
- data/pkg/kamatera_api_wrapper-0.1.0.gem +0 -0
- data/spec/client_spec.rb +40 -0
- data/spec/spec_helper.rb +8 -0
- metadata +157 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: ff3a0a0c39bd3fcc5ae637d0d932256d56d10801741f7579009dbebb00db11b7
|
|
4
|
+
data.tar.gz: c57b9846789d4f20e17758e0f6bcd2cc803f426194b2a06f6e9a338ed6c421ca
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 20023fea03c1741507267d6e37e56932d14af812a34f18e34a95abb19f9f15006de2a4cd03b8d0c3c0e4de760b54f75895abc025521a32bf5895a9eaa4a5bea1
|
|
7
|
+
data.tar.gz: b4ae3504dcf3c238a175e36afa042f6875172c9273d3c03a50b626abe51c81c00812126fb72543338d2e8457f31a9a70a2139f4e3fd61d7cfd8e6ee1af135dff
|
data/.gitignore
ADDED
data/.rspec_status
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
PATH
|
|
2
|
+
remote: .
|
|
3
|
+
specs:
|
|
4
|
+
kamatera_api_wrapper (0.1.0)
|
|
5
|
+
faraday (~> 2.0)
|
|
6
|
+
faraday-retry
|
|
7
|
+
multi_json (~> 1.15)
|
|
8
|
+
|
|
9
|
+
GEM
|
|
10
|
+
remote: https://rubygems.org/
|
|
11
|
+
specs:
|
|
12
|
+
addressable (2.8.8)
|
|
13
|
+
public_suffix (>= 2.0.2, < 8.0)
|
|
14
|
+
bigdecimal (3.3.1)
|
|
15
|
+
crack (1.0.1)
|
|
16
|
+
bigdecimal
|
|
17
|
+
rexml
|
|
18
|
+
diff-lcs (1.6.2)
|
|
19
|
+
faraday (2.14.0)
|
|
20
|
+
faraday-net_http (>= 2.0, < 3.5)
|
|
21
|
+
json
|
|
22
|
+
logger
|
|
23
|
+
faraday-net_http (3.4.2)
|
|
24
|
+
net-http (~> 0.5)
|
|
25
|
+
faraday-retry (2.3.2)
|
|
26
|
+
faraday (~> 2.0)
|
|
27
|
+
hashdiff (1.2.1)
|
|
28
|
+
json (2.16.0)
|
|
29
|
+
logger (1.7.0)
|
|
30
|
+
multi_json (1.17.0)
|
|
31
|
+
net-http (0.8.0)
|
|
32
|
+
uri (>= 0.11.1)
|
|
33
|
+
public_suffix (7.0.0)
|
|
34
|
+
rake (13.3.1)
|
|
35
|
+
rexml (3.4.4)
|
|
36
|
+
rspec (3.13.2)
|
|
37
|
+
rspec-core (~> 3.13.0)
|
|
38
|
+
rspec-expectations (~> 3.13.0)
|
|
39
|
+
rspec-mocks (~> 3.13.0)
|
|
40
|
+
rspec-core (3.13.6)
|
|
41
|
+
rspec-support (~> 3.13.0)
|
|
42
|
+
rspec-expectations (3.13.5)
|
|
43
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
|
44
|
+
rspec-support (~> 3.13.0)
|
|
45
|
+
rspec-mocks (3.13.7)
|
|
46
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
|
47
|
+
rspec-support (~> 3.13.0)
|
|
48
|
+
rspec-support (3.13.6)
|
|
49
|
+
uri (1.1.1)
|
|
50
|
+
webmock (3.26.1)
|
|
51
|
+
addressable (>= 2.8.0)
|
|
52
|
+
crack (>= 0.3.2)
|
|
53
|
+
hashdiff (>= 0.4.0, < 2.0.0)
|
|
54
|
+
|
|
55
|
+
PLATFORMS
|
|
56
|
+
ruby
|
|
57
|
+
x86_64-linux
|
|
58
|
+
|
|
59
|
+
DEPENDENCIES
|
|
60
|
+
bundler
|
|
61
|
+
kamatera_api_wrapper!
|
|
62
|
+
rake
|
|
63
|
+
rspec
|
|
64
|
+
webmock
|
|
65
|
+
|
|
66
|
+
BUNDLED WITH
|
|
67
|
+
2.5.22
|
data/README.md
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# KamateraApiWrapper
|
|
2
|
+
|
|
3
|
+
A small Ruby client for authenticating with Kamatera and calling server endpoints (GET /servers etc).
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
Add to your Gemfile:
|
|
8
|
+
|
|
9
|
+
```ruby
|
|
10
|
+
gem "kamatera_api_wrapper"
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Then:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
bundle install
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Usage
|
|
20
|
+
|
|
21
|
+
```ruby
|
|
22
|
+
require "kamatera_api_wrapper"
|
|
23
|
+
|
|
24
|
+
client = KamateraApiWrapper::Client.new(
|
|
25
|
+
client_id: "your_client_id",
|
|
26
|
+
client_secret: "your_secret"
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
# authenticate explicitly (optional, client will auto-auth on first request)
|
|
30
|
+
client.authenticate!
|
|
31
|
+
|
|
32
|
+
# list servers
|
|
33
|
+
servers = client.servers
|
|
34
|
+
puts servers.inspect
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Configuration options
|
|
38
|
+
|
|
39
|
+
You can pass options to the client:
|
|
40
|
+
|
|
41
|
+
- `base_url` — default `"https://console.kamatera.com"`
|
|
42
|
+
- `timeout` — Faraday open/read timeout in seconds (default: `10`)
|
|
43
|
+
- `token_expiry_margin` — seconds to subtract from expiry to refresh early (default: `30`)
|
|
44
|
+
|
|
45
|
+
Example:
|
|
46
|
+
|
|
47
|
+
```ruby
|
|
48
|
+
client = KamateraApiWrapper::Client.new(
|
|
49
|
+
client_id: "...",
|
|
50
|
+
client_secret: "...",
|
|
51
|
+
base_url: "https://console.kamatera.com",
|
|
52
|
+
timeout: 15,
|
|
53
|
+
token_expiry_margin: 10
|
|
54
|
+
)
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Tests
|
|
58
|
+
|
|
59
|
+
Run:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
bundle exec rspec
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Notes
|
|
66
|
+
|
|
67
|
+
- Token caching is in-memory in the `Client` instance. For multi-process environments or long-running services you should persist token(s) appropriately.
|
|
68
|
+
- `Application/json` Content-Type is used for authentication per Kamatera API requirement.
|
data/Rakefile
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
require "rake/testtask"
|
|
2
|
+
require "rspec/core/rake_task"
|
|
3
|
+
require "kamatera_api_wrapper"
|
|
4
|
+
|
|
5
|
+
RSpec::Core::RakeTask.new(:spec)
|
|
6
|
+
|
|
7
|
+
GEMSPEC = Dir.glob("*.gemspec").first or raise "No gemspec found"
|
|
8
|
+
|
|
9
|
+
def gemspec_spec
|
|
10
|
+
Gem::Specification.load(GEMSPEC)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
desc "Build the gem into the pkg directory"
|
|
14
|
+
task :build do
|
|
15
|
+
sh "rm -rf pkg"
|
|
16
|
+
sh "mkdir -p pkg"
|
|
17
|
+
sh "gem build #{GEMSPEC}"
|
|
18
|
+
#sh "mv #{gem_filename} pkg/#{gem_filename}"
|
|
19
|
+
#puts "Built: pkg/#{gem_filename}"
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
desc "Install the built gem locally"
|
|
23
|
+
task :install_local => :build do
|
|
24
|
+
gem_filename = Dir.glob("pkg/*.gem").first or raise "No gem in pkg/"
|
|
25
|
+
sh "gem install --local #{gem_filename}"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
task default: :spec
|
data/bin/console
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
|
+
require 'kamatera_api_wrapper'
|
|
5
|
+
|
|
6
|
+
Gem::Specification.new do |spec|
|
|
7
|
+
spec.name = "kamatera_api_wrapper"
|
|
8
|
+
spec.version = KamateraApiWrapper::VERSION
|
|
9
|
+
spec.authors = ["Stanislaw Zawadzki"]
|
|
10
|
+
spec.email = ["st.zawadzki@gmail.com"]
|
|
11
|
+
|
|
12
|
+
spec.summary = "Simple Ruby wrapper for Kamatera server API"
|
|
13
|
+
spec.description = "A small client for authenticating with Kamatera and calling server endpoints (GET /servers, etc.)"
|
|
14
|
+
spec.homepage = ""
|
|
15
|
+
spec.license = "MIT"
|
|
16
|
+
|
|
17
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
|
18
|
+
`git ls-files -z`.split("\x0")
|
|
19
|
+
end
|
|
20
|
+
spec.require_paths = ["lib"]
|
|
21
|
+
|
|
22
|
+
spec.add_development_dependency "bundler"
|
|
23
|
+
spec.add_development_dependency "rake"
|
|
24
|
+
spec.add_development_dependency "rspec"
|
|
25
|
+
spec.add_development_dependency "webmock"
|
|
26
|
+
|
|
27
|
+
spec.add_runtime_dependency "faraday", "~> 2.0"
|
|
28
|
+
spec.add_runtime_dependency "faraday-retry"
|
|
29
|
+
spec.add_runtime_dependency "multi_json", "~> 1.15"
|
|
30
|
+
end
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "mutex_m"
|
|
4
|
+
require "time"
|
|
5
|
+
|
|
6
|
+
module KamateraApiWrapper
|
|
7
|
+
# Simple client for Kamatera public API (authentication + servers)
|
|
8
|
+
#
|
|
9
|
+
# Example:
|
|
10
|
+
# client = KamateraApiWrapper::Client.new(client_id: "...", client_secret: "...")
|
|
11
|
+
# client.servers
|
|
12
|
+
class Client
|
|
13
|
+
include Mutex_m
|
|
14
|
+
|
|
15
|
+
AUTH_PATH = "/service/authenticate".freeze
|
|
16
|
+
DEFAULT_BASE = "https://console.kamatera.com".freeze
|
|
17
|
+
|
|
18
|
+
attr_reader :client_id, :client_secret, :base_url, :timeout, :token_expiry_margin
|
|
19
|
+
|
|
20
|
+
# options:
|
|
21
|
+
# - base_url: base host (default https://console.kamatera.com)
|
|
22
|
+
# - timeout: seconds for Faraday
|
|
23
|
+
# - token_expiry_margin: seconds to subtract from token expiry to refresh early
|
|
24
|
+
def initialize(client_id:, client_secret:, base_url: DEFAULT_BASE, timeout: 10, token_expiry_margin: 30, faraday: nil)
|
|
25
|
+
super() # Mutex_m
|
|
26
|
+
@client_id = client_id
|
|
27
|
+
@client_secret = client_secret
|
|
28
|
+
@base_url = base_url.chomp("/")
|
|
29
|
+
@timeout = timeout
|
|
30
|
+
@token_expiry_margin = token_expiry_margin
|
|
31
|
+
|
|
32
|
+
@faraday = faraday || build_connection
|
|
33
|
+
@token = nil
|
|
34
|
+
@token_expires_at = nil
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Authenticate immediately (you may call this, but other methods auto-authenticate)
|
|
38
|
+
def authenticate!
|
|
39
|
+
synchronize do
|
|
40
|
+
resp = @faraday.post(AUTH_PATH) do |req|
|
|
41
|
+
req.headers["Content-Type"] = "application/json"
|
|
42
|
+
req.body = MultiJson.dump(clientId: client_id, secret: client_secret)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
unless resp.success?
|
|
46
|
+
raise Errors::AuthenticationError, "Authentication failed (status #{resp.status}): #{resp.body}"
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
parsed = parse_json(resp.body)
|
|
50
|
+
token = parsed['authentication']
|
|
51
|
+
token_expires_at = DateTime.strptime(parsed['expires'].to_s, '%s')
|
|
52
|
+
|
|
53
|
+
unless token
|
|
54
|
+
raise Errors::ResponseParseError, "No token found in authentication response: #{resp.body}"
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
@token = token
|
|
58
|
+
if token_expires_at
|
|
59
|
+
# seconds
|
|
60
|
+
@token_expires_at = token_expires_at
|
|
61
|
+
else
|
|
62
|
+
# fallback: 1 hour
|
|
63
|
+
@token_expires_at = Time.now + 3600
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
true
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Returns array / parsed hash for GET /servers
|
|
71
|
+
def servers(params: nil)
|
|
72
|
+
ensure_authenticated!
|
|
73
|
+
|
|
74
|
+
resp = @faraday.get("/service/servers") do |req|
|
|
75
|
+
req.headers["Authorization"] = "Bearer #{token}"
|
|
76
|
+
req.params.update(params) if params
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
handle_response(resp)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# Returns array / parsed hash for GET /servers
|
|
83
|
+
def servers(params: nil)
|
|
84
|
+
ensure_authenticated!
|
|
85
|
+
|
|
86
|
+
resp = @faraday.get("/service/servers") do |req|
|
|
87
|
+
req.headers["Authorization"] = "Bearer #{token}"
|
|
88
|
+
req.params.update(params) if params
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
handle_response(resp)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def server(server_id: ,params: nil)
|
|
95
|
+
ensure_authenticated!
|
|
96
|
+
|
|
97
|
+
resp = @faraday.get("/service/server/#{server_id}") do |req|
|
|
98
|
+
req.headers["Authorization"] = "Bearer #{token}"
|
|
99
|
+
req.params.update(params) if params
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
handle_response(resp)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def change_server_cpu(server_id:, body:, params: nil)
|
|
106
|
+
ensure_authenticated!
|
|
107
|
+
|
|
108
|
+
resp = @faraday.put("/service/server/#{server_id}/cpu") do |req|
|
|
109
|
+
req.headers["Authorization"] = "Bearer #{token}"
|
|
110
|
+
req.headers['Accept'] = 'text/plain'
|
|
111
|
+
req.headers['Content-Type'] = 'application/json'
|
|
112
|
+
req.body = body
|
|
113
|
+
req.params.update(params) if params
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
handle_response(resp)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def change_server_ram(server_id:,body: ,params: nil)
|
|
120
|
+
ensure_authenticated!
|
|
121
|
+
|
|
122
|
+
resp = @faraday.put("/service/server/#{server_id}/ram") do |req|
|
|
123
|
+
req.headers["Authorization"] = "Bearer #{token}"
|
|
124
|
+
req.headers['Accept'] = 'text/plain'
|
|
125
|
+
req.headers['Content-Type'] = 'application/json'
|
|
126
|
+
req.body = body
|
|
127
|
+
req.params.update(params) if params
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
handle_response(resp)
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def get(path, params: nil)
|
|
134
|
+
ensure_authenticated!
|
|
135
|
+
|
|
136
|
+
resp = @faraday.get(path) do |req|
|
|
137
|
+
req.headers["Authorization"] = "Bearer #{token}"
|
|
138
|
+
req.params.update(params) if params
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
handle_response(resp)
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
private
|
|
145
|
+
|
|
146
|
+
def build_connection
|
|
147
|
+
Faraday.new(url: base_url) do |f|
|
|
148
|
+
f.request :retry, max: 2, interval: 0.05
|
|
149
|
+
f.response :raise_error # will raise Faraday::ClientError for 4xx/5xx
|
|
150
|
+
f.adapter Faraday.default_adapter
|
|
151
|
+
f.options.timeout = timeout
|
|
152
|
+
f.options.open_timeout = timeout
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def ensure_authenticated!
|
|
157
|
+
# double-check token presence and expiration; thread-safe
|
|
158
|
+
if token.nil? || token_expired?
|
|
159
|
+
authenticate!
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def token
|
|
164
|
+
@token
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
def token_expired?
|
|
168
|
+
return true if @token_expires_at.nil?
|
|
169
|
+
DateTime.now >= (@token_expires_at - token_expiry_margin)
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
def handle_response(resp)
|
|
173
|
+
if resp.status >= 200 && resp.status < 300
|
|
174
|
+
parse_json(resp.body)
|
|
175
|
+
else
|
|
176
|
+
raise Errors::RequestError, "API request failed (status #{resp.status}): #{resp.body}"
|
|
177
|
+
end
|
|
178
|
+
rescue MultiJson::ParseError => e
|
|
179
|
+
raise Errors::ResponseParseError, "Failed to parse JSON: #{e.message}"
|
|
180
|
+
rescue Faraday::ClientError => e
|
|
181
|
+
# Faraday might raise error due to response middleware
|
|
182
|
+
raise Errors::RequestError, "HTTP error: #{e.class}: #{e.message}"
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
def parse_json(body)
|
|
186
|
+
body = "{}" if body.nil? || body.strip == ""
|
|
187
|
+
MultiJson.load(body)
|
|
188
|
+
rescue MultiJson::ParseError => e
|
|
189
|
+
raise Errors::ResponseParseError, e.message
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module KamateraApiWrapper
|
|
4
|
+
module Errors
|
|
5
|
+
class KamateraError < StandardError; end
|
|
6
|
+
class AuthenticationError < KamateraError; end
|
|
7
|
+
class RequestError < KamateraError; end
|
|
8
|
+
class ResponseParseError < KamateraError; end
|
|
9
|
+
end
|
|
10
|
+
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
require "faraday"
|
|
2
|
+
require 'faraday/retry'
|
|
3
|
+
require "multi_json"
|
|
4
|
+
|
|
5
|
+
require_relative "kamatera_api_wrapper/version"
|
|
6
|
+
require_relative "kamatera_api_wrapper/errors"
|
|
7
|
+
require_relative "kamatera_api_wrapper/client"
|
|
8
|
+
|
|
9
|
+
module KamateraApiWrapper
|
|
10
|
+
class Error < StandardError; end
|
|
11
|
+
end
|
|
Binary file
|
data/spec/client_spec.rb
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
RSpec.describe KamateraApiWrapper::Client do
|
|
4
|
+
let(:client_id) { "abc" }
|
|
5
|
+
let(:client_secret) { "shh" }
|
|
6
|
+
let(:base_url) { "https://console.kamatera.com" }
|
|
7
|
+
let(:client) { described_class.new(client_id: client_id, client_secret: client_secret, base_url: base_url) }
|
|
8
|
+
|
|
9
|
+
describe "#authenticate!" do
|
|
10
|
+
it "requests token and stores it" do
|
|
11
|
+
stub = stub_request(:post, "#{base_url}/service/authenticate")
|
|
12
|
+
.with(
|
|
13
|
+
headers: { "Content-Type" => "application/json" },
|
|
14
|
+
body: { clientId: client_id, secret: client_secret }.to_json
|
|
15
|
+
)
|
|
16
|
+
.to_return(status: 200, body: { authentication: "tok", expires: Time.now.to_i + 3600 }.to_json, headers: { "Content-Type" => "application/json" })
|
|
17
|
+
|
|
18
|
+
expect(client.authenticate!).to eq(true)
|
|
19
|
+
# token internals are not exposed; call servers to assert token used via WebMock
|
|
20
|
+
stub_request(:get, "#{base_url}/servers")
|
|
21
|
+
.with(headers: { "Authorization" => "Bearer tok" })
|
|
22
|
+
.to_return(status: 200, body: [{ id: "srv-1" }].to_json, headers: { "Content-Type" => "application/json" })
|
|
23
|
+
|
|
24
|
+
expect(client.servers).to eq([{"id" => "srv-1"}])
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
describe "#servers" do
|
|
29
|
+
it "auto-authenticates when needed" do
|
|
30
|
+
stub_request(:post, "#{base_url}/service/authenticate")
|
|
31
|
+
.to_return(status: 200, body: { authentication: "auto-tok", expires: Time.now.to_i + 3600 }.to_json)
|
|
32
|
+
|
|
33
|
+
stub_request(:get, "#{base_url}/servers")
|
|
34
|
+
.with(headers: { "Authorization" => "Bearer auto-tok" })
|
|
35
|
+
.to_return(status: 200, body: [{ id: "s1" }].to_json)
|
|
36
|
+
|
|
37
|
+
expect(client.servers).to eq([{"id" => "s1"}])
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: kamatera_api_wrapper
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Stanislaw Zawadzki
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2025-12-01 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: bundler
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - ">="
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '0'
|
|
20
|
+
type: :development
|
|
21
|
+
prerelease: false
|
|
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: rake
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - ">="
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '0'
|
|
34
|
+
type: :development
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - ">="
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '0'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: rspec
|
|
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: webmock
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - ">="
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '0'
|
|
62
|
+
type: :development
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - ">="
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '0'
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: faraday
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - "~>"
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: '2.0'
|
|
76
|
+
type: :runtime
|
|
77
|
+
prerelease: false
|
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - "~>"
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: '2.0'
|
|
83
|
+
- !ruby/object:Gem::Dependency
|
|
84
|
+
name: faraday-retry
|
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
|
86
|
+
requirements:
|
|
87
|
+
- - ">="
|
|
88
|
+
- !ruby/object:Gem::Version
|
|
89
|
+
version: '0'
|
|
90
|
+
type: :runtime
|
|
91
|
+
prerelease: false
|
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
+
requirements:
|
|
94
|
+
- - ">="
|
|
95
|
+
- !ruby/object:Gem::Version
|
|
96
|
+
version: '0'
|
|
97
|
+
- !ruby/object:Gem::Dependency
|
|
98
|
+
name: multi_json
|
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
|
100
|
+
requirements:
|
|
101
|
+
- - "~>"
|
|
102
|
+
- !ruby/object:Gem::Version
|
|
103
|
+
version: '1.15'
|
|
104
|
+
type: :runtime
|
|
105
|
+
prerelease: false
|
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
107
|
+
requirements:
|
|
108
|
+
- - "~>"
|
|
109
|
+
- !ruby/object:Gem::Version
|
|
110
|
+
version: '1.15'
|
|
111
|
+
description: A small client for authenticating with Kamatera and calling server endpoints
|
|
112
|
+
(GET /servers, etc.)
|
|
113
|
+
email:
|
|
114
|
+
- st.zawadzki@gmail.com
|
|
115
|
+
executables: []
|
|
116
|
+
extensions: []
|
|
117
|
+
extra_rdoc_files: []
|
|
118
|
+
files:
|
|
119
|
+
- ".gitignore"
|
|
120
|
+
- ".rspec_status"
|
|
121
|
+
- Gemfile
|
|
122
|
+
- Gemfile.lock
|
|
123
|
+
- README.md
|
|
124
|
+
- Rakefile
|
|
125
|
+
- bin/console
|
|
126
|
+
- kamatera_api_wrapper.gemspec
|
|
127
|
+
- lib/kamatera_api_wrapper.rb
|
|
128
|
+
- lib/kamatera_api_wrapper/client.rb
|
|
129
|
+
- lib/kamatera_api_wrapper/errors.rb
|
|
130
|
+
- lib/kamatera_api_wrapper/version.rb
|
|
131
|
+
- pkg/kamatera_api_wrapper-0.1.0.gem
|
|
132
|
+
- spec/client_spec.rb
|
|
133
|
+
- spec/spec_helper.rb
|
|
134
|
+
homepage: ''
|
|
135
|
+
licenses:
|
|
136
|
+
- MIT
|
|
137
|
+
metadata: {}
|
|
138
|
+
post_install_message:
|
|
139
|
+
rdoc_options: []
|
|
140
|
+
require_paths:
|
|
141
|
+
- lib
|
|
142
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
143
|
+
requirements:
|
|
144
|
+
- - ">="
|
|
145
|
+
- !ruby/object:Gem::Version
|
|
146
|
+
version: '0'
|
|
147
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
148
|
+
requirements:
|
|
149
|
+
- - ">="
|
|
150
|
+
- !ruby/object:Gem::Version
|
|
151
|
+
version: '0'
|
|
152
|
+
requirements: []
|
|
153
|
+
rubygems_version: 3.4.10
|
|
154
|
+
signing_key:
|
|
155
|
+
specification_version: 4
|
|
156
|
+
summary: Simple Ruby wrapper for Kamatera server API
|
|
157
|
+
test_files: []
|