scalingo 3.0.0.beta.2 → 3.0.0.beta.3
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/.rubocop.yml +8 -0
- data/CHANGELOG.md +11 -0
- data/README.md +4 -14
- data/lib/scalingo/api/client.rb +38 -10
- data/lib/scalingo/api/endpoint.rb +12 -2
- data/lib/scalingo/api/response.rb +7 -1
- data/lib/scalingo/auth/keys.rb +4 -4
- data/lib/scalingo/auth/scm_integrations.rb +4 -4
- data/lib/scalingo/auth/tokens.rb +6 -6
- data/lib/scalingo/auth/two_factor_auth.rb +4 -4
- data/lib/scalingo/auth/user.rb +2 -2
- data/lib/scalingo/bearer_token.rb +15 -0
- data/lib/scalingo/billing/profile.rb +3 -3
- data/lib/scalingo/client.rb +26 -113
- data/lib/scalingo/configuration.rb +7 -36
- data/lib/scalingo/core_client.rb +106 -0
- data/lib/scalingo/regional/addons.rb +21 -8
- data/lib/scalingo/regional/apps.rb +8 -8
- data/lib/scalingo/regional/collaborators.rb +4 -4
- data/lib/scalingo/regional/containers.rb +4 -4
- data/lib/scalingo/regional/deployments.rb +3 -3
- data/lib/scalingo/regional/domains.rb +5 -5
- data/lib/scalingo/regional/environment.rb +6 -6
- data/lib/scalingo/regional/events.rb +4 -4
- data/lib/scalingo/regional/logs.rb +2 -2
- data/lib/scalingo/regional/metrics.rb +2 -2
- data/lib/scalingo/regional/notifiers.rb +7 -7
- data/lib/scalingo/regional/operations.rb +1 -1
- data/lib/scalingo/regional/scm_repo_links.rb +8 -8
- data/lib/scalingo/token_holder.rb +31 -0
- data/lib/scalingo/version.rb +1 -1
- data/samples/regional/addons/token-200.json +49 -0
- data/samples/regional/addons/token-404.json +24 -0
- data/scalingo.gemspec +1 -1
- data/spec/scalingo/api/client_spec.rb +58 -11
- data/spec/scalingo/api/endpoint_spec.rb +3 -2
- data/spec/scalingo/api/response_spec.rb +16 -16
- data/spec/scalingo/auth_spec.rb +1 -1
- data/spec/scalingo/billing_spec.rb +11 -0
- data/spec/scalingo/configuration_spec.rb +32 -30
- data/spec/scalingo/regional/addons_spec.rb +16 -0
- data/spec/scalingo/regional_spec.rb +1 -1
- metadata +8 -2
@@ -12,7 +12,7 @@ module Scalingo
|
|
12
12
|
&block
|
13
13
|
)
|
14
14
|
|
15
|
-
unpack(
|
15
|
+
unpack(:variables) { response }
|
16
16
|
end
|
17
17
|
|
18
18
|
def create(app_id, payload = {}, headers = nil, &block)
|
@@ -25,7 +25,7 @@ module Scalingo
|
|
25
25
|
&block
|
26
26
|
)
|
27
27
|
|
28
|
-
unpack(
|
28
|
+
unpack(:variable) { response }
|
29
29
|
end
|
30
30
|
|
31
31
|
def update(app_id, variable_id, value, headers = nil, &block)
|
@@ -38,7 +38,7 @@ module Scalingo
|
|
38
38
|
&block
|
39
39
|
)
|
40
40
|
|
41
|
-
unpack(
|
41
|
+
unpack(:variable) { response }
|
42
42
|
end
|
43
43
|
|
44
44
|
def destroy(app_id, variable_id, headers = nil, &block)
|
@@ -51,7 +51,7 @@ module Scalingo
|
|
51
51
|
&block
|
52
52
|
)
|
53
53
|
|
54
|
-
unpack
|
54
|
+
unpack { response }
|
55
55
|
end
|
56
56
|
|
57
57
|
def bulk_update(app_id, variables, headers = nil, &block)
|
@@ -64,7 +64,7 @@ module Scalingo
|
|
64
64
|
&block
|
65
65
|
)
|
66
66
|
|
67
|
-
unpack(
|
67
|
+
unpack(:variables) { response }
|
68
68
|
end
|
69
69
|
|
70
70
|
def bulk_destroy(app_id, variable_ids, headers = nil, &block)
|
@@ -77,7 +77,7 @@ module Scalingo
|
|
77
77
|
&block
|
78
78
|
)
|
79
79
|
|
80
|
-
unpack
|
80
|
+
unpack { response }
|
81
81
|
end
|
82
82
|
end
|
83
83
|
end
|
@@ -10,7 +10,7 @@ module Scalingo
|
|
10
10
|
&block
|
11
11
|
)
|
12
12
|
|
13
|
-
unpack(
|
13
|
+
unpack(:events) { response }
|
14
14
|
end
|
15
15
|
|
16
16
|
def for(app_id, payload = {}, headers = nil, &block)
|
@@ -23,7 +23,7 @@ module Scalingo
|
|
23
23
|
&block
|
24
24
|
)
|
25
25
|
|
26
|
-
unpack(
|
26
|
+
unpack(:events) { response }
|
27
27
|
end
|
28
28
|
|
29
29
|
def types(headers = nil, &block)
|
@@ -36,7 +36,7 @@ module Scalingo
|
|
36
36
|
&block
|
37
37
|
)
|
38
38
|
|
39
|
-
unpack(
|
39
|
+
unpack(:event_types) { response }
|
40
40
|
end
|
41
41
|
|
42
42
|
def categories(headers = nil, &block)
|
@@ -49,7 +49,7 @@ module Scalingo
|
|
49
49
|
&block
|
50
50
|
)
|
51
51
|
|
52
|
-
unpack(
|
52
|
+
unpack(:event_categories) { response }
|
53
53
|
end
|
54
54
|
end
|
55
55
|
end
|
@@ -10,7 +10,7 @@ module Scalingo
|
|
10
10
|
&block
|
11
11
|
)
|
12
12
|
|
13
|
-
unpack
|
13
|
+
unpack { response }
|
14
14
|
end
|
15
15
|
|
16
16
|
def archives(app_id, headers = nil, &block)
|
@@ -23,7 +23,7 @@ module Scalingo
|
|
23
23
|
&block
|
24
24
|
)
|
25
25
|
|
26
|
-
unpack(
|
26
|
+
unpack(:archives) { response }
|
27
27
|
end
|
28
28
|
|
29
29
|
## Helper method to avoid having to manually chain two operations
|
@@ -22,7 +22,7 @@ module Scalingo
|
|
22
22
|
&block
|
23
23
|
)
|
24
24
|
|
25
|
-
unpack
|
25
|
+
unpack { response }
|
26
26
|
end
|
27
27
|
|
28
28
|
def types(headers = nil, &block)
|
@@ -35,7 +35,7 @@ module Scalingo
|
|
35
35
|
&block
|
36
36
|
)
|
37
37
|
|
38
|
-
unpack(
|
38
|
+
unpack(:metrics) { response }
|
39
39
|
end
|
40
40
|
end
|
41
41
|
end
|
@@ -12,7 +12,7 @@ module Scalingo
|
|
12
12
|
&block
|
13
13
|
)
|
14
14
|
|
15
|
-
unpack(
|
15
|
+
unpack(:notifiers) { response }
|
16
16
|
end
|
17
17
|
|
18
18
|
def find(app_id, notifier_id, headers = nil, &block)
|
@@ -25,7 +25,7 @@ module Scalingo
|
|
25
25
|
&block
|
26
26
|
)
|
27
27
|
|
28
|
-
unpack(
|
28
|
+
unpack(:notifier) { response }
|
29
29
|
end
|
30
30
|
|
31
31
|
def create(app_id, payload = {}, headers = nil, &block)
|
@@ -38,7 +38,7 @@ module Scalingo
|
|
38
38
|
&block
|
39
39
|
)
|
40
40
|
|
41
|
-
unpack(
|
41
|
+
unpack(:notifier) { response }
|
42
42
|
end
|
43
43
|
|
44
44
|
def update(app_id, notifier_id, payload = {}, headers = nil, &block)
|
@@ -51,7 +51,7 @@ module Scalingo
|
|
51
51
|
&block
|
52
52
|
)
|
53
53
|
|
54
|
-
unpack(
|
54
|
+
unpack(:notifier) { response }
|
55
55
|
end
|
56
56
|
|
57
57
|
def destroy(app_id, notifier_id, headers = nil, &block)
|
@@ -64,7 +64,7 @@ module Scalingo
|
|
64
64
|
&block
|
65
65
|
)
|
66
66
|
|
67
|
-
unpack
|
67
|
+
unpack { response }
|
68
68
|
end
|
69
69
|
|
70
70
|
def test(app_id, notifier_id, headers = nil, &block)
|
@@ -77,7 +77,7 @@ module Scalingo
|
|
77
77
|
&block
|
78
78
|
)
|
79
79
|
|
80
|
-
unpack
|
80
|
+
unpack { response }
|
81
81
|
end
|
82
82
|
|
83
83
|
def platforms(headers = nil, &block)
|
@@ -90,7 +90,7 @@ module Scalingo
|
|
90
90
|
&block
|
91
91
|
)
|
92
92
|
|
93
|
-
unpack(
|
93
|
+
unpack(:notification_platforms) { response }
|
94
94
|
end
|
95
95
|
end
|
96
96
|
end
|
@@ -12,7 +12,7 @@ module Scalingo
|
|
12
12
|
&block
|
13
13
|
)
|
14
14
|
|
15
|
-
unpack(
|
15
|
+
unpack(:scm_repo_link) { response }
|
16
16
|
end
|
17
17
|
|
18
18
|
def create(app_id, payload = {}, headers = nil, &block)
|
@@ -25,7 +25,7 @@ module Scalingo
|
|
25
25
|
&block
|
26
26
|
)
|
27
27
|
|
28
|
-
unpack(
|
28
|
+
unpack(:scm_repo_link) { response }
|
29
29
|
end
|
30
30
|
|
31
31
|
def update(app_id, payload = {}, headers = nil, &block)
|
@@ -38,7 +38,7 @@ module Scalingo
|
|
38
38
|
&block
|
39
39
|
)
|
40
40
|
|
41
|
-
unpack(
|
41
|
+
unpack(:scm_repo_link) { response }
|
42
42
|
end
|
43
43
|
|
44
44
|
def destroy(app_id, headers = nil, &block)
|
@@ -51,7 +51,7 @@ module Scalingo
|
|
51
51
|
&block
|
52
52
|
)
|
53
53
|
|
54
|
-
unpack(
|
54
|
+
unpack(:scm_repo_link) { response }
|
55
55
|
end
|
56
56
|
|
57
57
|
def deploy(app_id, branch, headers = nil, &block)
|
@@ -64,7 +64,7 @@ module Scalingo
|
|
64
64
|
&block
|
65
65
|
)
|
66
66
|
|
67
|
-
unpack(
|
67
|
+
unpack(:deployment) { response }
|
68
68
|
end
|
69
69
|
|
70
70
|
def review_app(review_app, pull_request_id, headers = nil, &block)
|
@@ -77,7 +77,7 @@ module Scalingo
|
|
77
77
|
&block
|
78
78
|
)
|
79
79
|
|
80
|
-
unpack(
|
80
|
+
unpack(:review_app) { response }
|
81
81
|
end
|
82
82
|
|
83
83
|
def branches(app_id, headers = nil, &block)
|
@@ -90,7 +90,7 @@ module Scalingo
|
|
90
90
|
&block
|
91
91
|
)
|
92
92
|
|
93
|
-
unpack(
|
93
|
+
unpack(:branches) { response }
|
94
94
|
end
|
95
95
|
|
96
96
|
def pulls(app_id, headers = nil, &block)
|
@@ -103,7 +103,7 @@ module Scalingo
|
|
103
103
|
&block
|
104
104
|
)
|
105
105
|
|
106
|
-
unpack(
|
106
|
+
unpack(:pulls) { response }
|
107
107
|
end
|
108
108
|
end
|
109
109
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require "scalingo/bearer_token"
|
2
|
+
|
3
|
+
module Scalingo
|
4
|
+
module TokenHolder
|
5
|
+
def self.included(base)
|
6
|
+
base.attr_reader :token
|
7
|
+
end
|
8
|
+
|
9
|
+
def token=(input)
|
10
|
+
@token = input.is_a?(BearerToken) ? input : BearerToken.new(input.to_s, raise_on_expired: config.raise_on_expired_token)
|
11
|
+
end
|
12
|
+
|
13
|
+
def authenticated?
|
14
|
+
token.present? && !token.expired?
|
15
|
+
end
|
16
|
+
|
17
|
+
def authenticate_with_bearer_token(bearer_token, expires_at:, raise_on_expired_token:)
|
18
|
+
self.token = if expires_at
|
19
|
+
token = bearer_token.is_a?(BearerToken) ? bearer_token.value : bearer_token.to_s
|
20
|
+
|
21
|
+
BearerToken.new(
|
22
|
+
token,
|
23
|
+
expires_at: expires_at,
|
24
|
+
raise_on_expired: raise_on_expired_token,
|
25
|
+
)
|
26
|
+
else
|
27
|
+
bearer_token
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/scalingo/version.rb
CHANGED
@@ -0,0 +1,49 @@
|
|
1
|
+
{
|
2
|
+
"path": "/apps/5ed10967884fef000f5e4fff/addons/ad-6733873b-1628-4b8e-8e74-c30f1c3f3b63/token",
|
3
|
+
"method": "post",
|
4
|
+
"request": {
|
5
|
+
"headers": {
|
6
|
+
"Authorization": "Bearer the-bearer-token"
|
7
|
+
}
|
8
|
+
},
|
9
|
+
"response": {
|
10
|
+
"status": 200,
|
11
|
+
"headers": {
|
12
|
+
"Date": "Fri, 29 May 2020 13:09:00 GMT",
|
13
|
+
"Etag": "W/\"ece1ff1263aad47584f356e20127cf3b\"",
|
14
|
+
"Content-Type": "application/json; charset=utf-8",
|
15
|
+
"Transfer-Encoding": "chunked",
|
16
|
+
"Connection": "keep-alive",
|
17
|
+
"Cache-Control": "max-age=0, private, must-revalidate",
|
18
|
+
"Referrer-Policy": "strict-origin-when-cross-origin"
|
19
|
+
},
|
20
|
+
"json_body": {
|
21
|
+
"addon": {
|
22
|
+
"id": "ad-6733873b-1628-4b8e-8e74-c30f1c3f3b63",
|
23
|
+
"app_id": "5ed10967884fef000f5e4fff",
|
24
|
+
"resource_id": "some_example_5629",
|
25
|
+
"addon_provider": {
|
26
|
+
"id": "postgresql",
|
27
|
+
"name": "PostgreSQL",
|
28
|
+
"logo_url": "//cdn.scalingo.com/addons/Scalingo_Postgresql.svg"
|
29
|
+
},
|
30
|
+
"plan": {
|
31
|
+
"id": "5d1e03873e6b3b000eefa827",
|
32
|
+
"name": "postgresql-sandbox",
|
33
|
+
"display_name": "Sandbox",
|
34
|
+
"price": 0.0,
|
35
|
+
"description": "<p>Pouet</p>\n",
|
36
|
+
"position": null,
|
37
|
+
"on_demand": false,
|
38
|
+
"disabled": false,
|
39
|
+
"disabled_alternative_plan_id": null,
|
40
|
+
"sku": "ovh-st-fr1-postgresql-sandbox"
|
41
|
+
},
|
42
|
+
"provisioned_at": "2020-05-29T13:08:58.103Z",
|
43
|
+
"deprovisioned_at": null,
|
44
|
+
"status": "provisioning",
|
45
|
+
"token": "eyJhbGciOiJIUzUxMiJ9.eyJpc3MiOiJTY2FsaW5nbyIsImlhdCI6MTU5Mjg0MjQ3OSwidXVpZCI6InVzLTY3NmJiMGMxLTFjYTktNDY4Mi04ZWUxLTI1NzQyMmU5ZWFiNSIsInJuZCI6IjlhZGZlMzNlNDUxNzNmZTBiNjg4ZjQxZTY4OTg1OWQ0IiwiZXhwIjoxNTkyODQ2MDc5LCJhZGRvbl91dWlkIjoiYWQtNTRlYzczMzItYjViOS00MGUyLTg2NWQtYmNkYTg1Yzc2Y2I2In0.-rYijDhFRWcycSFLcCbdQD3tg9rh1MhXE_rTvlOtQt-48BJcPmxH9Wpazzp7tkspYrx8jfIrWrALoujvW33WVw"
|
46
|
+
}
|
47
|
+
}
|
48
|
+
}
|
49
|
+
}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
{
|
2
|
+
"path": "/apps/5ed10967884fef000f5e4fff/addons/wrong-addon-id/token",
|
3
|
+
"method": "post",
|
4
|
+
"request": {
|
5
|
+
"headers": {
|
6
|
+
"Authorization": "Bearer the-bearer-token"
|
7
|
+
}
|
8
|
+
},
|
9
|
+
"response": {
|
10
|
+
"status": 404,
|
11
|
+
"headers": {
|
12
|
+
"Date": "Fri, 29 May 2020 13:08:59 GMT",
|
13
|
+
"Content-Type": "application/json; charset=utf-8",
|
14
|
+
"Transfer-Encoding": "chunked",
|
15
|
+
"Connection": "keep-alive",
|
16
|
+
"Cache-Control": "no-cache",
|
17
|
+
"Referrer-Policy": "strict-origin-when-cross-origin"
|
18
|
+
},
|
19
|
+
"json_body": {
|
20
|
+
"resource": "addon",
|
21
|
+
"error": "not found"
|
22
|
+
}
|
23
|
+
}
|
24
|
+
}
|
data/scalingo.gemspec
CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |s|
|
|
19
19
|
"changelog_uri" => "https://github.com/Scalingo/scalingo-ruby-api/blob/master/CHANGELOG.md",
|
20
20
|
"documentation_uri" => "https://developers.scalingo.com/",
|
21
21
|
"homepage_uri" => "https://www.scalingo.com/",
|
22
|
-
"source_code_uri" => "https://github.com/Scalingo/scalingo-ruby-api"
|
22
|
+
"source_code_uri" => "https://github.com/Scalingo/scalingo-ruby-api",
|
23
23
|
}
|
24
24
|
|
25
25
|
# Specify which files should be added to the gem when it is released.
|
@@ -3,14 +3,61 @@ require "spec_helper"
|
|
3
3
|
RSpec.describe Scalingo::API::Client do
|
4
4
|
let(:url) { "http://localhost" }
|
5
5
|
|
6
|
-
subject { described_class.new(
|
6
|
+
subject { described_class.new(url, scalingo: scalingo) }
|
7
7
|
|
8
8
|
describe "initialize" do
|
9
|
-
|
10
|
-
instance = described_class.new(:scalingo, :url)
|
9
|
+
let(:config) { {default_region: :test} }
|
11
10
|
|
12
|
-
|
13
|
-
|
11
|
+
describe "with only url" do
|
12
|
+
subject { described_class.new(:url) }
|
13
|
+
|
14
|
+
it "stores the url" do
|
15
|
+
expect(subject.url).to eq(:url)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "uses itself as token holder" do
|
19
|
+
expect(subject.token_holder).to eq(subject)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "configuration is the global one" do
|
23
|
+
expect(Scalingo::Configuration).to receive(:new).with({}, Scalingo.config).and_return(:config).once
|
24
|
+
|
25
|
+
expect(subject.config).to eq(:config)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "with scalingo client supplied" do
|
30
|
+
subject { described_class.new(:url, scalingo: scalingo) }
|
31
|
+
|
32
|
+
it "uses the scalingo client as token holder" do
|
33
|
+
expect(subject.token_holder).to eq(scalingo)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "configuration is herited from the scalingo client" do
|
37
|
+
expect(Scalingo::Configuration).to receive(:new).with({}, scalingo.config).once
|
38
|
+
|
39
|
+
subject
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "with config supplied" do
|
44
|
+
subject { described_class.new(:url, config: config) }
|
45
|
+
|
46
|
+
it "configuration is herited from the global one" do
|
47
|
+
expect(Scalingo::Configuration).to receive(:new).with(config, Scalingo.config).and_return(:config).once
|
48
|
+
|
49
|
+
expect(subject.config).to eq(:config)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe "with both supplied" do
|
54
|
+
subject { described_class.new(:url, scalingo: scalingo, config: config) }
|
55
|
+
|
56
|
+
it "configuration is herited from the scalingo one" do
|
57
|
+
expect(Scalingo::Configuration).to receive(:new).with(config, scalingo.config).once
|
58
|
+
|
59
|
+
subject
|
60
|
+
end
|
14
61
|
end
|
15
62
|
end
|
16
63
|
|
@@ -26,7 +73,7 @@ RSpec.describe Scalingo::API::Client do
|
|
26
73
|
mock = double
|
27
74
|
|
28
75
|
described_class.register_handler!(:handler, mock)
|
29
|
-
instance = described_class.new(:
|
76
|
+
instance = described_class.new(:url, scalingo: scalingo)
|
30
77
|
|
31
78
|
# Only 1 instanciation should be done, no matter how many calls are done below
|
32
79
|
expect(mock).to receive(:new).with(instance).and_return("1st").once
|
@@ -55,20 +102,20 @@ RSpec.describe Scalingo::API::Client do
|
|
55
102
|
proc { {"X-Another" => "another"} }
|
56
103
|
}
|
57
104
|
|
58
|
-
it "only returns the user agent if nothing else is configured" do
|
59
|
-
expect(subject.headers).to eq("User-Agent" => user_agent)
|
105
|
+
it "only returns the user agent and accept if nothing else is configured" do
|
106
|
+
expect(subject.headers).to eq("Accept" => "application/json", "User-Agent" => user_agent)
|
60
107
|
end
|
61
108
|
|
62
109
|
it "allows additional headers to be globally configured" do
|
63
110
|
expect(scalingo.config).to receive(:additional_headers).and_return(extra_hash)
|
64
111
|
|
65
|
-
expect(subject.headers).to eq("User-Agent" => user_agent, "X-Other" => "other")
|
112
|
+
expect(subject.headers).to eq("Accept" => "application/json", "User-Agent" => user_agent, "X-Other" => "other")
|
66
113
|
end
|
67
114
|
|
68
115
|
it "additional headers can be a block" do
|
69
116
|
expect(scalingo.config).to receive(:additional_headers).and_return(extra_block)
|
70
117
|
|
71
|
-
expect(subject.headers).to eq("User-Agent" => user_agent, "X-Another" => "another")
|
118
|
+
expect(subject.headers).to eq("Accept" => "application/json", "User-Agent" => user_agent, "X-Another" => "another")
|
72
119
|
end
|
73
120
|
end
|
74
121
|
|
@@ -118,7 +165,7 @@ RSpec.describe Scalingo::API::Client do
|
|
118
165
|
|
119
166
|
context "with bearer token" do
|
120
167
|
it "has an authentication header set with a bearer scheme" do
|
121
|
-
expect(subject.connection.headers["Authorization"]).to eq "Bearer #{subject.
|
168
|
+
expect(subject.connection.headers["Authorization"]).to eq "Bearer #{subject.token_holder.token.value}"
|
122
169
|
end
|
123
170
|
end
|
124
171
|
end
|