psu_identity 0.3.0 → 0.5.0

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
2
  SHA256:
3
- metadata.gz: 7996e867a943731e649e3cf0c2981fd08dd938e24f914bb8a12f1745bf7d605f
4
- data.tar.gz: f771b556fb55e71d9ae6d0673e863dbf88fb7a1a173c224640111fa140488c92
3
+ metadata.gz: 6d739e41da59f566b5b558d4a61f1d12e818634e2f7de1d46ae5bf21622fbe0a
4
+ data.tar.gz: 6d86921f52e9abed163f3406c5aa916ad54758c0573372cf5edd973c426a5cd9
5
5
  SHA512:
6
- metadata.gz: 362b2abff2b599aaae062a0b367c8afbd038e6cc7536476ed7ac1a710ae534f90fa25274ff9ebae21ded7c404de669766db274806ae0c7ae31cf3b8d4249adef
7
- data.tar.gz: 6105dfa4398b1653a1621a84548f7ed3dee1caad9f05a746364eca6f527616d1beea6fbd9c27d277d38be8fc0e5c4fedf5403cbe0a739e1f9f74e3acd0a43773
6
+ metadata.gz: f65a3c573798e0d2ce97b5cff55af6fceeba88f87fca788b1cb1a5113e47922e2ee1cd428acee8d32412a890859ddc41198fa7a3fcabf287321fc0b82ad21f52
7
+ data.tar.gz: 3e6c1af64c775ceb1e4e81410b8d25a9b51c43eb754a260c0f43dacbf993ed5eeb9ba9967b11aff2d8dd92bdd9476c3310411ce446f37731aa0b153732da9b7b
data/.circleci/config.yml CHANGED
@@ -5,7 +5,7 @@ orbs:
5
5
  jobs:
6
6
  build:
7
7
  docker:
8
- - image: circleci/ruby:2.6.3-stretch-node
8
+ - image: cimg/ruby:3.1.3
9
9
  executor: ruby/default
10
10
  steps:
11
11
  - checkout
@@ -14,9 +14,9 @@ jobs:
14
14
  command: mkdir ./log
15
15
 
16
16
  - run:
17
- name: "Install Bundler 2.1.4"
17
+ name: "Install Bundler 2.3.6"
18
18
  command: |
19
- gem install bundler:2.1.4 &&
19
+ gem install bundler:2.3.6 &&
20
20
  bundle -v
21
21
 
22
22
  # An orb function for bundling
@@ -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
@@ -9,11 +9,19 @@ inherit_from:
9
9
  - .niftany/style.yml
10
10
  - .rubocop_todo.yml
11
11
 
12
+ require: [rubocop-rspec, rubocop-performance]
13
+
12
14
  AllCops:
13
15
  DisplayCopNames: true
14
16
  NewCops: enable
15
17
 
18
+
16
19
  Metrics/BlockLength:
17
20
  Exclude:
18
21
  - 'spec/**/*'
19
22
  - 'psu_identity.gemspec'
23
+
24
+ Style/OpenStructUse:
25
+ Exclude:
26
+ - 'lib/psu_identity/search_service/atomic_link.rb'
27
+ - 'spec/lib/psu_identity/search_service/atomic_link_spec.rb'
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.6.3
1
+ 3.1.3
data/Gemfile.lock CHANGED
@@ -1,16 +1,17 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- psu_identity (0.3.0)
4
+ psu_identity (0.5.0)
5
5
  faraday (~> 1.0)
6
6
  json
7
+ oauth2
7
8
  rake (>= 12.0)
8
9
 
9
10
  GEM
10
11
  remote: https://rubygems.org/
11
12
  specs:
12
- addressable (2.8.0)
13
- public_suffix (>= 2.0.2, < 5.0)
13
+ addressable (2.8.1)
14
+ public_suffix (>= 2.0.2, < 6.0)
14
15
  ast (2.4.2)
15
16
  byebug (11.1.3)
16
17
  coderay (1.1.3)
@@ -43,10 +44,19 @@ 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)
48
- parallel (1.21.0)
49
- parser (3.0.2.0)
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)
58
+ parallel (1.22.1)
59
+ parser (3.2.1.1)
50
60
  ast (~> 2.4.1)
51
61
  pry (0.13.1)
52
62
  coderay (~> 1.1)
@@ -54,10 +64,11 @@ GEM
54
64
  pry-byebug (3.9.0)
55
65
  byebug (~> 11.0)
56
66
  pry (~> 0.13.0)
57
- public_suffix (4.0.6)
58
- rainbow (3.0.0)
67
+ public_suffix (5.0.1)
68
+ rack (2.2.6.4)
69
+ rainbow (3.1.1)
59
70
  rake (13.0.6)
60
- regexp_parser (2.1.1)
71
+ regexp_parser (2.7.0)
61
72
  rexml (3.2.5)
62
73
  rspec (3.10.0)
63
74
  rspec-core (~> 3.10.0)
@@ -75,32 +86,33 @@ GEM
75
86
  diff-lcs (>= 1.2.0, < 2.0)
