sul_orcid_client 0.4.1 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,14 +1,18 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class SulOrcidClient
2
4
  # Maps a Cocina Description to an Orcid Work.
3
5
 
4
6
  # Note that this mapping is currently based on a description generated
5
7
  # from an H2 work. However, it could be extended to more completely map descriptions.
8
+ # rubocop:disable Metrics/ClassLength
9
+ # rubocop:disable Metrics/MethodLength
6
10
  class WorkMapper
7
11
  # Error raised by WorkMapper
8
12
  class WorkMapperError < StandardError; end
9
13
 
10
14
  def self.map(description:, doi: nil)
11
- new(description: description, doi: doi).map
15
+ new(description:, doi:).map
12
16
  end
13
17
 
14
18
  # @param [Cocina::Models::Description] description to map
@@ -21,16 +25,16 @@ class SulOrcidClient
21
25
  def map
22
26
  {
23
27
  title: map_title,
24
- "short-description": map_short_description,
28
+ 'short-description': map_short_description,
25
29
  citation: map_citation,
26
30
  type: map_type,
27
- "publication-date": map_publication_date,
28
- "external-ids": map_external_ids,
31
+ 'publication-date': map_publication_date,
32
+ 'external-ids': map_external_ids,
29
33
  url: description.purl,
30
34
  contributors: map_contributors,
31
- "language-code": "en",
35
+ 'language-code': 'en',
32
36
  country: {
33
- value: "US"
37
+ value: 'US'
34
38
  }
35
39
  }.compact
36
40
  end
@@ -41,7 +45,7 @@ class SulOrcidClient
41
45
 
42
46
  def map_title
43
47
  title = description.title.first&.value
44
- raise WorkMapperError, "Title not mapped" unless title
48
+ raise WorkMapperError, 'Title not mapped' unless title
45
49
 
