hyrax 5.2.0 → 5.3.0

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.
Files changed (527) hide show
  1. checksums.yaml +4 -4
  2. data/.dassie/.env +5 -1
  3. data/.dassie/Gemfile +4 -2
  4. data/.dassie/app/assets/images/bulkrax/removed.png +0 -0
  5. data/.dassie/app/assets/javascripts/application.js +2 -0
  6. data/.dassie/app/assets/stylesheets/application.css +1 -0
  7. data/.dassie/app/controllers/catalog_controller.rb +1 -0
  8. data/.dassie/app/forms/admin_set_resource_form.rb +6 -0
  9. data/.dassie/app/forms/collection_resource_form.rb +5 -2
  10. data/.dassie/app/forms/generic_work_resource_form.rb +5 -2
  11. data/.dassie/app/forms/monograph_form.rb +5 -3
  12. data/.dassie/app/indexers/admin_set_resource_indexer.rb +5 -0
  13. data/.dassie/app/indexers/collection_resource_indexer.rb +3 -3
  14. data/.dassie/app/indexers/generic_work_resource_indexer.rb +6 -3
  15. data/.dassie/app/indexers/monograph_indexer.rb +6 -2
  16. data/.dassie/app/models/ability.rb +8 -0
  17. data/.dassie/app/models/collection_resource.rb +4 -2
  18. data/.dassie/app/models/concerns/bulkrax/has_local_processing.rb +8 -0
  19. data/.dassie/app/models/generic_work_resource.rb +5 -2
  20. data/.dassie/app/models/monograph.rb +5 -2
  21. data/.dassie/app/views/blacklight_dynamic_sitemap/sitemap/show.xml.builder +22 -0
  22. data/.dassie/bin/importer +142 -0
  23. data/.dassie/bin/web +4 -0
  24. data/.dassie/config/browse_everything_providers.yml +1 -1
  25. data/.dassie/config/bulkrax_api.yml +86 -0
  26. data/.dassie/config/initializers/bulkrax.rb +92 -0
  27. data/.dassie/config/initializers/clamav.rb +2 -0
  28. data/.dassie/config/initializers/hyrax.rb +7 -1
  29. data/.dassie/config/initializers/riiif.rb +4 -80
  30. data/.dassie/config/initializers/wings.rb +1 -1
  31. data/.dassie/config/metadata_profiles/m3_profile.yaml +929 -0
  32. data/.dassie/config/puma.rb +4 -2
  33. data/.dassie/config/routes.rb +7 -0
  34. data/.dassie/config/sidekiq.yml +17 -0
  35. data/.dassie/config/uv/uv.html +63 -81
  36. data/.dassie/db/migrate/20240606205215_create_hyrax_flexible_schemas.rb +9 -0
  37. data/.dassie/db/migrate/20240606205216_add_contexts_to_hyrax_flexible_schemas.rb +5 -0
  38. data/.dassie/db/migrate/20250826142438_create_bulkrax_importers.bulkrax.rb +19 -0
  39. data/.dassie/db/migrate/20250826142439_create_bulkrax_importer_runs.bulkrax.rb +17 -0
  40. data/.dassie/db/migrate/20250826142440_create_bulkrax_entries.bulkrax.rb +17 -0
  41. data/.dassie/db/migrate/20250826142441_add_status_to_entry.bulkrax.rb +10 -0
  42. data/.dassie/db/migrate/20250826142442_add_collections_to_importer_runs.bulkrax.rb +7 -0
  43. data/.dassie/db/migrate/20250826142443_change_collection_ids_on_entries.bulkrax.rb +6 -0
  44. data/.dassie/db/migrate/20250826142444_create_bulkrax_exporters.bulkrax.rb +20 -0
  45. data/.dassie/db/migrate/20250826142445_create_bulkrax_exporter_runs.bulkrax.rb +15 -0
  46. data/.dassie/db/migrate/20250826142446_change_importer_and_exporter_to_polymorphic.bulkrax.rb +19 -0
  47. data/.dassie/db/migrate/20250826142447_add_total_collection_records_to_importer_runs.bulkrax.rb +6 -0
  48. data/.dassie/db/migrate/20250826142448_add_children_to_importer_runs.bulkrax.rb +7 -0
  49. data/.dassie/db/migrate/20250826142449_change_total_records_to_total_work_entries.bulkrax.rb +7 -0
  50. data/.dassie/db/migrate/20250826142450_change_entry_last_error.bulkrax.rb +20 -0
  51. data/.dassie/db/migrate/20250826142451_add_validate_only_to_bulkrax_importers.bulkrax.rb +6 -0
  52. data/.dassie/db/migrate/20250826142452_add_status_to_importers.bulkrax.rb +10 -0
  53. data/.dassie/db/migrate/20250826142453_remove_foreign_key_from_bulkrax_entries.bulkrax.rb +6 -0
  54. data/.dassie/db/migrate/20250826142454_add_status_to_exporters.bulkrax.rb +8 -0
  55. data/.dassie/db/migrate/20250826142455_add_invalid_record_to_importer_run.bulkrax.rb +6 -0
  56. data/.dassie/db/migrate/20250826142456_create_bulkrax_statuses.bulkrax.rb +19 -0
  57. data/.dassie/db/migrate/20250826142457_move_to_statuses.bulkrax.rb +31 -0
  58. data/.dassie/db/migrate/20250826142458_add_date_filter_and_status_to_bulkrax_exporters.bulkrax.rb +8 -0
  59. data/.dassie/db/migrate/20250826142459_add_workflow_status_to_bulkrax_exporter.bulkrax.rb +6 -0
  60. data/.dassie/db/migrate/20250826142460_remove_unused_last_error.bulkrax.rb +8 -0
  61. data/.dassie/db/migrate/20250826142461_increase_text_sizes.bulkrax.rb +13 -0
  62. data/.dassie/db/migrate/20250826142462_change_bulkrax_statuses_error_message_column_type_to_text.bulkrax.rb +6 -0
  63. data/.dassie/db/migrate/20250826142463_rename_children_counters_to_relationships.bulkrax.rb +7 -0
  64. data/.dassie/db/migrate/20250826142464_add_file_set_counters_to_importer_runs.bulkrax.rb +8 -0
  65. data/.dassie/db/migrate/20250826142465_add_import_attempts_to_entries.bulkrax.rb +6 -0
  66. data/.dassie/db/migrate/20250826142466_add_work_counters_to_importer_runs.bulkrax.rb +7 -0
  67. data/.dassie/db/migrate/20250826142467_create_bulkrax_pending_relationships.bulkrax.rb +14 -0
  68. data/.dassie/db/migrate/20250826142468_add_order_to_bulkrax_pending_relationships.bulkrax.rb +6 -0
  69. data/.dassie/db/migrate/20250826142469_add_include_thumbnails_to_bulkrax_exporters.bulkrax.rb +6 -0
  70. data/.dassie/db/migrate/20250826142470_add_generated_metadata_to_bulkrax_exporters.bulkrax.rb +6 -0
  71. data/.dassie/db/migrate/20250826142471_rename_bulkrax_importer_run_to_importer_run.bulkrax.rb +18 -0
  72. data/.dassie/db/migrate/20250826142472_add_indices_to_bulkrax.bulkrax.rb +26 -0
  73. data/.dassie/db/migrate/20250826142473_denormalize_status_message.bulkrax.rb +8 -0
  74. data/.dassie/db/migrate/20250826142474_update_identifier_index.bulkrax.rb +7 -0
  75. data/.dassie/db/migrate/20250826142475_add_index_to_metadata_bulkrax_identifier.bulkrax.rb +19 -0
  76. data/.dassie/db/migrate/20250826142476_add_file_name_to_uploaded_files.bulkrax.rb +6 -0
  77. data/.dassie/db/migrate/20250826142477_add_error_tracking_to_pending_relationships.bulkrax.rb +6 -0
  78. data/.dassie/db/migrate/20250826142478_add_last_imported_at_to_bulkrax_importers.bulkrax.rb +6 -0
  79. data/.dassie/db/migrate/20250826142479_add_next_import_at_to_bulkrax_importers.bulkrax.rb +6 -0
  80. data/.dassie/db/migrate/20250826142480_entry_error_denormalization.bulkrax.rb +8 -0
  81. data/.dassie/db/migrate/20250826142481_faster_first_entry.bulkrax.rb +8 -0
  82. data/.dassie/db/migrate/20260430000001_create_hyrax_redirect_paths.hyrax.rb +13 -0
  83. data/.dassie/db/migrate/20260521003627_add_additional_redirect_info.hyrax.rb +32 -0
  84. data/.dassie/db/schema.rb +154 -1
  85. data/.dassie/package.json +1 -1
  86. data/.dassie/rspec_split_configuration.json +835 -0
  87. data/.dassie/solr/conf/solrconfig.xml +21 -5
  88. data/.github/{ISSUE_TEMPLATE.md → ISSUE_TEMPLATE/issue_template.md} +5 -0
  89. data/.github/workflows/lint-build-test.yml +5 -1
  90. data/.github/workflows/release-charts.yml +48 -0
  91. data/.gitignore +6 -0
  92. data/.koppie/.env +5 -1
  93. data/.koppie/Gemfile +3 -1
  94. data/.koppie/app/assets/images/bulkrax/removed.png +0 -0
  95. data/.koppie/app/assets/javascripts/application.js +2 -0
  96. data/.koppie/app/assets/stylesheets/application.css +1 -0
  97. data/.koppie/app/controllers/catalog_controller.rb +1 -1
  98. data/.koppie/app/forms/collection_resource_form.rb +5 -2
  99. data/.koppie/app/forms/file_set_form.rb +5 -0
  100. data/.koppie/app/forms/generic_work_form.rb +5 -3
  101. data/.koppie/app/forms/monograph_form.rb +5 -3
  102. data/.koppie/app/indexers/collection_resource_indexer.rb +5 -2
  103. data/.koppie/app/indexers/file_set_indexer.rb +7 -0
  104. data/.koppie/app/indexers/generic_work_indexer.rb +6 -3
  105. data/.koppie/app/indexers/monograph_indexer.rb +6 -2
  106. data/.koppie/app/models/ability.rb +8 -0
  107. data/.koppie/app/models/collection_resource.rb +4 -2
  108. data/.koppie/app/models/concerns/bulkrax/has_local_processing.rb +8 -0
  109. data/.koppie/app/models/generic_work.rb +5 -2
  110. data/.koppie/app/models/monograph.rb +5 -2
  111. data/.koppie/app/views/blacklight_dynamic_sitemap/sitemap/show.xml.builder +22 -0
  112. data/.koppie/bin/importer +142 -0
  113. data/.koppie/bin/web +4 -0
  114. data/.koppie/config/browse_everything_providers.yml +2 -0
  115. data/.koppie/config/bulkrax_api.yml +86 -0
  116. data/.koppie/config/initializers/bulkrax.rb +92 -0
  117. data/.koppie/config/initializers/clamav.rb +2 -0
  118. data/.koppie/config/initializers/hyrax.rb +11 -3
  119. data/.koppie/config/initializers/riiif.rb +4 -82
  120. data/.koppie/config/metadata_profiles/m3_profile.yaml +930 -0
  121. data/.koppie/config/routes.rb +7 -0
  122. data/.koppie/config/sidekiq.yml +2 -0
  123. data/.koppie/config/uv/uv.html +63 -81
  124. data/.koppie/db/migrate/20240606205215_create_hyrax_flexible_schemas.rb +9 -0
  125. data/.koppie/db/migrate/20240606205216_add_contexts_to_hyrax_flexible_schemas.rb +5 -0
  126. data/.koppie/db/migrate/20250826142438_create_bulkrax_importers.bulkrax.rb +19 -0
  127. data/.koppie/db/migrate/20250826142439_create_bulkrax_importer_runs.bulkrax.rb +17 -0
  128. data/.koppie/db/migrate/20250826142440_create_bulkrax_entries.bulkrax.rb +17 -0
  129. data/.koppie/db/migrate/20250826142441_add_status_to_entry.bulkrax.rb +10 -0
  130. data/.koppie/db/migrate/20250826142442_add_collections_to_importer_runs.bulkrax.rb +7 -0
  131. data/.koppie/db/migrate/20250826142443_change_collection_ids_on_entries.bulkrax.rb +6 -0
  132. data/.koppie/db/migrate/20250826142444_create_bulkrax_exporters.bulkrax.rb +20 -0
  133. data/.koppie/db/migrate/20250826142445_create_bulkrax_exporter_runs.bulkrax.rb +15 -0
  134. data/.koppie/db/migrate/20250826142446_change_importer_and_exporter_to_polymorphic.bulkrax.rb +19 -0
  135. data/.koppie/db/migrate/20250826142447_add_total_collection_records_to_importer_runs.bulkrax.rb +6 -0
  136. data/.koppie/db/migrate/20250826142448_add_children_to_importer_runs.bulkrax.rb +7 -0
  137. data/.koppie/db/migrate/20250826142449_change_total_records_to_total_work_entries.bulkrax.rb +7 -0
  138. data/.koppie/db/migrate/20250826142450_change_entry_last_error.bulkrax.rb +20 -0
  139. data/.koppie/db/migrate/20250826142451_add_validate_only_to_bulkrax_importers.bulkrax.rb +6 -0
  140. data/.koppie/db/migrate/20250826142452_add_status_to_importers.bulkrax.rb +10 -0
  141. data/.koppie/db/migrate/20250826142453_remove_foreign_key_from_bulkrax_entries.bulkrax.rb +6 -0
  142. data/.koppie/db/migrate/20250826142454_add_status_to_exporters.bulkrax.rb +8 -0
  143. data/.koppie/db/migrate/20250826142455_add_invalid_record_to_importer_run.bulkrax.rb +6 -0
  144. data/.koppie/db/migrate/20250826142456_create_bulkrax_statuses.bulkrax.rb +19 -0
  145. data/.koppie/db/migrate/20250826142457_move_to_statuses.bulkrax.rb +31 -0
  146. data/.koppie/db/migrate/20250826142458_add_date_filter_and_status_to_bulkrax_exporters.bulkrax.rb +8 -0
  147. data/.koppie/db/migrate/20250826142459_add_workflow_status_to_bulkrax_exporter.bulkrax.rb +6 -0
  148. data/.koppie/db/migrate/20250826142460_remove_unused_last_error.bulkrax.rb +8 -0
  149. data/.koppie/db/migrate/20250826142461_increase_text_sizes.bulkrax.rb +13 -0
  150. data/.koppie/db/migrate/20250826142462_change_bulkrax_statuses_error_message_column_type_to_text.bulkrax.rb +6 -0
  151. data/.koppie/db/migrate/20250826142463_rename_children_counters_to_relationships.bulkrax.rb +7 -0
  152. data/.koppie/db/migrate/20250826142464_add_file_set_counters_to_importer_runs.bulkrax.rb +8 -0
  153. data/.koppie/db/migrate/20250826142465_add_import_attempts_to_entries.bulkrax.rb +6 -0
  154. data/.koppie/db/migrate/20250826142466_add_work_counters_to_importer_runs.bulkrax.rb +7 -0
  155. data/.koppie/db/migrate/20250826142467_create_bulkrax_pending_relationships.bulkrax.rb +14 -0
  156. data/.koppie/db/migrate/20250826142468_add_order_to_bulkrax_pending_relationships.bulkrax.rb +6 -0
  157. data/.koppie/db/migrate/20250826142469_add_include_thumbnails_to_bulkrax_exporters.bulkrax.rb +6 -0
  158. data/.koppie/db/migrate/20250826142470_add_generated_metadata_to_bulkrax_exporters.bulkrax.rb +6 -0
  159. data/.koppie/db/migrate/20250826142471_rename_bulkrax_importer_run_to_importer_run.bulkrax.rb +18 -0
  160. data/.koppie/db/migrate/20250826142472_add_indices_to_bulkrax.bulkrax.rb +26 -0
  161. data/.koppie/db/migrate/20250826142473_denormalize_status_message.bulkrax.rb +8 -0
  162. data/.koppie/db/migrate/20250826142474_update_identifier_index.bulkrax.rb +7 -0
  163. data/.koppie/db/migrate/20250826142475_add_index_to_metadata_bulkrax_identifier.bulkrax.rb +19 -0
  164. data/.koppie/db/migrate/20250826142476_add_file_name_to_uploaded_files.bulkrax.rb +6 -0
  165. data/.koppie/db/migrate/20250826142477_add_error_tracking_to_pending_relationships.bulkrax.rb +6 -0
  166. data/.koppie/db/migrate/20250826142478_add_last_imported_at_to_bulkrax_importers.bulkrax.rb +6 -0
  167. data/.koppie/db/migrate/20250826142479_add_next_import_at_to_bulkrax_importers.bulkrax.rb +6 -0
  168. data/.koppie/db/migrate/20250826142480_entry_error_denormalization.bulkrax.rb +8 -0
  169. data/.koppie/db/migrate/20250826142481_faster_first_entry.bulkrax.rb +8 -0
  170. data/.koppie/db/migrate/20260430000001_create_hyrax_redirect_paths.hyrax.rb +13 -0
  171. data/.koppie/db/migrate/20260521003627_add_additional_redirect_info.hyrax.rb +32 -0
  172. data/.koppie/db/schema.rb +154 -1
  173. data/.koppie/package.json +1 -1
  174. data/.koppie/rspec_split_configuration.json +835 -0
  175. data/.koppie/solr/conf/solrconfig.xml +0 -5
  176. data/.koppie/yarn.lock +5587 -752
  177. data/.rubocop.yml +1 -0
  178. data/CONTAINERS.md +2 -0
  179. data/Dockerfile +9 -22
  180. data/Gemfile +0 -1
  181. data/Gemfile.allinson +2 -0
  182. data/README.md +1 -2
  183. data/app/actors/hyrax/actors/file_actor.rb +2 -0
  184. data/app/actors/hyrax/actors/file_set_actor.rb +1 -1
  185. data/app/assets/javascripts/hyrax/app.js.erb +143 -10
  186. data/app/assets/javascripts/hyrax/collection_select.js +68 -0
  187. data/app/assets/javascripts/hyrax/copy_permalink_button.js +28 -0
  188. data/app/assets/javascripts/hyrax/redirects.js +45 -0
  189. data/app/assets/javascripts/hyrax/relationships/control.es6 +21 -1
  190. data/app/assets/javascripts/hyrax/select_work_type.es6 +7 -2
  191. data/app/assets/javascripts/hyrax.js +3 -1
  192. data/app/assets/stylesheets/hyrax/_file-show.scss +1 -0
  193. data/app/assets/stylesheets/hyrax/_viewer.scss +8 -0
  194. data/app/assets/stylesheets/hyrax/dashboard.scss +22 -1
  195. data/app/assets/stylesheets/hyrax/sidebar.scss +98 -3
  196. data/app/authorities/qa/authorities/collections.rb +9 -9
  197. data/app/controllers/concerns/hyrax/analytics_error_handling.rb +97 -0
  198. data/app/controllers/concerns/hyrax/collections_controller_behavior.rb +3 -1
  199. data/app/controllers/concerns/hyrax/ensure_migrated_behavior.rb +50 -0
  200. data/app/controllers/concerns/hyrax/flexible_catalog_behavior.rb +206 -0
  201. data/app/controllers/concerns/hyrax/flexible_schema_behavior.rb +17 -0
  202. data/app/controllers/concerns/hyrax/redirect_to_display_url.rb +54 -0
  203. data/app/controllers/concerns/hyrax/works_controller_behavior.rb +52 -10
  204. data/app/controllers/hyrax/admin/admin_sets_controller.rb +21 -13
  205. data/app/controllers/hyrax/admin/analytics/collection_reports_controller.rb +2 -0
  206. data/app/controllers/hyrax/admin/analytics/work_reports_controller.rb +1 -0
  207. data/app/controllers/hyrax/admin/metadata_profiles_controller.rb +66 -0
  208. data/app/controllers/hyrax/batch_uploads_controller.rb +2 -0
  209. data/app/controllers/hyrax/dashboard/collections_controller.rb +27 -6
  210. data/app/controllers/hyrax/dashboard/nest_collections_controller.rb +2 -1
  211. data/app/controllers/hyrax/dashboard_controller.rb +2 -1
  212. data/app/controllers/hyrax/file_sets_controller.rb +19 -1
  213. data/app/controllers/hyrax/homepage_controller.rb +7 -0
  214. data/app/controllers/hyrax/my/works_controller.rb +2 -21
  215. data/app/controllers/hyrax/permissions_controller.rb +4 -2
  216. data/app/controllers/hyrax/redirects_controller.rb +56 -0
  217. data/app/controllers/hyrax/single_use_links_viewer_controller.rb +2 -1
  218. data/app/controllers/hyrax/transcripts_controller.rb +31 -0
  219. data/app/controllers/hyrax/uploads_controller.rb +18 -9
  220. data/app/forms/concerns/hyrax/based_near_field_behavior.rb +77 -0
  221. data/app/forms/concerns/hyrax/flexible_form_behavior.rb +37 -0
  222. data/app/forms/concerns/hyrax/redirects_field_behavior.rb +95 -0
  223. data/app/forms/concerns/hyrax/transcripts_behavior.rb +40 -0
  224. data/app/forms/hyrax/forms/admin_set_form.rb +1 -1
  225. data/app/forms/hyrax/forms/administrative_set_form.rb +3 -0
  226. data/app/forms/hyrax/forms/batch_edit_form.rb +1 -3
  227. data/app/forms/hyrax/forms/batch_upload_form.rb +14 -0
  228. data/app/forms/hyrax/forms/file_set_edit_form.rb +1 -1
  229. data/app/forms/hyrax/forms/file_set_form.rb +6 -7
  230. data/app/forms/hyrax/forms/pcdm_collection_form.rb +17 -5
  231. data/app/forms/hyrax/forms/pcdm_object_form.rb +11 -3
  232. data/app/forms/hyrax/forms/resource_batch_edit_form.rb +8 -22
  233. data/app/forms/hyrax/forms/resource_form.rb +110 -10
  234. data/app/forms/hyrax/forms.rb +1 -0
  235. data/app/helpers/hyrax/attributes_helper.rb +109 -0
  236. data/app/helpers/hyrax/blacklight_override.rb +26 -0
  237. data/app/helpers/hyrax/collections_helper.rb +2 -0
  238. data/app/helpers/hyrax/file_set_form_helper.rb +24 -0
  239. data/app/helpers/hyrax/hyrax_helper_behavior.rb +51 -2
  240. data/app/helpers/hyrax/iiif_helper.rb +11 -1
  241. data/app/helpers/hyrax/permalink_helper.rb +37 -0
  242. data/app/helpers/hyrax/redirects_tab_helper.rb +29 -0
  243. data/app/helpers/hyrax/work_form_helper.rb +9 -5
  244. data/app/helpers/hyrax/works_helper.rb +14 -0
  245. data/app/indexers/concerns/hyrax/workflow_indexer.rb +30 -0
  246. data/app/indexers/hyrax/file_set_indexer.rb +1 -0
  247. data/app/indexers/hyrax/indexers/administrative_set_indexer.rb +2 -1
  248. data/app/indexers/hyrax/indexers/file_set_indexer.rb +6 -2
  249. data/app/indexers/hyrax/indexers/pcdm_collection_indexer.rb +11 -1
  250. data/app/indexers/hyrax/indexers/pcdm_object_indexer.rb +25 -4
  251. data/app/indexers/hyrax/indexers/redirects_indexer.rb +29 -0
  252. data/app/indexers/hyrax/indexers/resource_indexer.rb +4 -0
  253. data/app/indexers/hyrax/indexers.rb +2 -0
  254. data/app/inputs/controlled_vocabulary_input.rb +7 -1
  255. data/app/jobs/content_deposit_error_event_job.rb +14 -0
  256. data/app/jobs/create_work_job.rb +2 -0
  257. data/app/jobs/migrate_files_to_valkyrie_job.rb +7 -1
  258. data/app/models/batch_upload_item.rb +4 -0
  259. data/app/models/concerns/hyrax/ability/flexible_metadata_ability.rb +10 -0
  260. data/app/models/concerns/hyrax/ability.rb +3 -1
  261. data/app/models/concerns/hyrax/collection_behavior.rb +4 -0
  262. data/app/models/concerns/hyrax/file_set/transcripts.rb +16 -0
  263. data/app/models/concerns/hyrax/file_set_behavior.rb +9 -0
  264. data/app/models/concerns/hyrax/flexibility.rb +107 -0
  265. data/app/models/concerns/hyrax/redirects_normalization.rb +38 -0
  266. data/app/models/concerns/hyrax/solr_document/characterization.rb +1 -1
  267. data/app/models/concerns/hyrax/solr_document/metadata.rb +9 -0
  268. data/app/models/concerns/hyrax/solr_document/ordered_members.rb +4 -0
  269. data/app/models/concerns/hyrax/solr_document_behavior.rb +28 -6
  270. data/app/models/concerns/hyrax/suppressible.rb +1 -1
  271. data/app/models/concerns/hyrax/valkyrie_lazy_migration.rb +1 -1
  272. data/app/models/concerns/hyrax/with_embargoes_and_leases.rb +30 -0
  273. data/app/models/concerns/hyrax/work_behavior.rb +8 -0
  274. data/app/models/hyrax/administrative_set.rb +1 -1
  275. data/app/models/hyrax/change_set.rb +3 -1
  276. data/app/models/hyrax/embargo.rb +3 -1
  277. data/app/models/hyrax/file_set.rb +4 -2
  278. data/app/models/hyrax/flexible_schema.rb +219 -0
  279. data/app/models/hyrax/lease.rb +3 -1
  280. data/app/models/hyrax/pcdm_collection.rb +4 -1
  281. data/app/models/hyrax/redirect.rb +64 -0
  282. data/app/models/hyrax/redirect_path.rb +14 -0
  283. data/app/models/hyrax/resource.rb +22 -25
  284. data/app/models/hyrax/riiif/file.rb +43 -0
  285. data/app/models/hyrax/riiif/file_resolver.rb +65 -0
  286. data/app/models/hyrax/uploaded_file.rb +9 -0
  287. data/app/models/hyrax/virus_scanner.rb +16 -3
  288. data/app/models/hyrax/work.rb +4 -1
  289. data/app/models/job_io_wrapper.rb +12 -3
  290. data/app/models/user_mailbox.rb +3 -1
  291. data/app/presenters/hyrax/admin_set_presenter.rb +11 -0
  292. data/app/presenters/hyrax/annotates_content.rb +35 -0
  293. data/app/presenters/hyrax/collection_presenter.rb +5 -1
  294. data/app/presenters/hyrax/displays_content.rb +133 -0
  295. data/app/presenters/hyrax/displays_image.rb +11 -4
  296. data/app/presenters/hyrax/displays_transcripts.rb +59 -0
  297. data/app/presenters/hyrax/file_set_presenter.rb +8 -18
  298. data/app/presenters/hyrax/google_scholar_presenter.rb +39 -0
  299. data/app/presenters/hyrax/iiif_manifest_presenter.rb +22 -4
  300. data/app/presenters/hyrax/missing_method_behavior.rb +15 -0
  301. data/app/presenters/hyrax/pcdm_member_presenter_factory.rb +2 -4
  302. data/app/presenters/hyrax/work_show_presenter.rb +56 -14
  303. data/app/renderers/hyrax/renderers/attribute_renderer.rb +6 -2
  304. data/app/renderers/hyrax/renderers/license_attribute_renderer.rb +10 -10
  305. data/app/renderers/hyrax/renderers/redirects_label_attribute_renderer.rb +25 -0
  306. data/app/renderers/hyrax/renderers/rights_statement_attribute_renderer.rb +10 -11
  307. data/app/search_builders/hyrax/dashboard/nested_collections_search_builder.rb +1 -5
  308. data/app/search_builders/hyrax/filter_by_type.rb +1 -1
  309. data/app/services/hyrax/action/create_valkyrie_work.rb +3 -2
  310. data/app/services/hyrax/authority_rendering_helper.rb +28 -0
  311. data/app/services/hyrax/authority_service.rb +107 -0
  312. data/app/services/hyrax/callbacks.rb +2 -2
  313. data/app/services/hyrax/collections/nested_collection_query_service.rb +9 -3
  314. data/app/services/hyrax/collections_service.rb +17 -0
  315. data/app/services/hyrax/custom_queries/find_by_property_value.rb +89 -0
  316. data/app/services/hyrax/edit_permissions_service.rb +4 -4
  317. data/app/services/hyrax/file_set_type_service.rb +12 -4
  318. data/app/services/hyrax/flexible_schema_validator_service.rb +153 -0
  319. data/app/services/hyrax/flexible_schema_validators/class_validator.rb +123 -0
  320. data/app/services/hyrax/flexible_schema_validators/core_metadata_validator.rb +211 -0
  321. data/app/services/hyrax/flexible_schema_validators/existing_records_validator.rb +83 -0
  322. data/app/services/hyrax/flexible_schema_validators/redirects_validator.rb +116 -0
  323. data/app/services/hyrax/flexible_schema_validators/schema_validator.rb +34 -0
  324. data/app/services/hyrax/flexible_schema_validators/sort_properties_validator.rb +54 -0
  325. data/app/services/hyrax/license_service.rb +1 -1
  326. data/app/services/hyrax/listeners/metadata_index_listener.rb +11 -0
  327. data/app/services/hyrax/m3_profile_editor.rb +32 -0
  328. data/app/services/hyrax/m3_schema_loader.rb +119 -0
  329. data/app/services/hyrax/manifest_builder_service.rb +18 -24
  330. data/app/services/hyrax/permalink_path.rb +25 -0
  331. data/app/services/hyrax/qa_select_service.rb +9 -5
  332. data/app/services/hyrax/redirect_path_normalizer.rb +58 -0
  333. data/app/services/hyrax/redirects_lookup.rb +59 -0
  334. data/app/services/hyrax/resource_permissions_visibility_propagator.rb +54 -0
  335. data/app/services/hyrax/resource_types_service.rb +3 -20
  336. data/app/services/hyrax/rights_statement_service.rb +1 -1
  337. data/app/services/hyrax/schema_loader.rb +205 -0
  338. data/app/services/hyrax/search_service.rb +1 -1
  339. data/app/services/hyrax/simple_schema_loader.rb +28 -127
  340. data/app/services/hyrax/solr_service.rb +39 -2
  341. data/app/services/hyrax/tolerant_select_service.rb +5 -3
  342. data/app/services/hyrax/valkyrie_upload.rb +2 -2
  343. data/app/services/hyrax/visibility_propagator.rb +4 -1
  344. data/app/services/hyrax/work_uploads_handler.rb +17 -9
  345. data/app/services/hyrax/workflow/workflow_factory.rb +5 -4
  346. data/app/services/migrate_resource_service.rb +7 -1
  347. data/app/uploaders/hyrax/uploaded_file_uploader.rb +2 -2
  348. data/app/utils/hyrax/data_destroyers/collection_branding_destroyer.rb +1 -1
  349. data/app/utils/hyrax/required_data_seeder.rb +1 -0
  350. data/app/utils/hyrax/required_data_seeders/collection_type_seeder.rb +1 -1
  351. data/app/utils/hyrax/required_data_seeders/flexible_profile_seeder.rb +28 -0
  352. data/app/validators/hyrax/controlled_vocabulary_validator.rb +64 -0
  353. data/app/validators/hyrax/redirect_validator.rb +128 -0
  354. data/app/views/catalog/_thumbnail_list_default.html.erb +2 -2
  355. data/app/views/collections/edit_fields/_schema_version.html.erb +1 -0
  356. data/app/views/hyrax/admin/admin_sets/_form_metadata.html.erb +24 -2
  357. data/app/views/hyrax/admin/admin_sets/_show_document_list_row.html.erb +1 -1
  358. data/app/views/hyrax/admin/admin_sets/show.html.erb +1 -1
  359. data/app/views/hyrax/admin/analytics/_analytics_error.html.erb +42 -0
  360. data/app/views/hyrax/admin/analytics/collection_reports/index.html.erb +11 -9
  361. data/app/views/hyrax/admin/analytics/work_reports/index.html.erb +60 -57
  362. data/app/views/hyrax/admin/features/index.html.erb +1 -1
  363. data/app/views/hyrax/admin/metadata_profiles/_import_modal.html.erb +20 -0
  364. data/app/views/hyrax/admin/metadata_profiles/index.html.erb +54 -0
  365. data/app/views/hyrax/base/_attribute_rows.html.erb +4 -21
  366. data/app/views/hyrax/base/_citations.html.erb +1 -0
  367. data/app/views/hyrax/base/_currently_shared.html.erb +2 -1
  368. data/app/views/hyrax/base/_file_manager_thumbnail.html.erb +1 -1
  369. data/app/views/hyrax/base/_form_member_of_collections.html.erb +6 -6
  370. data/app/views/hyrax/base/_form_redirects.html.erb +125 -0
  371. data/app/views/hyrax/base/_form_share.html.erb +7 -2
  372. data/app/views/hyrax/base/_member.html.erb +1 -1
  373. data/app/views/hyrax/base/_social_media.html.erb +1 -1
  374. data/app/views/hyrax/base/iiif_viewers/_universal_viewer.html.erb +1 -1
  375. data/app/views/hyrax/base/show.html.erb +3 -0
  376. data/app/views/hyrax/collections/_default_group.html.erb +3 -0
  377. data/app/views/hyrax/collections/_list_collections.html.erb +3 -0
  378. data/app/views/hyrax/collections/_list_works.html.erb +1 -1
  379. data/app/views/hyrax/collections/_show_document_list_row.html.erb +1 -1
  380. data/app/views/hyrax/collections/show.html.erb +4 -0
  381. data/app/views/hyrax/dashboard/_sidebar.html.erb +4 -2
  382. data/app/views/hyrax/dashboard/collections/_button_for_update_collection.html.erb +2 -1
  383. data/app/views/hyrax/dashboard/collections/_default_group.html.erb +3 -0
  384. data/app/views/hyrax/dashboard/collections/_form.html.erb +17 -0
  385. data/app/views/hyrax/dashboard/collections/_form_for_select_collection.html.erb +7 -10
  386. data/app/views/hyrax/dashboard/collections/_list_collections.html.erb +3 -0
  387. data/app/views/hyrax/dashboard/collections/_list_works.html.erb +1 -1
  388. data/app/views/hyrax/dashboard/collections/_show_document_list_row.html.erb +1 -1
  389. data/app/views/hyrax/dashboard/profiles/_edit_primary.html.erb +1 -8
  390. data/app/views/hyrax/dashboard/profiles/_trophy_edit.html.erb +1 -1
  391. data/app/views/hyrax/dashboard/profiles/show.html.erb +5 -5
  392. data/app/views/hyrax/dashboard/sidebar/_metadata.html.erb +11 -0
  393. data/app/views/hyrax/dashboard/sidebar/_repository_content.html.erb +1 -0
  394. data/app/views/hyrax/dashboard/works/_default_group.html.erb +3 -0
  395. data/app/views/hyrax/dashboard/works/_list_works.html.erb +4 -2
  396. data/app/views/hyrax/file_sets/_form.html.erb +16 -3
  397. data/app/views/hyrax/file_sets/_metadata.html.erb +35 -0
  398. data/app/views/hyrax/file_sets/_valkyrie_form.html.erb +37 -0
  399. data/app/views/hyrax/file_sets/edit.html.erb +14 -8
  400. data/app/views/hyrax/file_sets/media_display/_audio.html.erb +4 -0
  401. data/app/views/hyrax/file_sets/media_display/_image.html.erb +2 -2
  402. data/app/views/hyrax/file_sets/media_display/_video.html.erb +4 -0
  403. data/app/views/hyrax/homepage/_explore_collections.html.erb +1 -1
  404. data/app/views/hyrax/homepage/_featured_fields.html.erb +1 -1
  405. data/app/views/hyrax/homepage/_recent_document.html.erb +1 -1
  406. data/app/views/hyrax/homepage/robots.text.erb +17 -0
  407. data/app/views/hyrax/my/collections/_default_group.html.erb +3 -0
  408. data/app/views/hyrax/my/collections/_list_collections.html.erb +3 -0
  409. data/app/views/hyrax/my/collections/_modal_add_subcollection.html.erb +2 -2
  410. data/app/views/hyrax/my/collections/_modal_add_to_collection.html.erb +2 -2
  411. data/app/views/hyrax/my/works/_default_group.html.erb +3 -0
  412. data/app/views/hyrax/my/works/_list_works.html.erb +5 -2
  413. data/app/views/hyrax/shared/_copy_permalink.html.erb +10 -0
  414. data/app/views/hyrax/users/_user_info.html.erb +1 -6
  415. data/app/views/layouts/_head_tag_content.html.erb +2 -0
  416. data/app/views/layouts/hyrax/dashboard.html.erb +2 -1
  417. data/app/views/records/edit_fields/_contexts.html.erb +1 -0
  418. data/app/views/records/edit_fields/_license.html.erb +17 -5
  419. data/app/views/records/edit_fields/_resource_type.html.erb +16 -2
  420. data/app/views/records/edit_fields/_rights_statement.html.erb +17 -5
  421. data/app/views/records/edit_fields/_schema_version.html.erb +1 -0
  422. data/app/views/records/edit_fields/_transcript_ids.html.erb +18 -0
  423. data/app/views/records/show_fields/_rights.html.erb +1 -1
  424. data/app/views/shared/_citations.html.erb +46 -31
  425. data/app/views/shared/_schema_version.html.erb +38 -0
  426. data/bin/dev-entrypoint.sh +14 -4
  427. data/chart/hyrax/Chart.yaml +4 -4
  428. data/chart/hyrax/templates/ingress.yaml +3 -0
  429. data/chart/hyrax/values.yaml +10 -8
  430. data/config/features.rb +27 -0
  431. data/config/initializers/blacklight_dynamic_sitemap.rb +43 -0
  432. data/config/initializers/deprecation_patch.rb +27 -0
  433. data/config/initializers/hydra_works.rb +3 -0
  434. data/config/initializers/i18n_extensions.rb +197 -0
  435. data/config/initializers/storage_adapter_initializer.rb +15 -9
  436. data/config/locales/hyrax.de.yml +172 -54
  437. data/config/locales/hyrax.en.yml +183 -66
  438. data/config/locales/hyrax.es.yml +174 -49
  439. data/config/locales/hyrax.fr.yml +169 -45
  440. data/config/locales/hyrax.it.yml +172 -48
  441. data/config/locales/hyrax.pt-BR.yml +172 -54
  442. data/config/locales/hyrax.zh.yml +145 -21
  443. data/config/metadata/basic_metadata.yaml +66 -0
  444. data/config/metadata/batch_edit_metadata.yaml +119 -0
  445. data/config/metadata/file_set_metadata.yaml +19 -0
  446. data/config/metadata/redirects.yaml +15 -0
  447. data/config/metadata_profiles/m3_json_schema.json +487 -0
  448. data/config/metadata_profiles/m3_profile.yaml +954 -0
  449. data/config/routes.rb +9 -0
  450. data/docker-compose-allinson.yml +176 -0
  451. data/docker-compose-dassie.yml +14 -6
  452. data/docker-compose-koppie.yml +18 -10
  453. data/docker-compose-sirenia.yml +20 -10
  454. data/documentation/copy_permalink.md +29 -0
  455. data/documentation/developing-your-hyrax-based-app.md +2 -2
  456. data/documentation/file-ingest-characterization.md +763 -0
  457. data/documentation/flexible_metadata.md +113 -0
  458. data/documentation/forms/field_behaviors.md +297 -0
  459. data/documentation/redirects.md +428 -0
  460. data/hyrax.gemspec +7 -2
  461. data/lib/freyja/metadata_adapter.rb +1 -1
  462. data/lib/freyja/persister.rb +25 -1
  463. data/lib/generators/hyrax/collection_resource/collection_resource_generator.rb +2 -2
  464. data/lib/generators/hyrax/collection_resource/templates/collection.rb.erb +5 -1
  465. data/lib/generators/hyrax/collection_resource/templates/collection_form.rb.erb +5 -1
  466. data/lib/generators/hyrax/collection_resource/templates/collection_indexer.rb.erb +6 -1
  467. data/lib/generators/hyrax/iiif_viewer/USAGE +22 -0
  468. data/lib/generators/hyrax/iiif_viewer/iiif_viewer_generator.rb +49 -0
  469. data/lib/generators/hyrax/iiif_viewer/templates/_clover.html.erb +7 -0
  470. data/lib/generators/hyrax/iiif_viewer/templates/clover/clover.css +3328 -0
  471. data/lib/generators/hyrax/iiif_viewer/templates/clover/clover.html +16 -0
  472. data/lib/generators/hyrax/iiif_viewer/templates/clover/clover.js +237 -0
  473. data/lib/generators/hyrax/install_generator.rb +25 -1
  474. data/lib/generators/hyrax/riiif_generator.rb +1 -1
  475. data/lib/generators/hyrax/templates/app/views/blacklight_dynamic_sitemap/sitemap/show.xml.builder +22 -0
  476. data/lib/generators/hyrax/templates/config/clamav.rb +2 -0
  477. data/lib/generators/hyrax/templates/config/initializers/riiif.rb +4 -80
  478. data/lib/generators/hyrax/templates/db/migrate/20240606205215_create_hyrax_flexible_schemas.rb.erb +9 -0
  479. data/lib/generators/hyrax/templates/db/migrate/20240606205216_add_contexts_to_hyrax_flexible_schemas.rb.erb +5 -0
  480. data/lib/generators/hyrax/templates/db/migrate/20260430000001_create_hyrax_redirect_paths.rb.erb +22 -0
  481. data/lib/generators/hyrax/templates/db/migrate/20260521003627_add_additional_redirect_info.rb.erb +39 -0
  482. data/lib/generators/hyrax/templates/package.json +1 -1
  483. data/lib/generators/hyrax/templates/uv.html +60 -82
  484. data/lib/generators/hyrax/work/templates/indexer.rb.erb +1 -1
  485. data/lib/generators/hyrax/work/templates/model.rb.erb +5 -1
  486. data/lib/generators/hyrax/work_resource/templates/form.rb.erb +5 -2
  487. data/lib/generators/hyrax/work_resource/templates/indexer.rb.erb +6 -2
  488. data/lib/generators/hyrax/work_resource/templates/work.rb.erb +5 -2
  489. data/lib/generators/hyrax/work_resource/work_resource_generator.rb +1 -0
  490. data/lib/hyrax/active_fedora_dummy_model.rb +6 -0
  491. data/lib/hyrax/configuration.rb +197 -3
  492. data/lib/hyrax/deprecation.rb +31 -0
  493. data/lib/hyrax/engine.rb +2 -0
  494. data/lib/hyrax/form_fields.rb +17 -5
  495. data/lib/hyrax/indexer.rb +31 -2
  496. data/lib/hyrax/resource_sync/resource_list_writer.rb +3 -0
  497. data/lib/hyrax/schema.rb +15 -4
  498. data/lib/hyrax/specs/shared_specs/factories/administrative_sets.rb +12 -0
  499. data/lib/hyrax/specs/shared_specs/factories/hyrax_embargo.rb +1 -1
  500. data/lib/hyrax/specs/shared_specs/factories/hyrax_file_set.rb +13 -0
  501. data/lib/hyrax/specs/shared_specs/factories/hyrax_lease.rb +5 -1
  502. data/lib/hyrax/specs/shared_specs/factories/hyrax_work.rb +14 -0
  503. data/lib/hyrax/specs/shared_specs/simple_work.rb +41 -0
  504. data/lib/hyrax/specs/shared_specs.rb +1 -0
  505. data/lib/hyrax/transactions/collection_create.rb +2 -1
  506. data/lib/hyrax/transactions/collection_destroy.rb +1 -0
  507. data/lib/hyrax/transactions/collection_update.rb +2 -1
  508. data/lib/hyrax/transactions/container.rb +28 -0
  509. data/lib/hyrax/transactions/steps/apply_permission_template_on_update.rb +65 -0
  510. data/lib/hyrax/transactions/steps/apply_workflow_on_admin_set_change.rb +97 -0
  511. data/lib/hyrax/transactions/steps/ensure_admin_set.rb +1 -1
  512. data/lib/hyrax/transactions/steps/remove_redirect_paths.rb +35 -0
  513. data/lib/hyrax/transactions/steps/save.rb +10 -0
  514. data/lib/hyrax/transactions/steps/set_default_admin_set.rb +1 -1
  515. data/lib/hyrax/transactions/steps/sync_redirect_paths.rb +141 -0
  516. data/lib/hyrax/transactions/work_create.rb +2 -1
  517. data/lib/hyrax/transactions/work_destroy.rb +1 -0
  518. data/lib/hyrax/transactions/work_update.rb +4 -1
  519. data/lib/hyrax/version.rb +1 -1
  520. data/lib/hyrax.rb +61 -0
  521. data/lib/tasks/m3_profile_cleanup.rake +35 -0
  522. data/template.rb +4 -1
  523. metadata +313 -19
  524. data/.dassie/public/robots.txt +0 -1
  525. data/.koppie/public/robots.txt +0 -1
  526. data/app/forms/concerns/hyrax/basic_metadata_form_fields_behavior.rb +0 -39
  527. data/app/views/catalog/_thumbnail_list_collection.html.erb +0 -4
