scalingo-ruby-api 1.1.1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +21 -0
- data/README.md +90 -0
- data/lib/scalingo.rb +0 -5
- data/lib/scalingo/api.rb +4 -0
- data/lib/scalingo/configuration.rb +11 -14
- data/lib/scalingo/connection.rb +16 -15
- data/lib/scalingo/endpoint.rb +20 -9
- data/lib/scalingo/endpoint/account_keys.rb +3 -4
- data/lib/scalingo/endpoint/addon_categories.rb +0 -1
- data/lib/scalingo/endpoint/addon_provider.rb +0 -1
- data/lib/scalingo/endpoint/addons.rb +2 -3
- data/lib/scalingo/endpoint/alerts.rb +25 -0
- data/lib/scalingo/endpoint/apps.rb +11 -8
- data/lib/scalingo/endpoint/autoscalers.rb +27 -0
- data/lib/scalingo/endpoint/collaborators.rb +1 -2
- data/lib/scalingo/endpoint/deployments.rb +0 -1
- data/lib/scalingo/endpoint/domains.rb +3 -4
- data/lib/scalingo/endpoint/events.rb +0 -1
- data/lib/scalingo/endpoint/notifiers.rb +28 -0
- data/lib/scalingo/endpoint/regions.rb +6 -0
- data/lib/scalingo/endpoint/variables.rb +3 -4
- data/lib/scalingo/error.rb +7 -1
- data/lib/scalingo/jwt.rb +37 -0
- data/lib/scalingo/logs.rb +4 -8
- data/lib/scalingo/realtime/logs.rb +5 -5
- data/lib/scalingo/regions_cache.rb +12 -0
- data/lib/scalingo/request.rb +20 -2
- data/lib/scalingo/version.rb +1 -2
- data/test/connection_test.rb +2 -15
- data/test/endpoint_base_test.rb +11 -10
- data/test/endpoint_collection_test.rb +0 -1
- data/test/endpoint_resource_test.rb +3 -1
- data/test/request_test.rb +24 -15
- data/test/scalingo_test.rb +0 -11
- data/test/test_helper.rb +52 -5
- metadata +55 -33
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9cac65a8cb02d5c36c8a21f1079f5da30a22499183f4df5f5c218c0f31df8362
|
4
|
+
data.tar.gz: f5d702234ea4b5c2f13ac430f945dcc1e66986258a56526a8ae0167a3fa9e55b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d47763e0fb6b43781cdeaccda286a666efdc5240671889b2a1a7c152c2a32b5512685eacf945b2e0f3787ec64dd814b785c16d42c49ebc546d830b8dda69e26a
|
7
|
+
data.tar.gz: 56a4f6d9996a71d2d1b2ca43fd1bd9948d0e90559ec9415d2e0d4b426f86087926fd3f9bda21c90fef55be014ce31ff9555504512779ed9cec918d37c10bd7d6
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
## 2.0.0 - 2019/12/05
|
2
|
+
|
3
|
+
* Compatibility with new API tokens
|
4
|
+
* Compatibility with multi-region infrastructure
|
5
|
+
* Add missing resources: `regions`, `autoscalers`, `notifiers`, `alerts`
|
6
|
+
|
7
|
+
## 1.1.1 - 2019/01/08
|
8
|
+
|
9
|
+
* Update metadata on rubygems
|
10
|
+
|
11
|
+
## 1.1.0 - 2019/01/08
|
12
|
+
|
13
|
+
* Add /apps/:id/containers and /apps/:id/stats endpoints
|
14
|
+
|
15
|
+
## 1.0.0 - 2017/24/01
|
16
|
+
|
17
|
+
* First tag 1.0.0, API won't be broken
|
18
|
+
|
19
|
+
## 1.0.0.alpha1
|
20
|
+
|
21
|
+
* Initial alpha release
|
data/README.md
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
# Scalingo-ruby-api
|
2
|
+
|
3
|
+
A ruby wrapper for the Scalingo API
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
```ruby
|
8
|
+
gem 'scalingo-ruby-api', '~> 2'
|
9
|
+
```
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
```
|
14
|
+
bundle
|
15
|
+
```
|
16
|
+
|
17
|
+
Or install it yourself as:
|
18
|
+
|
19
|
+
```
|
20
|
+
gem install scalingo-ruby-api
|
21
|
+
```
|
22
|
+
|
23
|
+
## Usage
|
24
|
+
|
25
|
+
### Global configuration
|
26
|
+
|
27
|
+
```ruby
|
28
|
+
require 'scalingo'
|
29
|
+
|
30
|
+
Scalingo.token = 'tk-your-token'
|
31
|
+
Scalingo.region = 'osc-fr1'
|
32
|
+
|
33
|
+
# Or
|
34
|
+
|
35
|
+
Scalingo.configure do |config|
|
36
|
+
config.token = 'tk-your-token'
|
37
|
+
config.region = 'osc-fr1'
|
38
|
+
end
|
39
|
+
|
40
|
+
client = Scalingo::Client.new
|
41
|
+
```
|
42
|
+
|
43
|
+
### Client configuration
|
44
|
+
|
45
|
+
```ruby
|
46
|
+
client = Scalingo::Client.new(region: 'osc-fr1', token: 'tk-your-token')
|
47
|
+
|
48
|
+
# Or both can be combined
|
49
|
+
|
50
|
+
Scalingo.token = 'tk-your-token'
|
51
|
+
|
52
|
+
client_region1 = Scalingo::Client.new(region: 'osc-fr1')
|
53
|
+
client_region2 = Scalingo::Client.new(region: 'agora-fr1')
|
54
|
+
```
|
55
|
+
|
56
|
+
### Examples
|
57
|
+
|
58
|
+
```ruby
|
59
|
+
# Get all apps
|
60
|
+
apps = client.apps.all
|
61
|
+
|
62
|
+
# Get logs of one app
|
63
|
+
app = client.apps.find('my-app')
|
64
|
+
puts app.logs.dump
|
65
|
+
```
|
66
|
+
|
67
|
+
### Notes
|
68
|
+
|
69
|
+
Client contains a cache with the regions endpoints and the current valid bearer
|
70
|
+
token used for authentication.
|
71
|
+
|
72
|
+
If a lot of calls are done and to avoid making useless requests and slowing
|
73
|
+
down your queries, it is encouraged to re-use your client.
|
74
|
+
|
75
|
+
## Hacking
|
76
|
+
|
77
|
+
Using another authentication endpoint for hacking is possible through
|
78
|
+
|
79
|
+
```
|
80
|
+
client = Scalingo::Client.new(auth_endpoint: 'http://172.17.0.1:1234/v1', region: 'local')
|
81
|
+
apps = client.apps.all
|
82
|
+
```
|
83
|
+
|
84
|
+
## Special Thanks
|
85
|
+
|
86
|
+
To aki017 who made [slack-ruby-gem](http://github.com/aki017/slack-ruby-gem).
|
87
|
+
|
88
|
+
It was used as an inspirational source for this project.
|
89
|
+
|
90
|
+
Thanks [Aethelflaed](https://github.com/Aethelflaed) for the original implementation of this gem
|
data/lib/scalingo.rb
CHANGED
@@ -14,11 +14,6 @@ module Scalingo
|
|
14
14
|
Scalingo::Client.new(options)
|
15
15
|
end
|
16
16
|
|
17
|
-
def self.method_missing(method, *args, &block)
|
18
|
-
return super unless client.respond_to?(method)
|
19
|
-
client.send(method, *args, &block)
|
20
|
-
end
|
21
|
-
|
22
17
|
def self.respond_to?(method)
|
23
18
|
return client.respond_to?(method) || super
|
24
19
|
end
|
data/lib/scalingo/api.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
require_relative 'connection'
|
2
|
+
require_relative 'jwt'
|
2
3
|
require_relative 'request'
|
3
4
|
require_relative 'configuration'
|
4
5
|
require_relative 'endpoint'
|
6
|
+
require_relative 'regions_cache'
|
5
7
|
|
6
8
|
module Scalingo
|
7
9
|
class Api
|
@@ -15,8 +17,10 @@ module Scalingo
|
|
15
17
|
end
|
16
18
|
|
17
19
|
include Connection
|
20
|
+
include JWT
|
18
21
|
include Request
|
19
22
|
include Endpoint
|
23
|
+
include RegionsCache
|
20
24
|
end
|
21
25
|
end
|
22
26
|
|
@@ -9,9 +9,10 @@ module Scalingo
|
|
9
9
|
:adapter,
|
10
10
|
:token,
|
11
11
|
:endpoint,
|
12
|
+
:auth_endpoint,
|
13
|
+
:region,
|
12
14
|
:user_agent,
|
13
15
|
:proxy,
|
14
|
-
:parse_json,
|
15
16
|
].freeze
|
16
17
|
|
17
18
|
# The adapter that will be used to connect if none is set
|
@@ -22,10 +23,8 @@ module Scalingo
|
|
22
23
|
# By default, don't set an token
|
23
24
|
DEFAULT_TOKEN = nil
|
24
25
|
|
25
|
-
# The endpoint
|
26
|
-
|
27
|
-
# @note There is no reason to use any other endpoint at this time
|
28
|
-
DEFAULT_ENDPOINT = 'https://api.scalingo.com/v1/'.freeze
|
26
|
+
# The endpoint to exchange the token with a JWT
|
27
|
+
DEFAULT_AUTH_ENDPOINT = 'https://auth.scalingo.com/v1'.freeze
|
29
28
|
|
30
29
|
# By default, don't use a proxy server
|
31
30
|
DEFAULT_PROXY = nil
|
@@ -33,9 +32,6 @@ module Scalingo
|
|
33
32
|
# The user agent that will be sent to the Api endpoint if none is set
|
34
33
|
DEFAULT_USER_AGENT = "Scalingo Ruby Gem #{Scalingo::VERSION}".freeze
|
35
34
|
|
36
|
-
# Parse json by default, only changed when getting text result (e.g. Logs)
|
37
|
-
DEFAULT_PARSE_JSON = true
|
38
|
-
|
39
35
|
# @private
|
40
36
|
attr_accessor *VALID_OPTIONS_KEYS
|
41
37
|
|
@@ -58,12 +54,13 @@ module Scalingo
|
|
58
54
|
|
59
55
|
# Reset all configuration options to defaults
|
60
56
|
def reset
|
61
|
-
self.adapter
|
62
|
-
self.token
|
63
|
-
self.endpoint
|
64
|
-
self.
|
65
|
-
self.
|
66
|
-
self.
|
57
|
+
self.adapter = DEFAULT_ADAPTER
|
58
|
+
self.token = DEFAULT_TOKEN
|
59
|
+
self.endpoint = nil
|
60
|
+
self.auth_endpoint = DEFAULT_AUTH_ENDPOINT
|
61
|
+
self.region = nil
|
62
|
+
self.user_agent = DEFAULT_USER_AGENT
|
63
|
+
self.proxy = DEFAULT_PROXY
|
67
64
|
end
|
68
65
|
end
|
69
66
|
end
|
data/lib/scalingo/connection.rb
CHANGED
@@ -1,31 +1,32 @@
|
|
1
1
|
require 'faraday_middleware'
|
2
|
-
Dir[File.expand_path('
|
2
|
+
Dir[File.expand_path('../faraday/*.rb', __dir__)].each { |f| require f }
|
3
3
|
|
4
4
|
module Scalingo
|
5
5
|
module Connection
|
6
6
|
private
|
7
|
-
def connection
|
8
|
-
raise MissingToken.new if !token
|
9
7
|
|
10
|
-
|
11
|
-
|
12
|
-
'Accept' => 'application/json; charset=utf-8',
|
13
|
-
'Content-Type' => 'application/json',
|
14
|
-
'User-Agent' => user_agent,
|
15
|
-
},
|
16
|
-
:proxy => proxy,
|
17
|
-
:url => endpoint,
|
18
|
-
}
|
8
|
+
def build_connection(opts = {})
|
9
|
+
raise MissingToken if !token
|
19
10
|
|
20
|
-
Faraday::Connection.new(
|
11
|
+
Faraday::Connection.new(connection_options) do |connection|
|
21
12
|
connection.use Faraday::Request::Multipart
|
22
13
|
connection.use Faraday::Request::UrlEncoded
|
23
|
-
connection.use Faraday::Response::ParseJson if parse_json
|
24
14
|
connection.use FaradayMiddleware::RaiseHttpException
|
15
|
+
connection.response :json, :content_type => /\bjson$/
|
25
16
|
connection.adapter(adapter)
|
26
|
-
connection.basic_auth('', token)
|
27
17
|
end
|
28
18
|
end
|
19
|
+
|
20
|
+
def connection_options
|
21
|
+
return {
|
22
|
+
headers: {
|
23
|
+
'Accept' => 'application/json; charset=utf-8',
|
24
|
+
'Content-Type' => 'application/json',
|
25
|
+
'User-Agent' => user_agent,
|
26
|
+
},
|
27
|
+
proxy: proxy,
|
28
|
+
}
|
29
|
+
end
|
29
30
|
end
|
30
31
|
end
|
31
32
|
|
data/lib/scalingo/endpoint.rb
CHANGED
@@ -9,8 +9,13 @@ module Scalingo
|
|
9
9
|
module ClassMethods
|
10
10
|
def resources(name, opts = {})
|
11
11
|
name = name.to_s
|
12
|
+
|
13
|
+
endpoint_opts = { auth_api: opts[:auth_api] }
|
14
|
+
|
12
15
|
define_method(name.pluralize.underscore) do
|
13
|
-
Scalingo::Endpoint.const_get(
|
16
|
+
Scalingo::Endpoint.const_get(
|
17
|
+
name.pluralize.camelize,
|
18
|
+
).new(self, nil, endpoint_opts)
|
14
19
|
end
|
15
20
|
|
16
21
|
return if opts[:collection_only]
|
@@ -23,22 +28,28 @@ module Scalingo
|
|
23
28
|
|
24
29
|
extend ClassMethods
|
25
30
|
resources :apps
|
26
|
-
resources :account_keys
|
31
|
+
resources :account_keys, auth_api: true
|
27
32
|
resources :addon_providers, collection_only: true
|
28
33
|
resources :addon_categories, collection_only: true
|
34
|
+
resources :regions, collection_only: true, auth_api: true
|
29
35
|
|
30
36
|
module Base
|
31
37
|
attr_accessor :api
|
32
38
|
attr_accessor :prefix
|
39
|
+
attr_accessor :auth_api
|
33
40
|
|
34
|
-
def initialize(api, prefix = nil)
|
41
|
+
def initialize(api, prefix = nil, opts = {})
|
35
42
|
self.api = api
|
43
|
+
self.auth_api = opts.fetch(:auth_api, false)
|
36
44
|
self.prefix = prefix || self.class.name.split('::').last.underscore.pluralize
|
37
45
|
end
|
38
46
|
|
39
47
|
Request::REQUEST_METHODS.each do |method|
|
40
48
|
define_method(method) do |path = nil, options = {}|
|
41
|
-
|
49
|
+
req_path = prefix
|
50
|
+
req_path += "/#{path}" if !path.nil? && path != ''
|
51
|
+
options.merge!(auth_api: auth_api) if auth_api
|
52
|
+
api.send(method, req_path, options)
|
42
53
|
end
|
43
54
|
end
|
44
55
|
end
|
@@ -47,8 +58,8 @@ module Scalingo
|
|
47
58
|
include Base
|
48
59
|
include Endpoint
|
49
60
|
|
50
|
-
def initialize(api, prefix, data = {})
|
51
|
-
Base.instance_method(:initialize).bind(self).call(api, prefix)
|
61
|
+
def initialize(api, prefix, opts = {}, data = {})
|
62
|
+
Base.instance_method(:initialize).bind(self).call(api, prefix, opts)
|
52
63
|
OpenStruct.instance_method(:initialize).bind(self).call(data)
|
53
64
|
end
|
54
65
|
end
|
@@ -59,16 +70,16 @@ module Scalingo
|
|
59
70
|
include Enumerable
|
60
71
|
|
61
72
|
def all
|
62
|
-
get[collection_name].map{|r| resource_class.new(self, r[find_by], r)}
|
73
|
+
get[collection_name].map { |r| resource_class.new(self, r[find_by], {}, r) }
|
63
74
|
end
|
64
|
-
|
75
|
+
alias to_a all
|
65
76
|
|
66
77
|
def each
|
67
78
|
block_given? ? all.each(&Proc.new) : all.each
|
68
79
|
end
|
69
80
|
|
70
81
|
def find(id)
|
71
|
-
detect{|r| r[find_by] == id}
|
82
|
+
detect { |r| r[find_by] == id }
|
72
83
|
end
|
73
84
|
|
74
85
|
def collection_name
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module Scalingo
|
2
2
|
module Endpoint
|
3
3
|
class AccountKeys < Collection
|
4
|
-
def initialize(api)
|
5
|
-
super(api, '
|
4
|
+
def initialize(api, _, opts = {})
|
5
|
+
super(api, 'keys', opts)
|
6
6
|
end
|
7
7
|
|
8
8
|
def collection_name
|
@@ -10,7 +10,7 @@ module Scalingo
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def create(name, content)
|
13
|
-
post(nil,
|
13
|
+
post(nil, key: { name: name, content: content })
|
14
14
|
end
|
15
15
|
end
|
16
16
|
class AccountKey < Resource
|
@@ -20,4 +20,3 @@ module Scalingo
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
end
|
23
|
-
|
@@ -2,12 +2,12 @@ module Scalingo
|
|
2
2
|
module Endpoint
|
3
3
|
class Addons < Collection
|
4
4
|
def create(addon_provider_id, plan_id)
|
5
|
-
post(nil,
|
5
|
+
post(nil, addon: { addon_provider_id: addon_provider_id, plan_id: plan_id })
|
6
6
|
end
|
7
7
|
end
|
8
8
|
class Addon < Resource
|
9
9
|
def update(plan_id)
|
10
|
-
patch(nil,
|
10
|
+
patch(nil, addon: { plan_id: plan_id })
|
11
11
|
end
|
12
12
|
|
13
13
|
def destroy
|
@@ -16,4 +16,3 @@ module Scalingo
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|
19
|
-
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Scalingo
|
2
|
+
module Endpoint
|
3
|
+
# - container_type: can be any container type of an application (e.g. web, clock…)
|
4
|
+
# - limit: Any float value. For any resource consumption, please provide 0.1 if you need to be alerted when the consumption goes above 10%.
|
5
|
+
# - metric: e.g. RPM per container, RAM consumption…
|
6
|
+
# - notifiers: list of notifier ID that will receive the alerts (optional)
|
7
|
+
# - send_when_below: will the alert be sent when the value goes above or below the limit (optional)
|
8
|
+
# - duration_before_trigger: the alert is triggered if the value is above the limit for the specified duration. Duration is expressed in nanoseconds. (optional)
|
9
|
+
# - remind_every: send the alert at regular interval when activated (optional)
|
10
|
+
class Alerts < Collection
|
11
|
+
def create(params)
|
12
|
+
post(nil, alert: params)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
class Alert < Resource
|
16
|
+
def update(params)
|
17
|
+
patch(nil, alert: params)
|
18
|
+
end
|
19
|
+
|
20
|
+
def destroy
|
21
|
+
delete
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -2,7 +2,7 @@ module Scalingo
|
|
2
2
|
module Endpoint
|
3
3
|
class Apps < Collection
|
4
4
|
def create(name)
|
5
|
-
post(nil,
|
5
|
+
post(nil, app: { name: name })
|
6
6
|
end
|
7
7
|
|
8
8
|
def find_by
|
@@ -11,15 +11,15 @@ module Scalingo
|
|
11
11
|
end
|
12
12
|
class App < Resource
|
13
13
|
def scale(containers)
|
14
|
-
post('scale',
|
14
|
+
post('scale', containers: containers)
|
15
15
|
end
|
16
16
|
|
17
17
|
def restart(*scopes)
|
18
|
-
post('restart',
|
18
|
+
post('restart', scope: scopes)
|
19
19
|
end
|
20
20
|
|
21
21
|
def destroy(current_name)
|
22
|
-
delete(nil,
|
22
|
+
delete(nil, current_name: current_name)
|
23
23
|
end
|
24
24
|
|
25
25
|
def destroy!
|
@@ -27,14 +27,15 @@ module Scalingo
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def rename(new_name, current_name)
|
30
|
-
post('rename',
|
30
|
+
post('rename', new_name: new_name, current_name: current_name)
|
31
31
|
end
|
32
|
+
|
32
33
|
def rename!(new_name)
|
33
34
|
rename(new_name, prefix)
|
34
35
|
end
|
35
36
|
|
36
37
|
def transfer(email)
|
37
|
-
patch(nil,
|
38
|
+
patch(nil, app: { owner: { email: email } })
|
38
39
|
end
|
39
40
|
|
40
41
|
def logs_url
|
@@ -46,7 +47,7 @@ module Scalingo
|
|
46
47
|
end
|
47
48
|
|
48
49
|
def run(command, env = {})
|
49
|
-
post('run',
|
50
|
+
post('run', command: command, env: env)
|
50
51
|
end
|
51
52
|
|
52
53
|
resources :addons
|
@@ -56,8 +57,10 @@ module Scalingo
|
|
56
57
|
resources :domains
|
57
58
|
resources :stats
|
58
59
|
resources :variables
|
60
|
+
resources :notifiers
|
61
|
+
resources :alerts
|
62
|
+
resources :autoscalers
|
59
63
|
resources :events, collection_only: true
|
60
64
|
end
|
61
65
|
end
|
62
66
|
end
|
63
|
-
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Scalingo
|
2
|
+
module Endpoint
|
3
|
+
class Autoscalers < Collection
|
4
|
+
# - container_type: can be any container type of an application (e.g. web, clock…)
|
5
|
+
# - min_containers: lower limit of containers
|
6
|
+
# - max_containers: upper limit of containers
|
7
|
+
# - metric: e.g. RPM per container, RAM consumption. The list of available metrics is here.
|
8
|
+
# - target: the autoscaler will keep the metric value as close to the target as possible by scaling the application
|
9
|
+
# https://developers.scalingo.com/autoscalers
|
10
|
+
def create(params)
|
11
|
+
post(nil, autoscaler: params)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
class Autoscaler < Resource
|
15
|
+
# - container_type can't be changed
|
16
|
+
# Additional fields
|
17
|
+
# - disabled: if true, autoscaler will stop manipulating container formation
|
18
|
+
def update(params)
|
19
|
+
patch(nil, autoscaler: params)
|
20
|
+
end
|
21
|
+
|
22
|
+
def destroy
|
23
|
+
delete
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -2,7 +2,7 @@ module Scalingo
|
|
2
2
|
module Endpoint
|
3
3
|
class Collaborators < Collection
|
4
4
|
def create(email)
|
5
|
-
post(nil,
|
5
|
+
post(nil, collaborator: { email: email })
|
6
6
|
end
|
7
7
|
end
|
8
8
|
class Collaborator < Resource
|
@@ -12,4 +12,3 @@ module Scalingo
|
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
15
|
-
|
@@ -3,15 +3,15 @@ module Scalingo
|
|
3
3
|
class Domains < Collection
|
4
4
|
def create(name, tlscert = nil, tlskey = nil)
|
5
5
|
if tlskey
|
6
|
-
post(nil,
|
6
|
+
post(nil, domain: { name: name, tlscert: tlscert, tlskey: tlskey })
|
7
7
|
else
|
8
|
-
post(nil,
|
8
|
+
post(nil, domain: { name: name })
|
9
9
|
end
|
10
10
|
end
|
11
11
|
end
|
12
12
|
class Domain < Resource
|
13
13
|
def update(tlscert, tlskey)
|
14
|
-
path(nil,
|
14
|
+
path(nil, domain: { tlscert: tlscert, tlskey: tlskey })
|
15
15
|
end
|
16
16
|
|
17
17
|
def destroy
|
@@ -20,4 +20,3 @@ module Scalingo
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
end
|
23
|
-
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Scalingo
|
2
|
+
module Endpoint
|
3
|
+
# - platform_id
|
4
|
+
# - name
|
5
|
+
# - send_all_alerts (optional)
|
6
|
+
# - send_all_events (optional)
|
7
|
+
# - type_data (optional)
|
8
|
+
# - selected_event_ids (optional)
|
9
|
+
# - active (optional)
|
10
|
+
# https://developers.scalingo.com/notifiers
|
11
|
+
#
|
12
|
+
class Notifiers < Collection
|
13
|
+
def create(params)
|
14
|
+
post(nil, notifier: params)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
class Notifier < Resource
|
18
|
+
# params: platform_id can't be changed
|
19
|
+
def update(params)
|
20
|
+
patch(nil, notifier: params)
|
21
|
+
end
|
22
|
+
|
23
|
+
def destroy
|
24
|
+
delete
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -2,16 +2,16 @@ module Scalingo
|
|
2
2
|
module Endpoint
|
3
3
|
class Variables < Collection
|
4
4
|
def all(aliases = true)
|
5
|
-
get(nil,
|
5
|
+
get(nil, aliases: aliases)[collection_name]
|
6
6
|
end
|
7
7
|
|
8
8
|
def create(name, value)
|
9
|
-
post(nil,
|
9
|
+
post(nil, variable: { name: name, value: value })
|
10
10
|
end
|
11
11
|
end
|
12
12
|
class Variable < Resource
|
13
13
|
def update(value)
|
14
|
-
patch(nil,
|
14
|
+
patch(nil, variable: { value: value })
|
15
15
|
end
|
16
16
|
|
17
17
|
def destroy
|
@@ -20,4 +20,3 @@ module Scalingo
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
end
|
23
|
-
|
data/lib/scalingo/error.rb
CHANGED
@@ -2,9 +2,15 @@ module Scalingo
|
|
2
2
|
# Custom error class for rescuing from all Scalingo errors
|
3
3
|
class Error < StandardError; end
|
4
4
|
|
5
|
-
# Raised when
|
5
|
+
# Raised when the client tries a connection without any token
|
6
6
|
class MissingToken < Error; end
|
7
7
|
|
8
|
+
# Raised when the client tries a connection without a region defined
|
9
|
+
class MissingRegion < Error; end
|
10
|
+
|
11
|
+
# Raise if the region named used is invalid, like if it doesn't exist
|
12
|
+
class InvalidRegion < Error; end
|
13
|
+
|
8
14
|
# Raised when Scalingo returns the HTTP status code 400
|
9
15
|
class BadRequest < Error; end
|
10
16
|
|
data/lib/scalingo/jwt.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'jwt'
|
2
|
+
|
3
|
+
module Scalingo
|
4
|
+
module JWT
|
5
|
+
attr_reader :current_jwt
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
def current_jwt
|
10
|
+
return @current_jwt if current_jwt_valid?
|
11
|
+
|
12
|
+
@current_jwt = exchange_token_jwt
|
13
|
+
return @current_jwt
|
14
|
+
end
|
15
|
+
|
16
|
+
def current_jwt_valid?
|
17
|
+
return false if @current_jwt.nil?
|
18
|
+
|
19
|
+
::JWT.decode @current_jwt, nil, false
|
20
|
+
|
21
|
+
return true
|
22
|
+
rescue ::JWT::ExpiredSignature
|
23
|
+
return false
|
24
|
+
end
|
25
|
+
|
26
|
+
def exchange_token_jwt
|
27
|
+
jwt_connection = build_connection
|
28
|
+
jwt_connection.basic_auth('', token)
|
29
|
+
jwt_connection.url_prefix = auth_endpoint
|
30
|
+
|
31
|
+
response = jwt_connection.post do |request|
|
32
|
+
request.path = '/v1/tokens/exchange'
|
33
|
+
end
|
34
|
+
return response.body['token']
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/scalingo/logs.rb
CHANGED
@@ -5,9 +5,8 @@ module Scalingo
|
|
5
5
|
attr_reader :app
|
6
6
|
|
7
7
|
def initialize(app)
|
8
|
-
super({endpoint: ''})
|
9
|
-
self.parse_json = false
|
10
8
|
@app = app
|
9
|
+
super()
|
11
10
|
end
|
12
11
|
|
13
12
|
def dump(lines = 10)
|
@@ -19,15 +18,12 @@ module Scalingo
|
|
19
18
|
end
|
20
19
|
|
21
20
|
protected
|
22
|
-
def log_token
|
23
|
-
self.endpoint, log_token = app.logs_url.split('?')
|
24
|
-
@log_token = log_token.split('=').last
|
25
|
-
end
|
26
21
|
|
27
22
|
def request(method, path, options)
|
28
|
-
|
23
|
+
endpoint, query = app.logs_url.split('?')
|
24
|
+
log_token = query.split('=').last
|
25
|
+
options.merge!(token: log_token, endpoint: endpoint)
|
29
26
|
super(method, path, options)
|
30
27
|
end
|
31
28
|
end
|
32
29
|
end
|
33
|
-
|
@@ -26,12 +26,10 @@ module Scalingo
|
|
26
26
|
|
27
27
|
ws.on :message do |event|
|
28
28
|
data = JSON.parse(event.data)
|
29
|
-
if data['event'] == 'log'
|
30
|
-
@callbacks.each{|c| c.call(data['log'])}
|
31
|
-
end
|
29
|
+
@callbacks.each { |c| c.call(data['log']) } if data['event'] == 'log'
|
32
30
|
end
|
33
31
|
|
34
|
-
ws.on :close do
|
32
|
+
ws.on :close do
|
35
33
|
ws = nil
|
36
34
|
end
|
37
35
|
|
@@ -41,8 +39,10 @@ module Scalingo
|
|
41
39
|
end
|
42
40
|
|
43
41
|
protected
|
42
|
+
|
44
43
|
def url
|
45
|
-
|
44
|
+
url = app.logs_url.gsub(/^http/, 'ws')
|
45
|
+
return "#{url}&stream=true"
|
46
46
|
end
|
47
47
|
end
|
48
48
|
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Scalingo
|
2
|
+
module RegionsCache
|
3
|
+
def region_api_endpoint(name)
|
4
|
+
@regions_cache ||= regions.all
|
5
|
+
|
6
|
+
region = @regions_cache.select { |r| r.name == name }.first
|
7
|
+
raise InvalidRegion, name if region.nil?
|
8
|
+
|
9
|
+
return "#{region['api']}/v1"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
data/lib/scalingo/request.rb
CHANGED
@@ -5,8 +5,8 @@ module Scalingo
|
|
5
5
|
:post,
|
6
6
|
:patch,
|
7
7
|
:put,
|
8
|
-
:delete
|
9
|
-
]
|
8
|
+
:delete,
|
9
|
+
].freeze
|
10
10
|
|
11
11
|
REQUEST_METHODS.each do |method|
|
12
12
|
define_method(method) do |path, options = {}|
|
@@ -15,8 +15,26 @@ module Scalingo
|
|
15
15
|
end
|
16
16
|
|
17
17
|
protected
|
18
|
+
|
18
19
|
def request(method, path, options)
|
20
|
+
auth_api = options.delete(:auth_api)
|
21
|
+
endpoint = options.delete(:endpoint)
|
22
|
+
|
23
|
+
connection = build_connection
|
24
|
+
|
25
|
+
if auth_api
|
26
|
+
connection.url_prefix = URI(auth_endpoint)
|
27
|
+
elsif endpoint
|
28
|
+
connection.url_prefix = endpoint
|
29
|
+
else
|
30
|
+
raise MissingRegion if !region
|
31
|
+
|
32
|
+
connection.url_prefix = URI(region_api_endpoint(region))
|
33
|
+
end
|
34
|
+
|
19
35
|
response = connection.send(method) do |request|
|
36
|
+
request.headers['Authorization'] = "Bearer #{current_jwt}"
|
37
|
+
|
20
38
|
case method
|
21
39
|
when :get, :delete
|
22
40
|
request.url(path, options)
|
data/lib/scalingo/version.rb
CHANGED
data/test/connection_test.rb
CHANGED
@@ -4,21 +4,8 @@ class ConnectionTest < BaseTestCase
|
|
4
4
|
test 'missing token' do
|
5
5
|
Scalingo.token = nil
|
6
6
|
assert_raise(Scalingo::MissingToken) do
|
7
|
-
Scalingo.
|
7
|
+
client = Scalingo::Client.new(region: 'test-1')
|
8
|
+
client.apps.all
|
8
9
|
end
|
9
10
|
end
|
10
|
-
|
11
|
-
test 'parse_json' do
|
12
|
-
stub(:get, 'parse_json').to_return(body: {hello: :world}.to_json)
|
13
|
-
result = Scalingo.get('parse_json')
|
14
|
-
assert_equal({"hello" => "world"}, result)
|
15
|
-
end
|
16
|
-
|
17
|
-
test 'parse_json false' do
|
18
|
-
Scalingo.parse_json = false
|
19
|
-
stub(:get, 'parse_json').to_return(body: {hello: :world}.to_json)
|
20
|
-
result = Scalingo.get('parse_json')
|
21
|
-
assert_equal('{"hello":"world"}', result)
|
22
|
-
end
|
23
11
|
end
|
24
|
-
|
data/test/endpoint_base_test.rb
CHANGED
@@ -21,26 +21,28 @@ class EndpointBaseTest < BaseTestCase
|
|
21
21
|
end
|
22
22
|
|
23
23
|
Scalingo::Request::REQUEST_METHODS.each do |method|
|
24
|
-
test
|
24
|
+
test method.to_s do
|
25
|
+
default_opts = {}
|
26
|
+
|
25
27
|
@base.send(method)
|
26
28
|
assert_equal method, @api.method_called.http_method
|
27
|
-
assert_equal
|
28
|
-
assert_equal(
|
29
|
+
assert_equal @prefix.to_s, @api.method_called.path
|
30
|
+
assert_equal(default_opts, @api.method_called.options)
|
29
31
|
|
30
32
|
@base.send(method, 'test')
|
31
33
|
assert_equal method, @api.method_called.http_method
|
32
34
|
assert_equal "#{@prefix}/test", @api.method_called.path
|
33
|
-
assert_equal(
|
35
|
+
assert_equal(default_opts, @api.method_called.options)
|
34
36
|
|
35
|
-
@base.send(method, nil,
|
37
|
+
@base.send(method, nil, a: 1)
|
36
38
|
assert_equal method, @api.method_called.http_method
|
37
|
-
assert_equal
|
38
|
-
assert_equal(
|
39
|
+
assert_equal @prefix.to_s, @api.method_called.path
|
40
|
+
assert_equal(default_opts.merge(a: 1), @api.method_called.options)
|
39
41
|
|
40
|
-
@base.send(method, 'test',
|
42
|
+
@base.send(method, 'test', a: 1)
|
41
43
|
assert_equal method, @api.method_called.http_method
|
42
44
|
assert_equal "#{@prefix}/test", @api.method_called.path
|
43
|
-
assert_equal(
|
45
|
+
assert_equal(default_opts.merge(a: 1), @api.method_called.options)
|
44
46
|
end
|
45
47
|
end
|
46
48
|
|
@@ -49,4 +51,3 @@ class EndpointBaseTest < BaseTestCase
|
|
49
51
|
assert_equal 'endpoint_base_classes', @base.prefix
|
50
52
|
end
|
51
53
|
end
|
52
|
-
|
@@ -2,7 +2,9 @@ require 'test_helper'
|
|
2
2
|
|
3
3
|
class EndpointResourceTest < BaseTestCase
|
4
4
|
test 'initialize' do
|
5
|
-
resource = Scalingo::Endpoint::Resource.new(
|
5
|
+
resource = Scalingo::Endpoint::Resource.new(
|
6
|
+
'api', 'prefix', {}, hello: :world, world: :hello,
|
7
|
+
)
|
6
8
|
assert_equal 'api', resource.api
|
7
9
|
assert_equal 'prefix', resource.prefix
|
8
10
|
|
data/test/request_test.rb
CHANGED
@@ -9,55 +9,64 @@ class RequestTest < BaseTestCase
|
|
9
9
|
http_method: request.method,
|
10
10
|
headers: request.headers,
|
11
11
|
uri: request.uri,
|
12
|
-
query: request.uri.query ? Hash[request.uri.query.split('&').map{|q| q.split('=')}] : {},
|
12
|
+
query: request.uri.query ? Hash[request.uri.query.split('&').map { |q| q.split('=') }] : {},
|
13
13
|
path: request.uri.path[4..-1],
|
14
14
|
)
|
15
|
-
{status: 200}
|
15
|
+
{ status: 200 }
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
19
|
[:get, :delete].each do |sym|
|
20
|
-
test
|
21
|
-
Scalingo.
|
20
|
+
test sym.to_s do
|
21
|
+
client = Scalingo::Client.new(region: 'test-1')
|
22
|
+
|
23
|
+
stub_regions('test-1')
|
24
|
+
stub_token_exchange
|
25
|
+
|
26
|
+
client.public_send(sym, '')
|
22
27
|
assert_equal sym, @request.http_method
|
23
28
|
assert_equal({}, @request.query)
|
24
|
-
assert_equal
|
29
|
+
assert_equal nil, @request.path
|
25
30
|
assert_nil @request.body
|
26
31
|
|
27
|
-
|
32
|
+
client.public_send(sym, 'hello')
|
28
33
|
assert_equal sym, @request.http_method
|
29
34
|
assert_equal({}, @request.query)
|
30
35
|
assert_equal 'hello', @request.path
|
31
36
|
assert_nil @request.body
|
32
37
|
|
33
|
-
|
38
|
+
client.public_send(sym, 'hello', hello: :world)
|
34
39
|
assert_equal sym, @request.http_method
|
35
|
-
assert_equal({
|
40
|
+
assert_equal({ 'hello' => 'world' }, @request.query)
|
36
41
|
assert_equal 'hello', @request.path
|
37
42
|
assert_nil @request.body
|
38
43
|
end
|
39
44
|
end
|
40
45
|
|
41
46
|
[:post, :patch, :put].each do |sym|
|
42
|
-
test
|
43
|
-
Scalingo.
|
47
|
+
test sym.to_s do
|
48
|
+
client = Scalingo::Client.new(region: 'test-1')
|
49
|
+
|
50
|
+
stub_token_exchange
|
51
|
+
stub_regions('test-1')
|
52
|
+
|
53
|
+
client.public_send(sym, '')
|
44
54
|
assert_equal sym, @request.http_method
|
45
55
|
assert_equal({}, @request.query)
|
46
|
-
assert_equal
|
56
|
+
assert_equal nil, @request.path
|
47
57
|
assert_equal '', @request.body
|
48
58
|
|
49
|
-
|
59
|
+
client.public_send(sym, 'hello')
|
50
60
|
assert_equal sym, @request.http_method
|
51
61
|
assert_equal({}, @request.query)
|
52
62
|
assert_equal 'hello', @request.path
|
53
63
|
assert_equal '', @request.body
|
54
64
|
|
55
|
-
|
65
|
+
client.public_send(sym, 'hello', hello: :world)
|
56
66
|
assert_equal sym, @request.http_method
|
57
67
|
assert_equal({}, @request.query)
|
58
68
|
assert_equal 'hello', @request.path
|
59
|
-
assert_equal({hello: :world}, @request.body)
|
69
|
+
assert_equal({ hello: :world }, @request.body)
|
60
70
|
end
|
61
71
|
end
|
62
72
|
end
|
63
|
-
|
data/test/scalingo_test.rb
CHANGED
@@ -11,15 +11,4 @@ class ScalingoTest < BaseTestCase
|
|
11
11
|
test 'client' do
|
12
12
|
assert_equal Scalingo::Client, Scalingo.client.class
|
13
13
|
end
|
14
|
-
|
15
|
-
test 'respond_to' do
|
16
|
-
assert !Scalingo.methods.include?(:get)
|
17
|
-
assert Scalingo.respond_to?(:get)
|
18
|
-
end
|
19
|
-
|
20
|
-
test 'method_missing' do
|
21
|
-
stub(:get, '').to_return(status: 200)
|
22
|
-
assert Scalingo.client.get('') == Scalingo.get('')
|
23
|
-
end
|
24
14
|
end
|
25
|
-
|
data/test/test_helper.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'bundler/setup'
|
2
2
|
require 'simplecov'
|
3
|
+
require 'jwt'
|
3
4
|
require 'pry'
|
4
5
|
|
5
6
|
SimpleCov.configure do
|
@@ -26,17 +27,63 @@ class BaseTestCase < ActiveSupport::TestCase
|
|
26
27
|
WebMock.reset!
|
27
28
|
end
|
28
29
|
|
29
|
-
def
|
30
|
-
Scalingo.
|
30
|
+
def auth_endpoint_uri
|
31
|
+
Scalingo.auth_endpoint
|
31
32
|
end
|
32
33
|
|
33
|
-
def
|
34
|
+
def url_with_basic_auth(url)
|
35
|
+
return url.split('://').join("://:#{Scalingo.token}@")
|
36
|
+
end
|
37
|
+
|
38
|
+
def stub(method, path, auth_api: false, region: 'test-1')
|
39
|
+
uri = "https://api.#{region}.scalingo.com"
|
40
|
+
uri = auth_endpoint_uri if auth_api
|
34
41
|
case path
|
35
42
|
when String
|
36
|
-
|
43
|
+
uri = url_with_basic_auth(uri) if path == '/tokens/exchange'
|
44
|
+
return stub_request(method, "#{uri}#{path}")
|
37
45
|
when Regexp
|
38
|
-
stub_request(method, /#{Regexp.quote(
|
46
|
+
return stub_request(method, /#{Regexp.quote(uri)}#{path}/)
|
39
47
|
end
|
40
48
|
end
|
49
|
+
|
50
|
+
def stub_regions(region)
|
51
|
+
stub(
|
52
|
+
:get, '/regions', auth_api: true,
|
53
|
+
).to_return(
|
54
|
+
status: 200,
|
55
|
+
headers: {
|
56
|
+
'Content-Type' => 'application/json',
|
57
|
+
},
|
58
|
+
body: { regions: [
|
59
|
+
{
|
60
|
+
name: region,
|
61
|
+
api: "https://api.#{region}.scalingo.com",
|
62
|
+
database_api: "https://db-api.#{region}.scalingo.com",
|
63
|
+
},
|
64
|
+
] }.to_json,
|
65
|
+
)
|
66
|
+
end
|
67
|
+
|
68
|
+
def stub_token_exchange
|
69
|
+
stub(
|
70
|
+
:post, '/tokens/exchange', auth_api: true,
|
71
|
+
).to_return(
|
72
|
+
status: 200,
|
73
|
+
headers: {
|
74
|
+
'Content-Type' => 'application/json',
|
75
|
+
},
|
76
|
+
body: { token: generate_test_jwt }.to_json,
|
77
|
+
)
|
78
|
+
end
|
79
|
+
|
80
|
+
def generate_test_jwt
|
81
|
+
payload = {
|
82
|
+
iss: 'Scalingo Test', iat: Time.current.utc.to_i, uuid: SecureRandom.uuid,
|
83
|
+
rnd: SecureRandom.hex, exp: (Time.now.utc.to_i + 3600),
|
84
|
+
}
|
85
|
+
token = JWT.encode payload, '0' * 100, 'HS512'
|
86
|
+
return token
|
87
|
+
end
|
41
88
|
end
|
42
89
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scalingo-ruby-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Leo Unbekandt
|
@@ -9,8 +9,28 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2019-
|
12
|
+
date: 2019-12-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: activesupport
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ">="
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '4'
|
21
|
+
- - "<"
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: '6'
|
24
|
+
type: :runtime
|
25
|
+
prerelease: false
|
26
|
+
version_requirements: !ruby/object:Gem::Requirement
|
27
|
+
requirements:
|
28
|
+
- - ">="
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: '4'
|
31
|
+
- - "<"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '6'
|
14
34
|
- !ruby/object:Gem::Dependency
|
15
35
|
name: faraday
|
16
36
|
requirement: !ruby/object:Gem::Requirement
|
@@ -20,7 +40,7 @@ dependencies:
|
|
20
40
|
version: '0.7'
|
21
41
|
- - "<="
|
22
42
|
- !ruby/object:Gem::Version
|
23
|
-
version:
|
43
|
+
version: 0.17.0
|
24
44
|
type: :runtime
|
25
45
|
prerelease: false
|
26
46
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -30,76 +50,70 @@ dependencies:
|
|
30
50
|
version: '0.7'
|
31
51
|
- - "<="
|
32
52
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
53
|
+
version: 0.17.0
|
34
54
|
- !ruby/object:Gem::Dependency
|
35
55
|
name: faraday_middleware
|
36
56
|
requirement: !ruby/object:Gem::Requirement
|
37
57
|
requirements:
|
38
58
|
- - "~>"
|
39
59
|
- !ruby/object:Gem::Version
|
40
|
-
version: '0.
|
60
|
+
version: '0.13'
|
41
61
|
type: :runtime
|
42
62
|
prerelease: false
|
43
63
|
version_requirements: !ruby/object:Gem::Requirement
|
44
64
|
requirements:
|
45
65
|
- - "~>"
|
46
66
|
- !ruby/object:Gem::Version
|
47
|
-
version: '0.
|
67
|
+
version: '0.13'
|
48
68
|
- !ruby/object:Gem::Dependency
|
49
|
-
name:
|
69
|
+
name: faye-websocket
|
50
70
|
requirement: !ruby/object:Gem::Requirement
|
51
71
|
requirements:
|
52
72
|
- - "~>"
|
53
73
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
55
|
-
- - ">="
|
56
|
-
- !ruby/object:Gem::Version
|
57
|
-
version: 1.0.3
|
74
|
+
version: 0.9.2
|
58
75
|
type: :runtime
|
59
76
|
prerelease: false
|
60
77
|
version_requirements: !ruby/object:Gem::Requirement
|
61
78
|
requirements:
|
62
79
|
- - "~>"
|
63
80
|
- !ruby/object:Gem::Version
|
64
|
-
version:
|
65
|
-
- - ">="
|
66
|
-
- !ruby/object:Gem::Version
|
67
|
-
version: 1.0.3
|
81
|
+
version: 0.9.2
|
68
82
|
- !ruby/object:Gem::Dependency
|
69
|
-
name:
|
83
|
+
name: jwt
|
70
84
|
requirement: !ruby/object:Gem::Requirement
|
71
85
|
requirements:
|
72
86
|
- - "~>"
|
73
87
|
- !ruby/object:Gem::Version
|
74
|
-
version:
|
88
|
+
version: 2.2.1
|
75
89
|
type: :runtime
|
76
90
|
prerelease: false
|
77
91
|
version_requirements: !ruby/object:Gem::Requirement
|
78
92
|
requirements:
|
79
93
|
- - "~>"
|
80
94
|
- !ruby/object:Gem::Version
|
81
|
-
version:
|
95
|
+
version: 2.2.1
|
82
96
|
- !ruby/object:Gem::Dependency
|
83
|
-
name:
|
97
|
+
name: multi_json
|
84
98
|
requirement: !ruby/object:Gem::Requirement
|
85
99
|
requirements:
|
86
|
-
- - "
|
100
|
+
- - "~>"
|
87
101
|
- !ruby/object:Gem::Version
|
88
|
-
version: '
|
89
|
-
- - "
|
102
|
+
version: '1.0'
|
103
|
+
- - ">="
|
90
104
|
- !ruby/object:Gem::Version
|
91
|
-
version:
|
105
|
+
version: 1.0.3
|
92
106
|
type: :runtime
|
93
107
|
prerelease: false
|
94
108
|
version_requirements: !ruby/object:Gem::Requirement
|
95
109
|
requirements:
|
96
|
-
- - "
|
110
|
+
- - "~>"
|
97
111
|
- !ruby/object:Gem::Version
|
98
|
-
version: '
|
99
|
-
- - "
|
112
|
+
version: '1.0'
|
113
|
+
- - ">="
|
100
114
|
- !ruby/object:Gem::Version
|
101
|
-
version:
|
102
|
-
description: Ruby wrapper around the web API of scalingo.
|
115
|
+
version: 1.0.3
|
116
|
+
description: Ruby wrapper around the web API of scalingo.com
|
103
117
|
email:
|
104
118
|
- leo@scalingo.com
|
105
119
|
- geoffroy@planquart.fr
|
@@ -107,6 +121,8 @@ executables: []
|
|
107
121
|
extensions: []
|
108
122
|
extra_rdoc_files: []
|
109
123
|
files:
|
124
|
+
- CHANGELOG.md
|
125
|
+
- README.md
|
110
126
|
- Rakefile
|
111
127
|
- lib/faraday/raise_http_exception.rb
|
112
128
|
- lib/scalingo.rb
|
@@ -119,17 +135,23 @@ files:
|
|
119
135
|
- lib/scalingo/endpoint/addon_categories.rb
|
120
136
|
- lib/scalingo/endpoint/addon_provider.rb
|
121
137
|
- lib/scalingo/endpoint/addons.rb
|
138
|
+
- lib/scalingo/endpoint/alerts.rb
|
122
139
|
- lib/scalingo/endpoint/apps.rb
|
140
|
+
- lib/scalingo/endpoint/autoscalers.rb
|
123
141
|
- lib/scalingo/endpoint/collaborators.rb
|
124
142
|
- lib/scalingo/endpoint/containers.rb
|
125
143
|
- lib/scalingo/endpoint/deployments.rb
|
126
144
|
- lib/scalingo/endpoint/domains.rb
|
127
145
|
- lib/scalingo/endpoint/events.rb
|
146
|
+
- lib/scalingo/endpoint/notifiers.rb
|
147
|
+
- lib/scalingo/endpoint/regions.rb
|
128
148
|
- lib/scalingo/endpoint/stats.rb
|
129
149
|
- lib/scalingo/endpoint/variables.rb
|
130
150
|
- lib/scalingo/error.rb
|
151
|
+
- lib/scalingo/jwt.rb
|
131
152
|
- lib/scalingo/logs.rb
|
132
153
|
- lib/scalingo/realtime/logs.rb
|
154
|
+
- lib/scalingo/regions_cache.rb
|
133
155
|
- lib/scalingo/request.rb
|
134
156
|
- lib/scalingo/version.rb
|
135
157
|
- test/connection_test.rb
|
@@ -158,15 +180,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
158
180
|
- !ruby/object:Gem::Version
|
159
181
|
version: '0'
|
160
182
|
requirements: []
|
161
|
-
rubygems_version: 3.0.
|
183
|
+
rubygems_version: 3.0.3
|
162
184
|
signing_key:
|
163
185
|
specification_version: 4
|
164
186
|
summary: Ruby API for the awesome scalingo project !
|
165
187
|
test_files:
|
166
|
-
- test/
|
167
|
-
- test/
|
188
|
+
- test/scalingo_test.rb
|
189
|
+
- test/request_test.rb
|
168
190
|
- test/endpoint_collection_test.rb
|
169
191
|
- test/endpoint_resource_test.rb
|
170
|
-
- test/
|
171
|
-
- test/
|
192
|
+
- test/endpoint_base_test.rb
|
193
|
+
- test/connection_test.rb
|
172
194
|
- test/test_helper.rb
|