ddr-core 1.1.2 → 1.2.0.rc1

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: f6a1052e5e437237006cf1412ac6505d0d21daee7ca0bdaa0755d985c91eee87
4
- data.tar.gz: 4722ee74f016efbca90f93a6bdff963db1a964cd180dbbc55e0febf8c861c67c
3
+ metadata.gz: c58f60f94bc6a54ea670eb5a7a096e69221e5b8e6fce28191b939f283d4c3528
4
+ data.tar.gz: 170f607020dfabfa89c77c4a31b3daa10bc7d40bd06c251ff3e3d0a0372159e2
5
5
  SHA512:
6
- metadata.gz: d4352b429f24959b5c52388ba562724ff782c4a2e877c565ca0716c450965bbbbfde3d1c558ae2179064ec8963a4eb1f0fb6664656c7c1535cf1dc7acb02189f
7
- data.tar.gz: 7bf7a08bad7f10c1ff6049130e42d8c8584f925f845d83222aa74286b031dca008ee61a440d2989e4734e4e5539e14b2e252d679a0ff75bd0cbdbad6bf6a06f5
6
+ metadata.gz: 7ff5d87897742e3f736e3313a06145a6d378e168e72d6872effc563906370fe66865bf663027defe32041a45ab92910dab97e9d9a1ebd6d21bdf1d9b0b381b84
7
+ data.tar.gz: 48869cd2b81bd88378779ab319fb4a13407bc9060aa099b6b45d33469e8d6605af177aecff033b921f5588bca616f94e077ce75455d45ddba2a619fc7d0119a7
data/README.md CHANGED
@@ -6,7 +6,7 @@ A port of ddr-models based on Valkyrie.
6
6
 
7
7
  Install docker (Docker for Mac includes all the required components).
8
8
 
9
- Change to the `.docker` directory.
9
+ Change to the `.docker` directory.
10
10
 
11
11
  Start the *development* stack:
12
12
 
@@ -0,0 +1,10 @@
1
+ module Ddr
2
+ module SearchBuilderBehavior
3
+
4
+ def effective_role_filter(agents)
5
+ # https://lucene.apache.org/solr/guide/7_7/other-parsers.html#term-query-parser
6
+ "{!terms f=#{Ddr::Index::Fields::EFFECTIVE_ROLE} method=booleanQuery}#{agents.join(',')}"
7
+ end
8
+
9
+ end
10
+ end
@@ -15,6 +15,8 @@ module Ddr
15
15
  term_names
16
16
  end
17
17
 
18
+ # Dublin Core vocabulary comes from the rdf-vocab gem (https://github.com/ruby-rdf/rdf-vocab)
19
+ # DDR vocabulary is defined locally
18
20
  def self.vocabularies
19
21
  [RDF::Vocab::DC, Ddr::Vocab::DukeTerms].freeze
20
22
  end
@@ -34,7 +36,11 @@ module Ddr
34
36
 
35
37
  included do
36
38
  Ddr::Describable.term_names.each do |term_name|
37
- attribute term_name, Valkyrie::Types::Set
39
+ if term_name == :available # Intercept dcterms:available and set it to a single date so it can be used for embargoes
40
+ attribute term_name, Valkyrie::Types::DateTime.optional
41
+ else
42
+ attribute term_name, Valkyrie::Types::Set
43
+ end
38
44
  end
39
45
  end
40
46
 
@@ -53,7 +59,7 @@ module Ddr
53
59
  arg = args.pop
54
60
  terms = case arg.to_sym
55
61
  when :empty
56
- desc_metadata_terms.select { |t| values(t).empty? }
62
+ desc_metadata_terms.select { |t| values(t).nil? || values(t).empty? }
57
63
  when :present
58
64
  desc_metadata_terms.select { |t| values(t).present? }
59
65
  when :defined_attributes
@@ -94,15 +100,5 @@ module Ddr
94
100
  desc_metadata_terms.each { |t| set_desc_metadata_values(t, term_values_hash[t]) }
95
101
  end
96
102
 
