hyrax 5.1.0.pre.beta1 → 5.2.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 (104) hide show
  1. checksums.yaml +4 -4
  2. data/.dassie/.env +4 -0
  3. data/.dassie/Gemfile +12 -7
  4. data/.dassie/app/controllers/application_controller.rb +4 -0
  5. data/.dassie/app/helpers/hyrax_helper.rb +4 -0
  6. data/.dassie/app/models/ability.rb +4 -0
  7. data/.dassie/app/models/user.rb +11 -0
  8. data/.dassie/app/views/shared/_footer.html.erb +17 -0
  9. data/.dassie/config/application.rb +1 -1
  10. data/.dassie/config/database.yml +18 -0
  11. data/.dassie/config/environments/production.rb +1 -1
  12. data/.dassie/config/fedora.yml +6 -6
  13. data/.dassie/config/initializers/devise.rb +1 -0
  14. data/.dassie/config/initializers/profiler.rb +5 -0
  15. data/.dassie/config/locales/hyrax.en.yml +1 -1
  16. data/.dassie/config/puma.rb +55 -5
  17. data/.dassie/config/routes.rb +2 -0
  18. data/.dassie/db/migrate/20250328100249_user_roles.rb +20 -0
  19. data/.dassie/db/schema.rb +123 -109
  20. data/.github/workflows/lint-build-test.yml +34 -5
  21. data/.koppie/.env +1 -1
  22. data/.koppie/Gemfile +10 -6
  23. data/.koppie/app/controllers/application_controller.rb +4 -0
  24. data/.koppie/app/helpers/hyrax_helper.rb +4 -0
  25. data/.koppie/app/models/ability.rb +4 -0
  26. data/.koppie/app/models/user.rb +10 -0
  27. data/.koppie/app/views/shared/_footer.html.erb +17 -0
  28. data/.koppie/config/database.yml +2 -9
  29. data/.koppie/config/environments/development.rb +9 -0
  30. data/.koppie/config/environments/production.rb +1 -1
  31. data/.koppie/config/initializers/1_valkyrie.rb +5 -5
  32. data/.koppie/config/initializers/devise.rb +1 -1
  33. data/.koppie/config/initializers/profiler.rb +5 -0
  34. data/.koppie/config/locales/hyrax.en.yml +2 -2
  35. data/.koppie/config/puma.rb +26 -7
  36. data/.koppie/config/routes.rb +2 -0
  37. data/.koppie/db/schema.rb +109 -110
  38. data/CONTAINERS.md +10 -10
  39. data/Dockerfile +108 -50
  40. data/Gemfile +2 -1
  41. data/app/controllers/concerns/hyrax/valkyrie_downloads_controller_behavior.rb +1 -0
  42. data/app/controllers/concerns/hyrax/works_controller_behavior.rb +2 -1
  43. data/app/controllers/hyrax/admin/analytics/work_reports_controller.rb +4 -4
  44. data/app/controllers/hyrax/file_sets_controller.rb +11 -0
  45. data/app/helpers/hyrax/hyrax_helper_behavior.rb +2 -2
  46. data/app/helpers/hyrax/trophy_helper.rb +1 -1
  47. data/app/jobs/concerns/hyrax/queued_job_behavior.rb +22 -0
  48. data/app/jobs/hyrax/propagate_change_depositor_job.rb +1 -1
  49. data/app/jobs/hyrax/queued_delete_job.rb +11 -0
  50. data/app/jobs/hyrax/queued_indexing_job.rb +11 -0
  51. data/app/jobs/migrate_files_to_valkyrie_job.rb +33 -21
  52. data/app/jobs/migrate_sipity_entity_job.rb +21 -0
  53. data/app/models/concerns/hyrax/ability.rb +4 -2
  54. data/app/models/concerns/hyrax/solr_document_behavior.rb +5 -2
  55. data/app/models/hyrax/file_metadata.rb +22 -7
  56. data/app/services/hyrax/analytics/ga4/base.rb +1 -1
  57. data/app/services/hyrax/analytics/ga4.rb +5 -1
  58. data/app/services/hyrax/change_depositor_service.rb +1 -1
  59. data/app/services/hyrax/characterization/valkyrie_characterization_service.rb +21 -13
  60. data/app/services/hyrax/custom_queries/find_ids_by_model.rb +31 -6
  61. data/app/services/hyrax/edit_permissions_service.rb +9 -8
  62. data/app/services/hyrax/workflow/workflow_factory.rb +3 -3
  63. data/app/services/migrate_resource_service.rb +1 -1
  64. data/app/views/_user_util_links.html.erb +2 -1
  65. data/app/views/hyrax/admin/analytics/collection_reports/_top_collections.html.erb +3 -7
  66. data/app/views/hyrax/admin/analytics/work_reports/_top_file_set_downloads.html.erb +3 -6
  67. data/app/views/hyrax/admin/analytics/work_reports/_top_works.html.erb +2 -3
  68. data/app/views/hyrax/admin/analytics/work_reports/_work_files.html.erb +1 -6
  69. data/app/views/hyrax/base/_social_media.html.erb +2 -0
  70. data/app/views/hyrax/base/iiif_viewers/_universal_viewer.html.erb +1 -1
  71. data/app/views/hyrax/dashboard/collections/_show_document_list_menu.html.erb +13 -12
  72. data/app/views/hyrax/my/_admin_set_action_menu.html.erb +31 -27
  73. data/app/views/hyrax/my/_collection_action_menu.html.erb +40 -35
  74. data/app/views/hyrax/my/_work_action_menu.html.erb +23 -22
  75. data/bin/db-migrate-seed.sh +1 -1
  76. data/bin/dev-entrypoint.sh +3 -0
  77. data/config/features.rb +50 -40
  78. data/config/initializers/indexing_adapter_initializer.rb +4 -0
  79. data/config/initializers/new_framework_defaults_7_2.rb +6 -4
  80. data/config/initializers/reform_rails_6_1_monkey_patch.rb +29 -0
  81. data/config/metadata/core_metadata.yaml +1 -0
  82. data/docker-compose-dassie.yml +6 -6
  83. data/docker-compose-koppie.yml +2 -2
  84. data/docker-compose-sirenia.yml +2 -2
  85. data/documentation/developing-your-hyrax-based-app.md +2 -2
  86. data/hyrax.gemspec +3 -3
  87. data/lib/freyja/persister.rb +11 -4
  88. data/lib/generators/hyrax/install_generator.rb +0 -5
  89. data/lib/generators/hyrax/templates/.env +1 -1
  90. data/lib/generators/hyrax/templates/config/initializers/1_valkyrie.rb +21 -19
  91. data/lib/generators/hyrax/templates/db/migrate/20170131142607_add_permission_template_to_sipity_workflow.rb.erb +1 -1
  92. data/lib/generators/hyrax/templates/db/migrate/20170810190549_update_collection_type_column_options.rb.erb +1 -1
  93. data/lib/generators/hyrax/templates/db/migrate/20230821153635_add_fields_to_counter_metric.rb.erb +1 -1
  94. data/lib/hyrax/configuration.rb +22 -7
  95. data/lib/hyrax/controlled_vocabulary/importer/language.rb +5 -1
  96. data/lib/hyrax/transactions/steps/add_file_sets.rb +2 -1
  97. data/lib/hyrax/version.rb +1 -1
  98. data/lib/hyrax.rb +1 -0
  99. data/lib/tasks/workflow.rake +1 -2
  100. data/lib/valkyrie/indexing/redis_queue/indexing_adapter.rb +144 -0
  101. data/lib/wings/valkyrie/query_service.rb +3 -4
  102. data/template.rb +1 -1
  103. metadata +28 -14
  104. data/.github/workflows/main.yml +0 -17
