uc3-dmp-id 0.1.0 → 0.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1bdcb2754d5168bdeedf8583b91054cf62fc019d4479686da168d4ca70d83729
4
- data.tar.gz: b2af99461aa7614212aae435db0db174eeb50125006d0dacc87698ecaf41b7b8
3
+ metadata.gz: 2d78c65551789e0b3e96488bb2c3689999a301c76a8434f945f7b855dd62d57d
4
+ data.tar.gz: 73fe134b92ebe24bf9595610f3ef9e7f8dc744a3494152d9e7a6e7e73675b075
5
5
  SHA512:
6
- metadata.gz: 43cdce10f8bccc41fc979c67a4758fd5726206c9066acefcbc8abe65b9d36f79fc69eedb461a9ce584cf61f85ddd0dca13617d99a39e9c831eb56ea725a00eb0
7
- data.tar.gz: 393d0e083ca8cfbf2039ba11861576a2eff489d48d8c541279ae30a3f9e7215d39175c49d1203456f56bb00a6a7e3da6c0211d4c3fc7e4f64f32f88e3d96accf
6
+ metadata.gz: 9fb32754f0e36c6292860e35327a9af48b566bae061eb0d08a8e4f94b9976144acae3b948837f7b1835e918d20d06971085091db81d5483ba494c51fd5279d68
7
+ data.tar.gz: 889bd0b3cbe91b95a534930b267625b38fe988381cf7b76e6fd73e53d4d73796b5abe3af8bd81ae322b1c7f1e17c9b9f3ea0f59ba00f3b9deeaecb3a15a131ed
data/README.md CHANGED
@@ -1,3 +1,12 @@
1
1
  # Uc3DmpId
2
2
 
3
3
  Helper methods for working with DMP ID JSON records
4
+
5
+ After you have made changes, be sure to increment the version number in `lib/uc3-dmp-id/version.rb`.
6
+
7
+ To build and push this gem to RubyGems:
8
+ - Make sure you are logged into RubyGems in your terminal window (see their docs)
9
+ - Run `gem build uc3-dmp-id.gemspec` to build the gem
10
+ - Run `gem push uc3-dmp-id-[version].gem` to publish to RubyGems
11
+
12
+ After you have pushed a new version to RubyGems, you should rebuild and redeploy the AWS SAM application.
@@ -28,13 +28,13 @@ module Uc3DmpId
28
28
  related_works = modified_version.fetch('dmproadmap_related_identifiers', [])
29
29
 
30
30
  if related_works.any?
31
- latest_version = _add_related_identifier(updater: updater, latest_version: latest_version,
32
- identifiers: related_works, note: note, logger: logger)
31
+ latest_version = _add_related_identifier(updater:, latest_version:,
32
+ identifiers: related_works, note:, logger:)
33
33
  end
34
34
  return latest_version unless !funding.nil? && funding.any?
35
35
 
36
- _add_funding_mod(updater: updater, latest_version: latest_version, funding: funding,
37
- note: note, logger: logger)
36
+ _add_funding_mod(updater:, latest_version:, funding:,
37
+ note:, logger:)
38
38
  end
39
39
  # rubocop:enable Metrics/AbcSize, Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity
40
40
 
@@ -106,7 +106,7 @@ module Uc3DmpId
106
106
  end
107
107
 
108
108
  latest_version['dmproadmap_related_identifiers'] = [] if latest_version['dmproadmap_related_identifiers'].nil?
