scalingo-ruby-api 1.1.1 → 2.0.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 +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
|