data/.koppie/Gemfile CHANGED
@@ -19,24 +19,28 @@ gem 'devise-guests', '~> 0.8'
19
19
  # To install the package in Alpine: `apk add ruby-grpc`
20
20
  # The pinned versions should match the version provided by the Alpine packages.
21
21
 
22
- # Disabled due to dependency mismatches in Alpine packages (grpc 1.62.1 needs protobuf ~> 3.25)
23
- # if RUBY_PLATFORM =~ /musl/
22
+ if RUBY_PLATFORM =~ /musl/
23
+ # Disabled due to dependency mismatches in Alpine packages (grpc 1.62.1 needs protobuf ~> 3.25)
24
24
  # path '/usr/lib/ruby/gems/3.3.0' do
25
- # gem 'google-protobuf', '~> 3.24.4', force_ruby_platform: true
26
- # gem 'grpc', '~> 1.62.1', force_ruby_platform: true
25
+ gem 'google-protobuf', force_ruby_platform: true
26
+ gem 'grpc', force_ruby_platform: true
27
27
  # end
28
- # end
28
+ end
29
29
 
30
+ gem 'hydra-role-management'
30
31
  gemspec name: 'hyrax', path: ENV.fetch('HYRAX_ENGINE_PATH', '..')
31
32
  gem 'jbuilder', '~> 2.5'