46
50
  {
47
51
  title: {
@@ -51,41 +55,41 @@ class SulOrcidClient
51
55
  end
52
56
 
53
57
  def map_short_description
54
- description.note.find { |note| note.type == "abstract" }&.value
58
+ description.note.find { |note| note.type == 'abstract' }&.value
55
59
  end
56
60
 
57
61
  def map_citation
58
- citation = description.note.find { |note| note.type == "preferred citation" }&.value
62
+ citation = description.note.find { |note| note.type == 'preferred citation' }&.value
59
63
  return unless citation
60
64
 
61
65
  {
62
- "citation-type": "formatted-unspecified",
63
- "citation-value": citation
66
+ 'citation-type': 'formatted-unspecified',
67
+ 'citation-value': citation
64
68
  }
65
69
  end
66
70
 
67
71
  def map_external_ids
68
- {"external-id":
72
+ { 'external-id':
69
73
  [
70
- map_external_id("uri", description.purl, description.purl)
74
+ map_external_id('uri', description.purl, description.purl)
71
75
  ].tap do |ids|
72
- ids << map_external_id("doi", doi, "https://doi.org/#{doi}") if doi
73
- end}
76
+ ids << map_external_id('doi', doi, "https://doi.org/#{doi}") if doi
77
+ end }
74
78
  end
75
79
 
76
80
  def map_external_id(type, value, url)
77
81
  {
78
- "external-id-type": type,
79
- "external-id-value": value,
80
- "external-id-url": {
82
+ 'external-id-type': type,
83
+ 'external-id-value': value,
84
+ 'external-id-url': {
81
85
  value: url
82
86
  },
83
- "external-id-relationship": "self"
87
+ 'external-id-relationship': 'self'
84
88
  }
85
89
  end
86
90
 
87
91
  def map_publication_date
88
- date = event_value("publication") || event_value("deposit")
92
+ date = event_value('publication') || event_value('deposit')
89
93
  return unless date
90
94
 
91
95
  year, month, day = parse_date(date)
@@ -96,8 +100,8 @@ class SulOrcidClient
96
100
  value: year
97
101
  }
98
102
  }.tap do |publication_date|
99
- publication_date[:month] = {value: month} if month
100
- publication_date[:day] = {value: day} if month && day
103
+ publication_date[:month] = { value: month } if month
104
+ publication_date[:day] = { value: day } if month && day
101
105
  end
102
106
  end
103
107
 
@@ -113,64 +117,67 @@ class SulOrcidClient
113
117
  end
114
118
 
115
119
  H2_TERM_MAP = {
116
- "Data" => "data-set",
117
- "Software/Code" => "software",
118
- "Article" => "journal-article",
119
- "Book" => "book",
120
- "Book chapter" => "book-chapter",
121
- "Code" => "software",
122
- "Conference session" => "lecture-speech",
123
- "Course/instructional materials" => "manual",
124
- "Database" => "data-set",
125
- "Dramatic performance" => "artistic-performance",
126
- "Geospatial data" => "data-set",
127
- "Journal/periodical issue" => "journal-issue",
128
- "Performance" => "artistic-performance",
129
- "Poetry reading" => "artistic-performance",
130
- "Poster" => "conference-poster",
131
- "Preprint" => "preprint",
132
- "Presentation recording" => "lecture-speech",
133
- "Questionnaire" => "research-technique",
134
- "Report" => "report",
135
- "Software" => "software",
136
- "Speech" => "lecture-speech",
137
- "Statistical model" => "research-technique",
138
- "Syllabus" => "manual",
139
- "Tabular data" => "data-set",
140
- "Technical report" => "report",
141
- "Text corpus" => "data-set",
142
- "Thesis" => "dissertation-thesis",
143
- "Working paper" => "working-paper"
144
- }
120
+ 'Data' => 'data-set',
121
+ 'Software/Code' => 'software',
122
+ 'Article' => 'journal-article',
123
+ 'Book' => 'book',
124
+ 'Book chapter' => 'book-chapter',
125
+ 'Code' => 'software',
126
+ 'Conference session' => 'lecture-speech',
127
+ 'Course/instructional materials' => 'manual',
128
+ 'Database' => 'data-set',
129
+ 'Dramatic performance' => 'artistic-performance',
130
+ 'Geospatial data' => 'data-set',
131
+ 'Journal/periodical issue' => 'journal-issue',
132
+ 'Performance' => 'artistic-performance',
133
+ 'Poetry reading' => 'artistic-performance',
134
+ 'Poster' => 'conference-poster',
135
+ 'Preprint' => 'preprint',
136
+ 'Presentation recording' => 'lecture-speech',
137
+ 'Questionnaire' => 'research-technique',
138
+ 'Report' => 'report',
139
+ 'Software' => 'software',
140
+ 'Speech' => 'lecture-speech',
141
+ 'Statistical model' => 'research-technique',
142
+ 'Syllabus' => 'manual',
143
+ 'Tabular data' => 'data-set',
144
+ 'Technical report' => 'report',
145
+ 'Text corpus' => 'data-set',
146
+ 'Thesis' => 'dissertation-thesis',
147
+ 'Working paper' => 'working-paper'
148
+ }.freeze
145
149
 
146
150
  def map_type
147
151
  # See https://info.orcid.org/ufaqs/what-work-types-does-orcid-support/
148
152
  # For now, only mapping H2 terms; if there is not an H2 term, using "other".
149
153
 
150
- h2_form = description.form.find { |form| form.source&.value == "Stanford self-deposit resource types" }
151
- return "other" unless h2_form
154
+ h2_form = description.form.find { |form| form.source&.value == 'Stanford self-deposit resource types' }
155
+ return 'other' unless h2_form
152
156
 
153
157
  map_h2_resource_types(h2_form)
154
158
  end
155
159
 
156
160
  def map_h2_resource_types(form)
157
161
  # Try to match subtypes first, then type
158
- subtype_terms = form.structuredValue.select { |term| term.type == "subtype" }.map(&:value)
159
- type_term = form.structuredValue.find { |term| term.type == "type" }&.value
162
+ subtype_terms = form.structuredValue.select { |term| term.type == 'subtype' }.map(&:value)
163
+ type_term = form.structuredValue.find { |term| term.type == 'type' }&.value
160
164
  matching_term = (subtype_terms + [type_term]).find { |term| H2_TERM_MAP.key?(term) }
161
- return "other" unless matching_term
165
+ return 'other' unless matching_term
162
166
 
163
167
  H2_TERM_MAP[matching_term]
164
168
  end
165
169
 
