scalingo 3.0.0.beta.2 → 3.0.0.beta.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +8 -0
  3. data/CHANGELOG.md +11 -0
  4. data/README.md +4 -14
  5. data/lib/scalingo/api/client.rb +38 -10
  6. data/lib/scalingo/api/endpoint.rb +12 -2
  7. data/lib/scalingo/api/response.rb +7 -1
  8. data/lib/scalingo/auth/keys.rb +4 -4
  9. data/lib/scalingo/auth/scm_integrations.rb +4 -4
  10. data/lib/scalingo/auth/tokens.rb +6 -6
  11. data/lib/scalingo/auth/two_factor_auth.rb +4 -4
  12. data/lib/scalingo/auth/user.rb +2 -2
  13. data/lib/scalingo/bearer_token.rb +15 -0
  14. data/lib/scalingo/billing/profile.rb +3 -3
  15. data/lib/scalingo/client.rb +26 -113
  16. data/lib/scalingo/configuration.rb +7 -36
  17. data/lib/scalingo/core_client.rb +106 -0
  18. data/lib/scalingo/regional/addons.rb +21 -8
  19. data/lib/scalingo/regional/apps.rb +8 -8
  20. data/lib/scalingo/regional/collaborators.rb +4 -4
  21. data/lib/scalingo/regional/containers.rb +4 -4
  22. data/lib/scalingo/regional/deployments.rb +3 -3
  23. data/lib/scalingo/regional/domains.rb +5 -5
  24. data/lib/scalingo/regional/environment.rb +6 -6
  25. data/lib/scalingo/regional/events.rb +4 -4
  26. data/lib/scalingo/regional/logs.rb +2 -2
  27. data/lib/scalingo/regional/metrics.rb +2 -2
  28. data/lib/scalingo/regional/notifiers.rb +7 -7
  29. data/lib/scalingo/regional/operations.rb +1 -1
  30. data/lib/scalingo/regional/scm_repo_links.rb +8 -8
  31. data/lib/scalingo/token_holder.rb +31 -0
  32. data/lib/scalingo/version.rb +1 -1
  33. data/samples/regional/addons/token-200.json +49 -0
  34. data/samples/regional/addons/token-404.json +24 -0
  35. data/scalingo.gemspec +1 -1
  36. data/spec/scalingo/api/client_spec.rb +58 -11
  37. data/spec/scalingo/api/endpoint_spec.rb +3 -2
  38. data/spec/scalingo/api/response_spec.rb +16 -16
  39. data/spec/scalingo/auth_spec.rb +1 -1
  40. data/spec/scalingo/billing_spec.rb +11 -0
  41. data/spec/scalingo/configuration_spec.rb +32 -30
  42. data/spec/scalingo/regional/addons_spec.rb +16 -0
  43. data/spec/scalingo/regional_spec.rb +1 -1
  44. metadata +8 -2
@@ -6,20 +6,17 @@ module Scalingo
6
6
  class Configuration
7
7
  ATTRIBUTES = [
8
8
  # URL to the authentication API
9
- :auth,
9
+ # :auth,
10
10
 
11
11
  # URL to the billing API
12
- :billing,
12
+ # :billing,
13
13
 
14
14
  # List of regions under the form {"region_id": root_url}
15
- :regions,
15
+ # :regions,
16
16
 
17
17
  # Default region. Must match a key in `regions`
18
18
  :default_region,
19
19
 
20
- # Wether to use https or http
21
- :https,
22
-
23
20
  # Configure the User Agent header
24
21
  :user_agent,
25
22
 
@@ -36,20 +33,16 @@ module Scalingo
36
33
 
37
34
  # These headers will be added to every request. Individual methods may override them.
38
35
  # This should be a hash or a callable object that returns a hash.
39
- :additional_headers
36
+ :additional_headers,
37
+
38
+ # Specify an adapter for faraday. Leave nil for the default one (Net::HTTP)
39
+ :faraday_adapter,
40
40
  ]
41
41
 
42
42
  ATTRIBUTES.each { |attr| attr_accessor(attr) }
43
43
 
44
44
  def self.default
