workos 0.2.2 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 85c5142c818be2437ddf9782fa43d686f43a36cdae410a8c76c585b815614673
4
- data.tar.gz: 18a225e552fa8482536f3b7b390f57e1b1491e9927f0a09a7b80f44b4910120c
3
+ metadata.gz: 06fb7835303dcd8aa08c89cdd04c24c59f0d649b7e21d7dfd6ae82cc57529304
4
+ data.tar.gz: 62bfacb18255d7c177c611c7dda0dd2a459610cdd1e0a0c48bbe3800a750ed64
5
5
  SHA512:
6
- metadata.gz: 1d6624e4e04f3657be82f13feb304f25c2d4cd102ceb7bb25e1755c6abdd3271ef63cbb1ca66a0005182f08efcb68e896743fc8100d2a7ea9deebc466c8d52a9
7
- data.tar.gz: acf638e6e5479c76bbb0bc258277a07db00f975aa30ea196c17f0f5c2a30b8c95ea33451a976dfc51fff22f00d9820beb1b820bb81d88b93830529055fe51234
6
+ metadata.gz: dd38c198e15b8c0f9f804593aba4eebe23ccad4c3be119c3d75861f0f38769fa13bccf204ad1085f74a32d448877e172eac4f45132fae8e4a793d699e0e78327
7
+ data.tar.gz: de1017c20f88ad1ba4d74cb51e98a6f234e692564ef073ceaeaae893cdc3b70c2af9bce74d74264fe0461d21ce0757fc8e6548143de33a54a1dc9f08f8a91eab
data/.rubocop.yml CHANGED
@@ -10,6 +10,8 @@ Layout/LineLength:
10
10
  - '(\A|\s)/.*?/'
11
11
  Metrics/BlockLength:
12
12
  ExcludedMethods: ['describe', 'context']
13
+ Metrics/ModuleLength:
14
+ Max: 150
13
15
  Style/TrailingCommaInArguments:
14
16
  EnforcedStyleForMultiline: 'consistent_comma'
15
17
  Style/TrailingCommaInHashLiteral:
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.6.5
1
+ 2.7.1
@@ -1,9 +1,11 @@
1
1
  version: v1.0
2
2
  name: Ruby
3
+
3
4
  agent:
4
5
  machine:
5
6
  type: e1-standard-2
6
7
  os_image: ubuntu1804
8
+
7
9
  blocks:
8
10
  - name: Run Sorbet 🍦
9
11
  task:
@@ -11,19 +13,18 @@ blocks:
11
13
  - name: srb tc
12
14
  commands:
13
15
  - checkout
14
- - sem-version ruby 2.6.5
15
- - gem install bundler
16
16
  - bundle install
17
17
  - bundle exec srb tc
18
+
18
19
  - name: Run Rubocop 🚔
19
20
  task:
20
21
  jobs:
21
22
  - name: rubocop
22
23
  commands:
23
24
  - checkout
24
- - sem-version ruby 2.6.5
25
25
  - bundle install
26
26
  - bundle exec rubocop
27
+
27
28
  - name: Run Tests 👩🏽‍🔬
28
29
  task:
29
30
  secrets:
@@ -40,7 +41,7 @@ blocks:
40
41
  - checkout
41
42
  - sem-version ruby 2.0.0
42
43
  - bundle install
43
- - bundle exec rspec
44
+ - bundle exec rspec
44
45
  - name: Ruby 2.3.4
45
46
  commands:
46
47
  - checkout
@@ -58,7 +59,13 @@ blocks:
58
59
  - checkout
59
60
  - sem-version ruby 2.6.5
60
61
  - bundle install
61
- - bundle exec rspec
62
+ - bundle exec rspec
63
+ - name: Ruby 2.7.1
64
+ commands:
65
+ - checkout
66
+ - sem-version ruby 2.7.1
67
+ - bundle install
68
+ - bundle exec rspec
62
69
  promotions:
63
70
  - name: Deploy workos-rb to rubygems
64
- pipeline_file: rubygems.yml
71
+ pipeline_file: rubygems.yml
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- workos (0.2.2)
4
+ workos (0.2.3)
5
5
  sorbet-runtime (~> 0.5)
6
6
 
7
7
  GEM
@@ -54,10 +54,10 @@ GEM
54
54
  json (>= 1.8, < 3)
55
55
  simplecov-html (~> 0.10.0)