166
170
  def map_contributors
167
- contributors = description.contributor.map do |contributor|
168
- ContributorMapper.map(contributor: contributor)
169
- end.compact.presence
171
+ contributors = description.contributor.filter_map do |contributor|
172
+ ContributorMapper.map(contributor:)
173
+ end.presence
170
174
  return unless contributors
175
+
171
176
  {
172
177
  contributor: contributors
173
178
  }
174
179
  end
175
180
  end
181
+ # rubocop:enable Metrics/ClassLength
182
+ # rubocop:enable Metrics/MethodLength
176
183
  end
@@ -1,18 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "active_support"
4
- require "active_support/core_ext"
3
+ require 'active_support'
4
+ require 'active_support/core_ext'
5
5
 
6
- require "faraday"
7
- require "faraday/retry"
8
- require "oauth2"
9
- require "singleton"
10
- require "zeitwerk"
6
+ require 'faraday'
7
+ require 'faraday/retry'
8
+ require 'oauth2'
9
+ require 'singleton'
10
+ require 'zeitwerk'
11
11
 
12
12
  # Load the gem's internal dependencies: use Zeitwerk instead of needing to manually require classes
13
13
  Zeitwerk::Loader.for_gem.setup
14
14
 
15
15
  # Client for interacting with ORCID API
16
+ # rubocop:disable Metrics/ClassLength
16
17
  class SulOrcidClient
17
18
  include Singleton
18
19
 
@@ -52,16 +53,17 @@ class SulOrcidClient
52
53
  end
53
54
 
54
55
  # Fetches the name for a user given an orcidid
56
+ # rubocop:disable Metrics/MethodLength
55
57
  def fetch_name(orcidid:)
56
58
  match = /[0-9xX]{4}-[0-9xX]{4}-[0-9xX]{4}-[0-9xX]{4}/.match(orcidid)
57
- raise "invalid orcidid provided" unless match
59
+ raise 'invalid orcidid provided' unless match
58
60
 
59
61
  response = public_conn.get("/v3.0/#{match[0]&.upcase}/personal-details")
60
62
  case response.status
61
63
  when 200
62
64
  resp_json = JSON.parse(response.body)
63
- [resp_json.dig("name", "given-names", "value"),
64
- resp_json.dig("name", "family-name", "value")]
65
+ [resp_json.dig('name', 'given-names', 'value'),
66
+ resp_json.dig('name', 'family-name', 'value')]
65
67
  else
66
68
  raise "ORCID.org API returned #{response.status} (#{response.body}) for: #{orcidid}"
67
69
  end
@@ -71,19 +73,20 @@ class SulOrcidClient
71
73
  # see https://info.orcid.org/documentation/api-tutorials/api-tutorial-searching-the-orcid-registry
72
74
  # @param [query] query to pass to ORCID
73
75
  # @param [expanded] set to true or false (defaults to false) to indicate an expanded query results (see ORCID docs)
76
+ # rubocop:disable Metrics/AbcSize
74
77
  def search(query:, expanded: false)
75
78
  if expanded
76
- search_method = "expanded-search"
77
- response_name = "expanded-result"
79
+ search_method = 'expanded-search'
80
+ response_name = 'expanded-result'
78
81
  else
79
- search_method = "search"
80
- response_name = "result"
82
+ search_method = 'search'
83
+ response_name = 'result'
81
84
  end
82
85
 
83
86
  # this is the maximum number of rows ORCID allows in their response currently
84
87
  max_num_returned = 1000
85
88
  total_response = get("/v3.0/#{search_method}/?q=#{query}&rows=#{max_num_returned}")
86
- num_results = total_response["num-found"]
89
+ num_results = total_response['num-found']
87
90
 
88
91
  return total_response if num_results <= max_num_returned
89
92
 
@@ -105,24 +108,26 @@ class SulOrcidClient
105
108
  # @return [string] put-code
106
109
  def add_work(orcidid:, work:, token:)
107
110
  response = conn_with_token(token).post("/v3.0/#{base_orcidid(orcidid)}/work",
108
- work.to_json,
109
- "Content-Type" => "application/json")
111
+ work.to_json,
112
+ 'Content-Type' => 'application/json')
110
113
 
111
114
  case response.status