@@ -19,11 +19,6 @@
19
19
  <config>
20
20
  <luceneMatchVersion>5.0.0</luceneMatchVersion>
21
21
 
22
- <lib dir="${solr.install.dir:../../../..}/contrib/analysis-extras/lib" />
23
- <lib dir="${solr.install.dir:../../../..}/contrib/analysis-extras/lucene-libs" />
24
- <lib dir="${solr.install.dir:../../../..}/contrib/extraction/lib" regex=".*\.jar" />
25
- <lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-cell-\d.*\.jar" />
26
-
27
22
  <directoryFactory name="DirectoryFactory"
28
23
  class="${solr.directoryFactory:solr.NRTCachingDirectoryFactory}">
29
24
  </directoryFactory>
@@ -205,4 +200,25 @@
205
200
  <str name="uprefix">ignored_</str>
206
201
  </lst>
207
202
  </requestHandler>
203
+
204
+ <!-- Needed for Blacklight Dynamic Sitemap if noids are enabled -->
205
+ <updateRequestProcessorChain name="add_hashed_id">
206
+ <processor class="solr.processor.SignatureUpdateProcessorFactory">
207
+ <bool name="enabled">true</bool>
208
+ <str name="signatureField">hashed_id_ssi</str>
209
+ <bool name="overwriteDupes">false</bool>
210
+ <str name="fields">id</str>
211
+ <str name="signatureClass">solr.processor.Lookup3Signature</str>
212
+ </processor>
213
+ <processor class="solr.LogUpdateProcessorFactory" />
214
+ <processor class="solr.RunUpdateProcessorFactory" />
215
+ </updateRequestProcessorChain>
216
+
217
+ <!-- Update the /update handler -->
218
+ <requestHandler name="/update" class="solr.UpdateRequestHandler">
219
+ <lst name="defaults">
220
+ <str name="update.chain">add_hashed_id</str>
221
+ </lst>
222
+ </requestHandler>
223
+ <!-- End Blacklight Dynamic Sitemap section -->
208
224
  </config>
