folio_client 0.15.0 → 0.16.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 +349 -13
- data/Gemfile +2 -2
- data/Gemfile.lock +27 -32
- data/README.md +3 -2
- data/Rakefile +3 -3
- data/api_test.rb +13 -12
- data/folio_client.gemspec +28 -26
- data/lib/folio_client/authenticator.rb +21 -11
- data/lib/folio_client/data_import.rb +18 -17
- data/lib/folio_client/inventory.rb +19 -20
- data/lib/folio_client/job_status.rb +19 -14
- data/lib/folio_client/organizations.rb +15 -16
- data/lib/folio_client/records_editor.rb +15 -13
- data/lib/folio_client/source_storage.rb +28 -15
- data/lib/folio_client/unexpected_response.rb +4 -0
- data/lib/folio_client/users.rb +12 -13
- data/lib/folio_client/version.rb +1 -1
- data/lib/folio_client.rb +70 -47
- metadata +37 -12
- data/.autoupdate/postupdate +0 -19
- data/.rubocop/custom.yml +0 -84
- data/.standard.yml +0 -1
data/lib/folio_client.rb
CHANGED
@@ -1,17 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
3
|
+
require 'active_support/core_ext/module/delegation'
|
4
|
+
require 'active_support/core_ext/object/blank'
|
5
|
+
require 'faraday'
|
6
|
+
require 'faraday-cookie_jar'
|
7
|
+
require 'marc'
|
8
|
+
require 'ostruct'
|
9
|
+
require 'singleton'
|
10
|
+
require 'zeitwerk'
|
10
11
|
|
11
12
|
# Load the gem's internal dependencies: use Zeitwerk instead of needing to manually require classes
|
12
13
|
Zeitwerk::Loader.for_gem.setup
|
13
14
|
|
14
15
|
# Client for interacting with the Folio API
|
16
|
+
# rubocop:disable Metrics/ClassLength
|
15
17
|
class FolioClient
|
16
18
|
include Singleton
|
17
19
|
|
@@ -40,16 +42,18 @@ class FolioClient
|
|
40
42
|
class ConflictError < Error; end
|
41
43
|
|
42
44
|
DEFAULT_HEADERS = {
|
43
|
-
accept:
|
44
|
-
content_type:
|
45
|
+
accept: 'application/json, text/plain',
|
46
|
+
content_type: 'application/json'
|
45
47
|
}.freeze
|
46
48
|
|
47
49
|
class << self
|
48
50
|
# @param url [String] the folio API URL
|
49
51
|
# @param login_params [Hash] the folio client login params (username:, password:)
|
50
52
|
# @param okapi_headers [Hash] the okapi specific headers to add (X-Okapi-Tenant:, User-Agent:)
|
53
|
+
# @param legacy_auth [Boolean] true to use legacy /login rather than Poppy /login-with-expiry endpoint
|
51
54
|
# @return [FolioClient] the configured Singleton class
|
52
|
-
def configure(url:, login_params:, okapi_headers:, timeout: default_timeout)
|
55
|
+
def configure(url:, login_params:, okapi_headers:, timeout: default_timeout, legacy_auth: true)
|
56
|
+
# rubocop:disable Style/OpenStructUse
|
53
57
|
instance.config = OpenStruct.new(
|
54
58
|
# For the initial token, use a dummy value to avoid hitting any APIs
|
55
59
|
# during configuration, allowing `with_token_refresh_when_unauthorized` to handle
|
@@ -61,23 +65,26 @@ class FolioClient
|
|
61
65
|
# NOTE: `nil` and blank string cannot be used as dummy values here as
|
62
66
|
# they lead to a malformed request to be sent, which triggers an
|
63
67
|
# exception not rescued by `with_token_refresh_when_unauthorized`
|
64
|
-
token:
|
68
|
+
token: 'a temporary dummy token to avoid hitting the API before it is needed',
|
65
69
|
url: url,
|
66
70
|
login_params: login_params,
|
67
71
|
okapi_headers: okapi_headers,
|
68
|
-
timeout: timeout
|
72
|
+
timeout: timeout,
|
73
|
+
legacy_auth: legacy_auth # default true until we have new token endpoint enabled in Poppy
|
69
74
|
)
|
75
|
+
# rubocop:enable Style/OpenStructUse
|
70
76
|
|
71
77
|
self
|
72
78
|
end
|
73
79
|
|
74
|
-
delegate :config, :connection, :data_import, :default_timeout,
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
80
|
+
delegate :config, :connection, :cookie_jar, :data_import, :default_timeout,
|
81
|
+
:edit_marc_json, :fetch_external_id, :fetch_hrid,
|
82
|
+
:fetch_instance_info, :fetch_marc_hash, :fetch_marc_xml,
|
83
|
+
:force_token_refresh!, :get, :has_instance_status?,
|
84
|
+
:http_get_headers, :http_post_and_put_headers, :interface_details,
|
85
|
+
:job_profiles, :organization_interfaces, :organizations, :users,
|
86
|
+
:user_details, :post, :put, to: :instance
|
87
|
+
end
|
81
88
|
|
82
89
|
attr_accessor :config
|
83
90
|
|
@@ -86,7 +93,7 @@ class FolioClient
|
|
86
93
|
# @param params [Hash] params to get to the API
|
87
94
|
def get(path, params = {})
|
88
95
|
response = with_token_refresh_when_unauthorized do
|
89
|
-
connection.get(path, params, {
|
96
|
+
connection.get(path, params, { 'x-okapi-token': config.token })
|
90
97
|
end
|
91
98
|
|
92
99
|
UnexpectedResponse.call(response) unless response.success?
|
@@ -100,12 +107,13 @@ class FolioClient
|
|
100
107
|
# If the body is JSON, it will be automatically serialized
|
101
108
|
# @param path [String] the path to the Folio API request
|
102
109
|
# @param body [Object] body to post to the API as JSON
|
103
|
-
|
104
|
-
|
110
|
+
# rubocop:disable Metrics/MethodLength
|
111
|
+
def post(path, body = nil, content_type: 'application/json')
|
112
|
+
req_body = content_type == 'application/json' ? body&.to_json : body
|
105
113
|
response = with_token_refresh_when_unauthorized do
|
106
114
|
req_headers = {
|
107
|
-
|
108
|
-
|
115
|
+
'x-okapi-token': config.token,
|
116
|
+
'content-type': content_type
|
109
117
|
}
|
110
118
|
connection.post(path, req_body, req_headers)
|
111
119
|
end
|
@@ -116,17 +124,19 @@ class FolioClient
|
|
116
124
|
|
117
125
|
JSON.parse(response.body)
|
118
126
|
end
|
127
|
+
# rubocop:enable Metrics/MethodLength
|
119
128
|
|
120
129
|
# Send an authenticated put request
|
121
130
|
# If the body is JSON, it will be automatically serialized
|
122
131
|
# @param path [String] the path to the Folio API request
|
123
132
|
# @param body [Object] body to put to the API as JSON
|
124
|
-
|
125
|
-
|
133
|
+
# rubocop:disable Metrics/MethodLength
|
134
|
+
def put(path, body = nil, content_type: 'application/json')
|
135
|
+
req_body = content_type == 'application/json' ? body&.to_json : body
|
126
136
|
response = with_token_refresh_when_unauthorized do
|
127
137
|
req_headers = {
|
128
|
-
|
129
|
-
|
138
|
+
'x-okapi-token': config.token,
|
139
|
+
'content-type': content_type
|
130
140
|
}
|
131
141
|
connection.put(path, req_body, req_headers)
|
132
142
|
end
|
@@ -137,14 +147,22 @@ class FolioClient
|
|
137
147
|
|
138
148
|
JSON.parse(response.body)
|
139
149
|
end
|
150
|
+
# rubocop:enable Metrics/MethodLength
|
140
151
|
|
141
152
|
# the base connection to the Folio API
|
142
153
|
def connection
|
143
154
|
@connection ||= Faraday.new(
|
144
155
|
url: config.url,
|
145
156
|
headers: DEFAULT_HEADERS.merge(config.okapi_headers || {}),
|
146
|
-
request: {timeout: config.timeout}
|
147
|
-
)
|
157
|
+
request: { timeout: config.timeout }
|
158
|
+
) do |faraday|
|
159
|
+
faraday.use :cookie_jar, jar: cookie_jar
|
160
|
+
faraday.adapter Faraday.default_adapter
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
def cookie_jar
|
165
|
+
@cookie_jar ||= HTTP::CookieJar.new
|
148
166
|
end
|
149
167
|
|
150
168
|
# Public methods available on the FolioClient below
|
@@ -152,98 +170,98 @@ class FolioClient
|
|
152
170
|
# @see Inventory#fetch_hrid
|
153
171
|
def fetch_hrid(...)
|
154
172
|
Inventory
|
155
|
-
.new
|
173
|
+
.new
|
156
174
|
.fetch_hrid(...)
|
157
175
|
end
|
158
176
|
|
159
177
|
# @see Inventory#fetch_external_id
|
160
178
|
def fetch_external_id(...)
|
161
179
|
Inventory
|
162
|
-
.new
|
180
|
+
.new
|
163
181
|
.fetch_external_id(...)
|
164
182
|
end
|
165
183
|
|
166
184
|
# @see Inventory#fetch_instance_info
|
167
185
|
def fetch_instance_info(...)
|
168
186
|
Inventory
|
169
|
-
.new
|
187
|
+
.new
|
170
188
|
.fetch_instance_info(...)
|
171
189
|
end
|
172
190
|
|
173
191
|
# @see SourceStorage#fetch_marc_hash
|
174
192
|
def fetch_marc_hash(...)
|
175
193
|
SourceStorage
|
176
|
-
.new
|
194
|
+
.new
|
177
195
|
.fetch_marc_hash(...)
|
178
196
|
end
|
179
197
|
|
180
198
|
# @see SourceStorage#fetch_marc_xml
|
181
199
|
def fetch_marc_xml(...)
|
182
200
|
SourceStorage
|
183
|
-
.new
|
201
|
+
.new
|
184
202
|
.fetch_marc_xml(...)
|
185
203
|
end
|
186
204
|
|
187
205
|
# @see Inventory#has_instance_status?
|
188
|
-
def has_instance_status?(...)
|
206
|
+
def has_instance_status?(...) # rubocop:disable Naming/PredicateName
|
189
207
|
Inventory
|
190
|
-
.new
|
208
|
+
.new
|
191
209
|
.has_instance_status?(...)
|
192
210
|
end
|
193
211
|
|
194
212
|
# @ see DataImport#import
|
195
213
|
def data_import(...)
|
196
214
|
DataImport
|
197
|
-
.new
|
215
|
+
.new
|
198
216
|
.import(...)
|
199
217
|
end
|
200
218
|
|
201
219
|
# @ see DataImport#job_profiles
|
202
220
|
def job_profiles(...)
|
203
221
|
DataImport
|
204
|
-
.new
|
222
|
+
.new
|
205
223
|
.job_profiles(...)
|
206
224
|
end
|
207
225
|
|
208
226
|
# @see RecordsEditor#edit_marc_json
|
209
227
|
def edit_marc_json(...)
|
210
228
|
RecordsEditor
|
211
|
-
.new
|
229
|
+
.new
|
212
230
|
.edit_marc_json(...)
|
213
231
|
end
|
214
232
|
|
215
233
|
# @see Organizations#fetch_list
|
216
234
|
def organizations(...)
|
217
235
|
Organizations
|
218
|
-
.new
|
236
|
+
.new
|
219
237
|
.fetch_list(...)
|
220
238
|
end
|
221
239
|
|
222
240
|
# @see Organizations#fetch_interface_list
|
223
241
|
def organization_interfaces(...)
|
224
242
|
Organizations
|
225
|
-
.new
|
243
|
+
.new
|
226
244
|
.fetch_interface_list(...)
|
227
245
|
end
|
228
246
|
|
229
247
|
# @see Organizations#fetch_interface_details
|
230
248
|
def interface_details(...)
|
231
249
|
Organizations
|
232
|
-
.new
|
250
|
+
.new
|
233
251
|
.fetch_interface_details(...)
|
234
252
|
end
|
235
253
|
|
236
254
|
# @see Users#fetch_list
|
237
255
|
def users(...)
|
238
256
|
Users
|
239
|
-
.new
|
257
|
+
.new
|
240
258
|
.fetch_list(...)
|
241
259
|
end
|
242
260
|
|
243
261
|
# @see Users#fetch_user_details
|
244
262
|
def user_details(...)
|
245
263
|
Users
|
246
|
-
.new
|
264
|
+
.new
|
247
265
|
.fetch_user_details(...)
|
248
266
|
end
|
249
267
|
|
@@ -251,6 +269,10 @@ class FolioClient
|
|
251
269
|
120
|
252
270
|
end
|
253
271
|
|
272
|
+
def force_token_refresh!
|
273
|
+
config.token = Authenticator.token
|
274
|
+
end
|
275
|
+
|
254
276
|
private
|
255
277
|
|
256
278
|
# Wraps API operations to request new access token if expired.
|
@@ -269,11 +291,12 @@ class FolioClient
|
|
269
291
|
response = yield
|
270
292
|
|
271
293
|
# if unauthorized, token has likely expired. try to get a new token and then retry the same request(s).
|
272
|
-
if response.status == 401
|
273
|
-
|
294
|
+
if response.status == 401 || response.status == 403
|
295
|
+
force_token_refresh!
|
274
296
|
response = yield
|
275
297
|
end
|
276
298
|
|
277
299
|
response
|
278
300
|
end
|
279
301
|
end
|
302
|
+
# rubocop:enable Metrics/ClassLength
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: folio_client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.16.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Mangiafico
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-01-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -30,6 +30,20 @@ dependencies:
|
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: '8'
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: dry-monads
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
type: :runtime
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
33
47
|
- !ruby/object:Gem::Dependency
|
34
48
|
name: faraday
|
35
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -45,7 +59,7 @@ dependencies:
|
|
45
59
|
- !ruby/object:Gem::Version
|
46
60
|
version: '0'
|
47
61
|
- !ruby/object:Gem::Dependency
|
48
|
-
name:
|
62
|
+
name: faraday-cookie_jar
|
49
63
|
requirement: !ruby/object:Gem::Requirement
|
50
64
|
requirements:
|
51
65
|
- - ">="
|
@@ -73,7 +87,7 @@ dependencies:
|
|
73
87
|
- !ruby/object:Gem::Version
|
74
88
|
version: '0'
|
75
89
|
- !ruby/object:Gem::Dependency
|
76
|
-
name:
|
90
|
+
name: zeitwerk
|
77
91
|
requirement: !ruby/object:Gem::Requirement
|
78
92
|
requirements:
|
79
93
|
- - ">="
|
@@ -115,7 +129,7 @@ dependencies:
|
|
115
129
|
- !ruby/object:Gem::Version
|
116
130
|
version: '3.0'
|
117
131
|
- !ruby/object:Gem::Dependency
|
118
|
-
name: rubocop
|
132
|
+
name: rubocop
|
119
133
|
requirement: !ruby/object:Gem::Requirement
|
120
134
|
requirements:
|
121
135
|
- - ">="
|
@@ -129,7 +143,7 @@ dependencies:
|
|
129
143
|
- !ruby/object:Gem::Version
|
130
144
|
version: '0'
|
131
145
|
- !ruby/object:Gem::Dependency
|
132
|
-
name:
|
146
|
+
name: rubocop-performance
|
133
147
|
requirement: !ruby/object:Gem::Requirement
|
134
148
|
requirements:
|
135
149
|
- - ">="
|
@@ -143,7 +157,21 @@ dependencies:
|
|
143
157
|
- !ruby/object:Gem::Version
|
144
158
|
version: '0'
|
145
159
|
- !ruby/object:Gem::Dependency
|
146
|
-
name:
|
160
|
+
name: rubocop-rspec
|
161
|
+
requirement: !ruby/object:Gem::Requirement
|
162
|
+
requirements:
|
163
|
+
- - ">="
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: '0'
|
166
|
+
type: :development
|
167
|
+
prerelease: false
|
168
|
+
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
requirements:
|
170
|
+
- - ">="
|
171
|
+
- !ruby/object:Gem::Version
|
172
|
+
version: '0'
|
173
|
+
- !ruby/object:Gem::Dependency
|
174
|
+
name: simplecov
|
147
175
|
requirement: !ruby/object:Gem::Requirement
|
148
176
|
requirements:
|
149
177
|
- - ">="
|
@@ -177,11 +205,8 @@ executables: []
|
|
177
205
|
extensions: []
|
178
206
|
extra_rdoc_files: []
|
179
207
|
files:
|
180
|
-
- ".autoupdate/postupdate"
|
181
208
|
- ".rspec"
|
182
209
|
- ".rubocop.yml"
|
183
|
-
- ".rubocop/custom.yml"
|
184
|
-
- ".standard.yml"
|
185
210
|
- Gemfile
|
186
211
|
- Gemfile.lock
|
187
212
|
- LICENSE
|
@@ -215,14 +240,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
215
240
|
requirements:
|
216
241
|
- - ">="
|
217
242
|
- !ruby/object:Gem::Version
|
218
|
-
version:
|
243
|
+
version: 3.0.0
|
219
244
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
220
245
|
requirements:
|
221
246
|
- - ">="
|
222
247
|
- !ruby/object:Gem::Version
|
223
248
|
version: '0'
|
224
249
|
requirements: []
|
225
|
-
rubygems_version: 3.4.
|
250
|
+
rubygems_version: 3.4.22
|
226
251
|
signing_key:
|
227
252
|
specification_version: 4
|
228
253
|
summary: Interface for interacting with the Folio ILS API.
|
data/.autoupdate/postupdate
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
#!/bin/bash --login
|
2
|
-
|
3
|
-
# This script is called by our weekly dependency update job in Jenkins after updating Ruby and other deps
|
4
|
-
|
5
|
-
# Switch to Ruby 3.1 for FolioClient (3.0 is default in Jenkinsfile)
|
6
|
-
rvm use 3.1.2@folio_client --create &&
|
7
|
-
gem install bundler &&
|
8
|
-
bundle install --gemfile Gemfile
|
9
|
-
|
10
|
-
standardrb --fix > folio_client_standard.txt
|
11
|
-
|
12
|
-
retVal=$?
|
13
|
-
|
14
|
-
git commit -am "Update to latest standard style guide"
|
15
|
-
|
16
|
-
if [ $retVal -ne 0 ]; then
|
17
|
-
echo "ERROR UPDATING RUBY TO STANDARD STYLE (folio_client)"
|
18
|
-
cat folio_client_standard.txt
|
19
|
-
fi
|
data/.rubocop/custom.yml
DELETED
@@ -1,84 +0,0 @@
|
|
1
|
-
AllCops:
|
2
|
-
TargetRubyVersion: 3.0
|
3
|
-
DisplayCopNames: true
|
4
|
-
SuggestExtensions: false
|
5
|
-
Exclude:
|
6
|
-
- bin/**
|
7
|
-
- vendor/bundle/**/*
|
8
|
-
|
9
|
-
# Per team developer playbook
|
10
|
-
RSpec/MultipleMemoizedHelpers:
|
11
|
-
Enabled: false
|
12
|
-
RSpec/MultipleExpectations:
|
13
|
-
Max: 3
|
14
|
-
RSpec/ExampleLength:
|
15
|
-
Max: 15
|
16
|
-
|
17
|
-
RSpec/BeEq: # new in 2.9.0
|
18
|
-
Enabled: true
|
19
|
-
RSpec/BeNil: # new in 2.9.0
|
20
|
-
Enabled: true
|
21
|
-
RSpec/ChangeByZero: # new in 2.11
|
22
|
-
Enabled: true
|
23
|
-
RSpec/ClassCheck: # new in 2.13
|
24
|
-
Enabled: true
|
25
|
-
RSpec/ExcessiveDocstringSpacing: # new in 2.5
|
26
|
-
Enabled: true
|
27
|
-
RSpec/IdenticalEqualityAssertion: # new in 2.4
|
28
|
-
Enabled: true
|
29
|
-
RSpec/NoExpectationExample: # new in 2.13
|
30
|
-
Enabled: true
|
31
|
-
RSpec/SortMetadata: # new in 2.14
|
32
|
-
Enabled: true
|
33
|
-
RSpec/SubjectDeclaration: # new in 2.5
|
34
|
-
Enabled: true
|
35
|
-
RSpec/VerifiedDoubleReference: # new in 2.10.0
|
36
|
-
Enabled: true
|
37
|
-
FactoryBot/ConsistentParenthesesStyle: # new in 2.14
|
38
|
-
Enabled: true
|
39
|
-
FactoryBot/SyntaxMethods: # new in 2.7
|
40
|
-
Enabled: true
|
41
|
-
RSpec/Rails/AvoidSetupHook: # new in 2.4
|
42
|
-
Enabled: true
|
43
|
-
RSpec/Rails/HaveHttpStatus: # new in 2.12
|
44
|
-
Enabled: true
|
45
|
-
RSpec/Rails/InferredSpecType: # new in 2.14
|
46
|
-
Enabled: true
|
47
|
-
Capybara/MatchStyle: # new in 2.17
|
48
|
-
Enabled: true
|
49
|
-
Capybara/NegationMatcher: # new in 2.14
|
50
|
-
Enabled: true
|
51
|
-
Capybara/SpecificActions: # new in 2.14
|
52
|
-
Enabled: true
|
53
|
-
Capybara/SpecificFinders: # new in 2.13
|
54
|
-
Enabled: true
|
55
|
-
Capybara/SpecificMatcher: # new in 2.12
|
56
|
-
Enabled: true
|
57
|
-
RSpec/DuplicatedMetadata: # new in 2.16
|
58
|
-
Enabled: true
|
59
|
-
RSpec/PendingWithoutReason: # new in 2.16
|
60
|
-
Enabled: true
|
61
|
-
FactoryBot/FactoryNameStyle: # new in 2.16
|
62
|
-
Enabled: true
|
63
|
-
RSpec/Rails/MinitestAssertions: # new in 2.17
|
64
|
-
Enabled: true
|
65
|
-
RSpec/RedundantAround: # new in 2.19
|
66
|
-
Enabled: true
|
67
|
-
RSpec/SkipBlockInsideExample: # new in 2.19
|
68
|
-
Enabled: true
|
69
|
-
RSpec/Rails/TravelAround: # new in 2.19
|
70
|
-
Enabled: true
|
71
|
-
FactoryBot/AssociationStyle: # new in 2.23
|
72
|
-
Enabled: true
|
73
|
-
FactoryBot/FactoryAssociationWithStrategy: # new in 2.23
|
74
|
-
Enabled: true
|
75
|
-
FactoryBot/RedundantFactoryOption: # new in 2.23
|
76
|
-
Enabled: true
|
77
|
-
RSpec/BeEmpty: # new in 2.20
|
78
|
-
Enabled: true
|
79
|
-
RSpec/ContainExactly: # new in 2.19
|
80
|
-
Enabled: true
|
81
|
-
RSpec/IndexedLet: # new in 2.20
|
82
|
-
Enabled: true
|
83
|
-
RSpec/MatchArray: # new in 2.19
|
84
|
-
Enabled: true
|
data/.standard.yml
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
parallel: true
|