sdr-client 0.74.0 → 0.75.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: e961a5a661471be38fc957cb5ee14985b94d64c47d75300ebee2bec6b5d86f01
4
- data.tar.gz: 39bdac093eb599e91c402778605eb5164a9a72a289d56d31727e5edfee9569f2
3
+ metadata.gz: da8b0699691f353f0141796f1b687b167e47faf343e763b22e006afc7042d4b2
4
+ data.tar.gz: ac627e37ed720454c5569c7da728257b36988424af0c0f7acc365e63ee3e80e1
5
5
  SHA512:
6
- metadata.gz: 42a8987a6836d1fbffe02517bf08114ba44595524505ba318a3a3109be2b12bc4cbb67e482a2b67d5045763d24f3192b69726632989d22bab1a140c351d67b44
7
- data.tar.gz: 873fb15afd29b719f2f4cefe842e7109fb47f950578364a23f3772323015ed73040d1d79ab174e8ea25f7e59272a86eb3d264c26a36649c25727cee6a62f7eff
6
+ metadata.gz: 0357af1078af521bf1f3837e121dc844b1e0b1e39ec3c36678517dea2f0795da6e77f553f5e402c21c12e5c5bbe571d205643ce3fbf3e91e82dc99f9157ac7cd
7
+ data.tar.gz: 3edd8d027451deb5f90667decb7824062833c59bd35e15241238ef617082e33bee83e2a0219e4c6c2a6a000c2c09cd8bb0d5718ce1b58f37d7a22eec0167c790
data/.rubocop_todo.yml CHANGED
@@ -1,6 +1,6 @@
1
1
  # This configuration was generated by
2
2
  # `rubocop --auto-gen-config --auto-gen-only-exclude`
3
- # on 2022-03-11 00:50:54 UTC using RuboCop version 1.25.1.
3
+ # on 2022-03-23 20:29:32 UTC using RuboCop version 1.25.1.
4
4
  # The point is for the user to remove these configuration records
5
5
  # one by one as the offenses are removed from the code base.
6
6
  # Note that changes in the inspected code, or installation of new
@@ -26,21 +26,20 @@ Lint/UnusedMethodArgument:
26
26
  - 'lib/sdr_client/deposit/file_type_file_set_strategy.rb'
27
27
  - 'lib/sdr_client/deposit/image_file_set_strategy.rb'
28
28
 
29
- # Offense count: 2
29
+ # Offense count: 4
30
30
  # Configuration parameters: IgnoredMethods, CountRepeatedAttributes, Max.
31
31
  Metrics/AbcSize:
32
32
  Exclude:
33
33
  - 'lib/sdr_client/cli.rb'
34
34
  - 'lib/sdr_client/update.rb'
35
35
 
36
- # Offense count: 2
36
+ # Offense count: 1
37
37
  # Configuration parameters: IgnoredMethods, Max.
38
38
  Metrics/CyclomaticComplexity:
39
39
  Exclude:
40
- - 'lib/sdr_client/cli.rb'
41
40
  - 'lib/sdr_client/update.rb'
42
41
 
43
- # Offense count: 11
42
+ # Offense count: 12
44
43
  # Configuration parameters: CountComments, Max, CountAsOne, ExcludedMethods, IgnoredMethods.
45
44
  Metrics/MethodLength:
46
45
  Exclude:
@@ -52,7 +51,7 @@ Metrics/MethodLength:
52
51
  - 'lib/sdr_client/login.rb'
53
52
  - 'lib/sdr_client/update.rb'
54
53
 
55
- # Offense count: 10
54
+ # Offense count: 11
56
55
  # Configuration parameters: Max, CountAsOne.
57
56
  RSpec/ExampleLength:
58
57
  Exclude:
@@ -106,7 +105,7 @@ RSpec/NamedSubject:
106
105
  - 'spec/sdr_client/deposit/process_spec.rb'
107
106
  - 'spec/sdr_client/login_spec.rb'
108
107
 
109
- # Offense count: 12
108
+ # Offense count: 16
110
109
  # Configuration parameters: Max.
111
110
  RSpec/NestedGroups:
112
111
  Exclude:
@@ -114,6 +113,7 @@ RSpec/NestedGroups:
114
113
  - 'spec/sdr_client/deposit/model_process_spec.rb'