112
115
  when 201
113
- response["Location"].match(%r{work/(\d+)})[1]
116
+ response['Location'].match(%r{work/(\d+)})[1]
114
117
  when 401
115
118
  raise InvalidTokenError,
116
- "Invalid token for #{orcidid} - ORCID.org API returned #{response.status} (#{response.body})"
119
+ "Invalid token for #{orcidid} - ORCID.org API returned #{response.status} (#{response.body})"
117
120
  when 409
118
121
  match = response.body.match(/put-code (\d+)\./)
119
- raise "ORCID.org API returned a 409, but could not find put-code" unless match
122
+ raise 'ORCID.org API returned a 409, but could not find put-code' unless match
120
123
 
121
124
  match[1]
122
125
  else
123
126
  raise "ORCID.org API returned #{response.status} (#{response.body}) for: #{work.to_json}"
124
127
  end
125
128
  end
129
+ # rubocop:enable Metrics/MethodLength
130
+ # rubocop:enable Metrics/AbcSize
126
131
 
127
132
  # Update an existing work for a researcher.
128
133
  # @param [String] orcidid an ORCiD ID for the researcher
@@ -133,12 +138,16 @@ class SulOrcidClient
133
138
  # @raise [RuntimeError] if the API response status is not successful
134
139
  def update_work(orcidid:, work:, token:, put_code:)
135
140
  response = conn_with_token(token).put("/v3.0/#{base_orcidid(orcidid)}/work/#{put_code}",
136
- work.merge({"put-code" => put_code}).to_json,
137
- "Content-Type" => "application/vnd.orcid+json")
141
+ work.merge({ 'put-code' => put_code }).to_json,
142
+ 'Content-Type' => 'application/vnd.orcid+json')
138
143
 
139
- raise "ORCID.org API returned #{response.status} when updating #{put_code} for #{orcidid}. The author may have previously deleted this work from their ORCID profile." if response.status == 404
144
+ if response.status == 404
145
+ raise "ORCID.org API returned #{response.status} when updating #{put_code} for #{orcidid}. The author may have previously deleted " \
146
+ 'this work from their ORCID profile.'
147
+ end
140
148
 
141
149
  raise "ORCID.org API returned #{response.status} when updating #{put_code} for #{orcidid}" unless response.status == 200
150
+
142
151
  true
143
152
  end
144
153
 
@@ -171,7 +180,7 @@ class SulOrcidClient
171
180
 
172
181
  def client_token
173
182
  client = OAuth2::Client.new(client_id, client_secret, site: base_auth_url)
174
- token = client.client_credentials.get_token({scope: "/read-public"})
183
+ token = client.client_credentials.get_token({ scope: '/read-public' })
175
184
  token.token
176
185
  end
177
186
 
@@ -184,9 +193,9 @@ class SulOrcidClient
184
193
  def public_conn
185
194
  conn = Faraday.new(url: base_public_url) do |faraday|
186
195
  faraday.request :retry, max: 5,
187
- interval: 0.5,
188
- interval_randomness: 0.5,
189
- backoff_factor: 2
196
+ interval: 0.5,
197
+ interval_randomness: 0.5,
198
+ backoff_factor: 2
190
199
  end
191
200
  conn.options.timeout = 500
192
201
  conn.options.open_timeout = 10
@@ -195,12 +204,13 @@ class SulOrcidClient
195
204
  end
196
205
 
197
206
  # @return [Faraday::Connection]
207
+ # rubocop:disable Metrics/MethodLength
198
208
  def conn_with_token(token)
199
209
  conn = Faraday.new(url: base_url) do |faraday|
200
210
  faraday.request :retry, max: 3,
201
- interval: 0.5,
202
- interval_randomness: 0.5,
203
- backoff_factor: 2
211
+ interval: 0.5,
212
+ interval_randomness: 0.5,
213
+ backoff_factor: 2
204
214
  end
205
215
  conn.options.timeout = 500
206
216
  conn.options.open_timeout = 10
@@ -208,11 +218,12 @@ class SulOrcidClient
208
218
  conn.headers[:authorization] = "Bearer #{token}"
209
219
  conn
210
220
  end
221
+ # rubocop:enable Metrics/MethodLength
211
222
 
