oktakit 0.1.4 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 982d7dce841599fdd74241461d280ba4bde4c9c1
4
- data.tar.gz: 8d3b175bbcd444ab08ebe7b01ac55df0b202f77b
2
+ SHA256:
3
+ metadata.gz: 0e99dc499e67c72260945f77776e84ab7cf53e4ddaaf56ef1ad685662b62d247
4
+ data.tar.gz: 23130dfd22a8002feb6d690bdfba1e28d8868b4ac0aee29815c3aeb6434d1b22
5
5
  SHA512:
6
- metadata.gz: 3a4e2fe3a9e3014faf9dac52377c01ac2843dacc0e1de98ec00832f569d98e49f022a47621944d25426967aa12441932d84508078c27b9c3c7732fdf4bffb6f6
7
- data.tar.gz: d8b4642f81be10b8169331fea76c7e5996770087842f1dfd03ddea1e41a8c32dcc23b9be1483bf29ffabb27008719458ed9cd0aba16f57f7368b23db7d096013
6
+ metadata.gz: 1f26a6f891b6f1ae2c860c448e979a6cf4d9168ac1453d383ae1954696955b50ec095ad165d539d170da2950479bc03be90c1c646e454eb5bf024011d7c414c2
7
+ data.tar.gz: d1bb7b7030ba4d8d2d5fda311a3fe69af692b7b7add303660da277f47783e742e461b3b04ad03d31e6c439e168752162cc9122a2bb7f226d0442518d35b31196
@@ -0,0 +1,2 @@
1
+ enabled:
2
+ - cla
@@ -0,0 +1,27 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - master
7
+ pull_request:
8
+ branches:
9
+ - master
10
+
11
+ jobs:
12
+ build:
13
+ runs-on: ubuntu-latest
14
+ name: Ruby ${{ matrix.ruby }}
15
+ strategy:
16
+ matrix:
17
+ ruby: [2.6, 2.7, 3.0, 3.1]
18
+ steps:
19
+ - name: Check out code
20
+ uses: actions/checkout@v2
21
+ - name: Set up Ruby ${{ matrix.ruby }}
22
+ uses: ruby/setup-ruby@v1
23
+ with:
24
+ ruby-version: ${{ matrix.ruby }}
25
+ bundler-cache: true
26
+ - name: Ruby tests
27
+ run: bundle exec rspec
data/.gitignore CHANGED
@@ -1,6 +1,5 @@
1
1
  /.bundle/
2
2
  /.yardoc
3
- /Gemfile.lock
4
3
  /_yardoc/
5
4
  /coverage/
6
5
  /doc/
@@ -9,3 +8,4 @@
9
8
  /tmp/
10
9
  .byebug_history
11
10
  .DS_Store
11
+ *.gem
data/.rubocop.yml CHANGED
@@ -1,88 +1,16 @@
1
1
  # This file strictly follows the rules defined in the Ruby style guide:
2
2
  # http://shopify.github.io/ruby-style-guide/
3
+ inherit_gem:
4
+ rubocop-shopify: rubocop.yml
3
5
 
4
6
  AllCops:
5
- TargetRubyVersion: 2.1
7
+ TargetRubyVersion: 2.6
8
+ SuggestExtensions: false
6
9
 
7
- Rails:
10
+ # Allow .ruby-version and spec.required_ruby_version to differ
11
+ # to run a newer Ruby version for Rubocop, but don't force users to upgrade
12
+ Gemspec/RequiredRubyVersion:
8
13
  Enabled: false
9
14
 
10
- Lint/AssignmentInCondition:
11
- Enabled: false
12
-
13
- Style/Documentation:
14
- Enabled: false
15
-
16
- Style/MultilineOperationIndentation:
17
- Enabled: false
18
-
19
- Style/AlignParameters:
20
- EnforcedStyle: with_fixed_indentation
21
-
22
- Style/FirstParameterIndentation:
23
- EnforcedStyle: consistent
24
-
25
- Style/TrailingCommaInLiteral:
26
- Enabled: false
27
-
28
- Style/SignalException:
29
- EnforcedStyle: only_raise
30
-
31
- Style/NumericLiterals:
32
- Enabled: false
33
-
34
- Style/CaseIndentation:
35
- EnforcedStyle: end
36
-
37
- Style/IndentHash:
38
- EnforcedStyle: consistent
39
-
40
- Style/WordArray:
41
- Enabled: false
42
-
43
- Metrics/AbcSize:
44
- Enabled: false
45
-
46
- Metrics/CyclomaticComplexity:
47
- Enabled: false
48
-
49
- Style/StringLiterals:
50
- Enabled: false
51
-
52
- Metrics/LineLength:
53
- Max: 120
54
-
55
- Metrics/ClassLength:
56
- Enabled: false
57
-
58
- Metrics/MethodLength:
59
- Enabled: false
60
-
61
- Metrics/BlockLength:
62
- Exclude:
63
- - "**/*_spec.rb"
64
-
65
- Metrics/ParameterLists:
66
- Max: 5
67
- CountKeywordArgs: false
68
-
69
- Metrics/PerceivedComplexity:
70
- Enabled: false
71
-
72
- Lint/EndAlignment:
73
- EnforcedStyleAlignWith: variable
74
-
75
15
  Style/FrozenStringLiteralComment:
76
16
  Enabled: false
77
-
78
- Style/Alias:
79
- EnforcedStyle: prefer_alias_method
80
-
81
- Style/MutableConstant:
82
- Enabled: false
83
-
84
- Performance/Casecmp:
85
- Enabled: false
86
-
87
- Style/GuardClause:
88
- Enabled: false
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.6.6
data/.travis.yml CHANGED
@@ -1,7 +1,5 @@
1
- sudo: false
1
+ language: ruby
2
+ os: linux
2
3
  before_install: gem install bundler
3
4
  rvm:
4
- - '2.1'
5
- - '2.2'
6
- - '2.3.1'
7
-
5
+ - '2.6.0'
data/CHANGELOG.md ADDED
@@ -0,0 +1,13 @@
1
+ # Changelog
2
+
3
+ ## [v0.3.1] - 2022-01-20
4
+ - [Reverts a breaking change that caused errors to be raised for non-2xx responses](https://github.com/Shopify/oktakit/pull/54)
5
+
6
+ ## [v0.3.0] - 2022-01-20
7
+ - [Adds support for Ruby 3](https://github.com/Shopify/oktakit/pull/42)
8
+ - [Adds support for user reactivation endpoint](https://github.com/Shopify/oktakit/pull/47)
9
+ - [Adds support for app user schema operations endpoint](https://github.com/Shopify/oktakit/pull/32)
10
+ - [Makes custom error details available](https://github.com/Shopify/oktakit/pull/48)
11
+
12
+ ## [v0.2.1] - 2021-10-14
13
+ - Adds support for [Group Rule operations](https://developer.okta.com/docs/reference/api/groups/#group-rule-operations)
@@ -0,0 +1,76 @@
1
+ # Contributor Covenant Code of Conduct
2
+
3
+ ## Our Pledge
4
+
5
+ In the interest of fostering an open and welcoming environment, we as
6
+ contributors and maintainers pledge to making participation in our project and
7
+ our community a harassment-free experience for everyone, regardless of age, body
8
+ size, disability, ethnicity, sex characteristics, gender identity and expression,
9
+ level of experience, education, socio-economic status, nationality, personal
10
+ appearance, race, religion, or sexual identity and orientation.
11
+
12
+ ## Our Standards
13
+
14
+ Examples of behavior that contributes to creating a positive environment
15
+ include:
16
+
17
+ * Using welcoming and inclusive language
18
+ * Being respectful of differing viewpoints and experiences
19
+ * Gracefully accepting constructive criticism
20
+ * Focusing on what is best for the community
21
+ * Showing empathy towards other community members
22
+
23
+ Examples of unacceptable behavior by participants include:
24
+
25
+ * The use of sexualized language or imagery and unwelcome sexual attention or
26
+ advances
27
+ * Trolling, insulting/derogatory comments, and personal or political attacks
28
+ * Public or private harassment
29
+ * Publishing others' private information, such as a physical or electronic
30
+ address, without explicit permission
31
+ * Other conduct which could reasonably be considered inappropriate in a
32
+ professional setting
33
+
34
+ ## Our Responsibilities
35
+
36
+ Project maintainers are responsible for clarifying the standards of acceptable
37
+ behavior and are expected to take appropriate and fair corrective action in
38
+ response to any instances of unacceptable behavior.
39
+
40
+ Project maintainers have the right and responsibility to remove, edit, or
41
+ reject comments, commits, code, wiki edits, issues, and other contributions
42
+ that are not aligned to this Code of Conduct, or to ban temporarily or
43
+ permanently any contributor for other behaviors that they deem inappropriate,
44
+ threatening, offensive, or harmful.
45
+
46
+ ## Scope
47
+
48
+ This Code of Conduct applies both within project spaces and in public spaces
49
+ when an individual is representing the project or its community. Examples of
50
+ representing a project or community include using an official project e-mail
51
+ address, posting via an official social media account, or acting as an appointed
52
+ representative at an online or offline event. Representation of a project may be
53
+ further defined and clarified by project maintainers.
54
+
55
+ ## Enforcement
56
+
57
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be
58
+ reported by contacting the project team at security@shopify.com. All
59
+ complaints will be reviewed and investigated and will result in a response that
60
+ is deemed necessary and appropriate to the circumstances. The project team is
61
+ obligated to maintain confidentiality with regard to the reporter of an incident.
62
+ Further details of specific enforcement policies may be posted separately.
63
+
64
+ Project maintainers who do not follow or enforce the Code of Conduct in good
65
+ faith may face temporary or permanent repercussions as determined by other
66
+ members of the project's leadership.
67
+
68
+ ## Attribution
69
+
70
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
71
+ available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
72
+
73
+ [homepage]: https://www.contributor-covenant.org
74
+
75
+ For answers to common questions about this code of conduct, see
76
+ https://www.contributor-covenant.org/faq
data/Gemfile CHANGED
@@ -1,13 +1,15 @@
1
+ # frozen_string_literal: true
1
2
  source 'https://rubygems.org'
2
3
 
3
4
  gem 'byebug'
4
5
  gem 'rake'
5
- gem 'rubocop'
6
6
  gem 'yard'
7
7
 
8
8
  group :test do
9
- gem 'rspec', '~> 3.2'
10
- gem 'vcr', '~> 2.9', github: 'vcr/vcr', branch: 'master', ref: '480304be6d73803e6c4a0eb21a4ab4091da558d8'
9
+ gem 'rubocop'
10
+ gem 'rubocop-shopify', require: false
11
+ gem 'rspec', '~> 3.10'
12
+ gem 'vcr', '~> 6.0'
11
13
  end
12
14
 
13
15
  gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,101 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ oktakit (0.3.1)
5
+ sawyer (~> 0.8.1)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ addressable (2.8.0)
11
+ public_suffix (>= 2.0.2, < 5.0)
12
+ ast (2.4.2)
13
+ byebug (11.1.3)
14
+ diff-lcs (1.4.4)
15
+ faraday (1.9.3)
16
+ faraday-em_http (~> 1.0)
17
+ faraday-em_synchrony (~> 1.0)
18
+ faraday-excon (~> 1.1)
19
+ faraday-httpclient (~> 1.0)
20
+ faraday-multipart (~> 1.0)
21
+ faraday-net_http (~> 1.0)
22
+ faraday-net_http_persistent (~> 1.0)
23
+ faraday-patron (~> 1.0)
24
+ faraday-rack (~> 1.0)
25
+ faraday-retry (~> 1.0)
26
+ ruby2_keywords (>= 0.0.4)
27
+ faraday-em_http (1.0.0)
28
+ faraday-em_synchrony (1.0.0)
29
+ faraday-excon (1.1.0)
30
+ faraday-httpclient (1.0.1)
31
+ faraday-multipart (1.0.3)
32
+ multipart-post (>= 1.2, < 3)
33
+ faraday-net_http (1.0.1)
34
+ faraday-net_http_persistent (1.2.0)
35
+ faraday-patron (1.0.0)
36
+ faraday-rack (1.0.0)
37
+ faraday-retry (1.0.3)
38
+ multipart-post (2.1.1)
39
+ parallel (1.21.0)
40
+ parser (3.0.3.2)
41
+ ast (~> 2.4.1)
42
+ public_suffix (4.0.6)
43
+ rainbow (3.0.0)
44
+ rake (13.0.6)
45
+ regexp_parser (2.2.0)
46
+ rexml (3.2.5)
47
+ rspec (3.10.0)
48
+ rspec-core (~> 3.10.0)
49
+ rspec-expectations (~> 3.10.0)
50
+ rspec-mocks (~> 3.10.0)
51
+ rspec-core (3.10.1)
52
+ rspec-support (~> 3.10.0)
53
+ rspec-expectations (3.10.1)
54
+ diff-lcs (>= 1.2.0, < 2.0)
55
+ rspec-support (~> 3.10.0)
56
+ rspec-mocks (3.10.2)
57
+ diff-lcs (>= 1.2.0, < 2.0)
58
+ rspec-support (~> 3.10.0)
59
+ rspec-support (3.10.3)
60
+ rubocop (1.23.0)
61
+ parallel (~> 1.10)
62
+ parser (>= 3.0.0.0)
63
+ rainbow (>= 2.2.2, < 4.0)
64
+ regexp_parser (>= 1.8, < 3.0)
65
+ rexml
66
+ rubocop-ast (>= 1.12.0, < 2.0)
67
+ ruby-progressbar (~> 1.7)
68
+ unicode-display_width (>= 1.4.0, < 3.0)
69
+ rubocop-ast (1.15.0)
70
+ parser (>= 3.0.1.1)
71
+ rubocop-shopify (2.3.0)
72
+ rubocop (~> 1.22)
73
+ ruby-progressbar (1.11.0)
74
+ ruby2_keywords (0.0.5)
75
+ sawyer (0.8.2)
76
+ addressable (>= 2.3.5)
77
+ faraday (> 0.8, < 2.0)
78
+ unicode-display_width (2.1.0)
79
+ vcr (6.0.0)
80
+ webrick (1.7.0)
81
+ yard (0.9.27)
82
+ webrick (~> 1.7.0)
83
+
84
+ PLATFORMS
85
+ -darwin-21
86
+ arm64-darwin-21
87
+ x86_64-linux
88
+
89
+ DEPENDENCIES
90
+ bundler
91
+ byebug
92
+ oktakit!
93
+ rake
94
+ rspec (~> 3.10)
95
+ rubocop
96
+ rubocop-shopify
97
+ vcr (~> 6.0)
98
+ yard
99
+
100
+ BUNDLED WITH
101
+ 2.2.22
data/README.md CHANGED
@@ -15,18 +15,27 @@ gem 'oktakit'
15
15
 
16
16
  And then execute:
17
17
 
18
- $ bundle
18
+ ```sh
19
+ bundle
20
+ ```
19
21
 
20
22
  ## Usage
21
23
 
22
- `Oktakit` follows similar patterns as found in [`Octokit`](https://github.com/octokit/octokit.rb). So if you are familiar with Oktakit, then you should feel right at home.
24
+ `Oktakit` follows similar patterns as found in [`Octokit`](https://github.com/octokit/octokit.rb). So if you are familiar with Octokit, then you should feel right at home.
23
25
 
24
26
  ```ruby
25
27
  client = Oktakit.new(token: 't0k3n', organization: 'my-great-org')
26
28
  response, http_status = client.list_users
27
29
  ```
28
30
 
29
- #### Pagination
31
+ To work with the Okta sandbox (`<organization>.oktapreview.com`), set the `api_endpoint`:
32
+
33
+ ```ruby
34
+ client = Oktakit.new(token: 't0k3n', api_endpoint: 'https://my-great-org.oktapreview.com/api/v1')
35
+ ```
36
+
37
+ ### Pagination
38
+
30
39
  Pass the `paginate` flag as options for any `get` action for Oktakit to autopaginate the response for you.
31
40
 
32
41
  ```ruby
@@ -49,12 +58,17 @@ To anonymize the VCR data, first setup a real token and endpoint for Okta, such
49
58
  - Set the `OKTA_TEST_TOKEN` environment variable (this should be real). Don't worry, it is automatically removed.
50
59
  - Before committing, change `my-okta` to `okta-test` in `spec_helper.rb` and any VCR Cassettes.
51
60
 
52
- The [API Test Client](http://developer.okta.com/docs/api/getting_started/api_test_client) provided by Okta is also really helpful.
61
+ The [API Test Client](https://developer.okta.com/docs/api/getting_started/api_test_client) provided by Okta is also really helpful.
53
62
 
54
63
  ## Contributing
55
64
 
56
- 1. Fork it ( https://github.com/shopify/oktakit/fork )
65
+ 1. Fork it ( <https://github.com/shopify/oktakit/fork> )
57
66
  2. Create your feature branch (`git checkout -b my-new-feature`)
58
67
  3. Commit your changes (`git commit -am 'Add some feature'`)
59
68
  4. Push to the branch (`git push origin my-new-feature`)
60
69
  5. Create a new Pull Request
70
+
71
+ ### Contributor License Agreement
72
+
73
+ New contributors will be required to sign [Shopify's Contributor License Agreement (CLA)](https://cla.shopify.com/).
74
+ There are two versions of the CLA: one for individuals and one for organizations.
data/Rakefile CHANGED
@@ -7,13 +7,13 @@ require 'rubocop/rake_task'
7
7
  RuboCop::RakeTask.new
8
8
 
9
9
  task test: :spec
10
- task default: [:spec, :rubocop]
10
+ task default: %i[spec rubocop]
11
11
 
12
12
  namespace :doc do
13
13
  require 'yard'
14
14
  YARD::Rake::YardocTask.new do |task|
15
- task.files = %w(LICENSE.md lib/**/*.rb)
16
- task.options = %w(--output-dir doc/yard --markup markdown)
15
+ task.files = %w[LICENSE.md lib/**/*.rb]
16
+ task.options = %w[--output-dir doc/yard --markup markdown]
17
17
  end
18
18
  task default: :yard
19
19
  end
data/dev.yml CHANGED
@@ -3,13 +3,9 @@
3
3
  name: oktakit
4
4
 
5
5
  up:
6
- - ruby: 2.3.1
6
+ - ruby: 2.6.6
7
7
  - bundler
8
8
 
9
9
  commands:
10
10
  test: bundle exec rspec
11
11
  console: bin/console
12
-
13
- packages:
14
- - git@github.com:Shopify/dev-shopify.git
15
-
@@ -176,6 +176,22 @@ module Oktakit
176
176
  get("/apps/#{id}/users", options)
177
177
  end
178
178
 
179
+ # List Applications Assigned to User
180
+ #
181
+ # @params user_id [string] User ID
182
+ # @param options[:query] [Hash] Optional. Query params for request
183
+ # @param options[:headers] [Hash] Optional. Header params for the request.
184
+ # @param options[:accept] [String] Optional. The content type to accept. Default application/json
185
+ # @param options[:content_type] [String] Optional. The content type for the request. Default application/json
186
+ # @param options [Hash] Optional. Body params for request.
187
+ # @return [Array<Sawyer::Resource>] Array of Applications Assigned to User
188
+ # @see https://developer.okta.com/docs/api/resources/apps#list-applications-assigned-to-user
189
+ # @example
190
+ # Oktakit.list_applications_assigned_to_user('<user_id>')
191
+ def list_applications_assigned_to_user(user_id, options = {})
192
+ get("/apps?filter=user.id+eq+\"#{user_id}\"&expand=user/#{user_id}", options)
193
+ end
194
+
179
195
  # Update Application Credentials for Assigned User
180
196
  #
181
197
  # @params app_id [string] Application ID
@@ -0,0 +1,115 @@
1
+ module Oktakit
2
+ class Client
3
+ module GroupRules
4
+ # Add Group Rule
5
+ #
6
+ # @param options[:query] [Hash] Optional. Query params for request
7
+ # @param options[:headers] [Hash] Optional. Header params for the request.
8
+ # @param options[:accept] [String] Optional. The content type to accept. Default application/json
9
+ # @param options[:content_type] [String] Optional. The content type for the request. Default application/json
10
+ # @param options [Hash] Optional. Body params for request.
11
+ # @return [Hash<Sawyer::Resource>] The created Group Rule.
12
+ # @see https://developer.okta.com/docs/reference/api/groups/#create-group-rule
13
+ # @example
14
+ # Oktakit.add_group_rule
15
+ def add_group_rule(options = {})
16
+ post('/groups/rules', options)
17
+ end
18
+
19
+ # Get Group Rule
20
+ #
21
+ # @params id [string] Group Rule ID
22
+ # @param options[:query] [Hash] Optional. Query params for request
23
+ # @param options[:headers] [Hash] Optional. Header params for the request.
24
+ # @param options[:accept] [String] Optional. The content type to accept. Default application/json
25
+ # @param options[:content_type] [String] Optional. The content type for the request. Default application/json
26
+ # @param options [Hash] Optional. Body params for request.
27
+ # @return [Hash<Sawyer::Resource>] Fetched Group Rule
28
+ # @see https://developer.okta.com/docs/reference/api/groups/#get-group-rule
29
+ # @example
30
+ # Oktakit.get_group_rule('id')
31
+ def get_group_rule(id, options = {})
32
+ get("/groups/rules/#{id}", options)
33
+ end
34
+
35
+ # List Group Rules
36
+ #
37
+ # @param options[:query] [Hash] Optional. Query params for request
38
+ # @param options[:headers] [Hash] Optional. Header params for the request.
39
+ # @param options[:accept] [String] Optional. The content type to accept. Default application/json
40
+ # @param options[:content_type] [String] Optional. The content type for the request. Default application/json
41
+ # @param options [Hash] Optional. Body params for request.
42
+ # @return [Array<Sawyer::Resource>] Array of Group Rules
43
+ # @see https://developer.okta.com/docs/reference/api/groups/#list-group-rules
44
+ # @example
45
+ # Oktakit.list_group_rules
46
+ def list_group_rules(options = {})
47
+ get('/groups/rules', options)
48
+ end
49
+
50
+ # Update Group Rule
51
+ #
52
+ # @params id [string] Group Rule ID
53
+ # @param options[:query] [Hash] Optional. Query params for request
54
+ # @param options[:headers] [Hash] Optional. Header params for the request.
55
+ # @param options[:accept] [String] Optional. The content type to accept. Default application/json
56
+ # @param options[:content_type] [String] Optional. The content type for the request. Default application/json
57
+ # @param options [Hash] Optional. Body params for request.
58
+ # @return [Hash<Sawyer::Resource>] Updated Group Rule
59
+ # @see https://developer.okta.com/docs/reference/api/groups/#update-group-rule
60
+ # @example
61
+ # Oktakit.update_group_rule('id')
62
+ def update_group_rule(id, options = {})
63
+ put("/groups/rules/#{id}", options)
64
+ end
65
+
66
+ # Remove Group Rule
67
+ #
68
+ # @params id [string] Group ID
69
+ # @param options[:query] [Hash] Optional. Query params for request
70
+ # @param options[:headers] [Hash] Optional. Header params for the request.
71
+ # @param options[:accept] [String] Optional. The content type to accept. Default application/json
72
+ # @param options[:content_type] [String] Optional. The content type for the request. Default application/json
73
+ # @param options [Hash] Optional. Body params for request.
74
+ # @return HTTP 202 Accepted
75
+ # @see https://developer.okta.com/docs/reference/api/groups/#delete-a-group-rule
76
+ # @example
77
+ # Oktakit.remove_group_rule('id')
78
+ def remove_group_rule(id, options = {})
79
+ delete("/groups/rules/#{id}", options)
80
+ end
81
+
82
+ # Activate Group Rule
83
+ #
84
+ # @params id [string] Group ID
85
+ # @param options[:query] [Hash] Optional. Query params for request
86
+ # @param options[:headers] [Hash] Optional. Header params for the request.
87
+ # @param options[:accept] [String] Optional. The content type to accept. Default application/json
88
+ # @param options[:content_type] [String] Optional. The content type for the request. Default application/json
89
+ # @param options [Hash] Optional. Body params for request.
90
+ # @return HTTP 204 No Content
91
+ # @see https://developer.okta.com/docs/reference/api/groups/#activate-a-group-rule
92
+ # @example
93
+ # Oktakit.activate_group_rule('id')
94
+ def activate_group_rule(id, options = {})
95
+ post("/groups/rules/#{id}/lifecycle/activate", options)
96
+ end
97
+
98
+ # Deactivate Group Rule
99
+ #
100
+ # @params id [string] Group ID
101
+ # @param options[:query] [Hash] Optional. Query params for request
102
+ # @param options[:headers] [Hash] Optional. Header params for the request.
103
+ # @param options[:accept] [String] Optional. The content type to accept. Default application/json
104
+ # @param options[:content_type] [String] Optional. The content type for the request. Default application/json
105
+ # @param options [Hash] Optional. Body params for request.
106
+ # @return HTTP 204 No Content
107
+ # @see https://developer.okta.com/docs/reference/api/groups/#deactivate-a-group-rule
108
+ # @example
109
+ # Oktakit.deactivate_group_rule('id')
110
+ def deactivate_group_rule(id, options = {})
111
+ post("/groups/rules/#{id}/lifecycle/deactivate", options)
112
+ end
113
+ end
114
+ end
115
+ end
@@ -60,6 +60,70 @@ module Oktakit
60
60
  def remove_property_from_user_profile_schema(options = {})
61
61
  post('/meta/schemas/user/default', options)
62
62
  end
63
+
64
+ # Get App User Schema
65
+ #
66
+ # @params id [string] Application ID
67
+ # @param options[:query] [Hash] Optional. Query params for request
68
+ # @param options[:headers] [Hash] Optional. Header params for the request.
69
+ # @param options[:accept] [String] Optional. The content type to accept. Default application/json
70
+ # @param options[:content_type] [String] Optional. The content type for the request. Default application/json
71
+ # @param options [Hash] Optional. Body params for request.
72
+ # @return [Hash<Sawyer::Resource>] User Schema
73
+ # @see https://developer.okta.com/docs/reference/api/schemas/#get-app-user-schema
74
+ # @example
75
+ # Oktakit.get_app_user_schema('id')
76
+ def get_app_user_schema(id, options = {})
77
+ get("/meta/schemas/apps/#{id}/default", options)
78
+ end
79
+
80
+ # Add Property to App User Profile Schema
81
+ #
82
+ # @params id [string] Application ID
83
+ # @param options[:query] [Hash] Optional. Query params for request
84
+ # @param options[:headers] [Hash] Optional. Header params for the request.
85
+ # @param options[:accept] [String] Optional. The content type to accept. Default application/json
86
+ # @param options[:content_type] [String] Optional. The content type for the request. Default application/json
87
+ # @param options [Hash] Optional. Body params for request.
88
+ # @return [Hash<Sawyer::Resource>] User Schema
89
+ # @see https://developer.okta.com/docs/reference/api/schemas/#add-property-to-app-user-profile-schema
90
+ # @example
91
+ # Oktakit.add_property_to_app_user_profile_schema('id')
92
+ def add_property_to_app_user_profile_schema(id, options = {})
93
+ post("/meta/schemas/apps/#{id}/default", options)
94
+ end
95
+
96
+ # Update App User Profile Schema property
97
+ #
98
+ # @params id [string] Application ID
99
+ # @param options[:query] [Hash] Optional. Query params for request
100
+ # @param options[:headers] [Hash] Optional. Header params for the request.
101
+ # @param options[:accept] [String] Optional. The content type to accept. Default application/json
102
+ # @param options[:content_type] [String] Optional. The content type for the request. Default application/json
103
+ # @param options [Hash] Optional. Body params for request.
104
+ # @return [Hash<Sawyer::Resource>] User Schema
105
+ # @see https://developer.okta.com/docs/reference/api/schemas/#update-app-user-profile-schema-property
106
+ # @example
107
+ # Oktakit.update_app_user_profile_schema_property('id')
108
+ def update_app_user_profile_schema_property(id, options = {})
109
+ post("/meta/schemas/apps/#{id}/default", options)
110
+ end
111
+
112
+ # Remove property from App User Profile Schema
113
+ #
114
+ # @params id [string] Application ID
115
+ # @param options[:query] [Hash] Optional. Query params for request
116
+ # @param options[:headers] [Hash] Optional. Header params for the request.
117
+ # @param options[:accept] [String] Optional. The content type to accept. Default application/json
118
+ # @param options[:content_type] [String] Optional. The content type for the request. Default application/json
119
+ # @param options [Hash] Optional. Body params for request.
120
+ # @return [Hash<Sawyer::Resource>] User Schema
121
+ # @see https://developer.okta.com/docs/reference/api/schemas/#remove-property-from-app-user-profile-schema
122
+ # @example
123
+ # Oktakit.remove_property_from_app_user_profile_schema('id')
124
+ def remove_property_from_app_user_profile_schema(id, options = {})
125
+ post("/meta/schemas/apps/#{id}/default", options)
126
+ end
63
127
  end
64
128
  end
65
129
  end
@@ -9,7 +9,7 @@ module Oktakit
9
9
  # @param options[:content_type] [String] Optional. The content type for the request. Default application/json
10
10
  # @param options [Hash] Optional. Body params for request.
11
11
  # @return [Hash<Sawyer::Resource>] Returns the created User.
12
- # @see http://developer.okta.com/docs/api/resources/users.html#create-user
12
+ # @see https://developer.okta.com/docs/api/resources/users#create-user
13
13
  # @example
14
14
  # Oktakit.create_user
15
15
  def create_user(options = {})
@@ -25,7 +25,7 @@ module Oktakit
25
25
  # @param options[:content_type] [String] Optional. The content type for the request. Default application/json
26
26
  # @param options [Hash] Optional. Body params for request.
27
27
  # @return [Hash<Sawyer::Resource>] Fetched User
28
- # @see http://developer.okta.com/docs/api/resources/users.html#get-user
28
+ # @see https://developer.okta.com/docs/api/resources/users#get-user
29
29
  # @example
30
30
  # Oktakit.get_user('id')
31
31
  def get_user(id, options = {})
@@ -40,7 +40,7 @@ module Oktakit
40
40
  # @param options[:content_type] [String] Optional. The content type for the request. Default application/json
41
41
  # @param options [Hash] Optional. Body params for request.
42
42
  # @return [Array<Sawyer::Resource>] Array of User
43
- # @see http://developer.okta.com/docs/api/resources/users.html#list-users
43
+ # @see https://developer.okta.com/docs/api/resources/users#list-users
44
44
  # @example
45
45
  # Oktakit.list_users
46
46
  def list_users(options = {})
@@ -54,13 +54,18 @@ module Oktakit
54
54
  # @param options[:headers] [Hash] Optional. Header params for the request.
55
55
  # @param options[:accept] [String] Optional. The content type to accept. Default application/json
56
56
  # @param options[:content_type] [String] Optional. The content type for the request. Default application/json
57
+ # @param options[:partial] [Boolean] Indicates a partial update, in which case POST will be used instead of PUT
57
58
  # @param options [Hash] Optional. Body params for request.
58
59
  # @return [Hash<Sawyer::Resource>] Updated User
59
- # @see http://developer.okta.com/docs/api/resources/users.html#update-user
60
+ # @see https://developer.okta.com/docs/api/resources/users#update-user
60
61
  # @example
61
62
  # Oktakit.update_user('id')
62
63
  def update_user(id, options = {})
63
- put("/users/#{id}", options)
64
+ if options.delete(:partial)
65
+ post("/users/#{id}", options)
66
+ else
67
+ put("/users/#{id}", options)
68
+ end
64
69
  end
65
70
 
66
71
  # Update Profile
@@ -72,7 +77,7 @@ module Oktakit
72
77
  # @param options[:content_type] [String] Optional. The content type for the request. Default application/json
73
78
  # @param options [Hash] Optional. Body params for request.
74
79
  # @return [Hash<Sawyer::Resource>] Updated User
75
- # @see http://developer.okta.com/docs/api/resources/users.html#update-profile
80
+ # @see https://developer.okta.com/docs/api/resources/users#update-profile
76
81
  # @example
77
82
  # Oktakit.update_profile('id')
78
83
  def update_profile(id, options = {})
@@ -87,7 +92,7 @@ module Oktakit
87
92
  # @param options[:content_type] [String] Optional. The content type for the request. Default application/json
88
93
  # @param options [Hash] Optional. Body params for request.
89
94
  # @return [Array<Sawyer::Resource>] Array of App Links
90
- # @see http://developer.okta.com/docs/api/resources/users.html#get-assigned-app-links
95
+ # @see https://developer.okta.com/docs/api/resources/users#get-assigned-app-links
91
96
  # @example
92
97
  # Oktakit.get_assigned_app_links('id')
93
98
  def get_assigned_app_links(id, options = {})
@@ -103,7 +108,7 @@ module Oktakit
103
108
  # @param options[:content_type] [String] Optional. The content type for the request. Default application/json
104
109
  # @param options [Hash] Optional. Body params for request.
105
110
  # @return [Array<Sawyer::Resource>] Array of Groups
106
- # @see http://developer.okta.com/docs/api/resources/users.html#get-member-groups
111
+ # @see https://developer.okta.com/docs/api/resources/users#get-member-groups
107
112
  # @example
108
113
  # Oktakit.get_member_groups('id')
109
114
  def get_member_groups(id, options = {})
@@ -119,13 +124,31 @@ module Oktakit
119
124
  # @param options[:content_type] [String] Optional. The content type for the request. Default application/json
120
125
  # @param options [Hash] Optional. Body params for request.
121
126
  # @return [Hash<Sawyer::Resource>] Returns empty object by default. If sendEmail is false, a user activation link.
122
- # @see http://developer.okta.com/docs/api/resources/users.html#activate-user
127
+ # @see https://developer.okta.com/docs/api/resources/users#activate-user
123
128
  # @example
124
129
  # Oktakit.activate_user('id')
125
130
  def activate_user(id, options = {})
126
131
  post("/users/#{id}/lifecycle/activate", options)
127
132
  end
128
133
 
134
+ # Reactivate User
135
+ #
136
+ # @params id [string] User ID
137
+ # @param options[:query] [Hash] Optional. Query params for request
138
+ # @param options[:headers] [Hash] Optional. Header params for the request.
139
+ # @param options[:accept] [String] Optional. The content type to accept. Default application/json
140
+ # @param options[:content_type] [String] Optional. The content type for the request. Default application/json
141
+ # @param options [Hash] Optional. Body params for request.
142
+ # @return [Hash<Sawyer::Resource>].
143
+ # @note The user must be in a PROVISIONED status
144
+ # @see https://developer.okta.com/docs/reference/api/users/#reactivate-user
145
+ # @example
146
+ # Oktakit.reactivate_user('id')
147
+
148
+ def reactivate_user(id, options = {})
149
+ post("/users/#{id}/lifecycle/reactivate", options)
150
+ end
151
+
129
152
  # Deactivate User
130
153
  #
131
154
  # @params id [string] User ID
@@ -135,13 +158,31 @@ module Oktakit
135
158
  # @param options[:content_type] [String] Optional. The content type for the request. Default application/json
136
159
  # @param options [Hash] Optional. Body params for request.
137
160
  # @return [Hash<Sawyer::Resource>] Returns an empty object.
138
- # @see http://developer.okta.com/docs/api/resources/users.html#deactivate-user
161
+ # @see https://developer.okta.com/docs/api/resources/users#deactivate-user
139
162
  # @example
140
163
  # Oktakit.deactivate_user('id')
141
164
  def deactivate_user(id, options = {})
142
165
  post("/users/#{id}/lifecycle/deactivate", options)
143
166
  end
144
167
 
168
+ # Delete User
169
+ #
170
+ # @params id [string] User ID
171
+ # @param options[:query] [Hash] Optional. Query params for request
172
+ # @param options[:headers] [Hash] Optional. Header params for the request.
173
+ # @param options[:accept] [String] Optional. The content type to accept. Default application/json
174
+ # @param options[:content_type] [String] Optional. The content type for the request. Default application/json
175
+ # @param options [Hash] Optional. Body params for the request.
176
+ # @return 204 'No Content'
177
+ # @note Deletes a user permanently. This operation can only be performed on users that have a DEPROVISIONED status. This action cannot be recovered!
178
+ # This operation on a user that hasn't been deactivated causes that user to be deactivated. A second delete operation is required to delete the user.
179
+ # @see https://developer.okta.com/docs/reference/api/users/#delete-user
180
+ # @example
181
+ # Oktakit.delete_user('id')
182
+ def delete_user(id, options = {})
183
+ delete("/users/#{id}", options)
184
+ end
185
+
145
186
  # Suspend User
146
187
  #
147
188
  # @params id [string] User ID
@@ -151,7 +192,7 @@ module Oktakit
151
192
  # @param options[:content_type] [String] Optional. The content type for the request. Default application/json
152
193
  # @param options [Hash] Optional. Body params for request.
153
194
  # @return [Hash<Sawyer::Resource>] Returns an empty object.
154
- # @see http://developer.okta.com/docs/api/resources/users.html#suspend-user
195
+ # @see https://developer.okta.com/docs/api/resources/users#suspend-user
155
196
  # @example
156
197
  # Oktakit.suspend_user('id')
157
198
  def suspend_user(id, options = {})
@@ -167,7 +208,7 @@ module Oktakit
167
208
  # @param options[:content_type] [String] Optional. The content type for the request. Default application/json
168
209
  # @param options [Hash] Optional. Body params for request.
169
210
  # @return [Hash<Sawyer::Resource>] Returns an empty object. Returns an empty object.
170
- # @see http://developer.okta.com/docs/api/resources/users.html#unsuspend-user
211
+ # @see https://developer.okta.com/docs/api/resources/users#unsuspend-user
171
212
  # @example
172
213
  # Oktakit.unsuspend_user('id')
173
214
  def unsuspend_user(id, options = {})
@@ -183,7 +224,7 @@ module Oktakit
183
224
  # @param options[:content_type] [String] Optional. The content type for the request. Default application/json
184
225
  # @param options [Hash] Optional. Body params for request.
185
226
  # @return [Hash<Sawyer::Resource>] Returns an empty object
186
- # @see http://developer.okta.com/docs/api/resources/users.html#unlock-user
227
+ # @see http://developer.okta.com/docs/api/resources/users#unlock-user
187
228
  # @example
188
229
  # Oktakit.unlock_user('id')
189
230
  def unlock_user(id, options = {})
@@ -199,7 +240,7 @@ module Oktakit
199
240
  # @param options[:content_type] [String] Optional. The content type for the request. Default application/json
200
241
  # @param options [Hash] Optional. Body params for request.
201
242
  # @return [Hash<Sawyer::Resource>] Returns an empty object by default. If sendEmail is false a password reset link
202
- # @see http://developer.okta.com/docs/api/resources/users.html#reset-password
243
+ # @see https://developer.okta.com/docs/api/resources/users#reset-password
203
244
  # @example
204
245
  # Oktakit.reset_password('id')
205
246
  def reset_password(id, options = {})
@@ -215,7 +256,7 @@ module Oktakit
215
256
  # @param options[:content_type] [String] Optional. The content type for the request. Default application/json
216
257
  # @param options [Hash] Optional. Body params for request.
217
258
  # @return [Hash<Sawyer::Resource>] Returns the user by default. If tempPassword is true, a temporary password.
218
- # @see http://developer.okta.com/docs/api/resources/users.html#expire-password
259
+ # @see https://developer.okta.com/docs/api/resources/users#expire-password
219
260
  # @example
220
261
  # Oktakit.expire_password('id')
221
262
  def expire_password(id, options = {})
@@ -231,7 +272,7 @@ module Oktakit
231
272
  # @param options[:content_type] [String] Optional. The content type for the request. Default application/json
232
273
  # @param options [Hash] Optional. Body params for request.
233
274
  # @return [Hash<Sawyer::Resource>] Returns an empty object by default.
234
- # @see http://developer.okta.com/docs/api/resources/users.html#reset-factors
275
+ # @see https://developer.okta.com/docs/api/resources/users#reset-factors
235
276
  # @example
236
277
  # Oktakit.reset_factors('id')
237
278
  def reset_factors(id, options = {})
@@ -247,7 +288,7 @@ module Oktakit
247
288
  # @param options[:content_type] [String] Optional. The content type for the request. Default application/json
248
289
  # @param options [Hash] Optional. Body params for request.
249
290
  # @return [Hash<Sawyer::Resource>] Returns an empty object by default. If sendEmail is false a password reset link
250
- # @see http://developer.okta.com/docs/api/resources/users.html#forgot-password
291
+ # @see https://developer.okta.com/docs/api/resources/users#forgot-password
251
292
  # @example
252
293
  # Oktakit.forgot_password('id')
253
294
  def forgot_password(id, options = {})
@@ -263,7 +304,7 @@ module Oktakit
263
304
  # @param options[:content_type] [String] Optional. The content type for the request. Default application/json
264
305
  # @param options [Hash] Optional. Body params for request.
265
306
  # @return [Hash<Sawyer::Resource>] Credentials of the user
266
- # @see http://developer.okta.com/docs/api/resources/users.html#change-password
307
+ # @see https://developer.okta.com/docs/api/resources/users#change-password
267
308
  # @example
268
309
  # Oktakit.change_password('id')
269
310
  def change_password(id, options = {})
@@ -279,12 +320,27 @@ module Oktakit
279
320
  # @param options[:content_type] [String] Optional. The content type for the request. Default application/json
280
321
  # @param options [Hash] Optional. Body params for request.
281
322
  # @return [Hash<Sawyer::Resource>] Credentials of the user
282
- # @see http://developer.okta.com/docs/api/resources/users.html#change-recovery-question
323
+ # @see https://developer.okta.com/docs/api/resources/users#change-recovery-question
283
324
  # @example
284
325
  # Oktakit.change_recovery_question('id')
285
326
  def change_recovery_question(id, options = {})
286
327
  post("/users/#{id}/credentials/change_recovery_question", options)
287
328
  end
329
+
330
+ # Clear user sessions
331
+ #
332
+ # @params id [string] User ID
333
+ # @param options[:query] [Hash] Optional. Query params for request
334
+ # @param options[:headers] [Hash] Optional. Header params for the request.
335
+ # @param options[:accept] [String] Optional. The content type to accept. Default application/json
336
+ # @param options[:content_type] [String] Optional. The content type for the request. Default application/json
337
+ # @param options [Hash] Optional. Body params for the request.
338
+ # @return 204 'No Content'
339
+ # @see https://developer.okta.com/docs/api/resources/users#user-sessions
340
+ # Oktakit.clear_user_sessions('id')
341
+ def clear_user_sessions(id, options = {})
342
+ delete("/users/#{id}/sessions", options)
343
+ end
288
344
  end
289
345
  end
290
346
  end
@@ -5,6 +5,7 @@ require 'oktakit/client/apps'
5
5
  require 'oktakit/client/events'
6
6
  require 'oktakit/client/factors'
7
7
  require 'oktakit/client/groups'
8
+ require 'oktakit/client/group_rules'
8
9
  require 'oktakit/client/identity_providers'
9
10
  require 'oktakit/client/schemas'
10
11
  require 'oktakit/client/templates'
@@ -17,6 +18,7 @@ module Oktakit
17
18
  include Events
18
19
  include Factors
19
20
  include Groups
21
+ include GroupRules
20
22
  include IdentityProviders
21
23
  include Schemas
22
24
  include Templates
@@ -27,13 +29,27 @@ module Oktakit
27
29
 
28
30
  # Default Faraday middleware stack
29
31
  MIDDLEWARE = RACK_BUILDER_CLASS.new do |builder|
30
- builder.use Oktakit::Response::RaiseError
31
- builder.adapter Faraday.default_adapter
32
+ builder.use(Oktakit::Response::RaiseError)
33
+ builder.adapter(Faraday.default_adapter)
32
34
  end
33
35
 
34
- def initialize(token:, organization:)
36
+ def initialize(token: nil, access_token: nil, organization: nil, api_endpoint: nil)
37
+ if organization.nil? && api_endpoint.nil?
38
+ raise ArgumentError, "Please provide either the organization or the api_endpoint argument"
39
+ end
40
+
41
+ if (token.nil? && access_token.nil?) || (token && access_token)
42
+ raise ArgumentError, "Please provide either the token or the access_token argument"
43
+ end
44
+
35
45
  @token = token
46
+ @access_token = access_token
36
47
  @organization = organization
48
+ @api_endpoint = api_endpoint
49
+ end
50
+
51
+ def api_endpoint
52
+ @api_endpoint || "https://#{@organization.downcase}.okta.com/api/v1"
37
53
  end
38
54
 
39
55
  # Make a HTTP GET request
@@ -54,16 +70,16 @@ module Oktakit
54
70
  accept: options.delete(:accept),
55
71
  content_type: options.delete(:content_type),
56
72
  paginate: should_paginate,
57
- data: options
73
+ data: options,
58
74
  }
59
75
 
60
- resp, status, next_page = request :get, url, **request_options
76
+ resp, status, next_page = request(:get, url, **request_options)
61
77
 
62
78
  # If request succeeded and we should paginate, then automatically traverse all next_pages
63
79
  if status == 200 && should_paginate
64
80
  all_objs = [resp]
65
81
  while next_page
66
- resp, status, next_page = request :get, next_page, **request_options
82
+ resp, status, next_page = request(:get, next_page, **request_options)
67
83
  break unless status == 200 # Return early if page request fails
68
84
 
69
85
  all_objs << resp
@@ -84,9 +100,9 @@ module Oktakit
84
100
  # @param options [Hash] Optional. Body params for request.
85
101
  # @return [Sawyer::Resource]
86
102
  def post(url, options = {})
87
- request :post, url, query: options.delete(:query), headers: options.delete(:headers),
103
+ request(:post, url, query: options.delete(:query), headers: options.delete(:headers),
88
104
  accept: options.delete(:accept), content_type: options.delete(:content_type),
89
- data: options
105
+ data: options)
90
106
  end
91
107
 
92
108
  # Make a HTTP PUT request
@@ -99,9 +115,9 @@ module Oktakit
99
115
  # @param options [Hash] Optional. Body params for request.
100
116
  # @return [Sawyer::Resource]
101
117
  def put(url, options = {})
102
- request :put, url, query: options.delete(:query), headers: options.delete(:headers),
118
+ request(:put, url, query: options.delete(:query), headers: options.delete(:headers),
103
119
  accept: options.delete(:accept), content_type: options.delete(:content_type),
104
- data: options
120
+ data: options)
105
121
  end
106
122
 
107
123
  # Make a HTTP PATCH request
@@ -114,9 +130,9 @@ module Oktakit
114
130
  # @param options [Hash] Optional. Body params for request.
115
131
  # @return [Sawyer::Resource]
116
132
  def patch(url, options = {})
117
- request :patch, url, query: options.delete(:query), headers: options.delete(:headers),
133
+ request(:patch, url, query: options.delete(:query), headers: options.delete(:headers),
118
134
  accept: options.delete(:accept), content_type: options.delete(:content_type),
119
- data: options
135
+ data: options)
120
136
  end
121
137
 
122
138
  # Make a HTTP DELETE request
@@ -129,9 +145,9 @@ module Oktakit
129
145
  # @param options [Hash] Optional. Body params for request.
130
146
  # @return [Sawyer::Resource]
131
147
  def delete(url, options = {})
132
- request :delete, url, query: options.delete(:query), headers: options.delete(:headers),
148
+ request(:delete, url, query: options.delete(:query), headers: options.delete(:headers),
133
149
  accept: options.delete(:accept), content_type: options.delete(:content_type),
134
- data: options
150
+ data: options)
135
151
  end
136
152
 
137
153
  # Make a HTTP HEAD request
@@ -144,9 +160,9 @@ module Oktakit
144
160
  # @param options [Hash] Optional. Body params for request.
145
161
  # @return [Sawyer::Resource]
146
162
  def head(url, options = {})
147
- request :head, url, query: options.delete(:query), headers: options.delete(:headers),
163
+ request(:head, url, query: options.delete(:query), headers: options.delete(:headers),
148
164
  accept: options.delete(:accept), content_type: options.delete(:content_type),
149
- data: options
165
+ data: options)
150
166
  end
151
167
 
152
168
  attr_reader :last_response
@@ -160,7 +176,7 @@ module Oktakit
160
176
  options[:headers][:accept] = accept if accept
161
177
  options[:headers][:content_type] = content_type if content_type
162
178
 
163
- uri = URI::Parser.new.escape("/api/v1" + path.to_s)
179
+ uri = URI::DEFAULT_PARSER.escape("/api/v1" + path.to_s)
164
180
  @last_response = resp = sawyer_agent.call(method, uri, data, options)
165
181
 
166
182
  response = [resp.data, resp.status]
@@ -169,11 +185,12 @@ module Oktakit
169
185
  end
170
186
 
171
187
  def sawyer_agent
172
- @agent ||= Sawyer::Agent.new(api_endpoint, sawyer_options) do |http|
188
+ @sawyer_agent ||= Sawyer::Agent.new(api_endpoint, sawyer_options) do |http|
173
189
  http.headers[:accept] = 'application/json'
174
190
  http.headers[:content_type] = 'application/json'
175
191
  http.headers[:user_agent] = "Oktakit v#{Oktakit::VERSION}"
176
- http.authorization 'SSWS ', @token
192
+ http.authorization('SSWS ', @token) if @token
193
+ http.authorization(:Bearer, @access_token) if @access_token
177
194
  end
178
195
  end
179
196
 
@@ -184,12 +201,9 @@ module Oktakit
184
201
  }
185
202
  end
186
203
 
187
- def api_endpoint
188
- "https://#{@organization}.okta.com/api/v1"
189
- end
190
-
191
204
  def absolute_to_relative_url(next_ref)
192
205
  return unless next_ref
206
+
193
207
  next_ref.href.sub(api_endpoint, '')
194
208
  end
195
209
  end
data/lib/oktakit/error.rb CHANGED
@@ -8,7 +8,7 @@ module Oktakit
8
8
  # @return [Oktakit::Error]
9
9
  def self.from_response(response)
10
10
  status = response[:status].to_i
11
- if klass = error(status)
11
+ if (klass = error(status))
12
12
  klass.new(response)
13
13
  end
14
14
  end
@@ -41,19 +41,19 @@ module Oktakit
41
41
  # Array of validation errors
42
42
  # @return [Array<Hash>] Error info
43
43
  def errors
44
- if data && data.is_a?(Hash)
44
+ if data&.is_a?(Hash)
45
45
  data[:errors] || []
46
46
  else
47
47
  []
48
48
  end
49
49
  end
50
50
 
51
- private
52
-
53
51
  def data
54
52
  @data ||= parse_data
55
53
  end
56
54
 
55
+ private
56
+
57
57
  def parse_data
58
58
  body = @response[:body]
59
59
  return if body.empty?
@@ -88,8 +88,8 @@ module Oktakit
88
88
  end
89
89
 
90
90
  def redact_url(url_string)
91
- %w(client_secret access_token).each do |token|
92
- url_string.gsub!(/#{token}=\S+/, "#{token}=(redacted)") if url_string.include? token
91
+ %w[client_secret access_token].each do |token|
92
+ url_string.gsub!(/#{token}=\S+/, "#{token}=(redacted)") if url_string.include?(token)
93
93
  end
94
94
  url_string
95
95
  end
@@ -10,7 +10,7 @@ module Oktakit
10
10
  private
11
11
 
12
12
  def on_complete(response)
13
- if error = Oktakit::Error.from_response(response)
13
+ if (error = Oktakit::Error.from_response(response))
14
14
  raise error
15
15
  end
16
16
  end
@@ -1,3 +1,3 @@
1
1
  module Oktakit
2
- VERSION = '0.1.4'.freeze
2
+ VERSION = '0.3.1'.freeze
3
3
  end
data/lib/oktakit.rb CHANGED
@@ -2,7 +2,7 @@ require 'oktakit/version'
2
2
  require 'oktakit/client'
3
3
 
4
4
  module Oktakit
5
- def self.new(*args)
6
- Client.new(*args)
5
+ def self.new(**args)
6
+ Client.new(**args)
7
7
  end
8
8
  end
data/oktakit.gemspec CHANGED
@@ -1,5 +1,4 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
1
+ lib = File.expand_path('lib', __dir__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
3
  require 'oktakit/version'
5
4
 
@@ -10,16 +9,16 @@ Gem::Specification.new do |spec|
10
9
  spec.email = ['graeme.johnson@shopify.com', 'julian@shopify.com']
11
10
 
12
11
  spec.summary = 'Ruby toolkit for working with the Okta API'
13
- spec.homepage = 'https://github.com/shopify/oktakit'
12
+ spec.homepage = 'https://github.com/Shopify/oktakit'
14
13
  spec.license = 'MIT'
15
14
 
16
- spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
15
+ spec.files = %x(git ls-files -z).split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
16
  spec.bindir = 'exe'
18
17
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
18
  spec.require_paths = ['lib']
20
19
 
21
- spec.required_ruby_version = '>= 2.0'
20
+ spec.required_ruby_version = '>= 2.6'
22
21
 
23
- spec.add_dependency 'sawyer', '~> 0.7.0'
24
- spec.add_development_dependency 'bundler'
22
+ spec.add_dependency('sawyer', '~> 0.8.1')
23
+ spec.add_development_dependency('bundler')
25
24
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oktakit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Graeme Johnson
8
8
  - Julian Nadeau
9
- autorequire:
9
+ autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2017-03-06 00:00:00.000000000 Z
12
+ date: 2022-01-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sawyer
@@ -17,14 +17,14 @@ dependencies:
17
17
  requirements:
18
18
  - - "~>"
19
19
  - !ruby/object:Gem::Version
20
- version: 0.7.0
20
+ version: 0.8.1
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - "~>"
26
26
  - !ruby/object:Gem::Version
27
- version: 0.7.0
27
+ version: 0.8.1
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: bundler
30
30
  requirement: !ruby/object:Gem::Requirement
@@ -39,7 +39,7 @@ dependencies:
39
39
  - - ">="
40
40
  - !ruby/object:Gem::Version
41
41
  version: '0'
42
- description:
42
+ description:
43
43
  email:
44
44
  - graeme.johnson@shopify.com
45
45
  - julian@shopify.com
@@ -47,11 +47,17 @@ executables: []
47
47
  extensions: []
48
48
  extra_rdoc_files: []
49
49
  files:
50
+ - ".github/probots.yml"
51
+ - ".github/workflows/ci.yml"
50
52
  - ".gitignore"
51
53
  - ".rspec"
52
54
  - ".rubocop.yml"
55
+ - ".ruby-version"
53
56
  - ".travis.yml"
57
+ - CHANGELOG.md
58
+ - CODE_OF_CONDUCT.md
54
59
  - Gemfile
60
+ - Gemfile.lock
55
61
  - LICENSE.txt
56
62
  - README.md
57
63
  - Rakefile
@@ -64,6 +70,7 @@ files:
64
70
  - lib/oktakit/client/apps.rb
65
71
  - lib/oktakit/client/events.rb
66
72
  - lib/oktakit/client/factors.rb
73
+ - lib/oktakit/client/group_rules.rb
67
74
  - lib/oktakit/client/groups.rb
68
75
  - lib/oktakit/client/identity_providers.rb
69
76
  - lib/oktakit/client/schemas.rb
@@ -73,11 +80,11 @@ files:
73
80
  - lib/oktakit/response/raise_error.rb
74
81
  - lib/oktakit/version.rb
75
82
  - oktakit.gemspec
76
- homepage: https://github.com/shopify/oktakit
83
+ homepage: https://github.com/Shopify/oktakit
77
84
  licenses:
78
85
  - MIT
79
86
  metadata: {}
80
- post_install_message:
87
+ post_install_message:
81
88
  rdoc_options: []
82
89
  require_paths:
83
90
  - lib
@@ -85,16 +92,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
85
92
  requirements:
86
93
  - - ">="
87
94
  - !ruby/object:Gem::Version
88
- version: '2.0'
95
+ version: '2.6'
89
96
  required_rubygems_version: !ruby/object:Gem::Requirement
90
97
  requirements:
91
98
  - - ">="
92
99
  - !ruby/object:Gem::Version
93
100
  version: '0'
94
101
  requirements: []
95
- rubyforge_project:
96
- rubygems_version: 2.5.1
97
- signing_key:
102
+ rubygems_version: 3.2.20
103
+ signing_key:
98
104
  specification_version: 4
99
105
  summary: Ruby toolkit for working with the Okta API
100
106
  test_files: []