115
114
  - 'spec/sdr_client/deposit/process_spec.rb'
116
115
  - 'spec/sdr_client/login_spec.rb'
116
+ - 'spec/sdr_client/update_spec.rb'
117
117
 
118
118
  # Offense count: 19
119
119
  # Cop supports --auto-correct.
@@ -136,7 +136,7 @@ Style/StringConcatenation:
136
136
  - 'lib/sdr_client/deposit/create_resource.rb'
137
137
  - 'spec/sdr_client/deposit_spec.rb'
138
138
 
139
- # Offense count: 19
139
+ # Offense count: 26
140
140
  # Cop supports --auto-correct.
141
141
  # Configuration parameters: Max, AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
142
142
  # URISchemes: http, https
@@ -147,3 +147,4 @@ Layout/LineLength:
147
147
  - 'lib/sdr_client/update.rb'
148
148
  - 'spec/sdr_client/deposit/model_process_spec.rb'
149
149
  - 'spec/sdr_client/deposit/process_spec.rb'
150
+ - 'spec/sdr_client/update_spec.rb'
data/README.md CHANGED
@@ -79,16 +79,25 @@ Update an object:
79
79
  ```
80
80
  # Change admin policy object (APO)
81
81
  sdr update druid:bb408qn5061 --url https://sdr-api-server:3000 --admin-policy druid:bx911tp9024
82
+
82
83
  # Change collection
83
84
  sdr update druid:bb408qn5061 --url https://sdr-api-server:3000 --collection druid:pb756dt1672
85
+
84
86
  # Change copyright
85
87
  sdr update druid:bb408qn5061 --url https://sdr-api-server:3000 --copyright "Here is a new copyright statement"
88
+
86
89
  # Change use and reproduction statement
87
90
  sdr update druid:bb408qn5061 --url https://sdr-api-server:3000 --use-and-reproduction "Here are the terms of use..."
91
+
88
92
  # Change license
89
93
  sdr update druid:bb408qn5061 --url https://sdr-api-server:3000 --license "https://www.apache.org/licenses/LICENSE-2.0"
94
+
90
95
  # Change access controls
91
96
  sdr update druid:bb408qn5061 --url https://sdr-api-server:3000 --view "location-based" --download "none" --location "music" --cdl false
97
+
98
+ # Change Cocina wholesale from a file (note that you can use this flag with the
99
+ # others above, and the flags above will replace what's supplied in the cocina file)
100
+ sdr update druid:bb408qn5061 --url https://sdr-api-server:3000 --cocina-file bb408qn5061.json
92
101
  ```
93
102
 
94
103
  ## Testing
@@ -69,7 +69,8 @@ module SdrClient
69
69
  option :view, enum: %w[world stanford location-based citation-only dark], desc: 'Access view level for the object'
70
70
  option :download, enum: %w[world stanford location-based none], desc: 'Access download level for the object'
71
71
  option :location, enum: %w[spec music ars art hoover m&m], desc: 'Access location for the object'
72
- option :cdl, type: :boolean, default: false
72
+ option :cdl, type: :boolean, default: false, desc: 'Controlled digital lending'
73
+ option :cocina_file, desc: 'Path to a file containing Cocina JSON'
73
74
  def update(druid)
74
75
  validate_druid!(druid)
75
76
  job_id = SdrClient::Update.run(druid, **options)
@@ -153,7 +154,7 @@ module SdrClient
153
154
 
154
155
  def poll_for_job_complete(job_id:, url:)
155
156
  # the extra args to `say` prevent appending a newline
156
- say('SDR is processing your request', nil, false)
157
+ say('SDR is processing your request.', nil, false)
157
158
  result = nil
158
159
  (1).upto(60) do
159
160
  result = SdrClient::BackgroundJobResults.show(url: url, job_id: job_id)
@@ -163,10 +164,15 @@ module SdrClient
163
164
  say('.', nil, false)
164
165
  sleep 1
165
166
  end
167
+
166
168
  if result['status'] == 'complete'
167
- say " success! (druid: #{result.dig('output', 'druid')})"
169
+ if (errors = result.dig('output', 'errors'))
170
+ say_error " errored! #{errors}"
171
+ else
172
+ say " success! (druid: #{result.dig('output', 'druid')})"
173
+ end
168
174
  else