@@ -1,3 +1,8 @@
1
+ ---
2
+ name: Hyrax Issue
3
+ about: Use this template for Hyrax issues
4
+ ---
5
+
1
6
  ### Descriptive summary
2
7
 
3
8
  Present tense short summary (30 words or less)
@@ -15,6 +15,10 @@ on:
15
15
  required: false
16
16
  default: false
17
17
 
18
+ concurrency:
19
+ group: ${{ github.workflow }}-${{ github.ref }}
20
+ cancel-in-progress: true
21
+
18
22
  env:
19
23
  REGISTRY: ghcr.io
20
24
  IMAGE_NAME: ${{ github.repository }}-dev
@@ -99,7 +103,7 @@ jobs:
99
103
  strategy:
100
104
  fail-fast: false
101
105
  matrix:
102
- ci_test_app: [dassie,koppie,sirenia]
106
+ ci_test_app: [dassie,koppie,sirenia,allinson]
103
107
  ci_node_total: [4]
104
108
  ci_node_index: [0,1,2,3]
105
109
  steps:
@@ -0,0 +1,48 @@
1
+ name: Release Charts
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ paths:
8
+ - "chart/**"
9
+ workflow_dispatch:
10
+ inputs:
11
+ debug_enabled:
12
+ type: boolean
13
+ description: "Run the build with tmate debugging enabled (https://github.com/marketplace/actions/debugging-with-tmate)"
14
+ required: false
15
+ default: false
16
+ jobs:
17
+ release:
18
+ runs-on: ubuntu-latest
19
+ permissions:
20
+ contents: write
21
+ packages: write
22
+ steps:
23
+ - name: Setup tmate session
24
+ uses: mxschmitt/action-tmate@v3
25
+ if: ${{ github.event_name == 'workflow_dispatch' && inputs.debug_enabled }}
26
+ with:
27
+ detached: true
28
+
29
+ - name: Checkout
30
+ uses: actions/checkout@v3
31
+ with:
32
+ fetch-depth: 0
33
+
34
+ - name: Configure Git
35
+ run: |
36
+ git config user.name "$GITHUB_ACTOR"
37
+ git config user.email "$GITHUB_ACTOR@users.noreply.github.com"
38
+
39
+ - name: Run chart-releaser
40
+ uses: samvera-labs/helm-oci-charts-releaser@main
41
+ with:
42
+ charts_dir: chart
43
+ oci_registry: ghcr.io/samvera
44
+ oci_username: samvera
45
+ oci_password: ${{ secrets.GITHUB_TOKEN }}
46
+ oci_path: charts
47
+ github_token: ${{ secrets.GITHUB_TOKEN }}
48
+ tag_name_pattern: "{chartName}-chart"
data/.gitignore CHANGED
@@ -4,6 +4,7 @@
4
4
  ruby-version