97
- ################
98
- # I do not believe this method is needed any longer since I can't find any usage of it in ddr-models, ddr-batch,
99
- # dul-hydra, ddr-public, or ddr-portals
100
- ################
101
- # module ClassMethods
102
- # def find_by_identifier(identifier)
103
- # find(Ddr::Index::Fields::IDENTIFIER_ALL => identifier)
104
- # end
105
- # end
106
-
107
103
  end
108
104
  end
@@ -7,6 +7,7 @@ module Ddr
7
7
  affiliation: Valkyrie::Types::Set,
8
8
  aleph_id: Valkyrie::Types::Strict::String.optional,
9
9
  aspace_id: Valkyrie::Types::Strict::String.optional,
10
+ contentdm_id: Valkyrie::Types::Strict::String.optional,
10
11
  depositor: Valkyrie::Types::Strict::String.optional,
11
12
  display_format: Valkyrie::Types::Strict::String.optional,
12
13
  doi: Valkyrie::Types::Strict::String.optional,
@@ -54,6 +55,11 @@ module Ddr
54
55
  workflow_state == Ddr::Workflow::UNPUBLISHED
55
56
  end
56
57
 
58
+ # Usually won't be called directly. See `publishable?` on Resource and its derivatives
59
+ def nonpublishable?
60
+ workflow_state == Ddr::Workflow::NONPUBLISHABLE
61
+ end
62
+
57
63
  def resource_roles
58
64
  roles.select(&:in_resource_scope?)
59
65
  end
@@ -7,12 +7,24 @@ module Ddr
7
7
  attribute :parent_id, Valkyrie::Types::ID.optional
8
8
  end
9
9
 
10
+ def has_parent?
11
+ parent_id.present?
12
+ end
13
+
10
14
  def parent
11
- Ddr.query_service.find_by(id: parent_id) if parent_id
15
+ Ddr.query_service.find_by(id: parent_id) if has_parent?
12
16
  end
13
17
 
18
+ # Resources with parents (currently, Items and Components) are publishable only if they have not been marked
19
+ # nonpublishable and their parent is published
14
20
  def publishable?
15
- parent&.published? || false
21
+ !nonpublishable? && parental_publication_guard
22
+ end
23
+
24
+ private
25
+
26
+ def parental_publication_guard
27
+ parent.present? && parent.published?
16
28
  end
17
29
 
18
30
  end
@@ -0,0 +1,9 @@
1
+ module Ddr
2
+ module SearchBuilderBehavior
3
+
4
+ def effective_role_filter
5
+
6
+ end
7
+
8
+ end
9
+ end
@@ -0,0 +1,26 @@
1
+ module Ddr
2
+ class AdminSet < AuxiliaryResource
3
+
4
+ def self.call(obj)
5
+ find_by_code(obj.admin_set)
6
+ rescue ActiveResource::ResourceNotFound => e
7
+ raise Ddr::NotFoundError, e
8
+ end
9
+
10
+ def self.find_by_code(code)
11
+ return unless code
12
+ new get(:find, code: code)
13
+ end
14
+
15
+ def self.keys
16
+ with_cache("keys") do
17
+ all.map(&:code)
18
+ end
19
+ end
20
+
21
+ def to_s
22
+ title
23
+ end
24
+
25
+ end
26
+ end
@@ -0,0 +1,34 @@
1
+ require 'active_resource'
2
+
3
+ module Ddr
4
+ class AuxiliaryResourceCache < ActiveSupport::Cache::MemoryStore
5
+
6
+ def initialize
7
+ @_cache =
8
+ end
9
+
10
+ def with(key, &block)
11
+ begin
12
+ cache.set(key, block.call)
13
+ rescue ActiveResource::ServerError => e
14
+ if cache.key?(key)
15
+ Rails.logger.error(e)
16
+ cache.get(key)
17
+ else
18
+ raise
19
+ end
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def get(key)
26
+ @_cache[key]
27
+ end
28
+
29
+ def set(key, value)
30
+ @_cache[key] = value
31
+ end
32
+
33
+ end
34
+ end
@@ -0,0 +1,13 @@
1
+ require 'active_resource'
2
+
3
+ module Ddr
4
+ #
5
+ # Abstract superclass for resources bound to ddr-aux API data
6
+ #
7
+ class AuxiliaryResource < ActiveResource::Base
8
+
9
+ # ActiveResource freezes `site` in subclasses
10
+ self.site = Ddr.ddr_aux_api_url
11
+
12
+ end
13
+ end
@@ -0,0 +1,20 @@
1
+ module Ddr
2
+ module CacheableAuxiliaryResource
3
+
4
+ def with_cache(key, &block)
5
+ block.call.tap { |value| cache.write(key, value) }
6
+ rescue ActiveResource::ServerError => e
7
+ if value = cache.fetch(key)
8
+ logger.error(e) if logger
9
+ value
10
+ else
11
+ raise
12
+ end
13
+ end
14
+
15
+ def cache
16
+ @cache ||= ActiveSupport::Cache::MemoryStore.new
17
+ end
18
+
19
+ end
20
+ end
@@ -16,12 +16,13 @@ module Ddr
16
16
  query.docs