45
45
  new(
46
- auth: "https://auth.scalingo.com/v1",
47
- billing: "https://cashmachine.scalingo.com",
48
- regions: {
49
- agora_fr1: "https://api.agora-fr1.scalingo.com/v1",
50
- osc_fr1: "https://api.osc-fr1.scalingo.com/v1",
51
- osc_secnum_fr1: "https://api.osc-secnum-fr1.scalingo.com/v1"
52
- },
53
46
  default_region: :osc_fr1,
54
47
  user_agent: "Scalingo Ruby Client v#{Scalingo::VERSION}",
55
48
  exchanged_token_validity: 1.hour,
@@ -64,28 +57,6 @@ module Scalingo
64
57
  public_send("#{name}=", attributes.fetch(name, parent&.public_send(name)))
65
58
  end
66
59
  end
67
-
68
- def regions=(input)
69
- if input.is_a?(OpenStruct)
70
- @regions = input
71
- return
72
- end
73
-
74
- if input.is_a?(Hash)
75
- @regions = OpenStruct.new(input)
76
- return
77
- end
78
-
79
- raise ArgumentError, "wrong type for argument"
80
- end
81
-
82
- def default_region=(input)
83
- input = input.to_sym
84
-
85
- raise ArgumentError, "No regions named `#{input}`" unless regions.respond_to?(input)
86
-
87
- @default_region = input
88
- end
89
60
  end
90
61
 
91
62
  def self.config
@@ -0,0 +1,106 @@
1
+ require "forwardable"
2
+ require "faraday"
3
+ require "faraday_middleware"
4
+ require "scalingo/token_holder"
5
+ require "scalingo/errors"
6
+
7
+ module Scalingo
8
+ class CoreClient
9
+ extend Forwardable
10
+ include TokenHolder
11
+
12
+ attr_reader :config
13
+
14
+ def initialize(attributes = {})
15
+ @config = Configuration.new(attributes, Scalingo.config)
16
+ end
17
+
18
+ def inspect
19
+ str = %(<#{self.class}:0x#{object_id.to_s(16)} version:"#{Scalingo::VERSION}" authenticated:)
20
+
21
+ str << if token.present?
22
+ (token.expired? ? "expired" : "true")
23
+ else
24
+ "false"
25
+ end
26
+
27
+ str << ">"
28
+ str
29
+ end
30
+
31
+ ## Sub-clients accessors
32
+ def auth
33
+ raise NotImplementedError
34
+ end
35
+
36
+ def billing
37
+ raise NotImplementedError
38
+ end
39
+
40
+ def region(name = nil)
41
+ public_send(name || config.default_region)
42
+ end
43
+
44
+ ## Authentication helpers / Token management
45
+ def authenticate_with(access_token: nil, bearer_token: nil, expires_at: nil)
46
+ if !access_token && !bearer_token
47
+ raise ArgumentError, "You must supply one of `access_token` or `bearer_token`"
48
+ end
49
+
50
+ if access_token && bearer_token
51
+ raise ArgumentError, "You cannot supply both `access_token` and `bearer_token`"
52
+ end
53
+
54
+ if expires_at && !bearer_token
55
+ raise ArgumentError, "`expires_at` can only be used with `bearer_token`. `access_token` have a 1 hour expiration."
56
+ end
57
+
58
+ if access_token
59
+ expiration = Time.now + config.exchanged_token_validity
60
+ response = auth.tokens.exchange(access_token)
61
+
62
+ if response.successful?
63
+ self.token = BearerToken.new(
64
+ response.data[:token],
65
+ expires_at: expiration,
66
+ raise_on_expired: config.raise_on_expired_token,
67
+ )
68
+ end
69
+
70
+ return response.successful?
71
+ end
72
+
73
+ if bearer_token
74
+ authenticate_with_bearer_token(
75
+ bearer_token,
76
+ expires_at: expires_at,
77
+ raise_on_expired_token: config.raise_on_expired_token,
78
+ )
79
+
80
+ true
81
+ end
82
+ end
83
+
84
+ ## Delegations
85
+ def_delegator :auth, :keys
86
+ def_delegator :auth, :scm_integrations
87
+ def_delegator :auth, :tokens
88
+ def_delegator :auth, :two_factor_auth
89
+ def_delegator :auth, :tfa
90
+ def_delegator :auth, :user
91
+
92
+ def_delegator :region, :addons
93
+ def_delegator :region, :apps
94
+ def_delegator :region, :collaborators
95
+ def_delegator :region, :containers
96
+ def_delegator :region, :deployments
97
+ def_delegator :region, :domains
98
+ def_delegator :region, :environment
99
+ def_delegator :region, :events
100
+ def_delegator :region, :logs
101
+ def_delegator :region, :metrics
102
+ def_delegator :region, :notifiers
103
+ def_delegator :region, :operations
104
+ def_delegator :region, :scm_repo_links
105
+ end
106
+ end
@@ -12,7 +12,7 @@ module Scalingo
12
12
  &block
13
13
  )
14
14
 
15
- unpack(response, key: :addons)
15
+ unpack(:addons) { response }
16
16
  end
17
17
 
18
18
  def find(app_id, addon_id, headers = nil, &block)
@@ -25,7 +25,7 @@ module Scalingo
25
25
  &block
26
26
  )
