sul_orcid_client 0.4.1 → 0.6.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 +4 -4
- data/.rubocop.yml +353 -13
- data/Gemfile +2 -2
- data/Gemfile.lock +138 -124
- data/README.md +1 -2
- data/Rakefile +3 -3
- data/lib/sul_orcid_client/cocina_support.rb +7 -21
- data/lib/sul_orcid_client/contributor_mapper.rb +73 -28
- data/lib/sul_orcid_client/version.rb +1 -1
- data/lib/sul_orcid_client/work_mapper.rb +66 -59
- data/lib/sul_orcid_client.rb +45 -33
- data/sul_orcid_client.gemspec +32 -28
- metadata +65 -20
- data/.rubocop/custom.yml +0 -85
- data/.standard.yml +0 -1
@@ -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
|
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
|
-
|
28
|
+
'short-description': map_short_description,
|
25
29
|
citation: map_citation,
|
26
30
|
type: map_type,
|
27
|
-
|
28
|
-
|
31
|
+
'publication-date': map_publication_date,
|
32
|
+
'external-ids': map_external_ids,
|
29
33
|
url: description.purl,
|
30
34
|
contributors: map_contributors,
|
31
|
-
|
35
|
+
'language-code': 'en',
|
32
36
|
country: {
|
33
|
-
value:
|
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,
|
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 ==
|
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 ==
|
62
|
+
citation = description.note.find { |note| note.type == 'preferred citation' }&.value
|
59
63
|
return unless citation
|
60
64
|
|
61
65
|
{
|
62
|
-
|
63
|
-
|
66
|
+
'citation-type': 'formatted-unspecified',
|
67
|
+
'citation-value': citation
|
64
68
|
}
|
65
69
|
end
|
66
70
|
|
67
71
|
def map_external_ids
|
68
|
-
{
|
72
|
+
{ 'external-id':
|
69
73
|
[
|
70
|
-
map_external_id(
|
74
|
+
map_external_id('uri', description.purl, description.purl)
|
71
75
|
].tap do |ids|
|
72
|
-
ids << map_external_id(
|
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
|
-
|
79
|
-
|
80
|
-
|
82
|
+
'external-id-type': type,
|
83
|
+
'external-id-value': value,
|
84
|
+
'external-id-url': {
|
81
85
|
value: url
|
82
86
|
},
|
83
|
-
|
87
|
+
'external-id-relationship': 'self'
|
84
88
|
}
|
85
89
|
end
|
86
90
|
|
87
91
|
def map_publication_date
|
88
|
-
date = event_value(
|
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
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
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 ==
|
151
|
-
return
|
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 ==
|
159
|
-
type_term = form.structuredValue.find { |term| term.type ==
|
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
|
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.
|
168
|
-
ContributorMapper.map(contributor:
|
169
|
-
end.
|
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
|
data/lib/sul_orcid_client.rb
CHANGED
@@ -1,18 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require 'active_support'
|
4
|
+
require 'active_support/core_ext'
|
5
5
|
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
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
|
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(
|
64
|
-
|
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,26 +73,27 @@ 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 =
|
77
|
-
response_name =
|
79
|
+
search_method = 'expanded-search'
|
80
|
+
response_name = 'expanded-result'
|
78
81
|
else
|
79
|
-
search_method =
|
80
|
-
response_name =
|
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[
|
89
|
+
num_results = total_response['num-found']
|
87
90
|
|
88
91
|
return total_response if num_results <= max_num_returned
|
89
92
|
|
90
93
|
num_pages = (num_results / max_num_returned.to_f).ceil
|
91
94
|
|
92
95
|
# we already have page 1 of the results
|
93
|
-
(1..num_pages - 1).each do |page_num|
|
96
|
+
(1..num_pages - 1).each do |page_num| # rubocop:disable Lint/AmbiguousRange
|
94
97
|
response = get("/v3.0/#{search_method}/?q=#{query}&start=#{(page_num * max_num_returned) + 1}&rows=#{max_num_returned}")
|
95
98
|
total_response[response_name] += response[response_name]
|
96
99
|
end
|
@@ -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
|
-
|
109
|
-
|
111
|
+
work.to_json,
|
112
|
+
'Content-Type' => 'application/json')
|
110
113
|
|
111
114
|
case response.status
|
112
115
|
when 201
|
113
|
-
response[
|
116
|
+
response['Location'].match(%r{work/(\d+)})[1]
|
114
117
|
when 401
|
115
118
|
raise InvalidTokenError,
|
116
|
-
|
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
|
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
|
-
|
137
|
-
|
141
|
+
work.merge({ 'put-code' => put_code }).to_json,
|
142
|
+
'Content-Type' => 'application/vnd.orcid+json')
|
138
143
|
|
139
|
-
|
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:
|
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
|
-
|
188
|
-
|
189
|
-
|
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
|
-
|
202
|
-
|
203
|
-
|
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
|
-
|
215
|
-
|
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
|
data/sul_orcid_client.gemspec
CHANGED
@@ -1,24 +1,24 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
lib = File.expand_path(
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
4
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
-
require
|
5
|
+
require 'sul_orcid_client/version'
|
6
6
|
|
7
7
|
Gem::Specification.new do |spec|
|
8
|
-
spec.name =
|
8
|
+
spec.name = 'sul_orcid_client'
|
9
9
|
spec.version = SulOrcidClient::VERSION
|
10
|
-
spec.authors = [
|
11
|
-
spec.email = [
|
10
|
+
spec.authors = ['Peter Mangiafico', 'Justin Littman']
|
11
|
+
spec.email = ['pmangiafico@stanford.edu', 'jlittman@stanford.edu']
|
12
12
|
|
13
|
-
spec.summary =
|
14
|
-
spec.description =
|
15
|
-
spec.homepage =
|
16
|
-
spec.required_ruby_version =
|
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/orcid_client'
|
16
|
+
spec.required_ruby_version = '>= 3.2.0'
|
17
17
|
|
18
|
-
spec.metadata[
|
19
|
-
spec.metadata[
|
20
|
-
spec.metadata[
|
21
|
-
spec.metadata[
|
18
|
+
spec.metadata['homepage_uri'] = spec.homepage
|
19
|
+
spec.metadata['source_code_uri'] = 'https://github.com/sul-dlss/orcid_client'
|
20
|
+
spec.metadata['changelog_uri'] = 'https://github.com/sul-dlss/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 =
|
30
|
+
spec.bindir = 'exe'
|
31
31
|
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
32
|
-
spec.require_paths = [
|
32
|
+
spec.require_paths = ['lib']
|
33
33
|
|
34
|
-
spec.add_dependency
|
35
|
-
spec.add_dependency
|
36
|
-
spec.add_dependency
|
37
|
-
spec.add_dependency
|
38
|
-
spec.add_dependency
|
39
|
-
spec.add_dependency
|
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
|
42
|
-
spec.add_development_dependency
|
43
|
-
spec.add_development_dependency
|
44
|
-
spec.add_development_dependency
|
45
|
-
spec.add_development_dependency
|
46
|
-
spec.add_development_dependency
|
47
|
-
spec.add_development_dependency
|
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
|
+
version: 0.6.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:
|
11
|
+
date: 2025-07-07 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:
|
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:
|
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
|
@@ -222,14 +269,13 @@ files:
|
|
222
269
|
- lib/sul_orcid_client/version.rb
|
223
270
|
- lib/sul_orcid_client/work_mapper.rb
|
224
271
|
- sul_orcid_client.gemspec
|
225
|
-
homepage: https://github.com/sul-dlss/
|
272
|
+
homepage: https://github.com/sul-dlss/orcid_client
|
226
273
|
licenses: []
|
227
274
|
metadata:
|
228
|
-
homepage_uri: https://github.com/sul-dlss/
|
229
|
-
source_code_uri: https://github.com/sul-dlss/
|
230
|
-
changelog_uri: https://github.com/sul-dlss/
|
275
|
+
homepage_uri: https://github.com/sul-dlss/orcid_client
|
276
|
+
source_code_uri: https://github.com/sul-dlss/orcid_client
|
277
|
+
changelog_uri: https://github.com/sul-dlss/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.
|
248
|
-
signing_key:
|
293
|
+
rubygems_version: 3.6.2
|
249
294
|
specification_version: 4
|
250
295
|
summary: Interface for interacting with the ORCID API.
|
251
296
|
test_files: []
|