76
87
  rspec-support (~> 3.10.0)
77
88
  rspec-support (3.10.2)
78
- rubocop (1.22.1)
89
+ rubocop (1.48.1)
90
+ json (~> 2.3)
79
91
  parallel (~> 1.10)
80
- parser (>= 3.0.0.0)
92
+ parser (>= 3.2.0.0)
81
93
  rainbow (>= 2.2.2, < 4.0)
82
94
  regexp_parser (>= 1.8, < 3.0)
83
- rexml
84
- rubocop-ast (>= 1.12.0, < 2.0)
95
+ rexml (>= 3.2.5, < 4.0)
96
+ rubocop-ast (>= 1.26.0, < 2.0)
85
97
  ruby-progressbar (~> 1.7)
86
- unicode-display_width (>= 1.4.0, < 3.0)
87
- rubocop-ast (1.12.0)
88
- parser (>= 3.0.1.1)
98
+ unicode-display_width (>= 2.4.0, < 3.0)
99
+ rubocop-ast (1.27.0)
100
+ parser (>= 3.2.1.0)
89
101
  rubocop-performance (1.11.5)
90
102
  rubocop (>= 1.7.0, < 2.0)
91
103
  rubocop-ast (>= 0.4.0)
92
104
  rubocop-rspec (2.5.0)
93
105
  rubocop (~> 1.19)
94
- ruby-progressbar (1.11.0)
106
+ ruby-progressbar (1.13.0)
95
107
  ruby2_keywords (0.0.5)
96
108
  simplecov (0.17.0)
97
109
  docile (~> 1.1)
98
110
  json (>= 1.8, < 3)
99
111
  simplecov-html (~> 0.10.0)
100
112
  simplecov-html (0.10.2)
101
- unicode-display_width (2.1.0)
102
- vcr (6.0.0)
103
- webmock (3.14.0)
113
+ unicode-display_width (2.4.2)
114
+ vcr (6.1.0)
115
+ webmock (3.18.1)
104
116
  addressable (>= 2.8.0)
105
117
  crack (>= 0.3.2)
106
118
  hashdiff (>= 0.4.0, < 2.0.0)
@@ -109,16 +121,16 @@ PLATFORMS
109
121
  ruby
110
122
 
111
123
  DEPENDENCIES
112
- pry-byebug
124
+ pry-byebug (~> 3.9)
113
125
  psu_identity!
114
126
  rspec (~> 3.0)
115
- rspec-its
116
- rubocop (~> 1.22)
127
+ rspec-its (~> 1.3)
128
+ rubocop (~> 1.28)
117
129
  rubocop-performance (~> 1.11)
118
130
  rubocop-rspec (~> 2.5)
119
131
  simplecov (= 0.17)
120
- vcr
121
- webmock
132
+ vcr (~> 6.1)
133
+ webmock (~> 3.18)
122
134
 
123
135
  BUNDLED WITH
124
- 2.2.29
136
+ 2.3.6
@@ -0,0 +1,74 @@
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).to_sym }
34
+ to_struct = Struct.new(*snake_cased_response.keys)
35
+ to_struct.new(*snake_cased_response.values)
36
+ rescue JSON::ParserError
37
+ end
38
+
39
+ def connection
40
+ @connection ||= Faraday.new(url: endpoint, headers: auth_headers) do |conn|
41
+ conn.adapter :net_http
42
+ end
43
+ end
44
+
45
+ def auth_headers
46
+ { 'Authorization' => "Bearer #{token}" }
47
+ end
48
+
49
+ def token
50
+ oauth_client = OAuth2::Client.new(client_id,
51
+ client_secret, site: oauth_endpoint,
52
+ authorize_url: '/oauth/api/authz',
53
+ token_url: '/oauth/api/token')
54
+ oauth_token = oauth_client.client_credentials.get_token
55
+ oauth_token.token
56
+ end
57
+
58
+ def client_id
59
+ @client_id ||= ENV.fetch('PSU_ID_OAUTH_CLIENT_ID')
60
+ end
61
+
62
+ def client_secret
63
+ @client_secret ||= ENV.fetch('PSU_ID_OAUTH_CLIENT_SECRET')
64
+ end
65
+
66
+ def oauth_endpoint
67
+ @oauth_endpoint ||= ENV.fetch('PSU_ID_OAUTH_ENDPOINT', 'https://acceptance-oauth2-server.qa.k8s.psu.edu')
68
+ end
69
+
70
+ def endpoint
71
+ @endpoint ||= ENV.fetch('DIRECTORY_SERVICE_ENDPOINT', 'https://acceptance-directory-service.qa.k8s.psu.edu')
72
+ end
73
+ end
74
+ 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.5.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
@@ -12,7 +12,7 @@ Gem::Specification.new do |spec|
12
12
  spec.description = "Gem for interfacing with psu's search-service"
13
13
  spec.homepage = 'https://github.com/psu-libraries/psu_identity'
14
14
  spec.license = 'MIT'
15
- spec.required_ruby_version = Gem::Requirement.new('>= 2.6.3')
15
+ spec.required_ruby_version = Gem::Requirement.new('>= 3.1.3')
16
16
 