17
17
  end
18
18
 
19
- def targets
20
- Ddr.query_service.find_inverse_references_by(resource: self, property: 'for_collection_id')
19
+ # Collection resources are publishable unless they have been marked nonpublishable
20
+ def publishable?
21
+ !nonpublishable?
21
22
  end
22
23
 
23
- def publishable?
24
- true
24
+ def targets
25
+ Ddr.query_service.find_inverse_references_by(resource: self, property: 'for_collection_id')
25
26
  end
26
27
 
27
28
  end
@@ -29,5 +29,13 @@ module Ddr
29
29
  Ddr.query_service.find_by(id: target_id) if target_id
30
30
  end
31
31
 
32
+ def inherited_roles
33
+ if has_parent?
34
+ super | parent.policy_roles
35
+ else
36
+ super
37
+ end
38
+ end
39
+
32
40
  end
33
41
  end
@@ -90,6 +90,10 @@ module Ddr
90
90
  send(f)&.file_identifier.present?
91
91
  end
92
92
 
93
+ # By default, no resources are publishable. To enable publication of a particular class of resource, (1) include
94
+ # the `HasAdminMetadata` concern in the model class, which defines a `nonpublishable?` method which returns true
95
+ # if the workflow_state is "nonpublishable" and (2) override the `publishable?` method to provide the logic
96
+ # for determining if a particular resource is publishable.
93
97
  def publishable?
94
98
  false
95
99
  end
@@ -18,6 +18,8 @@ en:
18
18
  common_model_name:
19
19
  label: Model
20
20
  heading: model
21
+ contentdm_id:
22
+ label: "CONTENTdm ID"
21
23
  doi:
22
24
  label: DOI
23
25
  ead_id:
@@ -0,0 +1,9 @@
1
+ module Ddr::Auth
2
+ class DukePerson
3
+
4
+ def self.get(user)
5
+
6
+ end
7
+
8
+ end
9
+ end
@@ -2,6 +2,10 @@ module Ddr
2
2
  module Auth
3
3
  class PublicationAbilityDefinitions < AbilityDefinitions
4
4
 
5
+ # An object can't be published if it's already published or not publishable
6
+ # It can't be unpublished if it's already unpublished
7
+ # It can't be made nonpublishable if it's already published (must be unpublished
8
+ # first) or already nonpublishable
5
9
  def call
6
10
  cannot :publish, Ddr::Resource do |obj|
7
11
  obj.published? || !obj.publishable?
@@ -9,6 +13,9 @@ module Ddr
9
13
  cannot :unpublish, Ddr::Resource do |obj|
10
14
  !obj.published?
11
15
  end
16
+ cannot :make_nonpublishable, Ddr::Resource do |obj|
17
+ obj.published? || !obj.publishable?
18
+ end
12
19
  end
13
20
 
14
21
  end
@@ -1,6 +1,9 @@
1
1
  module Ddr::Auth
2
2
  class SuperuserAbilityDefinitions < AbilityDefinitions
3
3
 
4
+ # This bypasses all checks, including ones that look at whether an
5
+ # action is possible, not just allowed. So superusers may initiate
6
+ # actions which will fail.
4
7
  def call
5
8
  can :manage, :all
6
9
  end
@@ -0,0 +1,7 @@
1
+ module Ddr::Auth
2
+ class DukeDirectory
3
+
4
+
5
+
6
+ end
7
+ end
@@ -2,7 +2,7 @@ module Ddr::Auth
2
2
  class EffectiveRoles
3
3
 
4
4
  def self.call(obj, agents = nil)
5
- ( obj.resource_roles | obj.inherited_roles ).tap do |roles|
5
+ ( obj.roles | obj.inherited_roles ).tap do |roles|
6
6
  if agents
7
7
  roles.select! { |r| agents.include?(r.agent) }
8
8
  end
@@ -1,18 +1,21 @@
1
1
  module Ddr::Auth
2
2
  class Permissions
3
3
 
4
- READ = :read
5
- DOWNLOAD = :download
6
- ADD_CHILDREN = :add_children
7
- UPDATE = :update
8
- REPLACE = :replace
9
- ARRANGE = :arrange
10
- PUBLISH = :publish
11
- UNPUBLISH = :unpublish
12
- AUDIT = :audit
13
- GRANT = :grant
4
+ DISCOVER = :discover
5
+ READ = :read
6
+ DOWNLOAD = :download
7
+ ADD_CHILDREN = :add_children
8
+ UPDATE = :update
9
+ REPLACE = :replace
10
+ ARRANGE = :arrange
11
+ PUBLISH = :publish
12
+ UNPUBLISH = :unpublish
13
+ MAKE_NONPUBLISHABLE = :make_nonpublishable
14
+ AUDIT = :audit
15
+ GRANT = :grant
14
16
 
15
- ALL = [ READ, DOWNLOAD, ADD_CHILDREN, UPDATE, REPLACE, ARRANGE, PUBLISH, UNPUBLISH, AUDIT, GRANT ]
17
+ ALL = [ DISCOVER, READ, DOWNLOAD, ADD_CHILDREN, UPDATE,
18
+ REPLACE, ARRANGE, PUBLISH, UNPUBLISH, MAKE_NONPUBLISHABLE, AUDIT, GRANT ]
16
19
 
17
20
  end
18
21
  end
@@ -12,7 +12,7 @@ module Ddr
12
12
  end
13
13
 
14
14
  def enforce_show_permissions
15
- authorize! :read, params[:id]
15
+ authorize! Permissions::DISCOVER, params[:id]
16
16
  end
17
17
 
18
18
  end
@@ -10,18 +10,30 @@ module Ddr::Auth
10
10
 
11
11
  RESOURCE_SCOPE = "resource".freeze
12
12
  POLICY_SCOPE = "policy".freeze
13
- SCOPES = [RESOURCE_SCOPE, POLICY_SCOPE].freeze
13
+ SCOPES = [ RESOURCE_SCOPE, POLICY_SCOPE ].freeze
14
+
15
+ ORDERED_ROLE_TYPES = [
16
+ CURATOR,
17
+ EDITOR,
18
+ METADATA_EDITOR,
19
+ CONTRIBUTOR,
20
+ DOWNLOADER,
21
+ VIEWER,
22
+ METADATA_VIEWER
23
+ ]
14
24
 
15
25
  class << self
16
-
17
26
  def type_map
18
27
  @type_map ||= role_types.map { |role_type| [role_type.to_s, role_type] }.to_h
19
28
  end
20
29
 
21
30
  def role_types
22
- @role_types ||= RoleTypes.constants(false).map { |const| RoleTypes.const_get(const) }
31
+ ORDERED_ROLE_TYPES
23
32
  end
24
33
 
34
+ def titles
35
+ @titles ||= role_types.map(&:title)
36
+ end
25
37
  end
26
38
 
27
39
  end
@@ -8,35 +8,38 @@ module Ddr
8
8
 
9
9
  DEFAULT_SCOPE = Roles::RESOURCE_SCOPE
10
10
 
11
- ValidScope = Valkyrie::Types::Strict::String.enum(*(Roles::SCOPES))
12
- ValidRoleType = Valkyrie::Types::Strict::String.enum(*(Roles::role_types.map(&:title)))
11
+ ValidScope = Valkyrie::Types::Coercible::String.default(DEFAULT_SCOPE).enum(*(Roles::SCOPES))
12
+ ValidRoleType = Valkyrie::Types::Strict::String.enum(*(Roles.titles))
13
+ ValidAgent = Valkyrie::Types::Coercible::String.constrained(min_size: 1)
13
14
 
14
- attribute :agent, Valkyrie::Types::Strict::String.constrained(min_size: 1)
15
- attribute :role_type, ValidRoleType
16
- attribute :scope, ValidScope
17
-
18
- class << self
19
-
20
- # Build a Role instance from hash attributes
21
- # @param args [Hash] the attributes
22
- # @return [Role] the role
23
- # @example
24
- # Role.build type: "Curator", agent: "bob", scope: "resource"
25
- def build(args={})
26
- new.tap do |role|
27
- args[:role_type] ||= args.delete(:type)
28
- args[:agent] ||= nil # Triggers a constraint error
29
- args[:agent] = args[:agent].to_s # Coerce Ddr::Auth:Group to string
30
-
31
- args.each do |attr, val|
32
- role.set_value(attr, val)
33
- end
15
+ # Symbolize input keys
16
+ # https://dry-rb.org/gems/dry-struct/1.0/recipes/#symbolize-input-keys
17
+ transform_keys do |key|
18
+ _k = key.to_sym
19
+ # For backwards compat allow :type as an alias for :role_type
20
+ _k == :type ? :role_type : _k
21
+ end
34
22
 
35
- role.scope ||= DEFAULT_SCOPE
23
+ # Make nils use default values
24
+ # https://dry-rb.org/gems/dry-struct/1.0/recipes/#resolving-default-values-on-code-nil-code
25
+ transform_types do |type|
26
+ if type.default?
27
+ type.constructor do |value|
28
+ value.nil? ? Dry::Types::Undefined : value
36
29
  end
30
+ else
31
+ type
37
32
  end
33
+ end
38
34
 
39
- end # class << self
35
+ attribute :agent, ValidAgent
36
+ attribute :role_type, ValidRoleType
37
+ attribute :scope, ValidScope
38
+
39
+ # DEPRECATED: Use constructor
40
+ def self.build(args={})
41
+ new(args)
42
+ end
40
43
 
41
44
  # Roles are considered equal (==) if they
42
45
  # are of the same type and have the same agent and scope.
@@ -14,36 +14,43 @@ module Ddr
14
14
  "Editor",
15
15
  "The Editor role conveys reponsibility for managing the content, " \
16
16
  "description and structural arrangement of a resource.",
17
- [ Permissions::READ, Permissions::DOWNLOAD, Permissions::ADD_CHILDREN,
18
- Permissions::UPDATE, Permissions::REPLACE, Permissions::ARRANGE ]
17
+ [ Permissions::DISCOVER, Permissions::READ, Permissions::DOWNLOAD,
18
+ Permissions::ADD_CHILDREN, Permissions::UPDATE,
19
+ Permissions::REPLACE, Permissions::ARRANGE ]
19
20
  )
20
21
 
21
22
  METADATA_EDITOR = RoleType.new(
22
23
  "MetadataEditor",
23
24
  "The Metadata Editor role conveys responsibility for " \
24
25
  "managing the description of a resource.",
25
- [ Permissions::READ, Permissions::DOWNLOAD, Permissions::UPDATE ]
26
+ [ Permissions::DISCOVER, Permissions::READ, Permissions::DOWNLOAD, Permissions::UPDATE ]
26
27
  )
27
28
 
28
29
  CONTRIBUTOR = RoleType.new(
29
30
  "Contributor",
30
31
  "The Contributor role conveys responsibility for adding related " \
31
32
  "resources to a resource, such as works to a collection.",
32
- [ Permissions::READ, Permissions::ADD_CHILDREN ]
33
+ [ Permissions::DISCOVER, Permissions::READ, Permissions::ADD_CHILDREN ]
33
34
  )
34
35
 
35
36
  DOWNLOADER = RoleType.new(
36
37
  "Downloader",
37
38
  "The Downloader role conveys access to the \"master\" file " \
38
39
  "(original content bitstream) of a resource.",
39
- [ Permissions::READ, Permissions::DOWNLOAD ]
40
+ [ Permissions::DISCOVER, Permissions::READ, Permissions::DOWNLOAD ]
40
41
  )
41
42
 
42
43
  VIEWER = RoleType.new(
43
44
  "Viewer",
44
45
  "The Viewer role conveys access to the description and \"access\" " \
45
46
  "files (e.g., derivative bitstreams) of a resource.",
46
- [ Permissions::READ ]
47
+ [ Permissions::DISCOVER, Permissions::READ ]
48
+ )
49
+
50
+ METADATA_VIEWER = RoleType.new(
51
+ "MetadataViewer",
52
+ "The MetadataViewer role coveys access to the description of a resource.",
53
+ [ Permissions::DISCOVER ]
47
54
  )
48
55
 
49
56
  end
@@ -1,5 +1,5 @@
1
1
  module Ddr
2
2
  module Core
3
- VERSION = '1.1.2'
3
+ VERSION = '1.2.0.rc1'
4
4
  end
5
5
  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,6 +29,7 @@ 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
@@ -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: 1.1.2
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: 2020-02-07 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
@@ -306,6 +306,7 @@ files:
306
306
  - app/assets/config/ddr_core_manifest.js
307
307
  - app/controllers/users/omniauth_callbacks_controller.rb
308
308
  - app/controllers/users/sessions_controller.rb
309
+ - app/models/concerns/ddr/#search_builder_behavior.rb#
309
310
  - app/models/concerns/ddr/captionable.rb
310
311
  - app/models/concerns/ddr/describable.rb
311
312
  - app/models/concerns/ddr/governable.rb
@@ -319,12 +320,17 @@ files:
319
320
  - app/models/concerns/ddr/has_parent.rb
320
321
  - app/models/concerns/ddr/has_struct_metadata.rb
321
322
  - app/models/concerns/ddr/has_thumbnail.rb
323
+ - app/models/concerns/ddr/search_builder_behavior.rb~
322
324
  - app/models/concerns/ddr/solr_document_behavior.rb
323
325
  - app/models/concerns/ddr/streamable.rb
326
+ - app/models/ddr/#admin_set.rb#
327
+ - app/models/ddr/#auxiliary_resource_cache.rb#
324
328
  - app/models/ddr/admin_set.rb
325
329
  - app/models/ddr/alert.rb
326
330
  - app/models/ddr/attachment.rb
327
331
  - app/models/ddr/auxiliary_resource.rb
332
+ - app/models/ddr/auxiliary_resource.rb~
333
+ - app/models/ddr/cacheable_auxiliary_resource.rb~
328
334
  - app/models/ddr/collection.rb
329
335
  - app/models/ddr/component.rb
330
336
  - app/models/ddr/contact.rb
@@ -345,6 +351,7 @@ files:
345
351
  - db/migrate/20200207194453_add_default_to_lock_version.rb
346
352
  - lib/ddr-core.rb
347
353
  - lib/ddr/auth.rb
354
+ - lib/ddr/auth/#duke_person.rb#
348
355
  - lib/ddr/auth/ability.rb
349
356
  - lib/ddr/auth/ability_definitions.rb
350
357
  - lib/ddr/auth/ability_definitions/admin_set_ability_definitions.rb
@@ -365,6 +372,7 @@ files:
365
372
  - lib/ddr/auth/auth_context.rb
366
373
  - lib/ddr/auth/auth_context_factory.rb
367
374
  - lib/ddr/auth/detached_auth_context.rb
375
+ - lib/ddr/auth/duke_directory.rb~
368
376
  - lib/ddr/auth/dynamic_groups.rb
369
377
  - lib/ddr/auth/effective_permissions.rb
370
378
  - lib/ddr/auth/effective_roles.rb
@@ -450,11 +458,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
450
458
  version: '0'
451
459
  required_rubygems_version: !ruby/object:Gem::Requirement
452
460
  requirements:
453
- - - ">="
461
+ - - ">"
454
462
  - !ruby/object:Gem::Version
455
- version: '0'
463
+ version: 1.3.1
456
464
  requirements: []
457
- rubygems_version: 3.0.6
465
+ rubygems_version: 3.0.8
458
466
  signing_key:
459
467
  specification_version: 4
460
468
  summary: Models used in the Duke Digital Repository