212
223
  def headers
213
224
  {
214
- "Accept" => "application/json",
215
- "User-Agent" => "stanford-library-sul-pub"
225
+ 'Accept' => 'application/json',
226
+ 'User-Agent' => 'stanford-library-sul-pub'
216
227
  }
217
228
  end
218
229
 
@@ -224,3 +235,4 @@ class SulOrcidClient
224
235
  orcidid[-19, 19]
225
236
  end
226
237
  end
238
+ # rubocop:enable Metrics/ClassLength
@@ -1,24 +1,24 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- lib = File.expand_path("lib", __dir__)
3
+ lib = File.expand_path('lib', __dir__)
4
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
- require "sul_orcid_client/version"
5
+ require 'sul_orcid_client/version'
6
6
 
7
7
  Gem::Specification.new do |spec|
8
- spec.name = "sul_orcid_client"
8
+ spec.name = 'sul_orcid_client'
9
9
  spec.version = SulOrcidClient::VERSION
10
- spec.authors = ["Peter Mangiafico", "Justin Littman"]
11
- spec.email = ["pmangiafico@stanford.edu", "jlittman@stanford.edu"]
10
+ spec.authors = ['Peter Mangiafico', 'Justin Littman']
11
+ spec.email = ['pmangiafico@stanford.edu', 'jlittman@stanford.edu']
12
12
 
13
- spec.summary = "Interface for interacting with the ORCID API."
14
- spec.description = "This provides API interaction with the ORCID API"
15
- spec.homepage = "https://github.com/sul-dlss/sul_orcid_client"
16
- spec.required_ruby_version = ">= 3.2.0"
13
+ spec.summary = 'Interface for interacting with the ORCID API.'
14
+ spec.description = 'This provides API interaction with the ORCID API'
15
+ spec.homepage = 'https://github.com/sul-dlss/sul_orcid_client'
16
+ spec.required_ruby_version = '>= 3.2.0'
17
17
 
18
- spec.metadata["homepage_uri"] = spec.homepage
19
- spec.metadata["source_code_uri"] = "https://github.com/sul-dlss/sul_orcid_client"
20
- spec.metadata["changelog_uri"] = "https://github.com/sul-dlss/sul_orcid_client/releases"
21
- spec.metadata["rubygems_mfa_required"] = "true"
18
+ spec.metadata['homepage_uri'] = spec.homepage
19
+ spec.metadata['source_code_uri'] = 'https://github.com/sul-dlss/sul_orcid_client'
20
+ spec.metadata['changelog_uri'] = 'https://github.com/sul-dlss/sul_orcid_client/releases'
21
+ spec.metadata['rubygems_mfa_required'] = 'true'
22
22
 
23
23
  # Specify which files should be added to the gem when it is released.
24
24
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
@@ -27,22 +27,26 @@ Gem::Specification.new do |spec|
27
27
  (f == __FILE__) || f.match(%r{\A(?:(?:bin|test|spec|features)/|\.(?:git|travis|circleci)|appveyor)})
28
28
  end
29
29
  end
30
- spec.bindir = "exe"
30
+ spec.bindir = 'exe'
31
31
  spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
32
- spec.require_paths = ["lib"]
32
+ spec.require_paths = ['lib']
33
33
 
34
- spec.add_dependency "activesupport", ">= 4.2", "< 8"
35
- spec.add_dependency "cocina-models", "~> 0.90"
36
- spec.add_dependency "faraday"
37
- spec.add_dependency "faraday-retry"
38
- spec.add_dependency "oauth2"
39
- spec.add_dependency "zeitwerk"
34
+ spec.add_dependency 'activesupport', '>= 4.2'
35
+ spec.add_dependency 'cocina-models', '~> 0.90'
36
+ spec.add_dependency 'faraday'
37
+ spec.add_dependency 'faraday-retry'
38
+ spec.add_dependency 'oauth2'
39
+ spec.add_dependency 'zeitwerk'
40
40
 