5
5
  ruby-gemset
6
6
  .rvmrc
7
+ mise.toml
7
8
  Gemfile*.lock
8
9
 
9
10
  # don't push around data files (for dev envs only)
@@ -90,3 +91,8 @@ spec/reports
90
91
  /spec/examples.txt
91
92
  node_modules
92
93
  .env.*
94
+ .zed
95
+ .claude
96
+ CLAUDE.md
97
+ docker-compose.override.yml
98
+ plans/*
data/.koppie/.env CHANGED
@@ -1,4 +1,5 @@
1
1
  APP_NAME=koppie
2
+ BROWSE_EVERYTHING_FS_PROVIDER_PATH=/app/samvera/hyrax-engine/spec/fixtures
2
3
  BUNDLE_GEMFILE=Gemfile.koppie
3
4
  BUNDLE_PATH=/app/bundle
4
5
  CH12N_TOOL=fits_servlet
@@ -14,6 +15,7 @@ DB_USERNAME=hyrax_user
14
15
  FEDORA_URL=http://fedoraAdmin:fedoraAdmin@fcrepo:8080/fcrepo/rest
15
16
  FITS_SERVLET_URL=http://fits:8080/fits
16
17
  HUB_URL=http://chrome:4444/wd/hub
18
+ HYRAX_CLAMAV=false
17
19
  HYRAX_DERIVATIVES_PATH=/app/samvera/hyrax-webapp/derivatives/
18
20
  HYRAX_ENGINE_PATH=/app/samvera/hyrax-engine
19
21
  HYRAX_UPLOAD_PATH=/app/samvera/hyrax-webapp/uploads/
@@ -41,10 +43,12 @@ SOLR_COLLECTION_NAME=koppie
41
43
  SOLR_CORE_CONF_DIR=/opt/solr/server/configsets/hyraxconf
42
44
  SOLR_CORES=koppie
43
45
  SOLR_HOST=solr
46
+ SOLR_MODULES=analysis-extras,extraction
44
47
  SOLR_PORT=8983
45
48
  SOLR_URL=http://solr:8983/solr/koppie
46
49
  SOLR_TEST_URL=http://solr:8983/solr/koppie-test
47
- TB_RSPEC_OPTIONS="--format RspecJunitFormatter --out rspec.xml"
50
+ RSPEC_SPLIT_CONFIGURATION_PATH=/app/samvera/hyrax-engine/.koppie/rspec_split_configuration.json
51
+ TB_RSPEC_OPTIONS="--order defined --format RspecJunitFormatter --out rspec.xml"
48
52
  TB_RSPEC_FORMATTER=progress
49
53
  VALKYRIE_METADATA_ADAPTER=pg_metadata
50
54
  VALKYRIE_STORAGE_ADAPTER=versioned_disk_storage
data/.koppie/Gemfile CHANGED
@@ -10,6 +10,8 @@ git_source(:github) { |repo| "https://github.com/#{repo}.git" }
10
10
 
11
11
  gem 'bootsnap', '>= 1.1.0', require: false
12
12
  gem 'bootstrap', '~> 4.0'
13
+ gem 'bulkrax', github: 'samvera/bulkrax', branch: 'grounded'
14
+ gem 'clamby', '~> 1.6', require: ENV['HYRAX_CLAMAV'] == 'true'
13
15
  gem 'coffee-rails', '~> 4.2'
14
16
  gem 'dalli'
15
17
  gem 'devise'
@@ -36,7 +38,7 @@ gem 'pg', '~> 1.3'
36
38
  gem 'puma'
37
39
  gem 'rack-mini-profiler', require: ['prepend_net_http_patch']
38
40
  gem 'rails', '~> 7.2', '< 8.0'
39
- gem 'riiif', '~> 2.1'
41
+ gem 'riiif', '~> 2.8'
40
42
  gem 'rsolr', '>= 1.0', '< 3'
41
43
  gem 'sass-rails', '~> 6.0'
42
44
  gem 'sidekiq', '~> 7.0'
@@ -16,6 +16,7 @@
16
16
  //
17
17
  // Required by Blacklight
18
18
  //= require jquery3
19
+ //= require jquery-ui
19
20
  //= require rails-ujs
20
21
  //= require popper
21
22
  //= require twitter/typeahead
@@ -25,6 +26,7 @@
25
26
  //= require blacklight/blacklight
26
27
  //= require blacklight_gallery
27
28
 
29
+ //= require bulkrax/application
28
30
  //= require_tree .
29
31
  //= require hyrax
30
32
 
@@ -12,6 +12,7 @@
12
12
  *
13
13
  *= require_tree .
14
14
  *= require dataTables.bootstrap4
15
+ *= require 'bulkrax/application'
15
16
  *= require_self
16
17
  */