27
27
 
28
- unpack(response, key: :addon)
28
+ unpack(:addon) { response }
29
29
  end
30
30
 
31
31
  def provision(app_id, payload = {}, headers = nil, &block)
@@ -38,7 +38,7 @@ module Scalingo
38
38
  &block
39
39
  )
40
40
 
41
- unpack(response, key: :addon)
41
+ unpack(:addon) { response }
42
42
  end
43
43
 
44
44
  def update(app_id, addon_id, payload = {}, headers = nil, &block)
@@ -51,7 +51,7 @@ module Scalingo
51
51
  &block
52
52
  )
53
53
 
54
- unpack(response, key: :addon)
54
+ unpack(:addon) { response }
55
55
  end
56
56
 
57
57
  def destroy(app_id, addon_id, headers = nil, &block)
@@ -64,7 +64,7 @@ module Scalingo
64
64
  &block
65
65
  )
66
66
 
67
- unpack(response)
67
+ unpack { response }
68
68
  end
69
69
 
70
70
  def sso(app_id, addon_id, headers = nil, &block)
@@ -77,7 +77,20 @@ module Scalingo
77
77
  &block
78
78
  )
79
79
 
80
- unpack(response, key: :addon)
80
+ unpack(:addon) { response }
81
+ end
82
+
83
+ def token(app_id, addon_id, headers = nil, &block)
84
+ data = nil
85
+
86
+ response = connection.post(
87
+ "apps/#{app_id}/addons/#{addon_id}/token",
88
+ data,
89
+ headers,
90
+ &block
91
+ )
92
+
93
+ unpack(:addon) { response }
81
94
  end
82
95
 
83
96
  def categories(headers = nil, &block)
@@ -90,7 +103,7 @@ module Scalingo
90
103
  &block
91
104
  )
92
105
 
93
- unpack(response, key: :addon_categories)
106
+ unpack(:addon_categories) { response }
94
107
  end
95
108
 
96
109
  def providers(headers = nil, &block)
@@ -103,7 +116,7 @@ module Scalingo
103
116
  &block
104
117
  )
105
118
 
106
- unpack(response, key: :addon_providers)
119
+ unpack(:addon_providers) { response }
107
120
  end
108
121
  end
109
122
  end
@@ -12,7 +12,7 @@ module Scalingo
12
12
  &block
13
13
  )
14
14
 
15
- unpack(response, key: :apps)
15
+ unpack(:apps) { response }
16
16
  end
17
17
 
18
18
  def find(id, headers = nil, &block)
@@ -25,7 +25,7 @@ module Scalingo
25
25
  &block
26
26
  )
27
27
 
28
- unpack(response, key: :app)
28
+ unpack(:app) { response }
29
29
  end
30
30
 
31
31
  def create(payload = {}, headers = nil, &block)
@@ -44,7 +44,7 @@ module Scalingo
44
44
  &block
45
45
  )
46
46
 
47
- unpack(response, key: :app)
47
+ unpack(:app) { response }
48
48
  end
49
49
 
50
50
  def update(id, payload = {}, headers = nil, &block)
@@ -57,7 +57,7 @@ module Scalingo
57
57
  &block
58
58
  )
59
59
 
60
- unpack(response, key: :app)
60
+ unpack(:app) { response }
61
61
  end
62
62
 
63
63
  def logs_url(id, headers = nil, &block)
@@ -70,7 +70,7 @@ module Scalingo
70
70
  &block
71
71
  )
72
72
 
73
- unpack(response, key: :logs_url)
73
+ unpack(:logs_url) { response }
74
74
  end
75
75
 
76
76
  def destroy(id, payload = {}, headers = nil, &block)
@@ -81,7 +81,7 @@ module Scalingo
81
81
  &block
82
82
  )
83
83
 
84
- unpack(response)
84
+ unpack { response }
85
85
  end
86
86
 
87
87
  def rename(id, payload = {}, headers = nil, &block)
@@ -92,7 +92,7 @@ module Scalingo
92
92
  &block
93
93
  )
94
94
 
95
- unpack(response, key: :app)
95
+ unpack(:app) { response }
96
96
  end
97
97
 
