curation_concerns 0.12.0.pre1 → 0.12.0.pre2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +24 -16
- data/Gemfile +0 -4
- data/README.md +14 -0
- data/RELEASING.md +2 -2
- data/Rakefile +2 -0
- data/app/actors/concerns/curation_concerns/manages_embargoes_actor.rb +28 -0
- data/app/actors/curation_concerns/abstract_actor.rb +28 -0
- data/app/actors/curation_concerns/add_to_collection_actor.rb +38 -0
- data/app/actors/curation_concerns/apply_order_actor.rb +24 -0
- data/app/actors/curation_concerns/assign_identifier_actor.rb +7 -0
- data/app/actors/curation_concerns/assign_representative_actor.rb +18 -0
- data/app/actors/curation_concerns/attach_files_actor.rb +39 -0
- data/app/actors/curation_concerns/base_actor.rb +71 -0
- data/app/actors/curation_concerns/embargo_actor.rb +19 -0
- data/app/actors/curation_concerns/file_actor.rb +79 -0
- data/app/actors/curation_concerns/file_set_actor.rb +146 -0
- data/app/actors/curation_concerns/interpret_visibility_actor.rb +123 -0
- data/app/actors/curation_concerns/lease_actor.rb +19 -0
- data/app/actors/curation_concerns/root_actor.rb +17 -0
- data/app/actors/curation_concerns/work_actor_behavior.rb +8 -0
- data/app/assets/javascripts/curation_concerns/batch_select.js +42 -0
- data/app/assets/javascripts/curation_concerns/collections.js +13 -0
- data/app/assets/javascripts/curation_concerns/curation_concerns.js +2 -0
- data/app/assets/stylesheets/curation_concerns/_curation_concerns.scss +0 -3
- data/app/assets/stylesheets/curation_concerns/_modules.scss +1 -1
- data/app/assets/stylesheets/curation_concerns/_positioning.scss +3 -6
- data/app/assets/stylesheets/curation_concerns/_theme.scss +0 -39
- data/app/assets/stylesheets/curation_concerns/_typography.scss +0 -69
- data/app/assets/stylesheets/curation_concerns/modules/classify_work.scss +0 -2
- data/app/assets/stylesheets/curation_concerns/modules/collections.scss +4 -0
- data/app/assets/stylesheets/curation_concerns/modules/forms.scss +0 -4
- data/app/assets/stylesheets/curation_concerns/modules/site_actions.scss +34 -29
- data/app/assets/stylesheets/curation_concerns/modules/site_search.scss +0 -46
- data/app/assets/stylesheets/curation_concerns.scss +4 -0
- data/app/controllers/concerns/curation_concerns/collections_controller_behavior.rb +166 -21
- data/app/controllers/concerns/curation_concerns/embargoes_controller_behavior.rb +1 -1
- data/app/controllers/concerns/curation_concerns/leases_controller_behavior.rb +1 -1
- data/app/controllers/concerns/curation_concerns/selects_collections.rb +65 -0
- data/app/forms/curation_concerns/forms/collection_edit_form.rb +0 -29
- data/app/forms/curation_concerns/forms/work_form.rb +2 -1
- data/app/helpers/batch_select_helper.rb +23 -0
- data/app/helpers/collections_helper.rb +4 -0
- data/app/helpers/curation_concerns/collections_helper.rb +2 -2
- data/app/helpers/curation_concerns/collections_helper_behavior.rb +56 -0
- data/app/helpers/curation_concerns/render_constraints_helper.rb +14 -35
- data/app/helpers/curation_concerns/title_helper.rb +4 -0
- data/app/indexers/curation_concerns/collection_indexer.rb +16 -0
- data/app/indexers/curation_concerns/file_set_indexer.rb +46 -0
- data/app/indexers/curation_concerns/work_indexer.rb +15 -0
- data/app/jobs/audit_job.rb +49 -0
- data/app/jobs/characterize_job.rb +11 -0
- data/app/jobs/create_derivatives_job.rb +21 -0
- data/app/jobs/import_url_job.rb +48 -0
- data/app/jobs/ingest_file_job.rb +30 -0
- data/app/jobs/ingest_local_file_job.rb +20 -0
- data/app/jobs/resolrize_job.rb +7 -0
- data/app/models/checksum_audit_log.rb +20 -0
- data/app/models/collection.rb +6 -0
- data/app/models/concerns/curation_concerns/ability.rb +49 -0
- data/app/models/concerns/curation_concerns/basic_metadata.rb +64 -0
- data/app/models/concerns/curation_concerns/collection.rb +16 -0
- data/app/models/concerns/curation_concerns/collection_behavior.rb +62 -0
- data/app/models/concerns/curation_concerns/file_set/belongs_to_works.rb +47 -0
- data/app/models/concerns/curation_concerns/file_set/derivatives.rb +65 -0
- data/app/models/concerns/curation_concerns/file_set/full_text_indexing.rb +11 -0
- data/app/models/concerns/curation_concerns/file_set/indexing.rb +14 -0
- data/app/models/concerns/curation_concerns/file_set/querying.rb +17 -0
- data/app/models/concerns/curation_concerns/file_set_behavior.rb +36 -0
- data/app/models/concerns/curation_concerns/has_representative.rb +13 -0
- data/app/models/concerns/curation_concerns/human_readable_type.rb +17 -0
- data/app/models/concerns/curation_concerns/naming.rb +17 -0
- data/app/models/concerns/curation_concerns/permissions/readable.rb +18 -0
- data/app/models/concerns/curation_concerns/permissions/writable.rb +34 -0
- data/app/models/concerns/curation_concerns/permissions.rb +7 -0
- data/app/models/concerns/curation_concerns/required_metadata.rb +30 -0
- data/app/models/concerns/curation_concerns/serializers.rb +13 -0
- data/app/models/concerns/curation_concerns/solr_document_behavior.rb +147 -0
- data/app/models/concerns/curation_concerns/user.rb +18 -0
- data/app/models/concerns/curation_concerns/with_file_sets.rb +37 -0
- data/app/models/concerns/curation_concerns/work_behavior.rb +45 -0
- data/app/models/curation_concerns/classify_concern.rb +49 -0
- data/app/models/curation_concerns/quick_classification_query.rb +38 -0
- data/app/models/single_use_link.rb +34 -0
- data/app/models/version_committer.rb +2 -0
- data/app/search_builders/curation_concerns/collection_member_search_builder.rb +1 -1
- data/app/search_builders/curation_concerns/collection_search_builder.rb +33 -0
- data/app/search_builders/curation_concerns/member_search_builder.rb +17 -0
- data/app/services/curation_concerns/derivative_path.rb +49 -0
- data/app/services/curation_concerns/file_set_audit_service.rb +105 -0
- data/app/services/curation_concerns/indexes_thumbnails.rb +30 -0
- data/app/services/curation_concerns/local_file_service.rb +10 -0
- data/app/services/curation_concerns/lock_manager.rb +39 -0
- data/app/services/curation_concerns/lockable.rb +16 -0
- data/app/services/curation_concerns/noid.rb +23 -0
- data/app/services/curation_concerns/persist_derivatives.rb +33 -0
- data/app/services/curation_concerns/persist_directly_contained_output_file_service.rb +26 -0
- data/app/services/curation_concerns/repository_audit_service.rb +7 -0
- data/app/services/curation_concerns/thumbnail_path_service.rb +46 -0
- data/app/services/curation_concerns/time_service.rb +7 -0
- data/app/services/curation_concerns/versioning_service.rb +26 -0
- data/app/validators/has_one_title_validator.rb +8 -0
- data/app/views/batch_select/_add_button.html.erb +3 -0
- data/app/views/batch_select/_check_all.html.erb +4 -0
- data/app/views/batch_select/_tools.html.erb +10 -0
- data/app/views/catalog/_action_menu_partials/_collection.html.erb +3 -3
- data/app/views/catalog/_action_menu_partials/_default.html.erb +1 -1
- data/app/views/catalog/_document_list.html.erb +1 -1
- data/app/views/collections/_bookmark_control.html.erb +2 -0
- data/app/views/collections/_button_create_collection.html.erb +2 -0
- data/app/views/collections/_button_for_creating_empty_collection.html.erb +1 -1
- data/app/views/collections/_button_for_delete_collection.html.erb +4 -0
- data/app/views/collections/_button_for_remove_selected_from_collection.html.erb +8 -0
- data/app/views/collections/_button_for_update_collection.html.erb +4 -0
- data/app/views/collections/_button_remove_from_collection.html.erb +4 -0
- data/app/views/collections/_document_header.html.erb +9 -0
- data/app/views/collections/_edit_actions.html.erb +1 -1
- data/app/views/collections/_edit_descriptions.html.erb +1 -1
- data/app/views/collections/_form.html.erb +2 -2
- data/app/views/collections/_form_for_select_destination_collection.html.erb +21 -0
- data/app/views/collections/_form_to_add_member.html.erb +1 -1
- data/app/views/collections/_index_default.html.erb +2 -0
- data/app/views/collections/_index_header_default.html.erb +2 -0
- data/app/views/collections/_media_display.html.erb +1 -1
- data/app/views/collections/_paginate.html.erb +1 -1
- data/app/views/collections/_paginate_compact.html.erb +1 -0
- data/app/views/collections/_results_pagination.html.erb +9 -0
- data/app/views/collections/_search_collection_dashboard_form.html.erb +1 -1
- data/app/views/collections/_search_form.html.erb +1 -1
- data/app/views/collections/_search_results.html.erb +23 -0
- data/app/views/collections/_show_actions.html.erb +1 -1
- data/app/views/collections/_sort_and_per_page.html.erb +1 -1
- data/app/views/collections/_view_type_group.html.erb +1 -1
- data/app/views/collections/index.html.erb +9 -0
- data/app/views/collections/new.html.erb +3 -0
- data/app/views/curation_concerns/base/_form_permission.html.erb +10 -11
- data/app/views/curation_concerns/base/_form_permission_embargo.html.erb +1 -1
- data/app/views/curation_concerns/base/_form_permission_lease.html.erb +1 -1
- data/app/views/curation_concerns/base/_legally_binding_text.html.erb +7 -7
- data/app/views/curation_concerns/base/_related_files.html.erb +1 -1
- data/app/views/curation_concerns/base/_visibility.html.erb +2 -2
- data/app/views/curation_concerns/file_sets/_actions.html.erb +1 -1
- data/app/views/embargoes/_list_expired_active_embargoes.html.erb +1 -1
- data/app/views/error/single_use_error.html.erb +1 -1
- data/app/views/shared/_add_content.html.erb +17 -15
- data/app/views/shared/_brand_bar.html.erb +19 -10
- data/app/views/shared/_header.html.erb +2 -6
- data/app/views/shared/_my_actions.html.erb +28 -27
- data/app/views/shared/_site_actions.html.erb +5 -1
- data/app/views/shared/_site_search.html.erb +3 -2
- data/app/views/shared/_title_bar.html.erb +7 -16
- data/app/views/welcome/index.html.erb +2 -2
- data/config/locales/curation_concerns.en.yml +25 -1
- data/curation_concerns.gemspec +21 -5
- data/lib/curation_concerns/collections/accepts_batches.rb +53 -0
- data/lib/curation_concerns/collections/search_service.rb +57 -0
- data/lib/curation_concerns/collections.rb +10 -0
- data/lib/curation_concerns/configuration.rb +167 -0
- data/lib/curation_concerns/engine.rb +22 -1
- data/lib/curation_concerns/messages.rb +68 -0
- data/lib/curation_concerns/models.rb +42 -0
- data/lib/curation_concerns/name.rb +20 -0
- data/lib/curation_concerns/null_logger.rb +10 -0
- data/lib/curation_concerns/rails/routes.rb +1 -3
- data/lib/curation_concerns/version.rb +1 -1
- data/lib/curation_concerns.rb +2 -0
- data/lib/generators/curation_concerns/abstract_migration_generator.rb +31 -0
- data/lib/generators/curation_concerns/clamav_generator.rb +19 -0
- data/lib/generators/curation_concerns/collection_generator.rb +15 -0
- data/lib/generators/curation_concerns/install_generator.rb +1 -2
- data/lib/generators/curation_concerns/models_generator.rb +62 -0
- data/lib/generators/curation_concerns/templates/app/models/collection.rb +6 -0
- data/lib/generators/curation_concerns/templates/app/models/file_set.rb +4 -0
- data/lib/generators/curation_concerns/templates/config/clamav.rb +1 -0
- data/lib/generators/curation_concerns/templates/config/curation_concerns.rb +61 -0
- data/lib/generators/curation_concerns/templates/config/mime_types.rb +6 -0
- data/lib/generators/curation_concerns/templates/config/redis.yml +9 -0
- data/lib/generators/curation_concerns/templates/config/redis_config.rb +29 -0
- data/lib/generators/curation_concerns/templates/config/resque-pool.yml +1 -0
- data/lib/generators/curation_concerns/templates/config/resque_config.rb +6 -0
- data/lib/generators/curation_concerns/templates/curation_concerns.scss +3 -2
- data/lib/generators/curation_concerns/templates/migrations/create_checksum_audit_logs.rb +19 -0
- data/lib/generators/curation_concerns/templates/migrations/create_single_use_links.rb +12 -0
- data/lib/generators/curation_concerns/templates/migrations/create_version_committers.rb +15 -0
- data/lib/tasks/migrate.rake +11 -0
- data/lib/tasks/resque.rake +14 -0
- data/lib/tasks/solr_reindex.rake +8 -0
- data/spec/actors/curation_concerns/file_set_actor_spec.rb +31 -0
- data/spec/controllers/accepts_batches_controller_spec.rb +65 -0
- data/spec/controllers/collections_controller_spec.rb +272 -0
- data/spec/controllers/curation_concerns/collections_controller_spec.rb +1 -2
- data/spec/controllers/selects_collections_controller_spec.rb +109 -0
- data/spec/features/create_work_spec.rb +1 -1
- data/spec/features/work_generator_spec.rb +1 -1
- data/spec/forms/collection_edit_form_spec.rb +2 -9
- data/spec/forms/work_form_spec.rb +5 -0
- data/spec/helpers/collections_helper_spec.rb +129 -0
- data/spec/helpers/curation_concerns/collections_helper_spec.rb +2 -2
- data/spec/helpers/render_constraints_helper_spec.rb +23 -1
- data/spec/lib/curation_concerns/collections/search_service_spec.rb +33 -0
- data/spec/models/collection_spec.rb +165 -0
- data/spec/tasks/rake_spec.rb +1 -1
- data/spec/test_app_templates/lib/generators/test_app_generator.rb +1 -1
- data/spec/views/curation_concerns/base/_form_permission.html.erb_spec.rb +4 -1
- data/spec/views/curation_concerns/file_sets/show.html.erb_spec.rb +1 -0
- data/spec/views/shared/_add_content.html.erb_spec.rb +3 -3
- metadata +341 -24
- data/VERSION +0 -1
- data/app/assets/stylesheets/curation_concerns/_global-variables.scss +0 -5
- data/app/assets/stylesheets/curation_concerns/modules/multi_value_fields.scss +0 -52
- data/app/views/collections/_form_required_information.html.erb +0 -11
- data/tasks/release.rake +0 -93
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 127203132df29eed98a348c7ca741685e62793e0
|
4
|
+
data.tar.gz: 0e4704e41785f9eaf7a062f2ff5d7c8c34c9326b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: abe17e8e0e63eb6b67adfd7606cef6e199d5b981d384a10615e59183764373dfd29f2b4655e6202e4d4bdcfca8db3e2dfa327a32213ee85e40c2f78955617bd1
|
7
|
+
data.tar.gz: 77bebf157e28c363c6025e2d35046a0e825de606e963dc7c22029f157c2a9c3703f1c09b9ebe413dff320c7dd072a678126db11748588cadaefa3bf409bfb0d5
|
data/.rubocop.yml
CHANGED
@@ -9,7 +9,7 @@ AllCops:
|
|
9
9
|
- 'script/**/*'
|
10
10
|
- 'vendor/**/*'
|
11
11
|
- '.internal_test_app/**/*'
|
12
|
-
- '
|
12
|
+
- 'app/models/concerns/curation_concerns/file_set/export.rb'
|
13
13
|
|
14
14
|
Rails:
|
15
15
|
Enabled: true
|
@@ -18,15 +18,15 @@ Performance/RedundantBlockCall:
|
|
18
18
|
# We can remove this exclusion when this commit is released:
|
19
19
|
# https://github.com/bbatsov/rubocop/commit/7df382531db4f66cd9872a4f478bd486d6ce6712
|
20
20
|
Exclude:
|
21
|
-
- '
|
21
|
+
- 'lib/curation_concerns/null_logger.rb'
|
22
22
|
|
23
23
|
Performance/RedundantMerge:
|
24
24
|
Enabled: false
|
25
25
|
|
26
26
|
Lint/AssignmentInCondition:
|
27
27
|
Exclude:
|
28
|
-
- '
|
29
|
-
- '
|
28
|
+
- 'app/services/curation_concerns/persist_derivatives.rb'
|
29
|
+
- 'app/actors/curation_concerns/file_set_actor.rb'
|
30
30
|
|
31
31
|
Metrics/LineLength:
|
32
32
|
Enabled: false
|
@@ -36,29 +36,29 @@ Metrics/AbcSize:
|
|
36
36
|
|
37
37
|
Metrics/CyclomaticComplexity:
|
38
38
|
Exclude:
|
39
|
-
- '
|
39
|
+
- 'app/services/curation_concerns/file_set_audit_service.rb'
|
40
40
|
- 'app/controllers/concerns/curation_concerns/file_sets_controller_behavior.rb'
|
41
41
|
- 'app/helpers/curation_concerns/curation_concerns_helper_behavior.rb'
|
42
42
|
- 'app/helpers/curation_concerns/attribute_helper.rb'
|
43
|
-
- '
|
44
|
-
- '
|
43
|
+
- 'app/actors/curation_concerns/file_set_actor.rb'
|
44
|
+
- 'app/actors/curation_concerns/work_actor_behavior.rb'
|
45
45
|
|
46
46
|
Metrics/PerceivedComplexity:
|
47
47
|
Exclude:
|
48
|
-
- '
|
48
|
+
- 'app/services/curation_concerns/file_set_audit_service.rb'
|
49
49
|
- 'app/controllers/concerns/curation_concerns/file_sets_controller_behavior.rb'
|
50
50
|
- 'app/helpers/curation_concerns/curation_concerns_helper_behavior.rb'
|
51
51
|
- 'app/helpers/curation_concerns/attribute_helper.rb'
|
52
|
-
- '
|
52
|
+
- 'app/actors/curation_concerns/file_set_actor.rb'
|
53
53
|
|
54
54
|
Metrics/MethodLength:
|
55
55
|
Enabled: false
|
56
56
|
|
57
57
|
Metrics/ClassLength:
|
58
58
|
Exclude:
|
59
|
-
-
|
59
|
+
- lib/curation_concerns/configuration.rb
|
60
60
|
- 'lib/generators/curation_concerns/templates/catalog_controller.rb'
|
61
|
-
- '
|
61
|
+
- 'app/actors/curation_concerns/file_set_actor.rb'
|
62
62
|
|
63
63
|
Metrics/ModuleLength:
|
64
64
|
Exclude:
|
@@ -67,7 +67,8 @@ Metrics/ModuleLength:
|
|
67
67
|
- 'app/controllers/concerns/curation_concerns/catalog_controller.rb'
|
68
68
|
- 'app/controllers/concerns/curation_concerns/file_sets_controller_behavior.rb'
|
69
69
|
- 'app/helpers/curation_concerns/curation_concerns_helper_behavior.rb'
|
70
|
-
- '
|
70
|
+
- 'app/models/concerns/curation_concerns/solr_document_behavior.rb'
|
71
|
+
- 'app/controllers/concerns/curation_concerns/collections_controller_behavior.rb'
|
71
72
|
|
72
73
|
Style/ZeroLengthPredicate:
|
73
74
|
Enabled: false
|
@@ -131,6 +132,7 @@ Style/PredicateName:
|
|
131
132
|
- 'app/helpers/curation_concerns/curation_concerns_helper_behavior.rb'
|
132
133
|
- 'app/controllers/concerns/curation_concerns/controller.rb'
|
133
134
|
- 'app/helpers/curation_concerns/collections_helper.rb'
|
135
|
+
- 'app/helpers/curation_concerns/collections_helper_behavior.rb'
|
134
136
|
|
135
137
|
Style/GlobalVars:
|
136
138
|
Exclude:
|
@@ -141,9 +143,9 @@ Style/SingleLineBlockParams:
|
|
141
143
|
|
142
144
|
Style/ClassVars:
|
143
145
|
Exclude:
|
144
|
-
- '
|
145
|
-
- '
|
146
|
-
- '
|
146
|
+
- 'lib/curation_concerns/models.rb'
|
147
|
+
- 'lib/curation_concerns/models/engine.rb'
|
148
|
+
- 'app/models/concerns/curation_concerns/file_set/versions.rb'
|
147
149
|
|
148
150
|
Style/SignalException:
|
149
151
|
Enabled: false
|
@@ -151,7 +153,7 @@ Style/SignalException:
|
|
151
153
|
Rails/Output:
|
152
154
|
Exclude:
|
153
155
|
- 'lib/generators/**/*'
|
154
|
-
- '
|
156
|
+
- 'lib/generators/**/*'
|
155
157
|
|
156
158
|
Rails/Date:
|
157
159
|
Enabled: false
|
@@ -174,6 +176,12 @@ RSpec/FilePath:
|
|
174
176
|
RSpec/InstanceVariable:
|
175
177
|
Enabled: false
|
176
178
|
|
179
|
+
RSpec/AnyInstance:
|
180
|
+
Enabled: false
|
181
|
+
|
182
|
+
RSpec/NotToNot:
|
183
|
+
Enabled: false
|
184
|
+
|
177
185
|
RSpec/DescribeClass:
|
178
186
|
Exclude:
|
179
187
|
- 'spec/javascripts/jasmine_spec.rb'
|
data/Gemfile
CHANGED
@@ -3,11 +3,7 @@ source 'https://rubygems.org'
|
|
3
3
|
# Specify your gem's dependencies in curation_concerns.gemspec
|
4
4
|
gemspec
|
5
5
|
|
6
|
-
gem 'curation_concerns-models', path: './curation_concerns-models'
|
7
|
-
|
8
6
|
group :development, :test do
|
9
|
-
gem 'rubocop', '~> 0.37.0', require: false
|
10
|
-
gem 'rubocop-rspec', '~> 1.3.1', require: false
|
11
7
|
gem 'simplecov', '~> 0.9', require: false
|
12
8
|
gem 'coveralls', require: false
|
13
9
|
gem 'poltergeist'
|
data/README.md
CHANGED
@@ -40,6 +40,20 @@ Then run the install generator. You will be prompted if you want to overwrite t
|
|
40
40
|
$ rails generate curation_concerns:install
|
41
41
|
$ rake db:migrate
|
42
42
|
|
43
|
+
### FITS 0.6.2
|
44
|
+
|
45
|
+
To install FITS:
|
46
|
+
* Go to http://projects.iq.harvard.edu/fits/downloads, download __fits-0.6.2.zip__, and unpack it somewhere on your machine. You can also install FITS on OSX with homebrew: `brew install fits` (you may also have to create a symlink from fits.sh -> fits in the next step).
|
47
|
+
* Mark fits.sh as executable (chmod a+x fits.sh)
|
48
|
+
* Run "fits.sh -h" from the command line and see a help message to ensure FITS is properly installed
|
49
|
+
* Give your app access to FITS by:
|
50
|
+
* Adding the full fits.sh path to your PATH (e.g., in your .bash_profile), OR
|
51
|
+
* Changing config/initializers/sufia.rb to point to your FITS location: config.fits_path = "/<your full path>/fits.sh"
|
52
|
+
|
53
|
+
### Redis 2.6
|
54
|
+
|
55
|
+
The redlock gem requires Redis >= 2.6.
|
56
|
+
|
43
57
|
## Usage
|
44
58
|
|
45
59
|
### Generator
|
data/RELEASING.md
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
* Bump version number in `
|
2
|
-
* Release the gem to rubygems.org: `rake
|
1
|
+
* Bump version number in `lib/curation_concerns/version.rb`
|
2
|
+
* Release the gem to rubygems.org: `rake build` then `rake release`
|
3
3
|
* `git push`
|
data/Rakefile
CHANGED
@@ -0,0 +1,28 @@
|
|
1
|
+
module CurationConcerns
|
2
|
+
# To use this module, include it in your Actor class
|
3
|
+
# and then add its interpreters wherever you want them to run.
|
4
|
+
# They should be called _before_ apply_attributes is called because
|
5
|
+
# they intercept values in the attributes Hash.
|
6
|
+
#
|
7
|
+
# @example
|
8
|
+
# class MyActorClass < BaseActor
|
9
|
+
# include Worthwile::ManagesEmbargoesActor
|
10
|
+
#
|
11
|
+
# def create
|
12
|
+
# interpret_visibility && super
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# def update
|
16
|
+
# interpret_visibility && super
|
17
|
+
# end
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
module ManagesEmbargoesActor
|
21
|
+
extend ActiveSupport::Concern
|
22
|
+
extend Deprecation
|
23
|
+
|
24
|
+
included do
|
25
|
+
Deprecation.warn(ManagesEmbargoesActor, "ManagesEmbargoesActor is deprecated and will be removed in CurationConcerns 1.0")
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module CurationConcerns
|
2
|
+
# The CurationConcern Abstract actor responds to two primary actions:
|
3
|
+
# * #create
|
4
|
+
# * #update
|
5
|
+
#
|
6
|
+
# and the following attributes
|
7
|
+
#
|
8
|
+
# * next_actor
|
9
|
+
# * curation_concern
|
10
|
+
# * user
|
11
|
+
#
|
12
|
+
# it must instantiate the next actor in the chain and instantiate it.
|
13
|
+
# it should respond to curation_concern, user and attributes.
|
14
|
+
# it ha to next_actor
|
15
|
+
class AbstractActor
|
16
|
+
attr_reader :next_actor
|
17
|
+
|
18
|
+
def initialize(_curation_concern, _user, next_actor)
|
19
|
+
@next_actor = next_actor
|
20
|
+
end
|
21
|
+
|
22
|
+
delegate :curation_concern, :user, to: :next_actor
|
23
|
+
|
24
|
+
delegate :create, to: :next_actor
|
25
|
+
|
26
|
+
delegate :update, to: :next_actor
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module CurationConcerns
|
2
|
+
class AddToCollectionActor < AbstractActor
|
3
|
+
def create(attributes)
|
4
|
+
collection_ids = attributes.delete(:collection_ids)
|
5
|
+
next_actor.create(attributes) && add_to_collections(collection_ids)
|
6
|
+
end
|
7
|
+
|
8
|
+
def update(attributes)
|
9
|
+
collection_ids = attributes.delete(:collection_ids)
|
10
|
+
add_to_collections(collection_ids) && next_actor.update(attributes)
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
# The default behavior of active_fedora's aggregates association,
|
16
|
+
# when assigning the id accessor (e.g. collection_ids = ['foo:1']) is to add
|
17
|
+
# to new collections, but not remove from old collections.
|
18
|
+
# This method ensures it's removed from the old collections.
|
19
|
+
def add_to_collections(new_collection_ids)
|
20
|
+
return true unless new_collection_ids
|
21
|
+
# remove from old collections
|
22
|
+
# TODO: Implement in_collection_ids https://github.com/projecthydra-labs/hydra-pcdm/issues/157
|
23
|
+
(curation_concern.in_collections.map(&:id) - new_collection_ids).each do |old_id|
|
24
|
+
collection = ::Collection.find(old_id)
|
25
|
+
collection.members.delete(curation_concern)
|
26
|
+
collection.save
|
27
|
+
end
|
28
|
+
|
29
|
+
# add to new
|
30
|
+
new_collection_ids.each do |coll_id|
|
31
|
+
collection = ::Collection.find(coll_id)
|
32
|
+
collection.members << curation_concern
|
33
|
+
collection.save
|
34
|
+
end
|
35
|
+
true
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module CurationConcerns
|
2
|
+
class ApplyOrderActor < AbstractActor
|
3
|
+
def update(attributes)
|
4
|
+
ordered_member_ids = attributes.delete(:ordered_member_ids)
|
5
|
+
apply_order(ordered_member_ids) && next_actor.update(attributes)
|
6
|
+
end
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def apply_order(new_order)
|
11
|
+
return true unless new_order
|
12
|
+
curation_concern.ordered_member_proxies.each_with_index do |proxy, index|
|
13
|
+
unless new_order[index]
|
14
|
+
proxy.prev.next = curation_concern.ordered_member_proxies.last.next
|
15
|
+
break
|
16
|
+
end
|
17
|
+
proxy.proxy_for = ActiveFedora::Base.id_to_uri(new_order[index])
|
18
|
+
proxy.target = nil
|
19
|
+
end
|
20
|
+
curation_concern.list_source.order_will_change!
|
21
|
+
true
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module CurationConcerns
|
2
|
+
class AssignRepresentativeActor < AbstractActor
|
3
|
+
def create(attributes)
|
4
|
+
next_actor.create(attributes) && assign_representative
|
5
|
+
end
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
def assign_representative
|
10
|
+
unless curation_concern.representative_id
|
11
|
+
# TODO: Possible optimization here. Does this cause a fetch of ordered_members if they're already loaded?
|
12
|
+
representative = nil # curation_concern.ordered_members.association.reader.first.target
|
13
|
+
curation_concern.representative = representative if representative
|
14
|
+
end
|
15
|
+
curation_concern.save
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module CurationConcerns
|
2
|
+
class AttachFilesActor < AbstractActor
|
3
|
+
def create(attributes)
|
4
|
+
files = [attributes.delete(:files)].flatten.compact
|
5
|
+
attach_files(files, visibility_attributes(attributes)) &&
|
6
|
+
next_actor.create(attributes)
|
7
|
+
end
|
8
|
+
|
9
|
+
def update(attributes)
|
10
|
+
files = [attributes.delete(:files)].flatten.compact
|
11
|
+
next_actor.update(attributes) &&
|
12
|
+
attach_files(files, visibility_attributes(attributes))
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def attach_files(files, visibility_attr)
|
18
|
+
files.all? do |file|
|
19
|
+
attach_file(file, visibility_attr)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def attach_file(file, visibility_attr)
|
24
|
+
file_set = ::FileSet.new
|
25
|
+
file_set_actor = CurationConcerns::FileSetActor.new(file_set, user)
|
26
|
+
file_set_actor.create_metadata(curation_concern, visibility_attr)
|
27
|
+
file_set_actor.create_content(file)
|
28
|
+
end
|
29
|
+
|
30
|
+
# The attributes used for visibility - used to send as initial params to
|
31
|
+
# created FileSets.
|
32
|
+
def visibility_attributes(attributes)
|
33
|
+
attributes.slice(:visibility, :visibility_during_lease,
|
34
|
+
:visibility_after_lease, :lease_expiration_date,
|
35
|
+
:embargo_release_date, :visibility_during_embargo,
|
36
|
+
:visibility_after_embargo)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module CurationConcerns
|
2
|
+
# The CurationConcern base actor responds to two primary actions:
|
3
|
+
# * #create
|
4
|
+
# * #update
|
5
|
+
# it must instantiate the next actor in the chain and instantiate it.
|
6
|
+
# it should respond to curation_concern, user and attributes.
|
7
|
+
class BaseActor < AbstractActor
|
8
|
+
attr_reader :cloud_resources
|
9
|
+
|
10
|
+
def create(attributes)
|
11
|
+
@cloud_resources = attributes.delete(:cloud_resources.to_s)
|
12
|
+
apply_creation_data_to_curation_concern
|
13
|
+
apply_save_data_to_curation_concern(attributes)
|
14
|
+
next_actor.create(attributes) && save
|
15
|
+
end
|
16
|
+
|
17
|
+
def update(attributes)
|
18
|
+
apply_update_data_to_curation_concern
|
19
|
+
apply_save_data_to_curation_concern(attributes)
|
20
|
+
next_actor.update(attributes) && save
|
21
|
+
end
|
22
|
+
|
23
|
+
protected
|
24
|
+
|
25
|
+
def apply_creation_data_to_curation_concern
|
26
|
+
apply_depositor_metadata
|
27
|
+
apply_deposit_date
|
28
|
+
end
|
29
|
+
|
30
|
+
def apply_update_data_to_curation_concern
|
31
|
+
true
|
32
|
+
end
|
33
|
+
|
34
|
+
def apply_depositor_metadata
|
35
|
+
curation_concern.apply_depositor_metadata(user.user_key)
|
36
|
+
curation_concern.edit_users += [user.user_key]
|
37
|
+
end
|
38
|
+
|
39
|
+
def apply_deposit_date
|
40
|
+
curation_concern.date_uploaded = CurationConcerns::TimeService.time_in_utc
|
41
|
+
end
|
42
|
+
|
43
|
+
def save
|
44
|
+
curation_concern.save
|
45
|
+
end
|
46
|
+
|
47
|
+
def apply_save_data_to_curation_concern(attributes)
|
48
|
+
attributes[:rights] = Array(attributes[:rights]) if attributes.key? :rights
|
49
|
+
remove_blank_attributes!(attributes)
|
50
|
+
curation_concern.attributes = attributes.symbolize_keys
|
51
|
+
curation_concern.date_modified = CurationConcerns::TimeService.time_in_utc
|
52
|
+
end
|
53
|
+
|
54
|
+
# If any attributes are blank remove them
|
55
|
+
# e.g.:
|
56
|
+
# self.attributes = { 'title' => ['first', 'second', ''] }
|
57
|
+
# remove_blank_attributes!
|
58
|
+
# self.attributes
|
59
|
+
# => { 'title' => ['first', 'second'] }
|
60
|
+
def remove_blank_attributes!(attributes)
|
61
|
+
multivalued_form_attributes(attributes).each_with_object(attributes) do |(k, v), h|
|
62
|
+
h[k] = v.instance_of?(Array) ? v.select(&:present?) : v
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# Return the hash of attributes that are multivalued and not uploaded files
|
67
|
+
def multivalued_form_attributes(attributes)
|
68
|
+
attributes.select { |_, v| v.respond_to?(:select) && !v.respond_to?(:read) }
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module CurationConcerns
|
2
|
+
class EmbargoActor
|
3
|
+
attr_reader :work
|
4
|
+
|
5
|
+
# @param [Hydra::Works::Work] work
|
6
|
+
def initialize(work)
|
7
|
+
@work = work
|
8
|
+
end
|
9
|
+
|
10
|
+
# Update the visibility of the work to match the correct state of the embargo, then clear the embargo date, etc.
|
11
|
+
# Saves the embargo and the work
|
12
|
+
def destroy
|
13
|
+
work.embargo_visibility! # If the embargo has lapsed, update the current visibility.
|
14
|
+
work.deactivate_embargo!
|
15
|
+
work.embargo.save!
|
16
|
+
work.save!
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
module CurationConcerns
|
2
|
+
# actions for a file identified by file_set and relation (maps to use predicate)
|
3
|
+
class FileActor
|
4
|
+
attr_reader :file_set, :relation, :user
|
5
|
+
|
6
|
+
# @param [FileSet] file_set the parent FileSet
|
7
|
+
# @param [String] relation the type/use for the file.
|
8
|
+
# @param [User] user the user to record as the Agent acting upon the file
|
9
|
+
def initialize(file_set, relation, user)
|
10
|
+
@file_set = file_set
|
11
|
+
@relation = relation
|
12
|
+
@user = user
|
13
|
+
end
|
14
|
+
|
15
|
+
# Puts the uploaded content into a staging directory. Then kicks off a
|
16
|
+
# job to characterize and create derivatives with this on disk variant.
|
17
|
+
# Simultaneously moving a preservation copy to the repostiory.
|
18
|
+
# TODO: create a job to monitor this directory and prune old files that
|
19
|
+
# have made it to the repo
|
20
|
+
# @param [File, ActionDigest::HTTP::UploadedFile, Tempfile] file the file to save in the repository
|
21
|
+
def ingest_file(file)
|
22
|
+
working_file = copy_file_to_working_directory(file, file_set.id)
|
23
|
+
mime_type = file.respond_to?(:content_type) ? file.content_type : nil
|
24
|
+
IngestFileJob.perform_later(file_set, working_file, mime_type, user.user_key, relation)
|
25
|
+
make_derivative(file_set, working_file)
|
26
|
+
true
|
27
|
+
end
|
28
|
+
|
29
|
+
def revert_to(revision_id)
|
30
|
+
repository_file = file_set.send(relation.to_sym)
|
31
|
+
repository_file.restore_version(revision_id)
|
32
|
+
|
33
|
+
return false unless file_set.save
|
34
|
+
|
35
|
+
CurationConcerns::VersioningService.create(repository_file, user)
|
36
|
+
|
37
|
+
# Retrieve a copy of the orginal file from the repository
|
38
|
+
working_file = copy_repository_resource_to_working_directory(repository_file)
|
39
|
+
make_derivative(file_set, working_file)
|
40
|
+
true
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def make_derivative(file_set, working_file)
|
46
|
+
CharacterizeJob.perform_later(file_set, working_file)
|
47
|
+
end
|
48
|
+
|
49
|
+
# @param [File, ActionDispatch::Http::UploadedFile] file
|
50
|
+
# @param [String] id the identifer of the FileSet
|
51
|
+
# @return [String] path of the working file
|
52
|
+
def copy_file_to_working_directory(file, id)
|
53
|
+
file_name = file.respond_to?(:original_filename) ? file.original_filename : ::File.basename(file)
|
54
|
+
copy_stream_to_working_directory(id, file_name, file)
|
55
|
+
end
|
56
|
+
|
57
|
+
# @param [ActiveFedora::File] file the resource in the repo
|
58
|
+
# @return [String] path of the working file
|
59
|
+
def copy_repository_resource_to_working_directory(file)
|
60
|
+
copy_stream_to_working_directory(file_set.id, file.original_name, StringIO.new(file.content))
|
61
|
+
end
|
62
|
+
|
63
|
+
# @param [String] id the identifer
|
64
|
+
# @param [String] name the file name
|
65
|
+
# @param [#read] stream the stream to copy to the working directory
|
66
|
+
# @return [String] path of the working file
|
67
|
+
def copy_stream_to_working_directory(id, name, stream)
|
68
|
+
working_path = full_filename(id, name)
|
69
|
+
FileUtils.mkdir_p(File.dirname(working_path))
|
70
|
+
IO.copy_stream(stream, working_path)
|
71
|
+
working_path
|
72
|
+
end
|
73
|
+
|
74
|
+
def full_filename(id, original_name)
|
75
|
+
pair = id.scan(/..?/).first(4)
|
76
|
+
File.join(CurationConcerns.config.working_path, *pair, original_name)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|