17
18
 
@@ -2,7 +2,7 @@
2
2
  class CatalogController < ApplicationController
3
3
  include Hydra::Catalog
4
4
  include Hydra::Controller::ControllerBehavior
5
-
5
+ include Hyrax::FlexibleCatalogBehavior if Hyrax.config.flexible?
6
6
  # This filter applies the hydra access controls
7
7
  before_action :enforce_show_permissions, only: :show
8
8
 
@@ -3,6 +3,9 @@
3
3
  # Generated via
4
4
  # `rails generate hyrax:collection_resource CollectionResource`
5
5
  class CollectionResourceForm < Hyrax::Forms::PcdmCollectionForm
6
- include Hyrax::FormFields(:basic_metadata)
7
- include Hyrax::FormFields(:collection_resource)
6
+ if Hyrax.config.collection_include_metadata?
7
+ include Hyrax::FormFields(:basic_metadata)
8
+ include Hyrax::FormFields(:collection_resource)
9
+ end
10
+ check_if_flexible(CollectionResource)
8
11
  end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class FileSetForm < Hyrax::Forms::FileSetForm
4
+ check_if_flexible(FileSet)
5
+ end
@@ -6,9 +6,11 @@
6
6
  # @see https://github.com/samvera/hyrax/wiki/Hyrax-Valkyrie-Usage-Guide#forms