56
56
  simplecov-html (0.10.2)
57
- sorbet (0.5.5181)
58
- sorbet-static (= 0.5.5181)
59
- sorbet-runtime (0.5.5501)
60
- sorbet-static (0.5.5181-universal-darwin-14)
57
+ sorbet (0.5.5560)
58
+ sorbet-static (= 0.5.5560)
59
+ sorbet-runtime (0.5.5560)
60
+ sorbet-static (0.5.5560-universal-darwin-14)
61
61
  unicode-display_width (1.6.0)
62
62
  url (0.3.2)
63
63
  vcr (5.0.0)
@@ -83,4 +83,4 @@ DEPENDENCIES
83
83
  yard
84
84
 
85
85
  BUNDLED WITH
86
- 2.1.2
86
+ 2.1.4
data/lib/workos.rb CHANGED
@@ -29,6 +29,7 @@ module WorkOS
29
29
  autoload :Base, 'workos/base'
30
30
  autoload :Client, 'workos/client'
31
31
  autoload :AuditTrail, 'workos/audit_trail'
32
+ autoload :Connection, 'workos/connection'
32
33
  autoload :Profile, 'workos/profile'
33
34
  autoload :SSO, 'workos/sso'
34
35
 
@@ -57,22 +57,6 @@ module WorkOS
57
57
 
58
58
  execute_request(request: request)
59
59
  end
60
-
61
- private
62
-
63
- sig do
64
- params(
65
- path: String,
66
- idempotency_key: T.nilable(String),
67
- body: T.nilable(Hash),
68
- ).returns(Net::HTTP::Post)
69
- end
70
- def post_request(path:, idempotency_key: nil, body: nil)
71
- request = super(path: path, body: body)
72
- request['Authorization'] = "Bearer #{WorkOS.key}"
73
- request['Idempotency-Key'] = idempotency_key if idempotency_key
74
- request
75
- end
76
60
  end
77
61
  end
78
62
  end
data/lib/workos/client.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  # typed: true
3
3
 
4
-
5
4
  module WorkOS
6
5
  # A Net::HTTP based API client for interacting with the WorkOS API
7
6
  module Client
@@ -18,7 +17,11 @@ module WorkOS
18
17
  @client
19
18
  end
20
19
 
21
- sig { params(request: Net::HTTP::Post).returns(::T.untyped) }
20
+ sig do
21
+ params(
22
+ request: T.any(Net::HTTP::Get, Net::HTTP::Post),
23
+ ).returns(::T.untyped)
24
+ end
22
25
  def execute_request(request:)
23
26
  response = client.request(request)
24
27
 
@@ -28,10 +31,40 @@ module WorkOS
28
31
  response
29
32
  end
30
33
 
31
- sig { params(path: String, body: T.nilable(Hash)).returns(Net::HTTP::Post) }
32
- def post_request(path:, body: nil)
34
+ sig do
35
+ params(
36
+ path: String,
37
+ auth: T.nilable(T::Boolean),
38
+ params: T.nilable(Hash),
39
+ ).returns(Net::HTTP::Get)
40
+ end
41
+ def get_request(path:, auth: false, params: {})
42
+ uri = URI(path)
43
+ uri.query = URI.encode_www_form(params) if params
44
+
45
+ request = Net::HTTP::Get.new(
46
+ uri.to_s,
47
+ 'Content-Type' => 'application/json',
48
+ )
49
+
50
+ request['Authorization'] = "Bearer #{WorkOS.key!}" if auth
51
+ request['User-Agent'] = user_agent
52
+ request
53
+ end
54
+
55
+ sig do
56
+ params(
57
+ path: String,
58
+ auth: T.nilable(T::Boolean),
59
+ idempotency_key: T.nilable(String),
60
+ body: T.nilable(Hash),
61
+ ).returns(Net::HTTP::Post)
62
+ end
63
+ def post_request(path:, auth: false, idempotency_key: nil, body: nil)
33
64
  request = Net::HTTP::Post.new(path, 'Content-Type' => 'application/json')
34
65
  request.body = body.to_json if body
66
+ request['Authorization'] = "Bearer #{WorkOS.key!}" if auth
67
+ request['Idempotency-Key'] = idempotency_key if idempotency_key
35
68
  request['User-Agent'] = user_agent
36
69
  request
37
70
  end
@@ -68,6 +101,12 @@ module WorkOS
68
101
  http_status: http_status,