109
- assertion = _generate_assertion(updater: updater, note: note,
109
+ assertion = _generate_assertion(updater:, note:,
110
110
  mods: JSON.parse({ dmproadmap_related_identifiers: additions }.to_json))
111
111
  if logger.respond_to?(:debug)
112
112
  logger.debug(message: 'Adding change to :dmphub_modifications.',
@@ -151,7 +151,7 @@ module Uc3DmpId
151
151
  latest_version['dmphub_modifications'] = [] if latest_version['dmphub_modifications'].nil?
152
152
  mod = JSON.parse({ funding: fund }.to_json)
153
153
  mod['funding']['funding_status'] = 'granted'
154
- assertion = _generate_assertion(updater: updater, mods: mod, note: note)
154
+ assertion = _generate_assertion(updater:, mods: mod, note:)
155
155
  if logger.respond_to?(:debug)
156
156
  logger.debug(message: 'Adding change to :dmphub_modifications.',
157
157
  details: assertion)
@@ -200,7 +200,7 @@ module Uc3DmpId
200
200
  provenance: updater.gsub('PROVENANCE#', ''),
201
201
  timestamp: Time.now.utc.iso8601,
202
202
  status: 'pending',
203
- note: note
203
+ note:
204
204
  }
205
205
  mods.each_pair { |key, val| assertion[key] = val }
206
206
  JSON.parse(assertion.to_json)
@@ -23,23 +23,23 @@ module Uc3DmpId
23
23
  raise CreatorError, Helper::MSG_DMP_FORBIDDEN unless provenance.is_a?(Hash) && !provenance['PK'].nil?
24
24
 
25
25
  # Validate the incoming JSON first
26
- json = Helper.parse_json(json: json)
27
- errs = Validator.validate(mode: 'author', json: json)
26
+ json = Helper.parse_json(json:)
27
+ errs = Validator.validate(mode: 'author', json:)
28
28
  raise CreatorError, errs.join(', ') if errs.is_a?(Array) && errs.any? && errs.first != Validator::MSG_VALID_JSON
29
29
 
30
30
  # Try to find it by the :dmp_id first and Fail if found
31
31
  dmp_id = Helper.dmp_id_to_pk(json: json.fetch('dmp', {})['dmp_id'])
32
- result = Finder.exists?(p_key: dmp_id, logger: logger) unless dmp_id.nil?
32
+ result = Finder.exists?(p_key: dmp_id, logger:) unless dmp_id.nil?
33
33
  raise CreatorError, Helper::MSG_DMP_EXISTS if result.is_a?(Hash)
34
34
 
35
35
  # raise CreatorError, Uc3DmpId::MSG_DMP_EXISTS unless json['PK'].nil?
36
36
 
37
37
  client = Uc3DmpDynamo::Client.new
38
- p_key = _preregister_dmp_id(client: client, provenance: provenance, json: json, logger: logger)
38
+ p_key = _preregister_dmp_id(client:, provenance:, json:, logger:)
39
39
  raise CreatorError, MSG_UNABLE_TO_MINT if p_key.nil?
40
40
 
41
41
  # Add the DMPHub specific attributes and then save
42
- annotated = Helper.annotate_dmp_json(provenance: provenance, p_key: p_key, json: json['dmp'])
42
+ annotated = Helper.annotate_dmp_json(provenance:, p_key:, json: json['dmp'])
43
43
  logger.info(message: "Creating DMP ID: #{p_key}") if logger.respond_to?(:debug)
44
44
 
45
45
  # Set the :created and :modified timestamps
@@ -48,10 +48,10 @@ module Uc3DmpId
48
48
  annotated['modified'] = now
49
49
 
50
50
  # Create the item
51
- resp = client.put_item(json: annotated, logger: logger)
51
+ resp = client.put_item(json: annotated, logger:)
52
52
  raise CreatorError, Helper::MSG_DMP_NO_DMP_ID if resp.nil?
53
53
 
54
- _post_process(json: annotated, logger: logger)
54
+ _post_process(json: annotated, logger:)
55
55
  Helper.cleanse_dmp_json(json: JSON.parse({ dmp: annotated }.to_json))
56
56
  end
57
57
  # rubocop:enable Metrics/AbcSize, Metrics/MethodLength
@@ -75,7 +75,7 @@ module Uc3DmpId
75
75
  counter = 0
76
76
  while dmp_id == '' && counter <= 10
77
77
  prefix = "#{ENV.fetch('DMP_ID_SHOULDER', nil)}#{SecureRandom.hex(2).upcase}#{SecureRandom.hex(2)}"
78
- dmp_id = prefix unless Finder.exists?(client: client, p_key: prefix)
78
+ dmp_id = prefix unless Finder.exists?(client:, p_key: prefix)
79
79
  counter += 1
80
80
  end
81
81
  # Something went wrong and it was unable to identify a unique id
@@ -94,7 +94,7 @@ module Uc3DmpId
94
94
 
95
95
  # Publish the change to the EventBridge
96
96
  publisher = Uc3DmpEventBridge::Publisher.new
97
- publisher.publish(source: 'DmpCreator', event_type: 'EZID update', dmp: json, logger: logger)
97
+ publisher.publish(source: 'DmpCreator', event_type: 'EZID update', dmp: json, logger:)
98
98
 
99
99
  # Determine if there are any related identifiers that we should try to fetch a citation for
100
100
  citable_identifiers = Helper.citable_related_identifiers(dmp: json)
@@ -108,7 +108,7 @@ module Uc3DmpId
108
108
  }
109
109
  logger.debug(message: 'Fetching citations', details: citable_identifiers) if logger.respond_to?(:debug)
110
110
  publisher.publish(source: 'DmpCreator', dmp: json, event_type: 'Citation Fetch', detail: citer_detail,
111
- logger: logger)
111
+ logger:)
112
112
  true
113
113
  end
114
114
  end
@@ -19,7 +19,7 @@ module Uc3DmpId
19
19
 
20
20
  # Fetch the latest version of the DMP ID by it's PK
21
21
  client = Uc3DmpDynamo::Client.new
22
- dmp = Finder.by_pk(p_key: p_key, client: client, cleanse: false, logger: logger)
22
+ dmp = Finder.by_pk(p_key:, client:, cleanse: false, logger:)
23
23
  raise DeleterError, Helper::MSG_DMP_NOT_FOUND unless dmp.is_a?(Hash) && !dmp['dmp'].nil?
24
24
 
25
25
  # Only allow this if the provenance is the owner of the DMP!
@@ -38,16 +38,16 @@ module Uc3DmpId
38
38
  dmp['dmp']['dmphub_tombstoned_at'] = now
39
39
 
40
40
  # Create the Tombstone version
41
- resp = client.put_item(json: dmp['dmp'], logger: logger)
41
+ resp = client.put_item(json: dmp['dmp'], logger:)
42
42
  raise DeleterError, Helper::MSG_DMP_NO_TOMBSTONE if resp.nil?