41
- spec.add_development_dependency "rake", "~> 13.0"
42
- spec.add_development_dependency "rspec", "~> 3.0"
43
- spec.add_development_dependency "rubocop-rspec"
44
- spec.add_development_dependency "simplecov"
45
- spec.add_development_dependency "standard"
46
- spec.add_development_dependency "vcr"
47
- spec.add_development_dependency "webmock"
41
+ spec.add_development_dependency 'rake', '~> 13.0'
42
+ spec.add_development_dependency 'rspec', '~> 3.0'
43
+ spec.add_development_dependency 'rubocop'
44
+ spec.add_development_dependency 'rubocop-capybara'
45
+ spec.add_development_dependency 'rubocop-factory_bot'
46
+ spec.add_development_dependency 'rubocop-performance'
47
+ spec.add_development_dependency 'rubocop-rspec'
48
+ spec.add_development_dependency 'rubocop-rspec_rails'
49
+ spec.add_development_dependency 'simplecov'
50
+ spec.add_development_dependency 'vcr'
51
+ spec.add_development_dependency 'webmock'
48
52
  end
metadata CHANGED
@@ -1,15 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sul_orcid_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Mangiafico
8
8
  - Justin Littman
9
- autorequire:
10
9
  bindir: exe
11
10
  cert_chain: []
12
- date: 2023-11-20 00:00:00.000000000 Z
11
+ date: 2025-02-18 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: activesupport
@@ -18,9 +17,6 @@ dependencies:
18
17
  - - ">="
19
18
  - !ruby/object:Gem::Version
20
19
  version: '4.2'
21
- - - "<"
22
- - !ruby/object:Gem::Version
23
- version: '8'
24
20
  type: :runtime
25
21
  prerelease: false
26
22
  version_requirements: !ruby/object:Gem::Requirement
@@ -28,9 +24,6 @@ dependencies:
28
24
  - - ">="
29
25
  - !ruby/object:Gem::Version
30
26
  version: '4.2'
31
- - - "<"
32
- - !ruby/object:Gem::Version
33
- version: '8'
34
27
  - !ruby/object:Gem::Dependency
35
28
  name: cocina-models
36
29
  requirement: !ruby/object:Gem::Requirement
@@ -129,6 +122,62 @@ dependencies:
129
122
  - - "~>"
130
123
  - !ruby/object:Gem::Version
131
124
  version: '3.0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rubocop
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rubocop-capybara
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: rubocop-factory_bot
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: rubocop-performance
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
132
181
  - !ruby/object:Gem::Dependency
133
182
  name: rubocop-rspec
134
183
  requirement: !ruby/object:Gem::Requirement
@@ -144,7 +193,7 @@ dependencies:
144
193
  - !ruby/object:Gem::Version
145
194
  version: '0'
146
195
  - !ruby/object:Gem::Dependency
147
- name: simplecov
196
+ name: rubocop-rspec_rails
148
197
  requirement: !ruby/object:Gem::Requirement
149
198
  requirements:
150
199
  - - ">="
@@ -158,7 +207,7 @@ dependencies:
158
207
  - !ruby/object:Gem::Version
159
208
  version: '0'
160
209
  - !ruby/object:Gem::Dependency
161
- name: standard
210
+ name: simplecov
162
211
  requirement: !ruby/object:Gem::Requirement
163
212
  requirements:
164
213
  - - ">="
@@ -209,8 +258,6 @@ extra_rdoc_files: []
209
258
  files:
210
259
  - ".rspec"
211
260
  - ".rubocop.yml"
212
- - ".rubocop/custom.yml"
213
- - ".standard.yml"
214
261
  - Gemfile
215
262
  - Gemfile.lock
216
263
  - LICENSE
@@ -229,7 +276,6 @@ metadata:
229
276
  source_code_uri: https://github.com/sul-dlss/sul_orcid_client
230
277
  changelog_uri: https://github.com/sul-dlss/sul_orcid_client/releases
231
278
  rubygems_mfa_required: 'true'
232
- post_install_message:
233
279
  rdoc_options: []
234
280
  require_paths:
235
281
  - lib
@@ -244,8 +290,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
244
290
  - !ruby/object:Gem::Version
245
291
  version: '0'
246
292
  requirements: []
247
- rubygems_version: 3.4.21
248
- signing_key:
293
+ rubygems_version: 3.6.3
249
294
  specification_version: 4
250
295
  summary: Interface for interacting with the ORCID API.
251
296
  test_files: []