7
7
  # @see https://github.com/samvera/valkyrie/wiki/ChangeSets-and-Dirty-Tracking
8
8
  class GenericWorkForm < Hyrax::Forms::ResourceForm(GenericWork)
9
- include Hyrax::FormFields(:basic_metadata)
10
- include Hyrax::FormFields(:generic_work)
11
-
9
+ if Hyrax.config.work_include_metadata?
10
+ include Hyrax::FormFields(:basic_metadata)
11
+ include Hyrax::FormFields(:generic_work)
12
+ end
13
+ check_if_flexible(GenericWork)
12
14
  # Define custom form fields using the Valkyrie::ChangeSet interface
13
15
  #
14
16
  # property :my_custom_form_field
@@ -6,9 +6,11 @@
6
6
  # @see https://github.com/samvera/hyrax/wiki/Hyrax-Valkyrie-Usage-Guide#forms
7
7
  # @see https://github.com/samvera/valkyrie/wiki/ChangeSets-and-Dirty-Tracking
8
8
  class MonographForm < Hyrax::Forms::ResourceForm(Monograph)
9
- include Hyrax::FormFields(:basic_metadata)
10
- include Hyrax::FormFields(:monograph)
11
-
9
+ if Hyrax.config.work_include_metadata?
10
+ include Hyrax::FormFields(:basic_metadata)
11
+ include Hyrax::FormFields(:monograph)
12
+ end
13
+ check_if_flexible(Monograph)
12
14
  # Define custom form fields using the Valkyrie::ChangeSet interface