43
43
 
44
44
  # Delete the Latest version
45
- client.delete_item(p_key: p_key, s_key: Helper::DMP_LATEST_VERSION, logger: logger)
45
+ client.delete_item(p_key:, s_key: Helper::DMP_LATEST_VERSION, logger:)
46
46
 
47
47
  # TODO: We should do a check here to see if it was successful!
48
48
 
49
49
  # Notify EZID about the removal
50
- _post_process(json: dmp, logger: logger)
50
+ _post_process(json: dmp, logger:)
51
51
 
52
52
  # Return the tombstoned record
53
53
  Helper.cleanse_dmp_json(json: dmp)
@@ -66,7 +66,7 @@ module Uc3DmpId
66
66
 
67
67
  # Publish the change to the EventBridge
68
68
  publisher = Uc3DmpEventBridge::Publisher.new
69
- publisher.publish(source: 'DmpDeleter', event_type: 'EZID update', dmp: json, logger: logger)
69
+ publisher.publish(source: 'DmpDeleter', event_type: 'EZID update', dmp: json, logger:)
70
70
  true
71
71
  end
72
72
  end
@@ -20,15 +20,15 @@ module Uc3DmpId
20
20
  # TODO: Replace this with ElasticSearch
21
21
  def search_dmps(args:, logger: nil)
22
22
  client = Uc3DmpDynamo::Client.new
23
- return _by_owner(owner_org: args['owner_orcid'], client: client, logger: logger) unless args['owner_orcid'].nil?
23
+ return _by_owner(owner_org: args['owner_orcid'], client:, logger:) unless args['owner_orcid'].nil?
24
24
 
25
25
  unless args['owner_org_ror'].nil?
26
- return _by_owner_org(owner_org: args['owner_org_ror'], client: client,
27
- logger: logger)
26
+ return _by_owner_org(owner_org: args['owner_org_ror'], client:,
27
+ logger:)
28
28
  end
29
29
  unless args['modification_day'].nil?
30
- return _by_mod_day(day: args['modification_day'], client: client,
31
- logger: logger)
30
+ return _by_mod_day(day: args['modification_day'], client:,
31
+ logger:)
32
32
  end
33
33
 
34
34
  []
@@ -38,20 +38,20 @@ module Uc3DmpId
38
38
  # -------------------------------------------------------------------------
39
39
  # rubocop:disable Metrics/AbcSize
40
40
  def by_json(json:, client: nil, cleanse: true, logger: nil)
41
- json = Helper.parse_json(json: json)&.fetch('dmp', {})
41
+ json = Helper.parse_json(json:)&.fetch('dmp', {})
42
42
  raise FinderError, MSG_INVALID_ARGS if !json.is_a?(Hash) || (json['PK'].nil? && json['dmp_id'].nil?)
43
43
 
44
44
  p_key = json['PK']
45
45
  # Translate the incoming :dmp_id into a PK
46
46
  p_key = Helper.dmp_id_to_pk(json: json.fetch('dmp_id', {})) if p_key.nil?
47
- client = client.nil? ? Uc3DmpDynamo::Client.new : client
47
+ client = Uc3DmpDynamo::Client.new if client.nil?
48
48
 
49
49
  # TODO: Re-enable this once we figure out Dynamo indexes
50
50
  # find_by_dmphub_provenance_id -> if no PK and no dmp_id result
51
51
  # return by_provenance_identifier(json: json, client: client, logger: logger) if p_key.nil?
52
52
 
53
53
  # find_by_PK
54
- p_key.nil? ? nil : by_pk(p_key: p_key, s_key: json['SK'], client: client, cleanse: cleanse, logger: logger)
54
+ p_key.nil? ? nil : by_pk(p_key:, s_key: json['SK'], client:, cleanse:, logger:)
55
55
  end
56
56
  # rubocop:enable Metrics/AbcSize
57
57
 
@@ -62,20 +62,20 @@ module Uc3DmpId
62
62
  raise FinderError, MSG_MISSING_PK if p_key.nil?
63
63
 
64
64
  s_key = Helper::DMP_LATEST_VERSION if s_key.nil? || s_key.to_s.strip.empty?
65
- client = client.nil? ? Uc3DmpDynamo::Client.new : client
65
+ client = Uc3DmpDynamo::Client.new if client.nil?
66
66
  resp = client.get_item(
67
67
  key: {
68
- PK: Helper.append_pk_prefix(p_key: p_key),
69
- SK: Helper.append_sk_prefix(s_key: s_key)
68
+ PK: Helper.append_pk_prefix(p_key:),
69
+ SK: Helper.append_sk_prefix(s_key:)
70
70
  },
71
- logger: logger
71
+ logger:
72
72
  )
73
73
  return resp unless resp.is_a?(Hash)
74
74
 
75
75
  dmp = resp['dmp'].nil? ? JSON.parse({ dmp: resp }.to_json) : resp
76
76
  return nil if dmp['dmp']['PK'].nil?
77
77
 