98
98
  def transfer(id, payload = {}, headers = nil, &block)
@@ -103,7 +103,7 @@ module Scalingo
103
103
  &block
104
104
  )
105
105
 
106
- unpack(response, key: :app)
106
+ unpack(:app) { response }
107
107
  end
108
108
  end
109
109
  end
@@ -12,7 +12,7 @@ module Scalingo
12
12
  &block
13
13
  )
14
14
 
15
- unpack(response, key: :collaborators)
15
+ unpack(:collaborators) { response }
16
16
  end
17
17
 
18
18
  def destroy(app_id, collaborator_id, headers = nil, &block)
@@ -25,7 +25,7 @@ module Scalingo
25
25
  &block
26
26
  )
27
27
 
28
- unpack(response)
28
+ unpack { response }
29
29
  end
30
30
 
31
31
  def invite(app_id, payload = {}, headers = nil, &block)
@@ -38,7 +38,7 @@ module Scalingo
38
38
  &block
39
39
  )
40
40
 
41
- unpack(response, key: :collaborator)
41
+ unpack(:collaborator) { response }
42
42
  end
43
43
 
44
44
  def accept(token, headers = nil, &block)
@@ -51,7 +51,7 @@ module Scalingo
51
51
  &block
52
52
  )
53
53
 
54
- unpack(response)
54
+ unpack { response }
55
55
  end
56
56
  end
57
57
  end
@@ -12,7 +12,7 @@ module Scalingo
12
12
  &block
13
13
  )
14
14
 
15
- unpack(response, key: :containers)
15
+ unpack(:containers) { response }
16
16
  end
17
17
 
18
18
  def scale(app_id, formation, headers = nil, &block)
@@ -25,7 +25,7 @@ module Scalingo
25
25
  &block
26
26
  )
27
27
 
28
- unpack(response, key: :containers)
28
+ unpack(:containers) { response }
29
29
  end
30
30
 
31
31
  def restart(app_id, scope = [], headers = nil, &block)
@@ -38,7 +38,7 @@ module Scalingo
38
38
  &block
39
39
  )
40
40
 
41
- unpack(response)
41
+ unpack { response }
42
42
  end
43
43
 
44
44
  def sizes(headers = nil, &block)
@@ -51,7 +51,7 @@ module Scalingo
51
51
  &block
52
52
  )
53
53
 
54
- unpack(response, key: :container_sizes)
54
+ unpack(:container_sizes) { response }
55
55
  end
56
56
  end
57
57
  end
@@ -12,7 +12,7 @@ module Scalingo
12
12
  &block
13
13
  )
14
14
 
15
- unpack(response, key: :deployments)
15
+ unpack(:deployments) { response }
16
16
  end
17
17
 
18
18
  def find(app_id, deployment_id, headers = nil, &block)
@@ -25,7 +25,7 @@ module Scalingo
25
25
  &block
26
26
  )
27
27
 
28
- unpack(response, key: :deployment)
28
+ unpack(:deployment) { response }
29
29
  end
30
30
 
31
31
  def logs(app_id, deployment_id, headers = nil, &block)
@@ -38,7 +38,7 @@ module Scalingo
38
38
  &block
39
39
  )
40
40
 
41
- unpack(response, key: :deployment)
41
+ unpack(:deployment) { response }
42
42
  end
43
43
  end
44
44
  end
@@ -12,7 +12,7 @@ module Scalingo
12
12
  &block
13
13
  )
14
14
 
15
- unpack(response, key: :domains)
15
+ unpack(:domains) { response }
16
16
  end
17
17
 
18
18
  def find(app_id, domain_id, headers = nil, &block)
@@ -25,7 +25,7 @@ module Scalingo
25
25
  &block
26
26
  )
27
27
 
28
- unpack(response, key: :domain)
28
+ unpack(:domain) { 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(response, key: :domain)
41
+ unpack(:domain) { response }
42
42
  end
43
43
 
44
44
  def update(app_id, domain_id, payload = {}, headers = nil, &block)
@@ -51,7 +51,7 @@ module Scalingo
51
51
  &block
52
52
  )
53
53
 
54
- unpack(response, key: :domain)
54
+ unpack(:domain) { response }
55
55
  end
56
56
 
57
57
  def destroy(app_id, domain_id, headers = nil, &block)
@@ -64,7 +64,7 @@ module Scalingo
64
64
  &block
65
65
  )
66
66
 
67
- unpack(response)
67
+ unpack { response }
68
68
  end
69
69
  end
70
70
  end