32
33
  gem 'jquery-rails'
34
+ gem 'okcomputer'
33
35
  gem 'pg', '~> 1.3'
34
36
  gem 'puma'
37
+ gem 'rack-mini-profiler', require: ['prepend_net_http_patch']
35
38
  gem 'rails', '~> 7.2', '< 8.0'
36
39
  gem 'riiif', '~> 2.1'
37
40
  gem 'rsolr', '>= 1.0', '< 3'
38
41
  gem 'sass-rails', '~> 6.0'
39
- gem 'sidekiq', '~> 6.4'
42
+ gem 'sidekiq', '~> 7.0'
43
+ gem 'stackprof', require: false
40
44
  gem 'turbolinks', '~> 5'
41
45
  gem 'twitter-typeahead-rails', '0.11.1.pre.corejavascript'
42
46
  gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
@@ -10,4 +10,8 @@ class ApplicationController < ActionController::Base
10
10
  with_themed_layout '1_column'
11
11
 
12
12
  protect_from_forgery with: :exception
13
+
14
+ before_action do
15
+ Rack::MiniProfiler.authorize_request if current_user&.admin?
16
+ end
13
17
  end
@@ -3,4 +3,8 @@ module HyraxHelper
3
3
  include ::BlacklightHelper
4
4
  include Hyrax::BlacklightOverride
5
5
  include Hyrax::HyraxHelperBehavior
6
+
7
+ def application_name
8
+ ENV.fetch('APP_NAME') { super }.titleize
9
+ end
6
10
  end
@@ -17,5 +17,9 @@ class Ability
17
17
  # if user_groups.include? 'special_group'
18
18
  # can [:create], ActiveFedora::Base
19
19
  # end
20
+
21
+ if current_user.admin?
22
+ can [:create, :show, :add_user, :remove_user, :index, :edit, :update, :destroy], Role
23
+ end
20
24
  end
21
25
  end
@@ -2,6 +2,9 @@ class User < ApplicationRecord
2
2
  # Connects this user object to Hydra behaviors.
3
3
  include Hydra::User
4
4
 
5
+ # Connects this user object to Role-management behaviors.
6
+ include Hydra::RoleManagement::UserRoles
7
+
5
8
  # Connects this user object to Hyrax behaviors.
6
9
  include Hyrax::User
7
10
  include Hyrax::UserUsageStats
@@ -19,4 +22,11 @@ class User < ApplicationRecord
19
22
  def to_s
20
23
  email
21
24
  end
25
+
26
+ # Groups include roles and those set by #groups= (especially in specs)
27
+ def groups
28
+ g = roles.map(&:name)
29
+ g += group_service.fetch_groups(user: self)
30
+ g
31
+ end
22
32
  end
@@ -0,0 +1,17 @@
1
+ <footer class="navbar navbar-dark bg-dark site-footer">
2
+ <div class="container-fluid">
3
+ <div class="navbar-text text-left">
4
+ <p><%= t('hyrax.footer.service_html') %> <%= t('hyrax.product_name') %> v<%= Hyrax::VERSION %></p>
5
+ <p>Commit <%= link_to ENV.fetch('BUILD_GITSHA', "Unknown")[0..6],
6
+ "https://github.com/samvera/hyrax/commit/#{ENV.fetch('BUILD_GITSHA', 'main')}" %>
7
+ Built at <%= ENV.fetch('BUILD_TIMESTAMP', 'Unknown') %>
8
+ </p>
9
+ </div>
10
+ <div class="navbar-right">
11
+ <div class="navbar-text text-right">
12
+ <p><%= t('hyrax.footer.copyright_html', current_year: Time.current.year) %></p>
13
+ <p><%= t('hyrax.background_attribution_html') %></p>
14
+ </div>
15
+ </div>
16
+ </div>
17
+ </footer>
@@ -1,23 +1,16 @@
1
1
  default: &default
2
2
  adapter: postgresql
3
- pool: <%= ENV.fetch('DB_POOL') { 5 } %>
4
- timeout: <%= ENV.fetch('DB_TIMEOUT') { 5000 } %>
5
- database: <%= ENV['APP_DB_NAME'] %>
6
- username: <%= ENV['DB_USERNAME'] %>
7
- password: <%= ENV['DB_PASSWORD'] %>
8
- host: <%= ENV['DB_HOST'] %>
9
- port: <%= ENV['DB_PORT'] %>
3
+ url: <%= ENV.fetch('DATABASE_URL') %>
10
4
 
11
5
  development:
12
6
  <<: *default