78
- dmp = Versioner.append_versions(p_key: dmp['dmp']['PK'], dmp: dmp, client: client, logger: logger) if cleanse
78
+ dmp = Versioner.append_versions(p_key: dmp['dmp']['PK'], dmp:, client:, logger:) if cleanse
79
79
  cleanse ? Helper.cleanse_dmp_json(json: dmp) : dmp
80
80
  end
81
81
  # rubocop:enable Metrics/AbcSize
@@ -85,13 +85,13 @@ module Uc3DmpId
85
85
  def exists?(p_key:, s_key: Helper::DMP_LATEST_VERSION, client: nil, logger: nil)
86
86
  raise FinderError, MSG_MISSING_PK if p_key.nil?
87
87
 
88
- client = client.nil? ? Uc3DmpDynamo::Client.new : client
88
+ client = Uc3DmpDynamo::Client.new if client.nil?
89
89
  client.pk_exists?(
90
90
  key: {
91
- PK: Helper.append_pk_prefix(p_key: p_key),
92
- SK: Helper.append_sk_prefix(s_key: s_key)
91
+ PK: Helper.append_pk_prefix(p_key:),
92
+ SK: Helper.append_sk_prefix(s_key:)
93
93
  },
94
- logger: logger
94
+ logger:
95
95
  )
96
96
  end
97
97
 
@@ -115,15 +115,15 @@ module Uc3DmpId
115
115
  filter_expression: 'SK = :version',
116
116
  expression_attribute_values: { ':version': Helper::DMP_LATEST_VERSION }
117
117
  }
118
- client = client.nil? ? Uc3DmpDynamo::Client.new : client
119
- resp = client.query(args: args, logger: logger)
118
+ client = Uc3DmpDynamo::Client.new if client.nil?
119
+ resp = client.query(args:, logger:)
120
120
  return resp unless resp.is_a?(Hash)
121
121
 
122
122
  dmp = resp['dmp'].nil? ? JSON.parse({ dmp: resp }.to_json) : resp
123
123
  return nil if dmp['dmp']['PK'].nil?
124
124
 
125
125
  # If we got a hit, fetch the DMP and return it.
126
- by_pk(p_key: dmp['dmp']['PK'], s_key: dmp['dmp']['SK'], cleanse: cleanse, logger: logger)
126
+ by_pk(p_key: dmp['dmp']['PK'], s_key: dmp['dmp']['SK'], cleanse:, logger:)
127
127
  end
128
128
  # rubocop:enable Metrics/AbcSize
129
129
 
@@ -149,8 +149,8 @@ module Uc3DmpId
149
149
  expression_attribute_values: { ':version': Helper::DMP_LATEST_VERSION }
150
150
  }
151
151
  logger.info(message: "Querying _by_owner with #{args}") if logger.respond_to?(:info)
152
- client = client.nil? ? Uc3DmpDynamo::Client.new : client
153
- _process_search_response(response: client.query(args: args, logger: logger))
152
+ client = Uc3DmpDynamo::Client.new if client.nil?
153
+ _process_search_response(response: client.query(args:, logger:))
154
154
  end
155
155
 
156
156
  # Fetch the DMP IDs for the specified organization/institution (the org is the :dmphub_owner_org
@@ -174,8 +174,8 @@ module Uc3DmpId
174
174
  expression_attribute_values: { ':version': Helper::DMP_LATEST_VERSION }
175
175
  }
176
176
  logger.info(message: "Querying _by_owner_org with #{args}") if logger.respond_to?(:info)
177
- client = client.nil? ? Uc3DmpDynamo::Client.new : client
178
- _process_search_response(response: client.query(args: args, logger: logger))
177
+ client = Uc3DmpDynamo::Client.new if client.nil?
178
+ _process_search_response(response: client.query(args:, logger:))
179
179
  end
180
180
 
181
181
  # Fetch the DMP IDs modified on the specified date (the date is the :dmphub_modification_day on the DMP ID record)
@@ -195,8 +195,8 @@ module Uc3DmpId
195
195
  expression_attribute_values: { ':version': Helper::DMP_LATEST_VERSION }
196
196
  }
197
197
  logger.info(message: "Querying _by_mod_day with #{args}") if logger.respond_to?(:info)
198
- client = client.nil? ? Uc3DmpDynamo::Client.new : client
199
- _process_search_response(response: client.query(args: args, logger: logger))
198
+ client = Uc3DmpDynamo::Client.new if client.nil?
199
+ _process_search_response(response: client.query(args:, logger:))
200
200
  end
201
201
 
202
202
  # Transform the search results so that we do not include any of the DMPHub specific metadata
@@ -7,17 +7,17 @@ module Uc3DmpId
7
7
  # Helper functions for working with DMP IDs
8
8
  class Helper
9
9
  PK_DMP_PREFIX = 'DMP#'
