ddr-core 0.3.0 → 1.2.0.rc1

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.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/app/models/concerns/ddr/#search_builder_behavior.rb# +10 -0
  4. data/app/models/concerns/ddr/describable.rb +8 -12
  5. data/app/models/concerns/ddr/has_admin_metadata.rb +13 -65
  6. data/app/models/concerns/ddr/has_children.rb +8 -0
  7. data/app/models/concerns/ddr/has_content.rb +1 -0
  8. data/app/models/concerns/ddr/has_parent.rb +14 -2
  9. data/app/models/concerns/ddr/search_builder_behavior.rb~ +9 -0
  10. data/app/models/concerns/ddr/solr_document_behavior.rb +11 -90
  11. data/app/models/ddr/#admin_set.rb# +26 -0
  12. data/app/models/ddr/#auxiliary_resource_cache.rb# +34 -0
  13. data/app/models/ddr/admin_set.rb +3 -7
  14. data/app/models/ddr/alert.rb +16 -0
  15. data/app/models/ddr/auxiliary_resource.rb +24 -0
  16. data/app/models/ddr/auxiliary_resource.rb~ +13 -0
  17. data/app/models/ddr/cacheable_auxiliary_resource.rb~ +20 -0
  18. data/app/models/ddr/collection.rb +5 -4
  19. data/app/models/ddr/component.rb +8 -0
  20. data/app/models/ddr/contact.rb +1 -5
  21. data/app/models/ddr/finding_aid.rb +61 -0
  22. data/app/models/ddr/item.rb +0 -14
  23. data/app/models/ddr/language.rb +1 -6
  24. data/app/models/ddr/resource.rb +14 -0
  25. data/app/models/ddr/rights_statement.rb +2 -6
  26. data/config/locales/ddr-core.en.yml +4 -1
  27. data/db/migrate/20200207194453_add_default_to_lock_version.rb +6 -0
  28. data/lib/ddr/auth/#duke_person.rb# +9 -0
  29. data/lib/ddr/auth/ability_definitions/publication_ability_definitions.rb +7 -0
  30. data/lib/ddr/auth/ability_definitions/role_based_ability_definitions.rb +2 -2
  31. data/lib/ddr/auth/ability_definitions/superuser_ability_definitions.rb +3 -0
  32. data/lib/ddr/auth/duke_directory.rb~ +7 -0
  33. data/lib/ddr/auth/effective_permissions.rb +2 -1
  34. data/lib/ddr/auth/effective_roles.rb +6 -2
  35. data/lib/ddr/auth/failure_app.rb +1 -1
  36. data/lib/ddr/auth/grouper_gateway.rb +2 -2
  37. data/lib/ddr/auth/permissions.rb +14 -11
  38. data/lib/ddr/auth/role_based_access_controls_enforcement.rb +1 -37
  39. data/lib/ddr/auth/roles.rb +15 -3
  40. data/lib/ddr/auth/roles/role.rb +27 -69
  41. data/lib/ddr/auth/roles/role_types.rb +13 -6
  42. data/lib/ddr/core.rb +9 -0
  43. data/lib/ddr/core/version.rb +1 -1
  44. data/lib/ddr/fits.rb +0 -91
  45. data/lib/ddr/index.rb +2 -2
  46. data/lib/ddr/index/csv_query_result.rb +27 -20
  47. data/lib/ddr/index/fields.rb +5 -0
  48. data/lib/ddr/managers/technical_metadata_manager.rb +9 -4
  49. data/lib/ddr/structure.rb +2 -1
  50. data/lib/ddr/vocab/asset.rb +4 -0
  51. data/lib/ddr/workflow.rb +1 -0
  52. metadata +35 -9
@@ -19,10 +19,10 @@ module Ddr
19
19
  autoload :SortOrder
20
20
  autoload :UniqueKeyField
21
21
 
22
- def self.pids
22
+ def self.ids
23
23
  builder = QueryBuilder.new { field UniqueKeyField.instance }
24
24
  query = builder.query
25
- query.pids
25
+ query.ids
26
26
  end
27
27
 
28
28
  end
@@ -6,8 +6,35 @@ module Ddr::Index
6
6
  MAX_ROWS = 10**8 # Just set to a really high number :)
7
7
  CSV_MV_SEPARATOR = ";"
8
8
 