69
102
  request_id: response['x-request-id'],
70
103
  )
104
+ when 404
105
+ raise APIError.new(
106
+ message: json['message'],
107
+ http_status: http_status,
108
+ request_id: response['x-request-id'],
109
+ )
71
110
  when 422
72
111
  errors = json['errors'].map do |error|
73
112
  "#{error['field']}: #{error['code']}"
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+ # typed: true
3
+
4
+ require 'json'
5
+
6
+ module WorkOS
7
+ # The Connection class provides a lightweight wrapper around
8
+ # a WorkOS Connection resource. This class is not meant to be instantiated
9
+ # in user space, and is instantiated internally but exposed.
10
+ class Connection
11
+ extend T::Sig
12
+
13
+ attr_accessor :id, :name, :connection_type, :domains
14
+
15
+ sig { params(json: String).void }
16
+ def initialize(json)
17
+ raw = parse_json(json)
18
+
19
+ @id = T.let(raw.id, String)
20
+ @name = T.let(raw.name, String)
21
+ @connection_type = T.let(raw.connection_type, String)
22
+ @domains = T.let(raw.domains, Array)
23
+ end
24
+
25
+ def to_json(*)
26
+ {
27
+ id: id,
28
+ name: name,
29
+ connection_type: connection_type,
30
+ domains: domains,
31
+ }
32
+ end
33
+
34
+ private
35
+
36
+ sig { params(json_string: String).returns(WorkOS::Types::ConnectionStruct) }
37
+ def parse_json(json_string)
38
+ hash = JSON.parse(json_string, symbolize_names: true)
39
+
40
+ WorkOS::Types::ConnectionStruct.new(
41
+ id: hash[:id],
42
+ name: hash[:name],
43
+ connection_type: hash[:connection_type],
44
+ domains: hash[:domains],
45
+ )
46
+ end
47
+ end
48
+ end
@@ -1,14 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
  # typed: true
3
3
 
4
-
5
4
  require 'json'
6
5
 
7
6
  module WorkOS
8
7
  # The Profile class provides a lighweight wrapper around
9
8
  # a normalized response from the various IDPs WorkOS
10
9
  # supports as part of the SSO integration. This class
11
- # is not meant ot be instantiated in user space, and
10
+ # is not meant to be instantiated in user space, and
12
11
  # is instantiated internally but exposed.
13
12
  class Profile
14
13
  extend T::Sig
@@ -21,12 +20,12 @@ module WorkOS
21
20
  def initialize(profile_json)
22
21
  raw = parse_json(profile_json)
23
22
 
24
- @id = T.let(raw.id, String)
25
- @email = T.let(raw.email, String)
26
- @first_name = T.let(raw.first_name, String)
27
- @last_name = T.let(raw.last_name, String)
23
+ @id = T.let(raw.id, String)
24
+ @email = T.let(raw.email, String)
25
+ @first_name = T.let(raw.first_name, String)
26
+ @last_name = T.let(raw.last_name, String)
28
27
  @connection_type = T.let(raw.connection_type, String)
29
- @idp_id = T.let(raw.idp_id, String)
28
+ @idp_id = T.let(raw.idp_id, String)
30
29
  end
31
30
 
32
31
  sig { returns(String) }
data/lib/workos/sso.rb CHANGED
@@ -18,16 +18,6 @@ module WorkOS
18
18
 
19
19
  PROVIDERS = WorkOS::Types::Provider.values.map(&:serialize).freeze
20
20
 
21
- sig do
22
- params(
23
- project_id: String,
24
- redirect_uri: String,
25
- domain: T.nilable(String),
26
- provider: T.nilable(String),
27
- state: Hash,
28
- ).returns(String)
29
- end
30
-
31
21
  # Generate an Oauth2 authorization URL where your users will
32
22
  # authenticate using the configured SSO Identity Provider.
33
23
  #
@@ -59,6 +49,15 @@ module WorkOS
59
49
  # "response_type=code&state=%7B%3Anext_page%3D%3E%22%2Fdocs%22%7D"
60
50
  #
61
51
  # @return [String]
52
+ sig do
53
+ params(
54
+ project_id: String,
55
+ redirect_uri: String,
56
+ domain: T.nilable(String),
57
+ provider: T.nilable(String),
58
+ state: Hash,
59
+ ).returns(String)
60
+ end
62
61
  def authorization_url(
63
62
  project_id:, redirect_uri:, domain: nil, provider: nil, state: {}
64
63
  )
