psu_identity 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7996e867a943731e649e3cf0c2981fd08dd938e24f914bb8a12f1745bf7d605f
4
- data.tar.gz: f771b556fb55e71d9ae6d0673e863dbf88fb7a1a173c224640111fa140488c92
3
+ metadata.gz: 71486dc8c78a516d121f540ce6966457d863c725c2ab6ada88f7d6090267c8b8
4
+ data.tar.gz: 1ccd98e5c98644f8d1d44999ae2ff7c88284203d3666f241f6422f4a0c122c53
5
5
  SHA512:
6
- metadata.gz: 362b2abff2b599aaae062a0b367c8afbd038e6cc7536476ed7ac1a710ae534f90fa25274ff9ebae21ded7c404de669766db274806ae0c7ae31cf3b8d4249adef
7
- data.tar.gz: 6105dfa4398b1653a1621a84548f7ed3dee1caad9f05a746364eca6f527616d1beea6fbd9c27d277d38be8fc0e5c4fedf5403cbe0a739e1f9f74e3acd0a43773
6
+ metadata.gz: 2a4e22f4667d2163fd0f9ad4f32425cf78b116b4e8db4357493c15f533d8cdddbc70ae55ebc7752c47d4891d3f4d1e69cd351b0b38e3c89da19735deb06b6f91
7
+ data.tar.gz: 19911fbf7bd37ff89bb1b508c43bb3e2fa4142d0a88df670a8a5cfae347b13993bcf15dd55000a50661ede2982fbd39c9329c48dcd9f0938480389b3b7737c91
data/.circleci/config.yml CHANGED
@@ -35,6 +35,8 @@ jobs:
35
35
  - run:
36
36
  name: "Rspec"
37
37
  command: |
38
+ export PSU_ID_OAUTH_CLIENT_ID=foo
39
+ export PSU_ID_OAUTH_CLIENT_SECRET=bar
38
40
  RAILS_ENV=test bundle exec rspec &&
39
41
  bin/cc-test-reporter format-coverage -t simplecov -o coverage/codeclimate.json coverage/.resultset.json &&
40
42
  bin/cc-test-reporter upload-coverage
data/.gitignore CHANGED
@@ -8,9 +8,10 @@
8
8
  /tmp/
9
9
  .idea/
10
10
  log/
11
+ .envrc
11
12
 
12
13
  # rspec failure tracking
13
14
  .rspec_status
14
15
 
15
16
  # ignore gem builds
16
- /psu_identity-*
17
+ /psu_identity-*
data/.rubocop.yml CHANGED
@@ -13,6 +13,7 @@ AllCops:
13
13
  DisplayCopNames: true
14
14
  NewCops: enable
15
15
 
16
+
16
17
  Metrics/BlockLength:
17
18
  Exclude:
18
19
  - 'spec/**/*'
data/Gemfile.lock CHANGED
@@ -1,9 +1,10 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- psu_identity (0.3.0)
4
+ psu_identity (0.4.0)
5
5
  faraday (~> 1.0)
6
6
  json
7
+ oauth2
7
8
  rake (>= 12.0)
8
9
 
9
10
  GEM
@@ -43,8 +44,17 @@ GEM
43
44
  faraday-retry (1.0.3)
44
45
  hashdiff (1.0.1)
45
46
  json (2.5.1)
47
+ jwt (2.3.0)
46
48
  method_source (1.0.0)
49
+ multi_json (1.15.0)
50
+ multi_xml (0.6.0)
47
51
  multipart-post (2.1.1)
52
+ oauth2 (1.4.7)
53
+ faraday (>= 0.8, < 2.0)
54
+ jwt (>= 1.0, < 3.0)
55
+ multi_json (~> 1.3)
56
+ multi_xml (~> 0.5)
57
+ rack (>= 1.2, < 3)
48
58
  parallel (1.21.0)
49
59
  parser (3.0.2.0)
50
60
  ast (~> 2.4.1)
@@ -55,6 +65,7 @@ GEM
55
65
  byebug (~> 11.0)
56
66
  pry (~> 0.13.0)
57
67
  public_suffix (4.0.6)
68
+ rack (2.2.3)
58
69
  rainbow (3.0.0)
59
70
  rake (13.0.6)
60
71
  regexp_parser (2.1.1)
@@ -121,4 +132,4 @@ DEPENDENCIES
121
132
  webmock
122
133
 
123
134
  BUNDLED WITH
124
- 2.2.29
135
+ 2.3.6
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'oauth2'
4
+ require 'ostruct'
5
+
6
+ # @abstract Client for querying Penn State's directory-service API: https://directory-service.k8s.psu.edu/directory-service-web/resources
7
+ module PsuIdentity::DirectoryService
8
+ class Error < StandardError; end
9
+
10
+ class NotFound < StandardError; end
11
+
12
+ class Client
13
+ attr_reader :base_url
14
+
15
+ # @param [String] base_url
16
+ def initialize(base_url: '/directory-service-web/resources')
17
+ @base_url = base_url
18
+ end
19
+
20
+ # @param [Hash] args of options to pass to the endpoint
21
+ # @option args [String] :userid of the person
22
+ def userid(userid)
23
+ process_userid_response connection.get("#{base_url}/people/#{userid}")
24
+ end
25
+
26
+ private
27
+
28
+ def process_userid_response(response)
29
+ raise NotFound if response.status == 404
30
+
31
+ raise Error.new(response.body) unless response.success?
32
+
33
+ snake_cased_response = JSON.parse(response.body).transform_keys { |str| StringHelpers.underscore(str) }
34
+ OpenStruct.new(snake_cased_response)
35
+ rescue JSON::ParserError
36
+ end
37
+
38
+ def connection
39
+ @connection ||= Faraday.new(url: endpoint, headers: auth_headers) do |conn|
40
+ conn.adapter :net_http
41
+ end
42
+ end
43
+
44
+ def auth_headers
45
+ { 'Authorization' => "Bearer #{token}" }
46
+ end
47
+
48
+ def token
49
+ oauth_client = OAuth2::Client.new(client_id,
50
+ client_secret, site: oauth_endpoint,
51
+ authorize_url: '/oauth/api/authz',
52
+ token_url: '/oauth/api/token')
53
+ oauth_token = oauth_client.client_credentials.get_token
54
+ oauth_token.token
55
+ end
56
+
57
+ def client_id
58
+ @client_id ||= ENV.fetch('PSU_ID_OAUTH_CLIENT_ID')
59
+ end
60
+
61
+ def client_secret
62
+ @client_secret ||= ENV.fetch('PSU_ID_OAUTH_CLIENT_SECRET')
63
+ end
64
+
65
+ def oauth_endpoint
66
+ @oauth_endpoint ||= ENV.fetch('PSU_ID_OAUTH_ENDPOINT', 'https://acceptance-oauth2-server.qa.k8s.psu.edu')
67
+ end
68
+
69
+ def endpoint
70
+ @endpoint ||= ENV.fetch('DIRECTORY_SERVICE_ENDPOINT', 'https://acceptance-directory-service.qa.k8s.psu.edu')
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module StringHelpers
4
+ def self.underscore(str)
5
+ str
6
+ .to_s
7
+ .gsub(/::/, '/')
8
+ .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
9
+ .gsub(/([a-z\d])([A-Z])/, '\1_\2')
10
+ .tr('-', '_')
11
+ .downcase
12
+ end
13
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PsuIdentity
4
- VERSION = '0.3.0'
4
+ VERSION = '0.4.0'
5
5
  end
data/lib/psu_identity.rb CHANGED
@@ -7,8 +7,10 @@ require 'ostruct'
7
7
  module PsuIdentity
8
8
  class Error < StandardError; end
9
9
 
10
+ require 'psu_identity/directory_service/client'
10
11
  require 'psu_identity/search_service/atomic_link'
11
12
  require 'psu_identity/search_service/client'
12
13
  require 'psu_identity/search_service/person'
14
+ require 'psu_identity/string_helpers'
13
15
  require 'psu_identity/version'
14
16
  end
data/psu_identity.gemspec CHANGED
@@ -25,6 +25,7 @@ Gem::Specification.new do |spec|
25
25
 
26
26
  spec.add_dependency 'faraday', '~> 1.0'
27
27
  spec.add_dependency 'json'
28
+ spec.add_dependency 'oauth2'
28
29
  spec.add_dependency 'rake', '>= 12.0'
29
30
 
30
31
  spec.add_development_dependency 'pry-byebug'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: psu_identity
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Kiessling
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-01-25 00:00:00.000000000 Z
11
+ date: 2022-02-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: oauth2
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: rake
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -207,9 +221,11 @@ files:
207
221
  - bin/console
208
222
  - bin/setup
209
223
  - lib/psu_identity.rb
224
+ - lib/psu_identity/directory_service/client.rb
210
225
  - lib/psu_identity/search_service/atomic_link.rb
211
226
  - lib/psu_identity/search_service/client.rb
212
227
  - lib/psu_identity/search_service/person.rb
228
+ - lib/psu_identity/string_helpers.rb
213
229
  - lib/psu_identity/version.rb
214
230
  - psu_identity.gemspec
215
231
  homepage: https://github.com/psu-libraries/psu_identity