13
15
  #
14
16
  # property :my_custom_form_field
@@ -3,6 +3,9 @@
3
3
  # Generated via
4
4
  # `rails generate hyrax:collection_resource CollectionResource`
5
5
  class CollectionResourceIndexer < Hyrax::PcdmCollectionIndexer
6
- include Hyrax::Indexer(:basic_metadata)
7
- include Hyrax::Indexer(:collection_resource)
6
+ if Hyrax.config.collection_include_metadata?
7
+ include Hyrax::Indexer(:basic_metadata)
8
+ include Hyrax::Indexer(:collection_resource)
9
+ end
10
+ check_if_flexible(CollectionResource)
8
11
  end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Generated via
4
+ # `rails generate hyrax:work_resource Monograph`
5
+ class FileSetIndexer < Hyrax::Indexers::FileSetIndexer
6
+ check_if_flexible(FileSet)
7
+ end
@@ -3,9 +3,12 @@
3
3
  # Generated via
4
4
  # `rails generate hyrax:work_resource GenericWork`
5
5
  class GenericWorkIndexer < Hyrax::ValkyrieWorkIndexer
6
- include Hyrax::Indexer(:basic_metadata)
7
- include Hyrax::Indexer(:generic_work)
8
-
6
+ if Hyrax.config.work_include_metadata?
7
+ include Hyrax::Indexer(:core_metadata)
8
+ include Hyrax::Indexer(:basic_metadata)
9
+ include Hyrax::Indexer(:generic_work)
10
+ end
11
+ check_if_flexible(GenericWork)
9
12
  # Uncomment this block if you want to add custom indexing behavior:
10
13
  # def to_solr
11
14
  # super.tap do |index_document|
@@ -3,8 +3,12 @@
3
3
  # Generated via
4
4
  # `rails generate hyrax:work_resource Monograph`
5
5
  class MonographIndexer < Hyrax::ValkyrieWorkIndexer
6
- include Hyrax::Indexer(:basic_metadata)
7
- include Hyrax::Indexer(:monograph)
6
+ if Hyrax.config.work_include_metadata?
7
+ include Hyrax::Indexer(:core_metadata)
8
+ include Hyrax::Indexer(:basic_metadata)
9
+ include Hyrax::Indexer(:monograph)
10
+ end
11
+ check_if_flexible(Monograph)
8
12
 
9
13
  # Uncomment this block if you want to add custom indexing behavior:
10
14
  # def to_solr
@@ -22,4 +22,12 @@ class Ability
22
22
  can [:create, :show, :add_user, :remove_user, :index, :edit, :update, :destroy], Role
23
23
  end
24
24
  end
25
+
26
+ def can_import_works?
27
+ can_create_any_work?
28
+ end
29
+
30
+ def can_export_works?
31
+ can_create_any_work?
32
+ end
25
33
  end
@@ -27,6 +27,8 @@ class CollectionResource < Hyrax::PcdmCollection
27
27
  # * add Valkyrie attributes to this class
28
28
  # * update form and indexer to process the attributes
29
29
  #
30
- include Hyrax::Schema(:basic_metadata)
31
- include Hyrax::Schema(:collection_resource)
30
+ if Hyrax.config.collection_include_metadata
31
+ include Hyrax::Schema(:basic_metadata)
32
+ include Hyrax::Schema(:collection_resource)
33
+ end
32
34
  end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bulkrax::HasLocalProcessing
4
+ # This method is called during build_metadata
5
+ # add any special processing here, for example to reset a metadata property
6
+ # to add a custom property from outside of the import data
7
+ def add_local; end
8
+ end
@@ -3,6 +3,9 @@
3
3
  # Generated via
4
4
  # `rails generate hyrax:work_resource GenericWork`
5
5
  class GenericWork < Hyrax::Work
6
- include Hyrax::Schema(:basic_metadata)
7
- include Hyrax::Schema(:generic_work)
6
+ if Hyrax.config.work_include_metadata?
7
+ include Hyrax::Schema(:core_metadata)
8
+ include Hyrax::Schema(:basic_metadata)
9
+ include Hyrax::Schema(:generic_work)
10
+ end
8
11
  end
@@ -3,6 +3,9 @@
3
3
  # Generated via
4
4
  # `rails generate hyrax:work_resource Monograph`
5
5
  class Monograph < Hyrax::Work
6
- include Hyrax::Schema(:basic_metadata)
7
- include Hyrax::Schema(:monograph)
6
+ if Hyrax.config.work_include_metadata?
7
+ include Hyrax::Schema(:core_metadata)
8
+ include Hyrax::Schema(:basic_metadata)
9
+ include Hyrax::Schema(:monograph)
10
+ end
8
11
  end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ xml.instruct! :xml, version: '1.0', encoding: 'UTF-8'