9
+ DEFAULT_CSV_OPTIONS = {
10
+ headers: :first_row,
11
+ return_headers: false,
12
+ write_headers: true,
13
+ converters: [
14
+ # convert semicolons
15
+ lambda { |f| f.gsub(/\\#{CSV_MV_SEPARATOR}/, CSV_MV_SEPARATOR) rescue f },
16
+ # convert escaped newlines
17
+ lambda { |f| f.gsub(/\\r/, "\r").gsub(/\\n/, "\n") rescue f }
18
+ ],
19
+ }.freeze
20
+
9
21
  delegate :headers, :to_s, :to_csv, to: :table
10
22
 
23
+ attr_reader :csv_opts
24
+
25
+ #
26
+ # See Ruby docs on CSV::new for details on available keys
27
+ # and values for the optional `csv_options' Hash parameter.
28
+ #
29
+ # N.B. If you want to *add* a converter and retain the
30
+ # default converters, append DEFAULT_CSV_OPTIONS[:converters]
31
+ # to your Array of converters.
32
+ #
33
+ def initialize(query, csv_opts: {})
34
+ super(query)
35
+ @csv_opts = DEFAULT_CSV_OPTIONS.merge(csv_opts)
36
+ end
37
+
11
38
  def delete_empty_columns!
12
39
  table.by_col!.delete_if { |c, vals| vals.all?(&:nil?) }
13
40
  end
@@ -24,14 +51,6 @@ module Ddr::Index
24
51
  @table ||= CSV.parse(data, csv_opts)
25
52
  end
26
53
 
27
- def csv_opts
28
- { headers: csv_headers,
29
- converters: [convert_semicolons, convert_escaped_newlines],
30
- return_headers: false,
31
- write_headers: true,
32
- }
33
- end
34
-
35
54
  def solr_csv_opts
36
55
  { "csv.mv.separator" => CSV_MV_SEPARATOR,
37
56
  "csv.header" => solr_csv_header?,
@@ -44,10 +63,6 @@ module Ddr::Index
44
63
  query.fields.map { |f| f.respond_to?(:heading) ? f.heading : f.to_s }
45
64
  end
46
65
 
47
- def csv_headers
48
- :first_row
49
- end
50
-
51
66
  def solr_csv_header?
52
67
  query.fields.empty?
53
68
  end
@@ -72,13 +87,5 @@ module Ddr::Index
72
87
  Connection.get("select", params: solr_csv_params)
73
88
  end
74
89
 
75
- def convert_semicolons
76
- lambda { |f| f.gsub(/\\#{CSV_MV_SEPARATOR}/, CSV_MV_SEPARATOR) rescue f }
77
- end
78
-
79
- def convert_escaped_newlines
80
- lambda { |f| f.gsub(/\\r/, "\r").gsub(/\\n/, "\n") rescue f }
81
- end
82
-
83
90
  end
84
91
  end
@@ -29,15 +29,20 @@ module Ddr::Index
29
29
  CONTENT_CREATE_DATE = Field.new :content_create_date, :stored_sortable, type: :date
30
30
  CONTENT_SIZE = Field.new :content_size, solr_name: "content_size_lsi"
31
31
  CONTENT_SIZE_HUMAN = Field.new :content_size_human, :symbol
32
+ CONTENTDM_ID = Field.new :contentdm_id, :stored_sortable
32
33
  CONTRIBUTOR_FACET = Field.new :contributor_facet, :facetable
33
34
  CREATOR_FACET = Field.new :creator_facet, :facetable
34
35
  DATE_FACET = Field.new :date_facet, :facetable
35
36
  DATE_SORT = Field.new :date_sort, :sortable
36
37
  DC_IS_PART_OF = Field.new :isPartOf, :symbol
37
38
  DEPOSITOR = Field.new :depositor, :stored_sortable
39
+ # DDR-1997 - description should always be indexed as _tesim regardless of length - Valkyrie indexes fields > 1000
40
+ # characters in length as _tsim only
41
+ DESCRIPTION = Field.new :description, :stored_searchable # stored_searchable produces _tesim
38
42
  DISPLAY_FORMAT = Field.new :display_format, :stored_sortable
39
43
  DOI = Field.new :doi, :symbol
40
44
  EAD_ID = Field.new :ead_id, :stored_sortable
45
+ EFFECTIVE_ROLE = Field.new :effective_role, :symbol
41
46
  ENGRAVER_FACET = Field.new :engraver_facet, :facetable
42
47
  EXTRACTED_TEXT = Field.new :extracted_text, solr_name: "extracted_text_tsm"
43
48
  FCREPO3_PID = Field.new :fcrepo3_pid, :stored_sortable
@@ -2,7 +2,9 @@ module Ddr
2
2
  module Managers
3
3
  class TechnicalMetadataManager < Manager
4
4
 
5
- FITS_TIMESTAMP_FORMAT = "%D %l:%M %p" # Ex. 7/3/15 8:29 PM
5
+ FITS_141_TIMESTAMP_FORMAT = "%D %l:%M %p" # Ex. 7/3/15 8:29 PM
6
+ FITS_150_TIMESTAMP_FORMAT = "%D, %l:%M %p" # Ex. 7/3/15, 8:29 PM
7
+ FITS_TIMESTAMP_FORMATS = [ FITS_141_TIMESTAMP_FORMAT, FITS_150_TIMESTAMP_FORMAT ]
6
8
 
7
9
  delegate :content, to: :object
8
10
 
@@ -43,9 +45,12 @@ module Ddr
43
45
 
44
46
  def fits_datetime
45
47
  if fits_timestamp = fits.timestamp.first
46
- # no_zone = DateTime.strptime(fits_timestamp, FITS_TIMESTAMP_FORMAT)
47
- # no_zone.change(offset: no_zone.to_time.zone)
48
- Time.zone.strptime(fits_timestamp, FITS_TIMESTAMP_FORMAT)
48
+ parsed = nil
49
+ FITS_TIMESTAMP_FORMATS.each do |format|
50
+ parsed = Time.zone.strptime(fits_timestamp, format) rescue nil
51
+ break if parsed
52
+ end
53
+ parsed
49
54
  end
50
55
  end
51
56
 
@@ -82,6 +82,7 @@ module Ddr
82
82
 
83
83
  def add_filesec(id:nil)
84
84
  filesec = Ddr::Structures::FileSec.build(id: id, document: as_xml_document)
85
+
85
86
  root.add_child(filesec)
86
87
  filesec
87
88
  end
@@ -92,7 +93,7 @@ module Ddr
92
93
  filegrp
93
94
  end
94
95
 
95
- def add_file(parent:, id:SecureRandom.uuid, use:nil)
96
+ def add_file(parent:, id: "id_" + SecureRandom.uuid, use:nil)
96
97
  file = Ddr::Structures::File.build(id: id, use: use, document: as_xml_document)
97
98
  parent.add_child(file)
98
99
  file
@@ -47,5 +47,9 @@ module Ddr::Vocab
47
47
  label: "Nested Path",
48
48
  comment: "The nested/tree path to the object to be reflected in structural metadata."
49
49
 
50
+ property "contentdmId",
51
+ label: "CONTENTdm ID"
52
+ comment: "The CONTENTdm reference corresponding to the object."
53
+
50
54
  end
51
55
  end
@@ -3,6 +3,7 @@ module Ddr
3
3
 
4
4
  PUBLISHED = 'published'
5
5
  UNPUBLISHED = 'unpublished'
6
+ NONPUBLISHABLE = 'nonpublishable'
6
7
 
7
8
  end
8
9
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ddr-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 1.2.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jim Coble
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2019-08-05 00:00:00.000000000 Z
14
+ date: 2020-06-10 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: activeresource
@@ -89,14 +89,14 @@ dependencies:
89
89
  requirements:
90
90
  - - "~>"
91
91
  - !ruby/object:Gem::Version
92
- version: 2.0.0
92
+ version: 2.1.0
93
93
  type: :runtime
94
94
  prerelease: false
95
95
  version_requirements: !ruby/object:Gem::Requirement
96
96
  requirements:
97
97
  - - "~>"
98
98
  - !ruby/object:Gem::Version
99
- version: 2.0.0
99
+ version: 2.1.0
100
100
  - !ruby/object:Gem::Dependency
101
101
  name: grouper-rest-client
102
102
  requirement: !ruby/object:Gem::Requirement
@@ -209,6 +209,20 @@ dependencies:
209
209
  - - ">="
210
210
  - !ruby/object:Gem::Version
211
211
  version: '0'
212
+ - !ruby/object:Gem::Dependency
213
+ name: equivalent-xml
214
+ requirement: !ruby/object:Gem::Requirement
215
+ requirements:
216
+ - - ">="
217
+ - !ruby/object:Gem::Version
218
+ version: '0'
219
+ type: :development
220
+ prerelease: false
221
+ version_requirements: !ruby/object:Gem::Requirement
222
+ requirements:
223
+ - - ">="
224
+ - !ruby/object:Gem::Version
225
+ version: '0'
212
226
  - !ruby/object:Gem::Dependency
213
227
  name: factory_bot_rails
214
228
  requirement: !ruby/object:Gem::Requirement
@@ -292,6 +306,7 @@ files:
292
306
  - app/assets/config/ddr_core_manifest.js
293
307
  - app/controllers/users/omniauth_callbacks_controller.rb
294
308
  - app/controllers/users/sessions_controller.rb
309
+ - app/models/concerns/ddr/#search_builder_behavior.rb#
295
310
  - app/models/concerns/ddr/captionable.rb
296
311
  - app/models/concerns/ddr/describable.rb
297
312
  - app/models/concerns/ddr/governable.rb
@@ -305,15 +320,23 @@ files:
305
320
  - app/models/concerns/ddr/has_parent.rb
306
321
  - app/models/concerns/ddr/has_struct_metadata.rb
307
322
  - app/models/concerns/ddr/has_thumbnail.rb
323
+ - app/models/concerns/ddr/search_builder_behavior.rb~
308
324
  - app/models/concerns/ddr/solr_document_behavior.rb
309
325
  - app/models/concerns/ddr/streamable.rb
326
+ - app/models/ddr/#admin_set.rb#
327
+ - app/models/ddr/#auxiliary_resource_cache.rb#
310
328
  - app/models/ddr/admin_set.rb
329
+ - app/models/ddr/alert.rb
311
330
  - app/models/ddr/attachment.rb
331
+ - app/models/ddr/auxiliary_resource.rb
332
+ - app/models/ddr/auxiliary_resource.rb~
333
+ - app/models/ddr/cacheable_auxiliary_resource.rb~
312
334
  - app/models/ddr/collection.rb
313
335
  - app/models/ddr/component.rb
314
336
  - app/models/ddr/contact.rb
315
337
  - app/models/ddr/digest.rb
316
338
  - app/models/ddr/file.rb
339
+ - app/models/ddr/finding_aid.rb
317
340
  - app/models/ddr/item.rb
318
341
  - app/models/ddr/language.rb
319
342
  - app/models/ddr/media_type.rb
@@ -325,8 +348,10 @@ files:
325
348
  - config/routes.rb
326
349
  - db/migrate/20141104181418_create_users.rb
327
350
  - db/migrate/20141107124012_add_columns_to_user.rb
351
+ - db/migrate/20200207194453_add_default_to_lock_version.rb
328
352
  - lib/ddr-core.rb
329
353
  - lib/ddr/auth.rb
354
+ - lib/ddr/auth/#duke_person.rb#
330
355
  - lib/ddr/auth/ability.rb
331
356
  - lib/ddr/auth/ability_definitions.rb
332
357
  - lib/ddr/auth/ability_definitions/admin_set_ability_definitions.rb
@@ -347,6 +372,7 @@ files:
347
372
  - lib/ddr/auth/auth_context.rb
348
373
  - lib/ddr/auth/auth_context_factory.rb
349
374
  - lib/ddr/auth/detached_auth_context.rb
375
+ - lib/ddr/auth/duke_directory.rb~
350
376
  - lib/ddr/auth/dynamic_groups.rb
351
377
  - lib/ddr/auth/effective_permissions.rb
352
378
  - lib/ddr/auth/effective_roles.rb
@@ -419,7 +445,8 @@ files:
419
445
  homepage: https://gitlab.oit.duke.edu/ddr/ddr-core
420
446
  licenses:
421
447
  - BSD-3-Clause
422
- metadata: {}
448
+ metadata:
449
+ allowed_push_host: https://rubygems.org
423
450
  post_install_message:
424
451
  rdoc_options: []
425
452
  require_paths:
@@ -431,12 +458,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
431
458
  version: '0'
432
459
  required_rubygems_version: !ruby/object:Gem::Requirement
433
460
  requirements:
434
- - - ">="
461
+ - - ">"
435
462
  - !ruby/object:Gem::Version
436
- version: '0'
463
+ version: 1.3.1
437
464
  requirements: []
438
- rubyforge_project:
439
- rubygems_version: 2.7.9
465
+ rubygems_version: 3.0.8
440
466
  signing_key:
441
467
  specification_version: 4
442
468
  summary: Models used in the Duke Digital Repository