@@ -76,13 +75,6 @@ module WorkOS
76
75
  "https://#{WorkOS::API_HOSTNAME}/sso/authorize?#{query}"
77
76
  end
78
77
 
79
- sig do
80
- params(
81
- code: String,
82
- project_id: String,
83
- ).returns(WorkOS::Profile)
84
- end
85
-
86
78
  # Fetch the profile details for the authenticated SSO user.
87
79
  #
88
80
  # @param [String] code The authorization code provided in the callback URL
@@ -105,6 +97,7 @@ module WorkOS
105
97
  # >
106
98
  #
107
99
  # @return [WorkOS::Profile]
100
+ sig { params(code: String, project_id: String).returns(WorkOS::Profile) }
108
101
  def profile(code:, project_id:)
109
102
  body = {
110
103
  client_id: project_id,
@@ -119,17 +112,11 @@ module WorkOS
119
112
  WorkOS::Profile.new(response.body)
120
113
  end
121
114
 
122
- sig do
123
- params(
124
- token: String,
125
- ).returns(T::Boolean)
126
- end
127
-
128
115
  # Promote a DraftConnection created via the WorkOS.js embed such that the
129
116
  # Enterprise users can begin signing into your application.
130
117
  #
131
- # @param [String] token The draft connection token that's been provided to
132
- # you by the WorkOS.js embed
118
+ # @param [String] token The Draft Connection token that's been provided to
119
+ # you by the WorkOS.js
133
120
  #
134
121
  # @example
135
122
  # WorkOS::SSO.promote_draft_connection(
@@ -139,8 +126,10 @@ module WorkOS
139
126
  #
140
127
  # @return [Bool] - returns `true` if successful, `false` otherwise.
141
128
  # @see https://github.com/workos-inc/ruby-idp-link-example
129
+ sig { params(token: String).returns(T::Boolean) }
142
130
  def promote_draft_connection(token:)
143
- request = bearer_post_request(
131
+ request = post_request(
132
+ auth: true,
144
133
  path: "/draft_connections/#{token}/activate",
145
134
  )
146
135
 
@@ -149,6 +138,36 @@ module WorkOS
149
138
  response.is_a? Net::HTTPSuccess
150
139
  end
151
140
 
141
+ # Create a Connection
142
+ #
143
+ # @param [String] source The Draft Connection token that's been provided
144
+ # to you by WorkOS.js
145
+ #
146
+ # @example
147
+ # WorkOS::SSO.create_connection(source: 'draft_conn_429u59js')
148
+ # => #<WorkOS::Connection:0x00007fb6e4193d20
149
+ # @id="conn_02DRA1XNSJDZ19A31F183ECQW9",
150
+ # @name="Foo Corp",
151
+ # @connection_type="OktaSAML",
152
+ # @domains=
153
+ # [{:object=>"connection_domain",
154
+ # :id=>"domain_01E6PK9N3XMD8RHWF7S66380AR",
155
+ # :domain=>"example.com"}]>
156
+ #
157
+ # @return [WorkOS::Connection]
158
+ sig { params(source: String).returns(WorkOS::Connection) }
159
+ def create_connection(source:)
160
+ request = post_request(
161
+ auth: true,
162
+ path: '/connections',
163
+ body: { source: source },
164
+ )
165
+
166
+ response = execute_request(request: request)
167
+
168
+ WorkOS::Connection.new(response.body)
169
+ end
170
+
152
171
  private
153
172
 
154
173
  sig do
@@ -188,12 +207,6 @@ module WorkOS
188
207
  )
189
208
  end
190
209
  # rubocop:enable Metrics/MethodLength
191
-
192
- def bearer_post_request(path:, body: nil)
193
- request = post_request(path: path, body: body)
194
- request['Authorization'] = "Bearer #{WorkOS.key!}"
195
- request
196
- end
197
210
  end
198
211
  end
199
212
  end
data/lib/workos/types.rb CHANGED
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
- # typed: strict
3
-
2
+ # typed: strong
4
3
 
5
4
  module WorkOS
6
5
  # WorkOS believes strongly in typed languages,
7
6
  # so we're using Sorbet throughout this Ruby gem.
8
7
  module Types
8
+ require_relative 'types/connection_struct'
9
9
  require_relative 'types/profile_struct'
10
10
  require_relative 'types/provider_enum'
11
11
  end