ddr-core 0.3.0 → 1.2.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
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