13
- database: <%= ENV.fetch('APP_DB_NAME', 'nurax_pg_development') %>
14
7
 
15
8
  # Warning: The database defined as "test" will be erased and
16
9
  # re-generated from your development database when you run "rake".
17
10
  # Do not set this db to the same as development or production.
18
11
  test:
19
12
  <<: *default
20
- database: <%= ENV.fetch('APP_DB_NAME', 'nurax_pg_test') %>
13
+ url: <%= ENV.fetch('DATABASE_TEST_URL') { ENV.fetch('DATABASE_URL') } %>
21
14
 
22
15
  production:
23
16
  <<: *default
@@ -29,6 +29,15 @@ Rails.application.configure do
29
29
  config.cache_store = :null_store
30
30
  end
31
31
 
32
+ # Logging
33
+ #
34
+ config.log_level = ENV.fetch("RAILS_LOG_LEVEL", 'debug')
35
+ config.log_formatter = ::Logger::Formatter.new
36
+ # log to stdout
37
+ logger = ActiveSupport::Logger.new(STDOUT)
38
+ logger.formatter = config.log_formatter
39
+ config.logger = ActiveSupport::TaggedLogging.new(logger)
40
+
32
41
  # Store uploaded files on the local file system (see config/storage.yml for options)
33
42
  config.active_storage.service = :local
34
43
 
@@ -56,7 +56,7 @@ Rails.application.configure do
56
56
 
57
57
  # Use the lowest log level to ensure availability of diagnostic information
58
58
  # when problems arise.
59
- config.log_level = :debug
59
+ config.log_level = ENV.fetch("RAILS_LOG_LEVEL", :debug).to_sym
60
60
 
61
61
  # Prepend all log lines with the following tags.
62
62
  config.log_tags = [ :request_id ]
