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.
- checksums.yaml +4 -4
- data/.rubocop.yml +353 -13
- data/Gemfile +2 -2
- data/Gemfile.lock +115 -112
- data/README.md +1 -2
- data/Rakefile +3 -3
- data/lib/sul_orcid_client/cocina_support.rb +9 -5
- data/lib/sul_orcid_client/contributor_mapper.rb +28 -25
- 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 +44 -32
- data/sul_orcid_client.gemspec +32 -28
- metadata +61 -16
- 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,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 =
|
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
|
|
@@ -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/sul_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/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 =
|
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.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:
|
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:
|
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
|
@@ -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.
|
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: []
|