4
+ xml.urlset(
5
+ 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
6
+ 'xsi:schemaLocation' => 'http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd',
7
+ 'xmlns' => 'http://www.sitemaps.org/schemas/sitemap/0.9'
8
+ ) do
9
+ config = BlacklightDynamicSitemap::Engine.config
10
+ @sitemap_entries.each do |doc|
11
+ solr_doc = SolrDocument.new(doc)
12
+
13
+ xml.url do
14
+ # Use Hyrax's routing logic: collections go through hyrax engine, works through main_app
15
+ url_parts = solr_doc.collection? ? [hyrax, solr_doc] : [main_app, solr_doc]
16
+ xml.loc(polymorphic_url(url_parts))
17
+
18
+ last_modified = doc[config.last_modified_field]
19
+ xml.lastmod(config.format_last_modified&.call(last_modified) || last_modified)
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,142 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require_relative '../config/environment'
5
+
6
+ require 'slop'
7
+
8
+ def main(opts = {})
9
+ check_required_params
10
+
11
+ update = opts[:importer_id].present?
12
+ port = opts[:port].presence
13
+ url = build_url(opts.delete(:importer_id), opts.delete(:url), port)
14
+
15
+ headers = { 'Content-Type' => 'application/json' }
16
+ headers['Authorization'] = "Token: #{opts.delete(:auth_token)}"
17
+ params = build_params(opts)
18
+
19
+ Rails.logger.info("POST to #{url} - PARAMS #{params}")
20
+
21
+ conn = Faraday.new(
22
+ url: url,
23
+ headers: headers
24
+ )
25
+
26
+ response = if update
27
+ conn.put do |request|
28
+ request.body = params.to_json
29
+ end
30
+ else
31
+ conn.post do |request|
32
+ request.body = params.to_json
33
+ end
34
+ end
35
+
36
+ puts "#{response.status} - #{response.body.truncate(200)}"
37
+ end
38
+
39
+ def check_required_params
40
+ if opts[:importer_id].blank? && invalid?(opts)
41
+ puts 'Missing required parameters'
42
+ help
43
+ end
44
+
45
+ if opts[:auth_token].blank? # rubocop:disable Style/GuardClause
46
+ puts 'Missing Authentication Token --auth_token'
47
+ exit
48
+ end
49
+ end
50
+
51
+ def invalid?(opts)
52
+ required_params.each do |p|
53
+ return true if opts[p.to_sym].blank?
54
+ end
55
+ return false
56
+ end
57
+
58
+ def required_params
59
+ Bulkrax.api_definition['bulkrax']['importer'].map { |key, value| key if value['required'] == true }.compact
60
+ end
61
+
62
+ def build_params(opts = {})
63
+ params = {}
64
+ params[:commit] = opts.delete(:commit)
65
+ parser_fields = {
66
+ metadata_file_name: opts.delete(:metadata_file_name),
67
+ metadata_format: opts.delete(:metadata_format),
68
+ rights_statement: opts.delete(:rights_statement),
69
+ override_rights_statement: opts.delete(:override_rights_statement),
70
+ import_file_path: opts.delete(:import_file_path),
71
+ metadata_prefix: opts.delete(:metadata_prefix),
72
+ set: opts.delete(:set),
73
+ collection_name: opts.delete(:collection_name)
74
+ }.compact
75
+ params[:importer] = opts.compact
76
+ params[:importer][:user_id] = opts.delete(:user_id)
77
+ params[:importer][:admin_set_id] = opts.delete(:admin_set_id)
78
+ params[:importer][:parser_fields] = parser_fields || {}
79
+ return params.compact
80
+ end
81
+
82
+ def build_url(importer_id, url, port = nil)
83
+ if url.nil?
84
+ protocol = Rails.application.config.force_ssl ? 'https://' : 'http://'
85
+ host = Rails.application.config.action_mailer.default_url_options[:host]
86
+ url = "#{protocol}#{host}"
87
+ url = "#{url}:#{port}" if port
88
+ end
89
+ path = Bulkrax::Engine.routes.url_helpers.polymorphic_path(Bulkrax::Importer)
90
+ url = File.join(url, path)
91
+ url = File.join(url, importer_id) if importer_id
92
+ return url
93
+ end
94
+
95
+ def version
96
+ puts "Bulkrax #{Bulkrax::VERSION}"
97
+ puts "Slop #{Slop::VERSION}"
98
+ end
99
+
100
+ # Format the help for the CLI
101
+ def help
102
+ puts 'CREATE:'
103
+ puts ' bin/importer --name "My Import" --parser_klass Bulkrax::CsvParser --commit "Create and Import" --import_file_path /data/tmp/import.csv --auth_token 12345'
104
+ puts 'UPDATE:'
105
+ puts ' bin/importer --importer_id 1 --commit "Update and Re-Import (update metadata only)" --import_file_path /data/tmp/import.csv --auth_token 12345'
106
+ puts 'PARAMETERS:'
107
+ Bulkrax.api_definition['bulkrax']['importer'].each_pair do |key, value|
108
+ next if key == 'parser_fields'
109
+ puts " --#{key}"
110
+ value.each_pair do |k, v|
111
+ next if k == 'contained_in'
112
+ puts " #{k}: #{v}"
113
+ end
114
+ end
115
+ puts ' --url'
116
+ puts " Repository URL"
117
+ exit
118
+ end
119
+
120
+ # Setup the options
121
+ options = Slop.parse do |o|
122
+ o.on '--version', 'Print the version' do
123
+ version
124
+ exit
125
+ end
126
+
127
+ o.on '--help', 'Print help' do
128
+ help
129
+ exit
130
+ end
131
+
132
+ Bulkrax.api_definition['bulkrax']['importer'].each_pair do |key, value|
133
+ if value['required'].blank?
134
+ o.string "--#{key}", value['definition'], default: nil
135
+ else
136
+ o.string "--#{key}", value['definition']
137
+ end
138
+ end
139
+ o.string '--url', 'Repository URL'
140
+ end
141
+
142
+ main(options.to_hash)
data/.koppie/bin/web ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ exec "./bin/rails s -b 0.0.0.0"
@@ -3,6 +3,8 @@
3
3
  # The file_system provider can be a path to any directory on the server where your application is running.
4
4
  #
5
5
  ---
6
+ file_system:
7
+ home: <%= ENV.fetch('BROWSE_EVERYTHING_FS_PROVIDER_PATH', Rails.root.join('test_files')) %>
6
8
  # file_system:
7
9
  # :home: "/tmp"
8
10
  # dropbox:
@@ -0,0 +1,86 @@
1
+ bulkrax:
2
+ importer:
3
+ importer_id:
4
+ definition: 'The ID of the Importer. Used for Update only. CLI only.'
5
+ name:
6
+ definition: 'Name for the Importer'
7
+ required: true
8
+ admin_set_id:
9
+ definition: 'AdminSet ID. If not supplied the default AdminSet is used.'
10
+ parser_fields:
11
+ definition: 'Contains additional information which varies depending on the parser. Some is required.'
12
+ type: container
13
+ rights_statement:
14
+ definition: 'Supply a URI from the application rights statements'
15
+ valid_values: <%= Hyrax.config.rights_statement_service_class.new.select_active_options.map(&:last) %>
16
+ contained_in: parser_fields
17
+ override_rights_statement:
18
+ definition: 'Override any existing rights statements: 1 for yes | 0 for no'
19
+ valid_values:
20
+ - 0
21
+ - 1
22
+ contained_in: parser_fields
23
+ import_file_path:
24
+ definition: 'Path to the import file - required for CSV and BagIt only'
25
+ required:
26
+ - 'Bulkrax::BagitParser'
27
+ - 'Bulkrax::CsvParser'
28
+ contained_in: parser_fields
29
+ selected_files:
30
+ definition: 'Used by browse everything to retrieve files from cloud URLs'
31
+ metadata_file_name:
32
+ definition: 'Filename used for metadata files - required for BagIt only'
33
+ required:
34
+ - 'Bulkrax::BagitParser'
35
+ contained_in: parser_fields
36
+ metadata_format:
37
+ definition: 'RDF or CSV - required for BagIt only'
38
+ required:
39
+ - 'Bulkrax::BagitParser'
40
+ valid_values:
41
+ - 'Bulkrax::RdfEntry'
42
+ - 'Bulkrax::CsvEntry'
43
+ contained_in: parser_fields
44
+ set:
45
+ definition: 'The OAI setSpec - required for OAI only'
46
+ required:
47
+ - 'Bulkrax::OaiParser'
48
+ contained_in: parser_fields
49
+ collection_name:
50
+ definition: 'The OAI setName - required for required for OAI only'
51
+ required:
52
+ - 'Bulkrax::OaiParser'
53
+ contained_in: parser_fields
54
+ parser_klass:
55
+ definition: 'Parser name eg. Bulkrax::CsvParser'
56
+ required: true
57
+ valid_values: <%= Bulkrax.parsers.map {|p|p[:class_name]} %>
58
+ limit:
59
+ definition: 'Number of records to import; blank for all'
60
+ frequency:
61
+ definition: ISO 8601 Durations <%= Bulkrax::Importer.frequency_enums.map(&:first).join('; ') %>
62
+ valid_values: <%= Bulkrax::Importer.frequency_enums.map(&:last) %>
63
+ field_mapping:
64
+ definition: 'See bulkrax/lib/bulkrax.rb for further information'
65
+ user_id:
66
+ definition: 'ID of the User creating the Importer. If not supplied, the batch_user will be used.'
67
+ base_url:
68
+ definition: 'Base URL for the Endpoint - required for OAI Only'
69
+ required:
70
+ - 'Bulkrax::OaiParser'
71
+ commit:
72
+ definition: 'Commit Message, Bulkrax uses commit messages to decide what action to take.'
73
+ required: true
74
+ valid_values:
75
+ - "Create"
76
+ - "Create and Import"
77
+ - "Update Importer"
78
+ - "Update and Re-Import (update metadata and replace files)"
79
+ - "Update and Harvest Updated Items', 'Update and Re-Harvest All Items"
80
+ - "Update and Re-Import (update metadata only)"
81
+ - "Update and Import (importer has not yet been run)"
82
+ auth_token:
83
+ definition: 'Authentication token. Required for JSON requests only.'
84
+ required: true
85
+ port:
86
+ definition: 'Port to use in http request. Defaults to 80. May need to set to 3000 when running in the development environment'