10
- PK_DMP_REGEX = %r{DMP#[a-zA-Z0-9\-_.]+/[a-zA-Z0-9]{2}\.[a-zA-Z0-9./:]+}.freeze
10
+ PK_DMP_REGEX = %r{DMP#[a-zA-Z0-9\-_.]+/[a-zA-Z0-9]{2}\.[a-zA-Z0-9./:]+}
11
11
 
12
12
  SK_DMP_PREFIX = 'VERSION#'
13
- SK_DMP_REGEX = /VERSION#\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\+\d{2}:\d{2}/.freeze
13
+ SK_DMP_REGEX = /VERSION#\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\+\d{2}:\d{2}/
14
14
 
15
15
  # TODO: Verify the assumed structure of the DOI is valid
16
- DOI_REGEX = %r{[0-9]{2}\.[0-9]{4,}/[a-zA-Z0-9/_.-]+}.freeze
17
- URL_REGEX = %r{(https?://)?([a-zA-Z0-9\-_]\.)+[a-zA-Z0-9\-_]{2,3}(:[0-9]+)?/?}.freeze
16
+ DOI_REGEX = %r{[0-9]{2}\.[0-9]{4,}/[a-zA-Z0-9/_.-]+}
17
+ URL_REGEX = %r{(https?://)?([a-zA-Z0-9\-_]\.)+[a-zA-Z0-9\-_]{2,3}(:[0-9]+)?/?}
18
18
 
19
- DMP_LATEST_VERSION = "#{SK_DMP_PREFIX}latest"
20
- DMP_TOMBSTONE_VERSION = "#{SK_DMP_PREFIX}tombstone"
19
+ DMP_LATEST_VERSION = "#{SK_DMP_PREFIX}latest".freeze
20
+ DMP_TOMBSTONE_VERSION = "#{SK_DMP_PREFIX}tombstone".freeze
21
21
 
22
22
  DEFAULT_API_URL = 'https://api.dmphub.uc3dev.cdlib.net/dmps/'
23
23
  DEFAULT_LANDING_PAGE_URL = 'https://dmphub.uc3dev.cdlib.net/dmps/'
@@ -41,7 +41,7 @@ module Uc3DmpId
41
41
  # Append the PK prefix for the object
42
42
  # -------------------------------------------------------------------------------------
43
43
  def append_pk_prefix(p_key:)
44
- p_key.is_a?(String) ? "#{PK_DMP_PREFIX}#{remove_pk_prefix(p_key: p_key)}" : nil
44
+ p_key.is_a?(String) ? "#{PK_DMP_PREFIX}#{remove_pk_prefix(p_key:)}" : nil
45
45
  end
46
46
 
47
47
  # Strip off the PK prefix
@@ -53,7 +53,7 @@ module Uc3DmpId
53
53
  # Append the SK prefix for the object
54
54
  # -------------------------------------------------------------------------------------
55
55
  def append_sk_prefix(s_key:)
56
- s_key.is_a?(String) ? "#{SK_DMP_PREFIX}#{remove_sk_prefix(s_key: s_key)}" : nil
56
+ s_key.is_a?(String) ? "#{SK_DMP_PREFIX}#{remove_sk_prefix(s_key:)}" : nil
57
57
  end
58
58
 
59
59
  # Strip off the SK prefix
@@ -82,7 +82,7 @@ module Uc3DmpId
82
82
  return with_protocol ? value : value.gsub(%r{https?://}, '') if value.start_with?('http')
83
83
 
84
84
  dmp_id = dmp_id.gsub('doi:', '')
85
- dmp_id = dmp_id.start_with?('/') ? dmp_id[1..dmp_id.length] : dmp_id
85
+ dmp_id = dmp_id[1..dmp_id.length] if dmp_id.start_with?('/')
86
86
  base_domain = with_protocol ? dmp_id_base_url : dmp_id_base_url.gsub(%r{https?://}, '')
87
87
  "#{base_domain}#{dmp_id}"
88
88
  end
@@ -95,7 +95,7 @@ module Uc3DmpId
95
95
  p_key = param if param.start_with?(dmp_id_base_url) || param.start_with?(base_domain)
96
96
  p_key = CGI.unescape(p_key.nil? ? param : p_key)
97
97
  p_key = format_dmp_id(value: p_key)
98
- append_pk_prefix(p_key: p_key)
98
+ append_pk_prefix(p_key:)
99
99
  end
100
100
 
101
101
  # Append the :PK prefix to the :dmp_id
@@ -115,7 +115,7 @@ module Uc3DmpId
115
115
 
116
116
  {
117
117
  type: 'doi',
118
- identifier: format_dmp_id(value: remove_pk_prefix(p_key: p_key), with_protocol: true)
118
+ identifier: format_dmp_id(value: remove_pk_prefix(p_key:), with_protocol: true)
119
119
  }
120
120
  end
121
121
 
@@ -180,7 +180,7 @@ module Uc3DmpId
180
180
  # Add DMPHub specific fields to the DMP ID JSON
181
181
  # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
182
182
  def annotate_dmp_json(provenance:, p_key:, json:)
183
- json = parse_json(json: json)
183
+ json = parse_json(json:)
184
184
  bool_vals = [1, '1', true, 'true', 'yes']
185
185
  return json if provenance.nil? || p_key.nil? || !json.is_a?(Hash)
186
186
 
@@ -189,14 +189,14 @@ module Uc3DmpId
189
189
  return json if id != p_key && !json['PK'].nil?
190
190
 
191
191
  annotated = deep_copy_dmp(obj: json)
192
- annotated['PK'] = json['PK'] || append_pk_prefix(p_key: p_key)
192
+ annotated['PK'] = json['PK'] || append_pk_prefix(p_key:)
193
193
  annotated['SK'] = DMP_LATEST_VERSION
194
194
 
195
195
  # Ensure that the :dmp_id matches the :PK
196
196
  annotated['dmp_id'] = JSON.parse(pk_to_dmp_id(p_key: remove_pk_prefix(p_key: annotated['PK'])).to_json)
197
197
 
198
- owner_id = extract_owner_id(json: json)
199
- owner_org = extract_owner_org(json: json)
198
+ owner_id = extract_owner_id(json:)
199
+ owner_org = extract_owner_org(json:)
200
200
 
201
201
  # Set the :dmproadmap_featured flag appropriately
202
202
  featured = annotated.fetch('dmproadmap_featured', 'no')
@@ -219,7 +219,7 @@ module Uc3DmpId
219
219
  annotated['dmphub_provenance_identifier'] = annotated.fetch('dmproadmap_links', {})['get']
220
220
  else
221
221
  annotated['dmphub_provenance_identifier'] = format_provenance_id(
222
- provenance: provenance, value: json.fetch('dmp_id', {})['identifier']
222
+ provenance:, value: json.fetch('dmp_id', {})['identifier']
223
223
  )
224
224
  end
225
225
  annotated
@@ -16,18 +16,18 @@ module Uc3DmpId
16
16
  def update(provenance:, p_key:, json: {}, note: nil, logger: nil)
17
17
  raise UpdaterError, Helper::MSG_DMP_INVALID_DMP_ID unless p_key.is_a?(String) && !p_key.strip.empty?
18
18
 
19
- mods = Helper.parse_json(json: json).fetch('dmp', {})
20
- p_key = Helper.append_pk_prefix(p_key: p_key)
19
+ mods = Helper.parse_json(json:).fetch('dmp', {})
20
+ p_key = Helper.append_pk_prefix(p_key:)
21
21
  logger.debug(message: "Incoming modifications for PK #{p_key}", details: mods) if logger.respond_to?(:debug)
22
22
 
23
23
  # Fetch the latest version of the DMP ID
24
24
  client = Uc3DmpDynamo::Client.new
25
- latest_version = Finder.by_pk(p_key: p_key, client: client, logger: logger, cleanse: false)
26
- latest_version = latest_version['dmp'].nil? ? latest_version : latest_version.fetch('dmp', {})
25
+ latest_version = Finder.by_pk(p_key:, client:, logger:, cleanse: false)
26
+ latest_version = latest_version.fetch('dmp', {}) unless latest_version['dmp'].nil?
27
27
  logger.debug(message: "Latest version for PK #{p_key}", details: latest_version) if logger.respond_to?(:debug)
28
28
 
29
29
  # Verify that the DMP ID is updateable with the info passed in
30
- errs = _updateable?(provenance: provenance, p_key: p_key, latest_version: latest_version['dmp'],
30
+ errs = _updateable?(provenance:, p_key:, latest_version: latest_version['dmp'],
31
31
  mods: mods['dmp'])
32
32
  logger.error(message: errs.join(', ')) if logger.respond_to?(:error) && errs.is_a?(Array) && errs.any?
33
33
  raise UpdaterError, errs if errs.is_a?(Array) && errs.any?
@@ -37,35 +37,35 @@ module Uc3DmpId
37
37
  # Version the DMP ID record (if applicable).
38
38
  owner = latest_version['dmphub_provenance_id']
39
39
  updater = provenance['PK']
40
- version = Versioner.generate_version(client: client, latest_version: latest_version, owner: owner,
41
- updater: updater, logger: logger)
40
+ version = Versioner.generate_version(client:, latest_version:, owner:,
41
+ updater:, logger:)
42
42
  raise UpdaterError, Helper::MSG_DMP_UNABLE_TO_VERSION if version.nil?
43
43
 
44
44
  # Remove the version info because we don't want to save it on the record
45
45
  version.delete('dmphub_versions')
46
46
 
47
47
  # Splice the assertions
48
- version = _process_modifications(owner: owner, updater: updater, version: version, mods: mods, note: note,
49
- logger: logger)
48
+ version = _process_modifications(owner:, updater:, version:, mods:, note:,
49
+ logger:)
50
50
  # Set the :modified timestamps
51
51
  now = Time.now.utc
52
52
  version['modified'] = now.iso8601
53
53
  version['dmphub_modification_day'] = now.strftime('%Y-%m-%d')
54
54
 
55
55
  # Save the changes
56
- resp = client.put_item(json: version, logger: logger)
56
+ resp = client.put_item(json: version, logger:)
57
57
  raise UpdaterError, Helper::MSG_DMP_UNABLE_TO_VERSION if resp.nil?
58
58
 
59
59
  # Send the updates to EZID
60
- _post_process(provenance: provenance, json: version, logger: logger)
60
+ _post_process(provenance:, json: version, logger:)
61
61
 
62
62
  # Return the new version record
63
63
  logger.info(message: "Updated DMP ID: #{p_key}") if logger.respond_to?(:debug)
64
64
 
65
65
  # Append the :dmphub_versions Array
66
66
  json = JSON.parse({ dmp: version }.to_json)
67
- json = Versioner.append_versions(p_key: p_key, dmp: json, client: client, logger: logger)
68
- Helper.cleanse_dmp_json(json: json)
67
+ json = Versioner.append_versions(p_key:, dmp: json, client:, logger:)
68
+ Helper.cleanse_dmp_json(json:)
69
69
  end
70
70
  # rubocop:enable Metrics/AbcSize, Metrics/MethodLength
71
71
  # rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
@@ -77,21 +77,21 @@ module Uc3DmpId
77
77
  raise UpdaterError, Helper::MSG_DMP_INVALID_DMP_ID unless p_key.is_a?(String) && !p_key.strip.empty?
78
78
 
79
79
  # fetch the existing latest version of the DMP ID
80
- client = Uc3DmpDynamo::Client.new(logger: logger)
81
- dmp = Finder.by_pk(p_key: p_key, client: client, logger: logger, cleanse: false)
80
+ client = Uc3DmpDynamo::Client.new(logger:)
81
+ dmp = Finder.by_pk(p_key:, client:, logger:, cleanse: false)
82
82
  logger.info(message: 'Existing latest record', details: dmp) if logger.respond_to?(:debug)
83
83
  raise UpdaterError, Helper::MSG_DMP_FORBIDDEN unless provenance.is_a?(Hash) && !provenance['PK'].nil? &&
84
84
  provenance['PK'] == dmp['dmp']['dmphub_provenance_id']
85
85
 
86
86
  # Add the download URl for the PDF as a related identifier on the DMP ID record
87
- annotated = Helper.annotate_dmp_json(provenance: provenance, p_key: p_key, json: dmp['dmp'])
87
+ annotated = Helper.annotate_dmp_json(provenance:, p_key:, json: dmp['dmp'])
88
88
  annotated['dmproadmap_related_identifiers'] = [] if annotated['dmproadmap_related_identifiers'].nil?
89
89
  annotated['dmproadmap_related_identifiers'] << JSON.parse({
90
90
  descriptor: 'is_metadata_for', work_type: 'output_management_plan', type: 'url', identifier: url
91
91
  }.to_json)
92
92
 
93
93
  # Save the changes without creating a new version!
94
- resp = client.put_item(json: annotated, logger: logger)
94
+ resp = client.put_item(json: annotated, logger:)
95
95
  raise UpdaterError, Helper::MSG_DMP_UNABLE_TO_VERSION if resp.nil?
96
96
 
97
97
  logger.info(message: "Added DMP ID narrative for PK: #{p_key}, Narrative: #{url}") if logger.respond_to?(:debug)
@@ -111,8 +111,9 @@ module Uc3DmpId
111
111
  return [Helper::MSG_DMP_FORBIDDEN] unless provenance.is_a?(Hash) && !provenance['PK'].nil?
112
112
  # Verify that the JSON is for the same DMP in the PK
113
113
  return [Helper::MSG_DMP_FORBIDDEN] unless Helper.dmp_id_to_pk(json: mods.fetch('dmp_id', {})) == p_key
114
+
114
115
  # Bail out if the DMP ID could not be found or the PKs do not match for some reason
115
- return [Helper::MSG_DMP_UNKNOWN] unless latest_version.is_a?(Hash) && latest_version['PK'] == p_key
116
+ [Helper::MSG_DMP_UNKNOWN] unless latest_version.is_a?(Hash) && latest_version['PK'] == p_key
116
117
  end
117
118
  # rubocop:enable Metrics/AbcSize
118
119
 
@@ -123,14 +124,14 @@ module Uc3DmpId
123
124
 
124
125
  updated = if owner == updater
125
126
  # Splice together any assertions that may have been made while the user was editing the DMP ID
126
- Asserter.splice(latest_version: version, modified_version: mods, logger: logger)
127
+ Asserter.splice(latest_version: version, modified_version: mods, logger:)
127
128
  else
128
129
  # Attach the incoming changes as an assertion to the DMP ID since the updater is NOT the owner
129
- Asserter.add(updater: updater, latest_version: version, modified_version: mods, note: note,
130
- logger: logger)
130
+ Asserter.add(updater:, latest_version: version, modified_version: mods, note:,
131
+ logger:)
131
132
  end
132
133
 
133
- _merge_versions(latest_version: version, mods: updated, logger: logger)
134
+ _merge_versions(latest_version: version, mods: updated, logger:)
134
135
  end
135
136
  # rubocop:enable Metrics/ParameterLists
136
137
 
@@ -172,7 +173,7 @@ module Uc3DmpId
172
173
  logger.debug(message: 'Sending event for EZID publication',
173
174
  details: json)
174
175
  end
175
- publisher.publish(source: 'DmpUpdater', event_type: 'EZID update', dmp: json, logger: logger) if publishable
176
+ publisher.publish(source: 'DmpUpdater', event_type: 'EZID update', dmp: json, logger:) if publishable
176
177
 
177
178
  # Determine if there are any related identifiers that we should try to fetch a citation for
178
179
  citable_identifiers = Helper.citable_related_identifiers(dmp: json)
@@ -189,7 +190,7 @@ module Uc3DmpId
189
190
  details: citable_identifiers)
190
191
  end
191
192
  publisher.publish(source: 'DmpUpdater', dmp: json, event_type: 'Citation Fetch', detail: citer_detail,
192
- logger: logger)
193
+ logger:)
193
194
  true
194
195
  end
195
196
  # rubocop:enable Metrics/AbcSize, Metrics/MethodLength
@@ -23,11 +23,11 @@ module Uc3DmpId
23
23
  # Validate the specified DMP's :json against the schema for the specified :mode
24
24
  # rubocop:disable Metrics/AbcSize
25
25
  def validate(mode:, json:)
26
- json = Helper.parse_json(json: json)
26
+ json = Helper.parse_json(json:)
27
27
  return [MSG_EMPTY_JSON] if json.nil? || !VALIDATION_MODES.include?(mode)
28
28
 
29
29
  # Load the appropriate JSON schema for the mode
30
- schema = _load_schema(mode: mode)
30
+ schema = _load_schema(mode:)
31
31
  return [MSG_NO_SCHEMA] if schema.nil?
32
32
 
33
33
  # Validate the JSON
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Uc3DmpId
4
- VERSION = '0.1.0'
4
+ VERSION = '0.1.1'
5
5
  end
@@ -18,13 +18,13 @@ module Uc3DmpId
18
18
 
19
19
  args = {
20
20
  key_conditions: {
21
- PK: { attribute_value_list: [Helper.append_pk_prefix(p_key: p_key)], comparison_operator: 'EQ' }
21
+ PK: { attribute_value_list: [Helper.append_pk_prefix(p_key:)], comparison_operator: 'EQ' }
22
22
  },
23
23
  projection_expression: 'modified',
24
24
  scan_index_forward: false
25
25
  }
26
- client = client.nil? ? Uc3DmpDynamo::Client.new : client
27
- client.query(args: args, logger: logger)
26
+ client = Uc3DmpDynamo::Client.new if client.nil?
27
+ client.query(args:, logger:)
28
28
  end
29
29
 
30
30
  # Generate a snapshot of the current latest version of the DMP ID using the existing :modified as
@@ -57,8 +57,8 @@ module Uc3DmpId
57
57
  prior['SK'] = "#{Helper::SK_DMP_PREFIX}#{latest_version['modified'] || Time.now.utc.iso8601}"
58
58
 
59
59
  # Create the prior version record ()
60
- client = client.nil? ? Uc3DmpDynamo::Client.new : client
61
- resp = client.put_item(json: prior, logger: logger)
60
+ client = Uc3DmpDynamo::Client.new if client.nil?
61
+ resp = client.put_item(json: prior, logger:)
62
62
  return nil if resp.nil?
63
63
 
64
64
  msg = "#{SOURCE} created version PK: #{prior['PK']} SK: #{prior['SK']}"
@@ -74,7 +74,7 @@ module Uc3DmpId
74
74
  json = Helper.parse_json(json: dmp)
75
75
  return json unless p_key.is_a?(String) && !p_key.strip.empty? && json.is_a?(Hash) && !json['dmp'].nil?
76
76
 
77
- results = get_versions(p_key: p_key, client: client, logger: logger)
77
+ results = get_versions(p_key:, client:, logger:)
78
78
  return json unless results.length > 1
79
79
 
80
80
  # TODO: we may want to include milliseconds in the future if we get increased volume so that
@@ -82,7 +82,7 @@ module Uc3DmpId
82
82
  versions = results.map do |ver|
83
83
  next if ver['modified'].nil?
84
84
 
85
- base_url = "#{Helper.landing_page_url}#{Helper.remove_pk_prefix(p_key: p_key)}"
85
+ base_url = "#{Helper.landing_page_url}#{Helper.remove_pk_prefix(p_key:)}"
86
86
  {
87
87
  timestamp: ver['modified'],
88
88
  url: dmp['dmp']['modified'] == ver['modified'] ? base_url : "#{base_url}?version=#{ver['modified']}"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: uc3-dmp-id
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian Riley
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-08-25 00:00:00.000000000 Z
11
+ date: 2023-10-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -91,7 +91,7 @@ licenses:
91
91
  - MIT
92
92
  metadata:
93
93
  rubygems_mfa_required: 'false'
94
- post_install_message:
94
+ post_install_message:
95
95
  rdoc_options: []
96
96
  require_paths:
97
97
  - lib
@@ -100,15 +100,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - ">="
102
102
  - !ruby/object:Gem::Version
103
- version: '2.7'
103
+ version: '3.2'
104
104
  required_rubygems_version: !ruby/object:Gem::Requirement
105
105
  requirements:
106
106
  - - ">="
107
107
  - !ruby/object:Gem::Version
108
108
  version: '0'
109
109
  requirements: []
110
- rubygems_version: 3.1.6
111
- signing_key:
110
+ rubygems_version: 3.4.10
111
+ signing_key:
112
112
  specification_version: 4
113
113
  summary: DMPTool gem that provides support for DMP ID records
114
114
  test_files: []