hyrax 3.4.0 → 3.4.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 +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
|