@@ -31,8 +31,8 @@ Valkyrie::MetadataAdapter.register(
31
31
  Valkyrie::MetadataAdapter.register(
32
32
  Valkyrie::Persistence::Fedora::MetadataAdapter.new(
33
33
  connection: ::Ldp::Client.new(Hyrax.config.fedora_connection_builder.call(
34
- ENV.fetch('FCREPO_URL') { "http://localhost:8080/fcrepo/rest" })),
35
- base_path: Rails.env,
34
+ ENV.fetch('FEDORA6_URL') { ENV.fetch('FEDORA_URL') { "http://localhost:8080/fcrepo/rest" } })),
35
+ base_path: ENV.fetch('FEDORA_BASE_PATH', Rails.env).gsub(/^\/|\/$/, ''),
36
36
  schema: Valkyrie::Persistence::Fedora::PermissiveSchema.new(Hyrax::SimpleSchemaLoader.new.permissive_schema_for_valkrie_adapter),
37
37
  fedora_version: 6.5,
38
38
  fedora_pairtree_count: 4,
@@ -64,8 +64,8 @@ Valkyrie.config.metadata_adapter = ENV.fetch('VALKYRIE_METADATA_ADAPTER') { :pg_
64
64
  Valkyrie::StorageAdapter.register(
65
65
  Valkyrie::Storage::Fedora.new(
66
66
  connection: ::Ldp::Client.new(Hyrax.config.fedora_connection_builder.call(
67
- ENV.fetch('FCREPO_URL') { "http://localhost:8080/fcrepo/rest" })),
68
- base_path: Rails.env,
67
+ ENV.fetch('FEDORA6_URL') { ENV.fetch('FEDORA_URL') { "http://localhost:8080/fcrepo/rest" } })),
68
+ base_path: ENV.fetch('FEDORA_BASE_PATH', Rails.env).gsub(/^\/|\/$/, ''),
69
69
  fedora_version: 6.5,
70
70
  fedora_pairtree_count: 4,
71
71
  fedora_pairtree_length: 2
@@ -73,7 +73,7 @@ Valkyrie::StorageAdapter.register(
73
73
  )
74
74
 
75
75
  Valkyrie::StorageAdapter.register(
76
- Valkyrie::Storage::VersionedDisk.new(base_path: Rails.root.join("storage", "files"),
76
+ Valkyrie::Storage::VersionedDisk.new(base_path: ENV.fetch('HYRAX_STORAGE_PATH') { Rails.root.join("storage", "files") },
77
77
  file_mover: FileUtils.method(:cp)),
78
78
  :versioned_disk_storage
79
79
  )
@@ -266,7 +266,7 @@ Devise.setup do |config|
266
266
  # config.navigational_formats = ['*/*', :html]
267
267
 
268
268
  # The default HTTP method used to sign out a resource. Default is :delete.
269
- config.sign_out_via = :get
269
+ config.sign_out_via = :delete
270
270
 
271
271
  # ==> OmniAuth
272
272
  # Add a new OmniAuth provider. Check the wiki for more information on setting
@@ -0,0 +1,5 @@
1
+ require 'stackprof'
2
+ require 'rack-mini-profiler'
3
+
4
+ # initialization is skipped so trigger it
5
+ Rack::MiniProfilerRails.initialize!(Rails.application)
@@ -50,9 +50,9 @@ en:
50
50
  directory:
51
51
  suffix: "@example.org"
52
52
  footer:
53
- copyright_html: "<strong>Copyright &copy; 2022 Samvera</strong> Licensed under the Apache License, Version 2.0"
53
+ copyright_html: "<strong>Copyright &copy; %{current_year} Samvera</strong> Licensed under the Apache License, Version 2.0"
54
54
  service_html: A service of <a href="http://samvera.org/" class="navbar-link" target="_blank">Samvera</a>.
55
55
  institution_name: Institution
56
56
  institution_name_full: The Institution Name
57
- product_name: Koppie
57
+ product_name: Hyrax
58
58
  product_twitter_handle: "@SamveraRepo"
@@ -4,19 +4,20 @@
4
4
  # the maximum value specified for Puma. Default is set to 5 threads for minimum
5
5
  # and maximum; this matches the default thread size of Active Record.
6
6
  #
7
- threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }
8
- threads threads_count, threads_count
7
+ threads_count = ENV.fetch("RAILS_MAX_THREADS", 5).to_i
8
+ threads 1, threads_count - 2
9
9
 
10
10
  # Specifies the `port` that Puma will listen on to receive requests; default is 3000.
11
11
  #
12
- port ENV.fetch("PORT") { 3000 }
12
+ port ENV.fetch("PORT", 3000)
13
13
 
14
14
  # Specifies the `environment` that Puma will run in.
15
15
  #
16
- environment ENV.fetch("RAILS_ENV") { "development" }
16
+ rails_env = ENV.fetch("RAILS_ENV", 'development')
17
+ environment rails_env
17
18
 
18
19
  # Specifies the `pidfile` that Puma will use.
19
- pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" }
20
+ pidfile ENV.fetch("PIDFILE", 'tmp/pids/server.pid')
20
21
 
21
22
  # Specifies the number of `workers` to boot in clustered mode.
22
23
  # Workers are forked webserver processes. If using threads and workers together
@@ -24,14 +25,32 @@ pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" }
24
25
  # Workers do not work on JRuby or Windows (both of which do not support
25
26
  # processes).
26
27
  #
27
- # workers ENV.fetch("WEB_CONCURRENCY") { 2 }
28
+ workers ENV.fetch('WEB_CONCURRENCY', 1)
28
29
 
29
30
  # Use the `preload_app!` method when specifying a `workers` number.
30
31
  # This directive tells Puma to first boot the application and load code
31
32
  # before forking the application. This takes advantage of Copy On Write
32
33
  # process behavior so workers use less memory.
33
34
  #
34
- # preload_app!
35
+ preload_app!
35
36
 
36
37
  # Allow puma to be restarted by `rails restart` command.
37
38
  plugin :tmp_restart
39
+
40
+ # Embedded Sidekiq https://github.com/sidekiq/sidekiq/wiki/Embedding
41
+ if ENV.fetch('SIDEKIQ_MODE', false) == 'embed'
42
+ embedded_sidekiq = nil
43
+
44
+ on_worker_boot do
45
+ embedded_sidekiq = Sidekiq.configure_embed do |config|
46
+ config.logger.level = ENV.fetch("RAILS_LOG_LEVEL", 'debug')
47
+ config.queues = %w[ingest batch default]
48
+ config.concurrency = ENV.fetch('SIDEKIQ_WORKERS', 2) # Adjust max `threads` above accordingly
49
+ end
50
+ embedded_sidekiq.run
51
+ end
52
+
53
+ on_worker_shutdown do
54
+ embedded_sidekiq&.stop
55
+ end
56
+ end
@@ -12,6 +12,8 @@ Rails.application.routes.draw do
12
12
  concerns :searchable
13
13
  end
14
14
  devise_for :users
15
+ mount Hydra::RoleManagement::Engine => '/'
16
+
15
17
  mount Sidekiq::Web => '/sidekiq'
16
18
  mount Qa::Engine => '/authorities'
17
19
  mount Hyrax::Engine, at: '/'