169
- say_error "Job #{job_id} did not complete\n#{result.inspect}"
175
+ say_error " job #{job_id} did not complete\n#{result.inspect}"
170
176
  end
171
177
  end
172
178
  end
@@ -6,10 +6,10 @@ module SdrClient
6
6
  include Dry::Monads[:result]
7
7
 
8
8
  # @param [Integer] read_timeout the value in seconds to set the read timeout
9
- def initialize(url:, token: Credentials.read, read_timeout: 360)
9
+ def initialize(url:, token: Credentials.read, read_timeout: default_timeout, timeout: default_timeout)
10
10
  @url = url
11
11
  @token = token
12
- @request_options = { read_timeout: read_timeout }
12
+ @request_options = { read_timeout: read_timeout, timeout: timeout }
13
13
  end
14
14
 
15
15
  def connection
@@ -39,5 +39,11 @@ module SdrClient
39
39
  private
40
40
 
41
41
  attr_reader :url, :token, :request_options
42
+
43
+ # NOTE: This is the number of seconds it roughly takes for H2 to
44
+ # successfully shunt ~10GB files over to SDR API
45
+ def default_timeout
46
+ 900
47
+ end
42
48
  end
43
49
  end
@@ -17,7 +17,7 @@ module SdrClient
17
17
  # @return [String] job id for the background job result
18
18
  def run
19
19
  SdrClient::Deposit::UpdateResource.run(
20
- metadata: updated_cocina_item,
20
+ metadata: updated_cocina_object,
21
21
  logger: options[:logger] || Logger.new($stdout),
22
22
  connection: SdrClient::Connection.new(url: url)
23
23
  )
@@ -27,17 +27,18 @@ module SdrClient
27
27
 
28
28
  attr_reader :druid, :logger, :options, :url
29
29
 
30
- def updated_cocina_item
31
- @updated_cocina_item ||=
32
- original_cocina_item.then { |cocina_item| update_apo(cocina_item) }
33
- .then { |cocina_item| update_collection(cocina_item) }
34
- .then { |cocina_item| update_copyright(cocina_item) }
35
- .then { |cocina_item| update_use_and_reproduction(cocina_item) }
36
- .then { |cocina_item| update_license(cocina_item) }
37
- .then { |cocina_item| update_access(cocina_item) }
30
+ def updated_cocina_object
31
+ @updated_cocina_object ||=
32
+ original_cocina_object.then { |cocina_object| update_cocina(cocina_object) }
33
+ .then { |cocina_object| update_apo(cocina_object) }
34
+ .then { |cocina_object| update_collection(cocina_object) }
35
+ .then { |cocina_object| update_copyright(cocina_object) }
36
+ .then { |cocina_object| update_use_and_reproduction(cocina_object) }
37
+ .then { |cocina_object| update_license(cocina_object) }
38
+ .then { |cocina_object| update_access(cocina_object) }
38
39
  end
39
40
 
