curation_concerns 0.12.0.pre1 → 0.12.0.pre2
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/.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
|