17
17
  # Specify which files should be added to the gem when it is released.
18
18
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
@@ -25,15 +25,17 @@ 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
- spec.add_development_dependency 'pry-byebug'
31
+ spec.add_development_dependency 'pry-byebug', '~> 3.9'
31
32
  spec.add_development_dependency 'rspec', '~> 3.0'
32
- spec.add_development_dependency 'rspec-its'
33
- spec.add_development_dependency 'rubocop', '~> 1.22'
33
+ spec.add_development_dependency 'rspec-its', '~> 1.3'
34
+ spec.add_development_dependency 'rubocop', '~> 1.28'
34
35
  spec.add_development_dependency 'rubocop-performance', '~> 1.11'
35
36
  spec.add_development_dependency 'rubocop-rspec', '~> 2.5'
36
37
  spec.add_development_dependency 'simplecov', '=0.17'
37
- spec.add_development_dependency 'vcr'
38
- spec.add_development_dependency 'webmock'
38
+ spec.add_development_dependency 'vcr', '~> 6.1'
39
+ spec.add_development_dependency 'webmock', '~> 3.18'
40
+ spec.metadata['rubygems_mfa_required'] = 'true'
39
41
  end
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.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Kiessling
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-01-25 00:00:00.000000000 Z
11
+ date: 2023-03-24 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
@@ -56,16 +70,16 @@ dependencies:
56
70
  name: pry-byebug
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
- - - ">="
73
+ - - "~>"
60
74
  - !ruby/object:Gem::Version
61
- version: '0'
75
+ version: '3.9'
62
76
  type: :development
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
66
- - - ">="
80
+ - - "~>"
67
81
  - !ruby/object:Gem::Version
68
- version: '0'
82
+ version: '3.9'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: rspec
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -84,30 +98,30 @@ dependencies:
84
98
  name: rspec-its
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
- - - ">="
101
+ - - "~>"
88
102
  - !ruby/object:Gem::Version
89
- version: '0'
103
+ version: '1.3'
90
104
  type: :development
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
- - - ">="
108
+ - - "~>"
95
109
  - !ruby/object:Gem::Version
96
- version: '0'
110
+ version: '1.3'
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: rubocop
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
115
  - - "~>"
102
116
  - !ruby/object:Gem::Version
103
- version: '1.22'
117
+ version: '1.28'
104
118
  type: :development
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
107
121
  requirements:
108
122
  - - "~>"
109
123
  - !ruby/object:Gem::Version
110
- version: '1.22'
124
+ version: '1.28'
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: rubocop-performance
113
127
  requirement: !ruby/object:Gem::Requirement
@@ -154,30 +168,30 @@ dependencies:
154
168
  name: vcr
155
169
  requirement: !ruby/object:Gem::Requirement
156
170
  requirements:
157
- - - ">="
171
+ - - "~>"
158
172
  - !ruby/object:Gem::Version
159
- version: '0'
173
+ version: '6.1'
160
174
  type: :development
161
175
  prerelease: false
162
176
  version_requirements: !ruby/object:Gem::Requirement
163
177
  requirements:
164
- - - ">="
178
+ - - "~>"
165
179
  - !ruby/object:Gem::Version
166
- version: '0'
180
+ version: '6.1'
167
181
  - !ruby/object:Gem::Dependency
168
182
  name: webmock
169
183
  requirement: !ruby/object:Gem::Requirement
170
184
  requirements:
171
- - - ">="
185
+ - - "~>"
172
186
  - !ruby/object:Gem::Version
173
- version: '0'
187
+ version: '3.18'
174
188
  type: :development
175
189
  prerelease: false
176
190
  version_requirements: !ruby/object:Gem::Requirement
177
191
  requirements:
178
- - - ">="
192
+ - - "~>"
179
193
  - !ruby/object:Gem::Version
180
- version: '0'
194
+ version: '3.18'
181
195
  description: Gem for interfacing with psu's search-service
182
196
  email:
183
197
  - ajkiessl@gmail.com
@@ -207,16 +221,19 @@ 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
216
232
  licenses:
217
233
  - MIT
218
- metadata: {}
219
- post_install_message:
234
+ metadata:
235
+ rubygems_mfa_required: 'true'
236
+ post_install_message:
220
237
  rdoc_options: []
221
238
  require_paths:
222
239
  - lib
@@ -224,15 +241,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
224
241
  requirements:
225
242
  - - ">="
226
243
  - !ruby/object:Gem::Version
227
- version: 2.6.3
244
+ version: 3.1.3
228
245
  required_rubygems_version: !ruby/object:Gem::Requirement
229
246
  requirements:
230
247
  - - ">="
231
248
  - !ruby/object:Gem::Version
232
249
  version: '0'
233
250
  requirements: []
234
- rubygems_version: 3.0.3
235
- signing_key:
251
+ rubygems_version: 3.3.26
252
+ signing_key:
236
253
  specification_version: 4
237
254
  summary: Gem for interfacing with psu's search-service
238
255
  test_files: []