40
- def original_cocina_item
41
+ def original_cocina_object
41
42
  Cocina::Models.build(
42
43
  JSON.parse(
43
44
  SdrClient::Find.run(druid, url: url)
@@ -45,56 +46,76 @@ module SdrClient
45
46
  )
46
47
  end
47
48
 
49
+ def cocina_hash_from_file
50
+ @cocina_hash_from_file ||= JSON.parse(File.read(options[:cocina_file]), symbolize_names: true)
51
+ end
52
+
53
+ # Update the Cocina in full
54
+ def update_cocina(cocina_object)
55
+ return cocina_object unless options[:cocina_file]
56
+
57
+ if !File.file?(options[:cocina_file]) || !File.readable?(options[:cocina_file])
58
+ raise "File not found: #{options[:cocina_file]}"
59
+ end
60
+
61
+ # NOTE: We may want to add more checks later. For now, make sure the identifiers match.
62
+ if cocina_object.externalIdentifier != cocina_hash_from_file[:externalIdentifier]
63
+ raise "Cocina in #{options[:cocina_file]} has a different external identifier than #{cocina_object.externalIdentifier}: #{cocina_hash_from_file[:externalIdentifier]}"
64
+ end
65
+
66
+ cocina_object.new(cocina_hash_from_file)
67
+ end
68
+
48
69
  # Update the APO of a Cocina item if the options specify a new one, else return the original
49
- def update_apo(cocina_item)
50
- return cocina_item unless options[:apo]
70
+ def update_apo(cocina_object)
71
+ return cocina_object unless options[:apo]
51
72
 
52
- cocina_item.new(
53
- administrative: cocina_item.administrative.new(
73
+ cocina_object.new(
74
+ administrative: cocina_object.administrative.new(
54
75
  hasAdminPolicy: options[:apo]
55
76
  )
56
77
  )
57
78
  end
58
79
 
59
80
  # Update the collection of a Cocina item if the options specify a new one, else return the original
60
- def update_collection(cocina_item)
61
- return cocina_item unless options[:collection]
81
+ def update_collection(cocina_object)
82
+ return cocina_object unless options[:collection]
62
83
 
63
- cocina_item.new(
64
- structural: cocina_item.structural.new(
84
+ cocina_object.new(
85
+ structural: cocina_object.structural.new(
65
86
  isMemberOf: Array(options[:collection])
66
87
  )
67
88
  )
68
89
  end
69
90
 
70
91
  # Update the copyright of a Cocina item if the options specify a new one, else return the original
71
- def update_copyright(cocina_item)
72
- return cocina_item unless options[:copyright]
92
+ def update_copyright(cocina_object)
93
+ return cocina_object unless options[:copyright]
73
94
 
74
- cocina_item.new(
75
- access: cocina_item.access.new(
95
+ cocina_object.new(
96
+ access: cocina_object.access.new(
76
97
  copyright: options[:copyright]
77
98
  )
78
99
  )
79
100
  end
80
101
 
81
102
  # Update the use and reproduction statement of a Cocina item if the options specify a new one, else return the original
82
- def update_use_and_reproduction(cocina_item)
83
- return cocina_item unless options[:use_and_reproduction]
103
+ def update_use_and_reproduction(cocina_object)
104
+ return cocina_object unless options[:use_and_reproduction]
84
105
 
85
- cocina_item.new(
86
- access: cocina_item.access.new(
106
+ cocina_object.new(
107
+ access: cocina_object.access.new(
87
108
  useAndReproductionStatement: options[:use_and_reproduction]
88
109
  )
89
110
  )
90
111
  end
91
112
 
92
113
  # Update the license of a Cocina item if the options specify a new one, else return the original
93
- def update_license(cocina_item)
94
- return cocina_item unless options[:license]
114
+ def update_license(cocina_object)
115
+ return cocina_object unless options[:license]
95
116
 
96
- cocina_item.new(
97
- access: cocina_item.access.new(
117
+ cocina_object.new(
118
+ access: cocina_object.access.new(
98
119
  license: options[:license]
99
120
  )
100
121
  )
@@ -102,18 +123,18 @@ module SdrClient
102
123
 
103
124
  # rubocop:disable Style/DoubleNegation
104
125
  # Update the access of a Cocina item if the options specify a new one, else return the original
105
- def update_access(cocina_item)
106
- return cocina_item unless options[:view] || options[:download] || options[:location] || options[:cdl]
126
+ def update_access(cocina_object)
127
+ return cocina_object unless options[:view] || options[:download] || options[:location] || options[:cdl]
107
128
 
108
- cocina_item.new(
109
- access: cocina_item.access.new(
129
+ cocina_object.new(
130
+ access: cocina_object.access.new(
110
131
  view: options[:view],
111
132
  download: options[:download],
112
133
  location: options[:location],
113
134
  controlledDigitalLending: !!options[:cdl]
114
135
  ),
115
- structural: cocina_item.structural.new(
116
- contains: cocina_item.structural.contains.map do |file_set|
136
+ structural: cocina_object.structural.new(
137
+ contains: cocina_object.structural.contains.map do |file_set|
117
138
  file_set.new(
118
139
  structural: file_set.structural.new(
119
140
  contains: file_set.structural.contains.map do |file|
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SdrClient
4
- VERSION = '0.74.0'
4
+ VERSION = '0.75.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sdr-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.74.0
4
+ version: 0.75.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Coyne
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-03-25 00:00:00.000000000 Z
11
+ date: 2022-03-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport