hyrax 3.4.0 → 3.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.dassie/.env +2 -1
- data/.dassie/db/seeds.rb +70 -15
- data/.github/release.yml +26 -0
- data/app/services/hyrax/collections/nested_collection_query_service.rb +1 -1
- data/app/utils/hyrax/data_destroyers/collection_branding_destroyer.rb +29 -0
- data/app/utils/hyrax/data_destroyers/collection_types_destroyer.rb +26 -0
- data/app/utils/hyrax/data_destroyers/default_admin_set_id_cache_destroyer.rb +26 -0
- data/app/utils/hyrax/data_destroyers/featured_works_destroyer.rb +27 -0
- data/app/utils/hyrax/data_destroyers/permission_templates_destroyer.rb +30 -0
- data/app/utils/hyrax/data_destroyers/repository_metadata_destroyer.rb +42 -0
- data/app/utils/hyrax/data_destroyers/stats_destroyer.rb +33 -0
- data/app/utils/hyrax/data_maintenance.rb +51 -0
- data/app/utils/hyrax/required_data_seeder.rb +21 -0
- data/app/utils/hyrax/required_data_seeders/collection_seeder.rb +26 -0
- data/app/utils/hyrax/required_data_seeders/collection_type_seeder.rb +36 -0
- data/app/utils/hyrax/test_data_seeder.rb +24 -0
- data/app/utils/hyrax/test_data_seeders/collection_seeder.rb +91 -0
- data/app/utils/hyrax/test_data_seeders/collection_type_seeder.rb +72 -0
- data/app/utils/hyrax/test_data_seeders/user_seeder.rb +52 -0
- data/app/views/hyrax/my/_facet_pagination.html.erb +12 -9
- data/documentation/developing-your-hyrax-based-app.md +1 -1
- data/documentation/legacyREADME.md +1 -1
- data/lib/hyrax/schema.rb +16 -13
- data/lib/hyrax/version.rb +1 -1
- data/lib/wings/valkyrie/persister.rb +2 -0
- data/template.rb +1 -1
- metadata +18 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 865d623446e36dc64e73cf82ef855955e83d8d8f730a65f439b9b89664641c3f
|
4
|
+
data.tar.gz: 87aec067e009093bbd119d6d39639c5c6927b2b26173088ca7000b1241f71caa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d75dbf03372ee072f394a88af8449ff947ff42b21de9b10a83428ac98af5d01783f21e7f123ee00e3c0dd7b6d3808d4e7d59f0238e1fda703da8358d2b567447
|
7
|
+
data.tar.gz: 6dae952fde3a2f2fdc329775d8efe14929e23c0f92284d1848abfa8a7a8a041e4b5a197a4fa0581d3934ddc9267d0e3ca64c455a5f65b81f5287bde8110fb19e
|
data/.dassie/.env
CHANGED
data/.dassie/db/seeds.rb
CHANGED
@@ -1,22 +1,77 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
# Examples:
|
5
|
-
#
|
6
|
-
# movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }])
|
7
|
-
# Character.create(name: 'Luke', movie: movies.first)
|
1
|
+
wipe_data = ActiveModel::Type::Boolean.new.cast(ENV.fetch('WIPE_DATA', false))
|
2
|
+
seed_release_testing = ActiveModel::Type::Boolean.new.cast(ENV.fetch('SEED_RELEASE_TESTING', false))
|
3
|
+
seed_dassie = ActiveModel::Type::Boolean.new.cast(ENV.fetch('SEED_DASSIE', false))
|
8
4
|
|
9
|
-
|
5
|
+
unless wipe_data || seed_release_testing
|
6
|
+
puts 'NAME'
|
7
|
+
puts ' rails db:seed (Hyrax)'
|
8
|
+
puts
|
9
|
+
puts 'SYNOPSIS'
|
10
|
+
puts ' bundle exec rails db:seed [WIPE_DATA=true|false] [SEED_RELEASE_TESTING=true|false] [SEED_DASSIE=true|false]'
|
11
|
+
puts
|
12
|
+
puts 'DESCRIPTION'
|
13
|
+
puts ' Hyrax defined db:seed provides a means to clear repository metadata from the datastore (e.g. Fedora, Postgres) and from Solr.'
|
14
|
+
puts ' Seeds can be run to pre-populate metadata to help with release testing and local development testing.'
|
15
|
+
puts
|
16
|
+
puts ' NOTE: Options can be passed in with the command on the command line or set as ENV variables.'
|
17
|
+
puts
|
18
|
+
puts ' The options are as follows:'
|
19
|
+
puts
|
20
|
+
puts ' WIPE_DATA'
|
21
|
+
puts ' USE WITH CAUTION - Deleted data cannot be recovered.'
|
22
|
+
puts
|
23
|
+
puts ' When true, it will clear all repository metadata from the datastore (e.g. Fedora, Postgres) and from Solr. It also'
|
24
|
+
puts ' clears data from the application database that are tightly coupled to repository metadata. See Hyrax::DataMaintenance'
|
25
|
+
puts ' for more information on what data will be destroyed by this process.'
|
26
|
+
puts
|
27
|
+
puts ' The wipe_data process will also restore required repository metadata including collection types and the default admin'
|
28
|
+
puts ' set. See Hyrax::RequiredDataSeeder for more information on what data will be created by this process.'
|
29
|
+
puts
|
30
|
+
puts ' SEED_RELEASE_TESTING'
|
31
|
+
puts ' When true, it will run the set of seeds for release testing creating a repository metadata and support data, including'
|
32
|
+
puts ' test users, collection types, collections, and works with and without files. See Hyrax::TestDataSeeder for more information'
|
33
|
+
puts ' on what data will be created by this process.'
|
34
|
+
puts
|
35
|
+
puts ' SEED_DASSIE'
|
36
|
+
puts ' When true, it will run a minimal set of seeds for dassie test app, including required collection types, default admin set,'
|
37
|
+
puts ' and test users.'
|
38
|
+
puts
|
39
|
+
puts ' ALLOW_RELEASE_SEEDING_IN_PRODUCTION'
|
40
|
+
puts ' USE WITH EXTERME CAUTION WHEN USED IN PRODUCTION - Deleted data cannot be recovered. Attempts are made to not overwrite'
|
41
|
+
puts ' existing data, but use in production is not recommended.'
|
42
|
+
puts
|
43
|
+
puts ' If this is NOT true, the process will abort when Rails environment is production.'
|
44
|
+
puts
|
45
|
+
end
|
46
|
+
|
47
|
+
allow_release_seeding_in_production = ActiveModel::Type::Boolean.new.cast(ENV.fetch('ALLOW_RELEASE_SEEDING_IN_PRODUCTION', false))
|
48
|
+
|
49
|
+
if Rails.env == 'production' && !allow_release_seeding_in_production
|
50
|
+
puts "Seeding data for release testing is not for use in production!"
|
51
|
+
exit
|
52
|
+
end
|
53
|
+
|
54
|
+
if wipe_data
|
55
|
+
puts '####################################################################################'
|
56
|
+
puts
|
57
|
+
puts 'WARNING: You are about to clear all repository metadata from the datastore and solr.'
|
58
|
+
puts 'Are you sure? [YES|n]'
|
59
|
+
answer = STDIN.gets.chomp
|
60
|
+
unless answer == 'YES'
|
61
|
+
puts ' Aborting!'
|
62
|
+
puts '####################################################################################'
|
63
|
+
exit
|
64
|
+
end
|
10
65
|
|
11
|
-
|
12
|
-
|
13
|
-
f.password = 'admin_password'
|
66
|
+
Hyrax::DataMaintenance.new.destroy_repository_metadata_and_related_data
|
67
|
+
Hyrax::RequiredDataSeeder.new.generate_seed_data
|
14
68
|
end
|
15
69
|
|
16
|
-
|
17
|
-
|
70
|
+
if seed_dassie
|
71
|
+
Hyrax::RequiredDataSeeder.new.generate_seed_data
|
72
|
+
Hyrax::TestDataSeeders::UserSeeder.generate_seeds
|
18
73
|
end
|
19
74
|
|
20
|
-
|
21
|
-
|
75
|
+
if seed_release_testing
|
76
|
+
Hyrax::TestDataSeeder.new.generate_seed_data
|
22
77
|
end
|
data/.github/release.yml
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
changelog:
|
2
|
+
categories:
|
3
|
+
- title: Major Changes (Potentially breaking changes)
|
4
|
+
labels:
|
5
|
+
- notes-major
|
6
|
+
- title: New Features
|
7
|
+
labels:
|
8
|
+
- notes-minor
|
9
|
+
- title: Deprecations
|
10
|
+
labels:
|
11
|
+
- notes-deprecation
|
12
|
+
- title: Bug Fixes
|
13
|
+
labels:
|
14
|
+
- notes-bugfix
|
15
|
+
- title: Valkyrie Progress
|
16
|
+
labels:
|
17
|
+
- notes-valkyrie
|
18
|
+
- title: Documentation
|
19
|
+
labels:
|
20
|
+
- notes-docs
|
21
|
+
- title: Containerization
|
22
|
+
labels:
|
23
|
+
- notes-container
|
24
|
+
- title: Other
|
25
|
+
labels:
|
26
|
+
- "*"
|
@@ -171,7 +171,7 @@ module Hyrax
|
|
171
171
|
# @return [Fixnum] the largest number of collections in a path nested
|
172
172
|
# under this collection (including this collection)
|
173
173
|
def self.child_nesting_depth(child:, scope:)
|
174
|
-
return 1
|
174
|
+
return 1 unless child
|
175
175
|
# The nesting depth of a child collection is found by finding the largest nesting depth
|
176
176
|
# among all collections and works which have the child collection in the paths, and
|
177
177
|
# subtracting the nesting depth of the child collection itself.
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Hyrax
|
3
|
+
module DataDestroyers
|
4
|
+
# Collection branding info is tightly coupled to collections. When they are
|
5
|
+
# removed using wipe!, the associated database entries for collection branding
|
6
|
+
# also have to be deleted.
|
7
|
+
#
|
8
|
+
# @note WARNING: DO NOT USE IN PRODUCTION! The methods in this class are destructive.
|
9
|
+
# Data can not be recovered.
|
10
|
+
#
|
11
|
+
# @todo This destroys branding info in the database. Should it also delete
|
12
|
+
# related banner and logo files?
|
13
|
+
class CollectionBrandingDestroyer
|
14
|
+
class << self
|
15
|
+
attr_accessor :logger
|
16
|
+
|
17
|
+
def destroy_data(logger: Logger.new(STDOUT), allow_destruction_in_production: false)
|
18
|
+
raise("CollectionBrandingDestroyer is not for use in production!") if Rails.env.production? && !allow_destruction_in_production
|
19
|
+
@logger = logger
|
20
|
+
|
21
|
+
logger.info("Destroying collection branding...")
|
22
|
+
|
23
|
+
Hyrax::CollectionBrandingInfo.destroy_all
|
24
|
+
logger.info(" collection branding -- DESTROYED")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Hyrax
|
3
|
+
module DataDestroyers
|
4
|
+
# Collection types are recreated by the release seed data. Clear out here to
|
5
|
+
# start with a fresh set.
|
6
|
+
#
|
7
|
+
# @note WARNING: DO NOT USE IN PRODUCTION! The methods in this class are destructive.
|
8
|
+
# Data can not be recovered.
|
9
|
+
#
|
10
|
+
class CollectionTypesDestroyer
|
11
|
+
class << self
|
12
|
+
attr_accessor :logger
|
13
|
+
|
14
|
+
def destroy_data(logger: Logger.new(STDOUT), allow_destruction_in_production: false)
|
15
|
+
raise("CollectionTypesDestroyer is not for use in production!") if Rails.env.production? && !allow_destruction_in_production
|
16
|
+
@logger = logger
|
17
|
+
|
18
|
+
logger.info("Destroying collection types...")
|
19
|
+
|
20
|
+
Hyrax::CollectionType.destroy_all
|
21
|
+
logger.info(" collection types -- DESTROYED")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Hyrax
|
3
|
+
module DataDestroyers
|
4
|
+
# When the default admin set is removed using wipe!, the cache of the default
|
5
|
+
# admin set id also needs to be deleted.
|
6
|
+
#
|
7
|
+
# @note WARNING: DO NOT USE IN PRODUCTION! The methods in this class are destructive.
|
8
|
+
# Data can not be recovered.
|
9
|
+
#
|
10
|
+
class DefaultAdminSetIdCacheDestroyer
|
11
|
+
class << self
|
12
|
+
attr_accessor :logger
|
13
|
+
|
14
|
+
def destroy_data(logger: Logger.new(STDOUT), allow_destruction_in_production: false)
|
15
|
+
raise("DefaultAdminSetIdCacheDestroyer is not for use in production!") if Rails.env.production? && !allow_destruction_in_production
|
16
|
+
@logger = logger
|
17
|
+
|
18
|
+
logger.info("Destroying default admin set id cache...")
|
19
|
+
|
20
|
+
Hyrax::DefaultAdministrativeSet.destroy_all
|
21
|
+
logger.info(" default admin set id cache -- DESTROYED")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Hyrax
|
3
|
+
module DataDestroyers
|
4
|
+
# Featured works are tightly coupled to works in the repository. When they
|
5
|
+
# are removed using wipe!, the associated database entries for featured
|
6
|
+
# works also need to be deleted.
|
7
|
+
#
|
8
|
+
# @note WARNING: DO NOT USE IN PRODUCTION! The methods in this class are destructive.
|
9
|
+
# Data can not be recovered.
|
10
|
+
#
|
11
|
+
class FeaturedWorksDestroyer
|
12
|
+
class << self
|
13
|
+
attr_accessor :logger
|
14
|
+
|
15
|
+
def destroy_data(logger: Logger.new(STDOUT), allow_destruction_in_production: false)
|
16
|
+
raise("FeaturedWorksDestroyer is not for use in production!") if Rails.env.production? && !allow_destruction_in_production
|
17
|
+
@logger = logger
|
18
|
+
|
19
|
+
logger.info("Destroying featured works...")
|
20
|
+
|
21
|
+
FeaturedWork.destroy_all
|
22
|
+
logger.info(" featured works -- DESTROYED")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Hyrax
|
3
|
+
module DataDestroyers
|
4
|
+
# PermissionTemplates are tightly coupled to admin sets and collections.
|
5
|
+
# When they are removed using wipe!, the associated database entries for
|
6
|
+
# permission templates also have to be deleted.
|
7
|
+
#
|
8
|
+
# @note WARNING: DO NOT USE IN PRODUCTION! The methods in this class are destructive.
|
9
|
+
# Data can not be recovered.
|
10
|
+
#
|
11
|
+
class PermissionTemplatesDestroyer
|
12
|
+
class << self
|
13
|
+
attr_accessor :logger
|
14
|
+
|
15
|
+
def destroy_data(logger: Logger.new(STDOUT), allow_destruction_in_production: false)
|
16
|
+
raise("PermissionTemplatesDestroyer is not for use in production!") if Rails.env.production? && !allow_destruction_in_production
|
17
|
+
@logger = logger
|
18
|
+
|
19
|
+
logger.info("Destroying permission templates...")
|
20
|
+
|
21
|
+
Hyrax::PermissionTemplateAccess.destroy_all
|
22
|
+
logger.info(" permission templates access -- DESTROYED")
|
23
|
+
|
24
|
+
Hyrax::PermissionTemplate.destroy_all
|
25
|
+
logger.info(" permission templates -- DESTROYED")
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Hyrax
|
3
|
+
module DataDestroyers
|
4
|
+
# Clear all repository metadata from the datastore (e.g. Fedora, Postgres)
|
5
|
+
# and from Solr.
|
6
|
+
#
|
7
|
+
# @note WARNING: DO NOT USE IN PRODUCTION! The methods in this class are destructive.
|
8
|
+
# Data can not be recovered.
|
9
|
+
#
|
10
|
+
# @note When using Wings adapter, which wraps ActiveFedora, the persister wipe!
|
11
|
+
# method clears both Fedora and Solr. Optionally, an index_adapter may also
|
12
|
+
# be set to use Valkyrie to write to a second Solr core. If the Hyrax index
|
13
|
+
# adapter is the NullIndexingAdapter, that means that Valkyrie is not being
|
14
|
+
# used to index the repository metadata and does not need to be cleared using
|
15
|
+
# the Hyrax index adapter.
|
16
|
+
#
|
17
|
+
# When using other Valkyrie persistence adapters, wipe! only clears the repository
|
18
|
+
# metadata from the datastore (e.g. ORM table in Postgres). The index adapter
|
19
|
+
# is used to clear metadata from Solr.
|
20
|
+
#
|
21
|
+
class RepositoryMetadataDestroyer
|
22
|
+
class << self
|
23
|
+
attr_accessor :logger
|
24
|
+
|
25
|
+
def destroy_metadata(logger: Logger.new(STDOUT), allow_destruction_in_production: false)
|
26
|
+
raise("RepositoryMetadataDestroyer is not for use in production!") if Rails.env.production? && !allow_destruction_in_production
|
27
|
+
@logger = logger
|
28
|
+
|
29
|
+
logger.info("Destroying all repository metadata...")
|
30
|
+
|
31
|
+
unless Hyrax.index_adapter.is_a? Valkyrie::Indexing::NullIndexingAdapter
|
32
|
+
conn = Hyrax.index_adapter.connection
|
33
|
+
conn.delete_by_query('*:*', params: { 'softCommit' => true })
|
34
|
+
end
|
35
|
+
Hyrax.persister.wipe!
|
36
|
+
|
37
|
+
logger.info(" repository metadata -- DESTROYED")
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Hyrax
|
3
|
+
module DataDestroyers
|
4
|
+
# Stats are tightly coupled to works and files in the repository. When they
|
5
|
+
# are removed using wipe!, the associated database entries for stats also
|
6
|
+
# need to be deleted.
|
7
|
+
#
|
8
|
+
# @note WARNING: DO NOT USE IN PRODUCTION! The methods in this class are destructive.
|
9
|
+
# Data can not be recovered.
|
10
|
+
#
|
11
|
+
class StatsDestroyer
|
12
|
+
class << self
|
13
|
+
attr_accessor :logger
|
14
|
+
|
15
|
+
def destroy_data(logger: Logger.new(STDOUT), allow_destruction_in_production: false)
|
16
|
+
raise("StatsDataDestroyer is not for use in production!") if Rails.env.production? && !allow_destruction_in_production
|
17
|
+
@logger = logger
|
18
|
+
|
19
|
+
logger.info("Destroying stats...")
|
20
|
+
|
21
|
+
FileDownloadStat.destroy_all
|
22
|
+
logger.info(" file download stats -- DESTROYED")
|
23
|
+
|
24
|
+
FileViewStat.destroy_all
|
25
|
+
logger.info(" file view stats -- DESTROYED")
|
26
|
+
|
27
|
+
WorkViewStat.destroy_all
|
28
|
+
logger.info(" work view stats -- DESTROYED")
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Hyrax
|
4
|
+
##
|
5
|
+
# These methods created for use in rake tasks and db/seeds.rb They can be used to:
|
6
|
+
# * clear repository metadata and related data and files
|
7
|
+
# * clear temporary files
|
8
|
+
# * clear logs
|
9
|
+
#
|
10
|
+
# @note WARNING: DO NOT USE IN PRODUCTION! The methods in this class are destructive.
|
11
|
+
# Data can not be recovered.
|
12
|
+
#
|
13
|
+
class DataMaintenance
|
14
|
+
attr_accessor :logger, :allow_destruction_in_production
|
15
|
+
|
16
|
+
def initialize(logger: Logger.new(STDOUT), allow_destruction_in_production: false)
|
17
|
+
raise("Destruction of data is not for use in production!") if Rails.env.production? && !allow_destruction_in_production
|
18
|
+
@logger = logger
|
19
|
+
@allow_destruction_in_production = allow_destruction_in_production
|
20
|
+
end
|
21
|
+
|
22
|
+
# Clear repository metadata and related data
|
23
|
+
# * clear repository metadata from the datastore (e.g. Fedora, Postgres) and from Solr
|
24
|
+
# * clear targeted application data that is tightly coupled to repository metadata
|
25
|
+
# * delete files that are tightly coupled to repository metadata
|
26
|
+
def destroy_repository_metadata_and_related_data
|
27
|
+
Hyrax::DataDestroyers::RepositoryMetadataDestroyer.destroy_metadata(logger: logger, allow_destruction_in_production: allow_destruction_in_production)
|
28
|
+
Hyrax::DataDestroyers::StatsDestroyer.destroy_data(logger: logger, allow_destruction_in_production: allow_destruction_in_production)
|
29
|
+
Hyrax::DataDestroyers::FeaturedWorksDestroyer.destroy_data(logger: logger, allow_destruction_in_production: allow_destruction_in_production)
|
30
|
+
Hyrax::DataDestroyers::PermissionTemplatesDestroyer.destroy_data(logger: logger, allow_destruction_in_production: allow_destruction_in_production)
|
31
|
+
Hyrax::DataDestroyers::CollectionBrandingDestroyer.destroy_data(logger: logger, allow_destruction_in_production: allow_destruction_in_production)
|
32
|
+
Hyrax::DataDestroyers::DefaultAdminSetIdCacheDestroyer.destroy_data(logger: logger, allow_destruction_in_production: allow_destruction_in_production)
|
33
|
+
Hyrax::DataDestroyers::CollectionTypesDestroyer.destroy_data(logger: logger, allow_destruction_in_production: allow_destruction_in_production)
|
34
|
+
|
35
|
+
# TODO: Stubbed until RepositoryFilesDestroyer is written
|
36
|
+
# Hyrax::DataDestroyers::RepositoryFilesDestroyer.destroy_data(logger: logger, allow_destruction_in_production: allow_destruction_in_production)
|
37
|
+
end
|
38
|
+
|
39
|
+
# @todo write code to clear out log files
|
40
|
+
def destroy_log_files
|
41
|
+
# Stubbed until LogFilesDestroyer is written
|
42
|
+
# Hyrax::DataDestroyers::LogFilesDestroyer.destroy_data(logger: logger, allow_destruction_in_production: allow_destruction_in_production)
|
43
|
+
end
|
44
|
+
|
45
|
+
# @todo write code to delete tmp files
|
46
|
+
def destroy_tmp_files
|
47
|
+
# Stubbed until TmpFilesDestroyer is written
|
48
|
+
# Hyrax::DataDestroyers::TmpFilesDestroyer.destroy_data(logger: logger, allow_destruction_in_production: allow_destruction_in_production)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Hyrax
|
3
|
+
# This class was created for use in rake tasks and db/seeds.rb. It generates
|
4
|
+
# required repository metadata including Admin Set and User collection types and
|
5
|
+
# the default admin set.
|
6
|
+
#
|
7
|
+
# Seeders of required data are non-destructive. If the data already exists,
|
8
|
+
# it will not be replaced.
|
9
|
+
class RequiredDataSeeder
|
10
|
+
attr_accessor :logger
|
11
|
+
|
12
|
+
def initialize(logger: Logger.new(STDOUT))
|
13
|
+
@logger = logger
|
14
|
+
end
|
15
|
+
|
16
|
+
def generate_seed_data
|
17
|
+
Hyrax::RequiredDataSeeders::CollectionTypeSeeder.generate_seeds(logger: logger)
|
18
|
+
Hyrax::RequiredDataSeeders::CollectionSeeder.generate_seeds(logger: logger)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
# frozen_string_literal: true
|
4
|
+
module Hyrax
|
5
|
+
module RequiredDataSeeders
|
6
|
+
# This class was created for use in rake tasks and db/seeds.rb. It generates
|
7
|
+
# collections that are required for all Hyrax applications.
|
8
|
+
#
|
9
|
+
# Seeders of required data are non-destructive. If the data already exists,
|
10
|
+
# it will not be replaced.
|
11
|
+
class CollectionSeeder
|
12
|
+
class << self
|
13
|
+
attr_accessor :logger
|
14
|
+
|
15
|
+
def generate_seeds(logger: Logger.new(STDOUT))
|
16
|
+
@logger = logger
|
17
|
+
|
18
|
+
logger.info("Adding required collections...")
|
19
|
+
|
20
|
+
default_admin_set = Hyrax::AdminSetCreateService.find_or_create_default_admin_set
|
21
|
+
logger.info " #{default_admin_set.title.first} -- FOUND OR CREATED"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Hyrax
|
3
|
+
module RequiredDataSeeders
|
4
|
+
# This class was created for use in rake tasks and db/seeds.rb. It generates
|
5
|
+
# collection types that are required for all Hyrax applications.
|
6
|
+
#
|
7
|
+
# Seeders of required data are non-destructive. If the data already exists,
|
8
|
+
# it will not be replaced.
|
9
|
+
class CollectionTypeSeeder
|
10
|
+
class << self
|
11
|
+
attr_accessor :logger
|
12
|
+
|
13
|
+
def generate_seeds(logger: Logger.new(STDOUT))
|
14
|
+
@logger = logger
|
15
|
+
|
16
|
+
logger.info("Adding required collection types...")
|
17
|
+
|
18
|
+
as_ct = Hyrax::CollectionType.find_or_create_admin_set_type
|
19
|
+
set_badge_color(as_ct, '#990000')
|
20
|
+
logger.info(" #{as_ct.title} -- FOUND OR CREATED")
|
21
|
+
|
22
|
+
user_ct = Hyrax::CollectionType.find_or_create_default_collection_type
|
23
|
+
set_badge_color(user_ct, '#0099cc')
|
24
|
+
logger.info(" #{user_ct.title} -- FOUND OR CREATED")
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def set_badge_color(collection_type, badge_color = nil)
|
30
|
+
collection_type.badge_color = badge_color
|
31
|
+
collection_type.save
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Hyrax
|
4
|
+
# This class was created for use in rake tasks and db/seeds.rb. It generates
|
5
|
+
# repository metadata needed for release testing. This data can also be helpful
|
6
|
+
# for local development testing.
|
7
|
+
class TestDataSeeder
|
8
|
+
attr_accessor :logger, :allow_seeding_in_production
|
9
|
+
|
10
|
+
def initialize(logger: Logger.new(STDOUT), allow_seeding_in_production: false)
|
11
|
+
raise("TestDataSeeder is not for use in production!") if Rails.env.production? && !allow_seeding_in_production
|
12
|
+
@logger = logger
|
13
|
+
@allow_seeding_in_production = allow_seeding_in_production
|
14
|
+
end
|
15
|
+
|
16
|
+
def generate_seed_data
|
17
|
+
Hyrax::TestDataSeeders::UserSeeder.generate_seeds(logger: logger, allow_seeding_in_production: allow_seeding_in_production)
|
18
|
+
Hyrax::TestDataSeeders::CollectionTypeSeeder.generate_seeds(logger: logger, allow_seeding_in_production: allow_seeding_in_production)
|
19
|
+
Hyrax::TestDataSeeders::CollectionSeeder.generate_seeds(logger: logger, allow_seeding_in_production: allow_seeding_in_production)
|
20
|
+
# TODO: add work seeder
|
21
|
+
# Hyrax::TestDataSeeders::WorkSeeder.generate_seeds(logger: logger, allow_seeding_in_production: allow_seeding_in_production)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Hyrax
|
3
|
+
module TestDataSeeders
|
4
|
+
# This class was created for use in rake tasks and db/seeds.rb. It generates
|
5
|
+
# collection that can be used in release testing. This data can also be helpful
|
6
|
+
# for local development testing.
|
7
|
+
#
|
8
|
+
# Adding collections is non-destructive. But it may create an additional
|
9
|
+
# collection of the same.
|
10
|
+
#
|
11
|
+
# @todo Do we want to assume that if a collection of the same name exists, then
|
12
|
+
# it is the collection we want for release testing?
|
13
|
+
class CollectionSeeder
|
14
|
+
class << self
|
15
|
+
attr_accessor :logger
|
16
|
+
|
17
|
+
def generate_seeds(logger: Logger.new(STDOUT), allow_seeding_in_production: false) # rubocop:disable Metrics/AbcSize
|
18
|
+
raise("TestDataSeeders are not for use in production!") if Rails.env.production? && !allow_seeding_in_production
|
19
|
+
@logger = logger
|
20
|
+
|
21
|
+
logger.info("Adding collections...")
|
22
|
+
|
23
|
+
create_collection("Grand Parent Collection", collection_types['Nestable only'])
|
24
|
+
create_collection("Parent Collection", collection_types['Nestable only'])
|
25
|
+
create_collection("Child Collection", collection_types['Nestable only'])
|
26
|
+
create_collection("Branded Collection", collection_types['Brandable only'])
|
27
|
+
create_collection("Discoverable Collection", collection_types['Discoverable only'])
|
28
|
+
create_collection("Shared", collection_types['Sharable only'])
|
29
|
+
create_collection("Share Applies to Works", collection_types['Sharable only (and works)'])
|
30
|
+
create_collection("(SM1) Single Membership Collection", collection_types['Single Membership 1'])
|
31
|
+
create_collection("(SM1) Another Single Membership Collection", collection_types['Single Membership 1'])
|
32
|
+
create_collection("(SM2) Single Membership Collection", collection_types['Single Membership 2'])
|
33
|
+
create_collection("(SM2) Another Single Membership Collection", collection_types['Single Membership 2'])
|
34
|
+
end
|
35
|
+
|
36
|
+
##
|
37
|
+
# @api private
|
38
|
+
class NullUser
|
39
|
+
##
|
40
|
+
# @return [nil]
|
41
|
+
def user_key
|
42
|
+
nil
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def create_collection(title, collection_type_gid)
|
49
|
+
return unless valid_collection_type?(title, collection_type_gid)
|
50
|
+
return if exists?(title, collection_type_gid)
|
51
|
+
|
52
|
+
collection = Hyrax::PcdmCollection.new(title: title, collection_type_gid: collection_type_gid)
|
53
|
+
Hyrax.persister.save(resource: collection)
|
54
|
+
Hyrax.publisher.publish('collection.metadata.updated', collection: collection, user: seed_user)
|
55
|
+
logger.info(" #{collection.title.first} -- CREATED")
|
56
|
+
end
|
57
|
+
|
58
|
+
def seed_user
|
59
|
+
@seed_user ||= NullUser.new
|
60
|
+
end
|
61
|
+
|
62
|
+
def collection_types
|
63
|
+
@collection_types ||=
|
64
|
+
Hyrax::CollectionType.all
|
65
|
+
.each_with_object({}) { |ct, hsh| hsh[ct.title] = ct.to_global_id.to_s }
|
66
|
+
end
|
67
|
+
|
68
|
+
def valid_collection_type?(title, collection_type_gid)
|
69
|
+
return true if collection_type_gid.present? && collection_types.value?(collection_type_gid.to_s)
|
70
|
+
|
71
|
+
msg = " #{title} -- NOT CREATED -- Collection type gid (#{collection_type_gid}) " \
|
72
|
+
"is invalid or doesn't exist."
|
73
|
+
logger.info(msg)
|
74
|
+
false
|
75
|
+
end
|
76
|
+
|
77
|
+
def existing_collections
|
78
|
+
@existing_collections ||=
|
79
|
+
Hyrax.query_service.find_all_of_model(model: Hyrax::PcdmCollection)
|
80
|
+
.each_with_object({}) { |col, hsh| hsh[col.title&.first] = col.collection_type_gid.to_s }
|
81
|
+
end
|
82
|
+
|
83
|
+
def exists?(title, collection_type_gid)
|
84
|
+
return false unless existing_collections[title] == collection_type_gid.to_s
|
85
|
+
logger.info(" #{title} -- ALREADY EXISTS")
|
86
|
+
true
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Hyrax
|
3
|
+
module TestDataSeeders
|
4
|
+
# This class was created for use in rake tasks and db/seeds.rb. It generates
|
5
|
+
# collection types that can be used in release testing. This data can also be
|
6
|
+
# helpful for local development testing.
|
7
|
+
#
|
8
|
+
# Adding collection types is non-destructive. If a collection type with the
|
9
|
+
# title already exists, it will not be replaced.
|
10
|
+
class CollectionTypeSeeder
|
11
|
+
class << self
|
12
|
+
attr_accessor :logger
|
13
|
+
|
14
|
+
def generate_seeds(logger: Logger.new(STDOUT), allow_seeding_in_production: false) # rubocop:disable Metrics/MethodLength
|
15
|
+
raise("TestDataSeeders are not for use in production!") if Rails.env.production? && !allow_seeding_in_production
|
16
|
+
@logger = logger
|
17
|
+
|
18
|
+
logger.info("Adding collection types...")
|
19
|
+
|
20
|
+
create_collection_type(title: "Nestable only", badge_color: "#282D3C", nestable: true,
|
21
|
+
description: "Collections of this type can be nested.")
|
22
|
+
create_collection_type(title: "Brandable only", badge_color: "#ff6600", brandable: true,
|
23
|
+
description: "Collections of this type can have branding images.")
|
24
|
+
create_collection_type(title: "Discoverable only", badge_color: "#00A170", discoverable: true,
|
25
|
+
description: "Collections of this type can have visibility settings modified.")
|
26
|
+
create_collection_type(title: "Sharable only", badge_color: "#ff0066", sharable: true, share_applies_to_new_works: false,
|
27
|
+
description: "Collections of this type are sharable. Works " \
|
28
|
+
"do NOT inherit sharable settings when they are created.")
|
29
|
+
create_collection_type(title: "Sharable only (and works)", badge_color: "#0072B5", sharable: true, share_applies_to_new_works: true,
|
30
|
+
description: "Collections of this type are sharable. Works " \
|
31
|
+
"inherit sharable settings when they are created.")
|
32
|
+
create_collection_type(title: "Single Membership 1", badge_color: "#b34700", allow_multiple_membership: false,
|
33
|
+
description: "This Single Membership 1 collection type restricts collection membership. " \
|
34
|
+
"Collections of this type do not allow works to live in multiple collections of this type.")
|
35
|
+
create_collection_type(title: "Single Membership 2", badge_color: "#926AA6", allow_multiple_membership: false,
|
36
|
+
description: "This Single Membership 2 collection type restricts collection membership. " \
|
37
|
+
"Collections of this type do not allow works to live in multiple collections of this type.")
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def collection_type_titles
|
43
|
+
@collection_type_titles ||= Hyrax::CollectionType.all.map(&:title)
|
44
|
+
end
|
45
|
+
|
46
|
+
def create_collection_type(options = {})
|
47
|
+
title = options[:title]
|
48
|
+
return logger.info(" #{title} -- ALREADY EXISTS") if collection_type_titles.include? title
|
49
|
+
|
50
|
+
defaults_for_options(options)
|
51
|
+
Hyrax::CollectionType.new(options).save
|
52
|
+
logger.info(" #{title} -- CREATED")
|
53
|
+
end
|
54
|
+
|
55
|
+
def defaults_for_options(options = {})
|
56
|
+
options[:nestable] ||= false
|
57
|
+
options[:brandable] ||= false
|
58
|
+
options[:discoverable] ||= false
|
59
|
+
options[:sharable] ||= false
|
60
|
+
options[:share_applies_to_new_works] ||= false
|
61
|
+
options[:allow_multiple_membership] ||= true
|
62
|
+
|
63
|
+
# These should always false unless the collection type is Admin Set.
|
64
|
+
# Admin Set collection type is created by required_data_seeders
|
65
|
+
options[:require_membership] = false
|
66
|
+
options[:assigns_workflow] = false
|
67
|
+
options[:assigns_visibility] = false
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Hyrax
|
3
|
+
module TestDataSeeders
|
4
|
+
# This class was created for use in rake tasks and db/seeds.rb. It generates
|
5
|
+
# users that can be used in release testing. This data can also be helpful
|
6
|
+
# for local development testing.
|
7
|
+
#
|
8
|
+
# Adding users is non-destructive. If a user with the email already exists,
|
9
|
+
# they will not be replaced.
|
10
|
+
class UserSeeder
|
11
|
+
class << self
|
12
|
+
attr_accessor :logger
|
13
|
+
|
14
|
+
def generate_seeds(logger: Logger.new(STDOUT), allow_seeding_in_production: false)
|
15
|
+
raise("TestDataSeeders are not for use in production!") if Rails.env.production? && !allow_seeding_in_production
|
16
|
+
@logger = logger
|
17
|
+
|
18
|
+
logger.info("Adding users...")
|
19
|
+
|
20
|
+
add_user('admin@example.com', 'admin_password', admin_role)
|
21
|
+
add_user('basic_user@example.com', 'password')
|
22
|
+
add_user('another_user@example.com', 'password')
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def admin_role
|
28
|
+
unless defined? Role
|
29
|
+
logger.warn("Cannot create `Role` because the `hyrda-role-management` gem, or " \
|
30
|
+
"other gem providing a definition for a Role class, is not installed. " \
|
31
|
+
"For development, you can edit `config/role_map.yml` and add the user's " \
|
32
|
+
"email under the role you want to assign.")
|
33
|
+
return
|
34
|
+
end
|
35
|
+
@admin_role ||= Role.find_by(name: Hyrax.config.admin_user_group_name)
|
36
|
+
end
|
37
|
+
|
38
|
+
def add_user(email, password, role = nil)
|
39
|
+
created = false
|
40
|
+
user = ::User.find_or_create_by(email: email) do |f|
|
41
|
+
created = true
|
42
|
+
f.password = password
|
43
|
+
end
|
44
|
+
logger.info(" #{email} -- #{created ? 'CREATED' : 'ALREADY EXISTS'}")
|
45
|
+
return unless role && !user.roles.include?(role)
|
46
|
+
user.roles << role
|
47
|
+
user.save
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -1,13 +1,16 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
<%=
|
1
|
+
<div class="prev_next_links btn-group pull-left">
|
2
|
+
<% if @pagination.first_page? %>
|
3
|
+
<span class="disabled btn btn-disabled"><%= raw(t('views.pagination.previous')) %></span>
|
4
|
+
<% else %>
|
5
|
+
<%= link_to_previous_page @pagination, raw(t('views.pagination.previous')), route_set: hyrax, params: search_state.to_h, param_name: Blacklight::Solr::FacetPaginator.request_keys[:page], class: 'btn btn-link', data: {ajax_modal: "preserve"} %>
|
6
|
+
<% end %>
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
8
|
+
<% if @pagination.last_page? %>
|
9
|
+
<span class="disabled btn btn-disabled"><%= raw(t('views.pagination.next')) %></span>
|
10
|
+
<% else %>
|
11
|
+
<%= link_to_next_page @pagination, raw(t('views.pagination.next')), route_set: hyrax, params: search_state.to_h, param_name: Blacklight::Solr::FacetPaginator.request_keys[:page], class: 'btn btn-link', data: {ajax_modal: "preserve"} %>
|
12
|
+
<% end %>
|
13
|
+
</div>
|
11
14
|
|
12
15
|
<div class="sort_options btn-group pull-right">
|
13
16
|
<% if @pagination.sort == 'index' -%>
|
@@ -125,7 +125,7 @@ NOTE: The steps need to be done in order to create a new Hyrax based app.
|
|
125
125
|
Generate a new Rails application using the template.
|
126
126
|
|
127
127
|
```
|
128
|
-
rails _5.2.6_ new my_app -m https://raw.githubusercontent.com/samvera/hyrax/v3.4.
|
128
|
+
rails _5.2.6_ new my_app -m https://raw.githubusercontent.com/samvera/hyrax/v3.4.1/template.rb
|
129
129
|
```
|
130
130
|
|
131
131
|
Generating a new Rails application using Hyrax's template above takes cares of a number of steps for you, including:
|
@@ -50,7 +50,7 @@ The Samvera community is here to help. Please see our [support guide](./.github/
|
|
50
50
|
# Getting started
|
51
51
|
|
52
52
|
This document contains instructions specific to setting up an app with __Hyrax
|
53
|
-
v3.4.
|
53
|
+
v3.4.1__. If you are looking for instructions on installing a different
|
54
54
|
version, be sure to select the appropriate branch or tag from the drop-down
|
55
55
|
menu above.
|
56
56
|
|
data/lib/hyrax/schema.rb
CHANGED
@@ -4,24 +4,27 @@ module Hyrax
|
|
4
4
|
##
|
5
5
|
# @api public
|
6
6
|
#
|
7
|
-
# Builds a schema module for a Valkyrie
|
8
|
-
# resolved by schema loader, which must
|
9
|
-
#
|
10
|
-
#
|
7
|
+
# Builds a schema module for a +Valkyrie::Resource+. The schema itself is
|
8
|
+
# resolved by a schema loader instance, which must implement
|
9
|
+
# {SimpleSchemaLoader#attributes_for}, with a hash from attribute names to
|
10
|
+
# +Dry::Type+ types.
|
11
11
|
#
|
12
12
|
# For the default schema loader, configuration is loaded from
|
13
|
-
#
|
14
|
-
#
|
13
|
+
# +config/metadata/{name}.yaml+. A custom schema loader can be provided as
|
14
|
+
# +:schema_loader+ to
|
15
|
+
# resolve the schema in other ways.
|
15
16
|
#
|
16
|
-
# @note
|
17
|
-
# interface, and may define custom attributes using the base
|
18
|
-
#
|
19
|
-
#
|
20
|
-
#
|
21
|
-
#
|
22
|
-
# storage, an external schema service,
|
17
|
+
# @note +Valkyrie::Resource+ and {Hyrax::Resource} classes are not required to
|
18
|
+
# use this interface, and may define custom attributes using the base
|
19
|
+
# +Valkyrie::Resource.attribute+ interface. This mechanism is provided to
|
20
|
+
# allow schemas to be defined in a unified way that don't require programmer
|
21
|
+
# intervention ("configurable schemas"). While the default schema loader derives
|
22
|
+
# schemas from configuration files, alternate implementations could provide
|
23
|
+
# schema definitions pulled from repository storage, an external schema service,
|
24
|
+
# etc...
|
23
25
|
#
|
24
26
|
# @param [Symbol] schema_name
|
27
|
+
# @param [#attributes_for] schema_loader
|
25
28
|
#
|
26
29
|
# @return [Module] a module that, when included, applies a schema to a
|
27
30
|
# `Valkyire::Resource`
|
data/lib/hyrax/version.rb
CHANGED
data/template.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hyrax
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.4.
|
4
|
+
version: 3.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Justin Coyne
|
@@ -14,7 +14,7 @@ authors:
|
|
14
14
|
autorequire:
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
|
-
date: 2022-03-
|
17
|
+
date: 2022-03-30 00:00:00.000000000 Z
|
18
18
|
dependencies:
|
19
19
|
- !ruby/object:Gem::Dependency
|
20
20
|
name: rails
|
@@ -1461,6 +1461,7 @@ files:
|
|
1461
1461
|
- ".github/ISSUE_TEMPLATE.md"
|
1462
1462
|
- ".github/PULL_REQUEST_TEMPLATE.md"
|
1463
1463
|
- ".github/SUPPORT.md"
|
1464
|
+
- ".github/release.yml"
|
1464
1465
|
- ".github/stale.yml"
|
1465
1466
|
- ".github/workflows/main.yml"
|
1466
1467
|
- ".github/workflows/release.yml"
|
@@ -2271,6 +2272,21 @@ files:
|
|
2271
2272
|
- app/strategies/hyrax/strategies/yaml_strategy.rb
|
2272
2273
|
- app/uploaders/hyrax/avatar_uploader.rb
|
2273
2274
|
- app/uploaders/hyrax/uploaded_file_uploader.rb
|
2275
|
+
- app/utils/hyrax/data_destroyers/collection_branding_destroyer.rb
|
2276
|
+
- app/utils/hyrax/data_destroyers/collection_types_destroyer.rb
|
2277
|
+
- app/utils/hyrax/data_destroyers/default_admin_set_id_cache_destroyer.rb
|
2278
|
+
- app/utils/hyrax/data_destroyers/featured_works_destroyer.rb
|
2279
|
+
- app/utils/hyrax/data_destroyers/permission_templates_destroyer.rb
|
2280
|
+
- app/utils/hyrax/data_destroyers/repository_metadata_destroyer.rb
|
2281
|
+
- app/utils/hyrax/data_destroyers/stats_destroyer.rb
|
2282
|
+
- app/utils/hyrax/data_maintenance.rb
|
2283
|
+
- app/utils/hyrax/required_data_seeder.rb
|
2284
|
+
- app/utils/hyrax/required_data_seeders/collection_seeder.rb
|
2285
|
+
- app/utils/hyrax/required_data_seeders/collection_type_seeder.rb
|
2286
|
+
- app/utils/hyrax/test_data_seeder.rb
|
2287
|
+
- app/utils/hyrax/test_data_seeders/collection_seeder.rb
|
2288
|
+
- app/utils/hyrax/test_data_seeders/collection_type_seeder.rb
|
2289
|
+
- app/utils/hyrax/test_data_seeders/user_seeder.rb
|
2274
2290
|
- app/validators/hyrax/collection_membership_validator.rb
|
2275
2291
|
- app/validators/hyrax/has_one_title_validator.rb
|
2276
2292
|
- app/values/hyrax/chart_data.rb
|