diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 10708a84..50094ff0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -60,7 +60,7 @@ jobs: - name: Set up Ruby uses: ruby/setup-ruby@v1 with: - ruby-version: 3.2.10 + ruby-version: 4.0.1 - uses: actions/cache@v4 with: path: vendor/bundle diff --git a/.rubocop.yml b/.rubocop.yml index f04e59f0..c16d38cb 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,11 +1,11 @@ -require: +plugins: - rubocop-packaging - rubocop-performance - rubocop-rails - rubocop-rspec AllCops: - TargetRubyVersion: 3.1 + TargetRubyVersion: 4.0 # RuboCop has a bunch of cops enabled by default. This setting tells RuboCop # to ignore them, so only the ones explicitly set in this file are enabled. DisabledByDefault: true diff --git a/.ruby-version b/.ruby-version index f15386a5..90cdbdcb 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -3.2.10 +ruby-4.0.1 diff --git a/Dockerfile b/Dockerfile index 38c6b2b0..80c7317c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM phusion/passenger-full:3.1.6 +FROM phusion/passenger-ruby40:3.1.6 LABEL maintainer="support@datacite.org" # Set correct environment variables @@ -10,8 +10,8 @@ RUN usermod -a -G docker_env app # Use baseimage-docker's init process CMD ["/sbin/my_init"] -# Use Ruby 3.2.10 -RUN bash -lc 'rvm --default use ruby-3.2.10' +# set ddefault Ruby version +RUN bash -lc 'rvm --default use ruby-4.0.1' # Set debconf to run non-interactively RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections diff --git a/Gemfile b/Gemfile index 0ac5bb1d..bc8a3ae6 100755 --- a/Gemfile +++ b/Gemfile @@ -1,122 +1,99 @@ source "https://rubygems.org" -gem "bootsnap", "~> 1.4", ">= 1.4.4", require: false -gem "msgpack", "~> 1.4.4" -gem "mysql2", "~> 0.5.0" -gem "rails", "~> 7.2", ">= 7.2.3" +gem "bootsnap", "~> 1.23", require: false +gem "msgpack", "~> 1.8" +gem "mysql2", "~> 0.5.7" +gem "rails", "~> 8.1", ">= 8.1.2" -gem "aasm", "~> 5.0", ">= 5.0.6" -gem "active_model_serializers", "~> 0.10.10" -gem "addressable", "~> 2.7" -gem "aws-sdk-s3", require: false -gem "aws-sdk-sqs", "~> 1.23", ">= 1.23.1" -gem "base32-crockford-checksum", "~> 0.2.3" -gem "config", "~> 5.4" -gem "connection_pool", "< 3.0" -gem "dotenv", "~> 2.7", ">= 2.7.5" +gem "aasm", "~> 5.5", ">= 5.5.2" +gem "active_model_serializers", "~> 0.10.16" +gem "addressable", "~> 2.8", ">= 2.8.9" +gem "aws-sdk-s3", "~> 1.215", require: false +gem "aws-sdk-sqs", "~> 1.111" +gem "config", "~> 5.6", ">= 5.6.1" +gem "connection_pool", "~> 3.0", ">= 3.0.2" +gem "dotenv", "~> 3.2" # IMPORTANT!!! # We have monkey patched this gem -> config/initializers/serialization_core.rb # Please check this before upgrading/downgrading versions gem "jsonapi-serializer", "~> 2.2" -gem "flipper", "~> 1.3" -gem "flipper-active_support_cache_store" -gem "flipper-api" -gem "flipper-redis" -gem "flipper-ui" -gem "nilify_blanks", "~> 1.3" -gem "oj", ">= 2.8.3" -gem "oj_mimic_json", "~> 1.0", ">= 1.0.1" -gem "orcid_client", "~> 0.17.1" -gem "postrank-uri", "~> 1.1" -gem "rake", "~> 12.0" -gem "sentry-raven", "~> 3.1", ">= 3.1.2" -gem "shoryuken", "~> 7.0" +gem "flipper", "~> 1.4" +gem "flipper-active_support_cache_store", "~> 1.4" +gem "flipper-redis", "~> 1.4" +gem "flipper-ui", "~> 1.4" +gem "oj", "~> 3.16", ">= 3.16.16" +gem "orcid_client", "~> 0.18.0" +gem "rake", "~> 13.3", ">= 13.3.1" +gem "sentry-ruby", "~> 6.4", ">= 6.4.1" +gem "sentry-rails", "~> 6.4", ">= 6.4.1" +gem "shoryuken", "~> 7.0", ">= 7.0.1" gem "strip_attributes", "~> 1.9", ">= 1.9.2" -gem "tzinfo-data", "~> 1.2019", ">= 1.2019.3" +gem "tzinfo-data", "~> 1.2026", ">= 1.2026.1" -gem "commonmarker", "~> 0.21.0" -gem "country_select", "~> 4.0" -gem "dalli", "~> 2.7", ">= 2.7.10" -gem "hashie" -gem "kaminari", "~> 1.2" -gem "lograge", "~> 0.11.2" +gem "dalli", "~> 5.0", ">= 5.0.2" +gem "hashie", "~> 5.1" +gem "kaminari", "~> 1.2", ">= 1.2.2" +gem "lograge", "~> 0.14.0" gem "logstash-event", "~> 1.2", ">= 1.2.02" gem "logstash-logger", "~> 0.26.1" -gem "namae", "~> 1.0", ">= 1.0.1" -gem "nokogiri", "~> 1.10", ">= 1.10.7" -gem "rack-cors", "~> 1.0", require: "rack/cors" -gem "rouge", "~> 3.15" -gem "simple_form", "~> 4.1.0" -gem "cancancan", "~> 3.0" -gem "devise", "~> 4.8", ">= 4.8.1" -gem "gravtastic", "~> 3.2", ">= 3.2.6" -gem "jwt", "~> 2.2", ">= 2.2.1" -gem "mailgun-ruby", "~> 1.2" -gem "oauth2", "~> 1.4" -gem "omniauth", "~> 2.0", ">= 2.0.4" +gem "namae", "~> 1.2" +gem "nokogiri", "~> 1.19", ">= 1.19.1" +gem "simple_form", "~> 5.4", ">= 5.4.1" + +gem "cancancan", "~> 3.6", ">= 3.6.1" +gem "devise", "~> 5.0", ">= 5.0.2" +gem "jwt", "~> 3.1", ">= 3.1.2" +gem "mailgun-ruby", "~> 1.4", ">= 1.4.2" # not sure this is used +gem "omniauth", "~> 2.1", ">= 2.1.4" gem "omniauth-github", "~> 2.0" -gem "omniauth-globus", "~> 0.9.1" gem "omniauth-orcid", "~> 2.0" -gem "omniauth-rails_csrf_protection", "~> 1.0" -gem "repost", "~> 0.3.7" -gem "validates_email_format_of", "~> 1.6", ">= 1.6.3" +gem "omniauth-rails_csrf_protection", "~> 2.0", ">= 2.0.1" +gem "repost", "~> 0.5.1" -gem "apollo-federation", "~> 1.0" -gem "batch-loader", "~> 1.4", ">= 1.4.1" -gem "elasticsearch", "~> 7.1.0" -gem "elasticsearch-model", "~> 7.0", require: "elasticsearch/model" -gem "elasticsearch-rails", "~> 7.0" +gem "apollo-federation", "~> 3.10", ">= 3.10.3" +gem "elasticsearch", "~> 8.19", ">= 8.19.3" +gem "elasticsearch-model", "~> 8.0", ">= 8.0.1", require: "elasticsearch/model" +gem "elasticsearch-rails", "~> 8.0", ">= 8.0.1" +gem "elastic-transport", "~> 8.0", ">= 8.0.1" gem "faraday_middleware-aws-sigv4", "~> 0.3.0" -gem "google-protobuf", "3.19.6" -gem "graphql", "~> 2.0.0" -gem "graphql-batch", "~> 0.5.1" -gem "maremma", "~> 5.0" -gem "rack-utf8_sanitizer", "~> 1.6" +gem "google-protobuf", "4.34" +gem "graphql", "~> 2.5", ">= 2.5.21" +gem "graphql-batch", "~> 0.6.1" +gem "maremma", "~> 6.0" -gem "coffee-rails", "~> 4.1", ">= 4.1.1" -gem "git", "~> 1.5" -gem "mini_magick", "~> 4.5", ">= 4.5.1" -gem "rack-jwt" -gem "remotipart", "~> 1.2" -gem "sprockets", "~> 3.7", ">= 3.7.2" -gem "sprockets-rails", "~> 3.2", ">= 3.2.1", require: "sprockets/railtie" -gem "uglifier", "~> 2.7", ">= 2.7.2" +gem "mini_magick", "~> 5.3", ">= 5.3.1" +gem "sprockets", "~> 4.2", ">= 4.2.2" +gem "sprockets-rails", "~> 3.5", ">= 3.5.2", require: "sprockets/railtie" group :development, :test do - gem "better_errors" - gem "binding_of_caller" - gem "byebug", platforms: %i[mri mingw x64_mingw] - gem "rspec-benchmark", "~> 0.4.0" - gem "rspec-graphql_matchers", "2.0.0.pre.rc.0" - gem "rspec-rails", "~> 6.1", ">= 6.1.1" - gem "rubocop", "~> 1.3", ">= 1.3.1" - gem "rubocop-performance", "~> 1.5", ">= 1.5.1" - gem "rubocop-rails", "~> 2.8", ">= 2.8.1" - gem "rubocop-packaging", "~> 0.5.1" - gem "rubocop-rspec", "~> 2.0", require: false + gem "better_errors", "~> 2.10", ">= 2.10.1" + gem "binding_of_caller", "~> 2.0" + gem "byebug", "~> 13.0", platforms: %i[mri mingw x64_mingw] + gem "rspec-rails", "~> 8.0", ">= 8.0.4" + gem "rubocop", "~> 1.85", ">= 1.85.1" + gem "rubocop-performance", "~> 1.26", ">= 1.26.1" + gem "rubocop-rails", "~> 2.34", ">= 2.34.3" + gem "rubocop-packaging", "~> 0.6.0" + gem "rubocop-rspec", "~> 3.9", require: false end group :development do - gem "listen", "~> 3.9" - gem "spring" - gem "spring-commands-rspec" + gem "listen", "~> 3.10" + gem "spring", "~> 4.4", ">= 4.4.2" gem "spring-watcher-listen", "~> 2.1" end group :test do - gem "capybara", "~> 3.31" - gem "capybara-screenshot", "~> 1.0", ">= 1.0.24" - gem "cuprite", "~> 0.9" + gem "capybara", "~> 3.40" + gem "capybara-screenshot", "~> 1.0", ">= 1.0.27" + gem "cuprite", "~> 0.17" gem "database_cleaner-active_record", "~> 2.2", ">= 2.2.2" - gem "elasticsearch-extensions", "~> 0.0.29" gem "email_spec", "~> 2.2" - gem "factory_bot_rails", "~> 4.8", ">= 4.8.2" - gem "hashdiff", [">= 1.0.0.beta1", "< 2.0.0"] - gem "shoulda-matchers", "~> 4.1", ">= 4.1.2" + gem "factory_bot_rails", "~> 6.5", ">= 6.5.1" + gem "shoulda-matchers", "~> 7.0", ">= 7.0.1" gem "simplecov", "~> 0.22.0" - gem "test-prof", "~> 0.10.2" - gem "vcr", "~> 6.1" - gem "webmock", "~> 3.1" - gem "with_env", "~> 1.1" + gem "test-prof", "~> 1.5", ">= 1.5.2" + gem "vcr", "~> 6.4" + gem "webmock", "~> 3.26", ">= 3.26.1" end diff --git a/Gemfile.lock b/Gemfile.lock index 628af92e..268d12a6 100755 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,96 +1,96 @@ GEM remote: https://rubygems.org/ specs: - aasm (5.2.0) + aasm (5.5.2) concurrent-ruby (~> 1.0) - actioncable (7.2.3) - actionpack (= 7.2.3) - activesupport (= 7.2.3) + action_text-trix (2.1.16) + railties + actioncable (8.1.2) + actionpack (= 8.1.2) + activesupport (= 8.1.2) nio4r (~> 2.0) websocket-driver (>= 0.6.1) zeitwerk (~> 2.6) - actionmailbox (7.2.3) - actionpack (= 7.2.3) - activejob (= 7.2.3) - activerecord (= 7.2.3) - activestorage (= 7.2.3) - activesupport (= 7.2.3) + actionmailbox (8.1.2) + actionpack (= 8.1.2) + activejob (= 8.1.2) + activerecord (= 8.1.2) + activestorage (= 8.1.2) + activesupport (= 8.1.2) mail (>= 2.8.0) - actionmailer (7.2.3) - actionpack (= 7.2.3) - actionview (= 7.2.3) - activejob (= 7.2.3) - activesupport (= 7.2.3) + actionmailer (8.1.2) + actionpack (= 8.1.2) + actionview (= 8.1.2) + activejob (= 8.1.2) + activesupport (= 8.1.2) mail (>= 2.8.0) rails-dom-testing (~> 2.2) - actionpack (7.2.3) - actionview (= 7.2.3) - activesupport (= 7.2.3) - cgi + actionpack (8.1.2) + actionview (= 8.1.2) + activesupport (= 8.1.2) nokogiri (>= 1.8.5) - racc - rack (>= 2.2.4, < 3.3) + rack (>= 2.2.4) rack-session (>= 1.0.1) rack-test (>= 0.6.3) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) useragent (~> 0.16) - actiontext (7.2.3) - actionpack (= 7.2.3) - activerecord (= 7.2.3) - activestorage (= 7.2.3) - activesupport (= 7.2.3) + actiontext (8.1.2) + action_text-trix (~> 2.1.15) + actionpack (= 8.1.2) + activerecord (= 8.1.2) + activestorage (= 8.1.2) + activesupport (= 8.1.2) globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (7.2.3) - activesupport (= 7.2.3) + actionview (8.1.2) + activesupport (= 8.1.2) builder (~> 3.1) - cgi erubi (~> 1.11) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - active_model_serializers (0.10.14) + active_model_serializers (0.10.16) actionpack (>= 4.1) activemodel (>= 4.1) case_transform (>= 0.2) jsonapi-renderer (>= 0.1.1.beta1, < 0.3) - activejob (7.2.3) - activesupport (= 7.2.3) + activejob (8.1.2) + activesupport (= 8.1.2) globalid (>= 0.3.6) - activemodel (7.2.3) - activesupport (= 7.2.3) - activerecord (7.2.3) - activemodel (= 7.2.3) - activesupport (= 7.2.3) + activemodel (8.1.2) + activesupport (= 8.1.2) + activerecord (8.1.2) + activemodel (= 8.1.2) + activesupport (= 8.1.2) timeout (>= 0.4.0) - activestorage (7.2.3) - actionpack (= 7.2.3) - activejob (= 7.2.3) - activerecord (= 7.2.3) - activesupport (= 7.2.3) + activestorage (8.1.2) + actionpack (= 8.1.2) + activejob (= 8.1.2) + activerecord (= 8.1.2) + activesupport (= 8.1.2) marcel (~> 1.0) - activesupport (7.2.3) + activesupport (8.1.2) base64 - benchmark (>= 0.3) bigdecimal concurrent-ruby (~> 1.0, >= 1.3.1) connection_pool (>= 2.2.5) drb i18n (>= 1.6, < 2) + json logger (>= 1.4.2) minitest (>= 5.1) securerandom (>= 0.3) tzinfo (~> 2.0, >= 2.0.5) - addressable (2.8.0) - public_suffix (>= 2.0.2, < 5.0) - ansi (1.5.0) - apollo-federation (1.1.5) - google-protobuf (~> 3.7) - graphql (>= 1.9.8) + uri (>= 0.13.1) + addressable (2.8.9) + public_suffix (>= 2.0.2, < 8.0) + apollo-federation (3.10.3) + google-protobuf (< 5) + graphql ast (2.4.2) aws-eventstream (1.4.0) aws-partitions (1.1206.0) - aws-sdk-core (3.241.4) + aws-sdk-core (3.243.0) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.992.0) aws-sigv4 (~> 1.9) @@ -101,244 +101,229 @@ GEM aws-sdk-kms (1.48.0) aws-sdk-core (~> 3, >= 3.120.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.103.0) - aws-sdk-core (~> 3, >= 3.120.0) + aws-sdk-s3 (1.215.0) + aws-sdk-core (~> 3, >= 3.243.0) aws-sdk-kms (~> 1) - aws-sigv4 (~> 1.4) - aws-sdk-sqs (1.110.0) + aws-sigv4 (~> 1.5) + aws-sdk-sqs (1.111.0) aws-sdk-core (~> 3, >= 3.241.4) aws-sigv4 (~> 1.5) aws-sigv4 (1.12.1) aws-eventstream (~> 1, >= 1.0.2) - base32-crockford-checksum (0.2.3) base64 (0.3.0) - batch-loader (1.5.0) bcp47_spec (0.2.1) bcrypt (3.1.20) - benchmark (0.5.0) - benchmark-perf (0.4.0) - benchmark-trend (0.2.0) - benchmark_methods (0.7) - better_errors (2.9.1) - coderay (>= 1.0.0) + better_errors (2.10.1) erubi (>= 1.0.0) rack (>= 0.9.0) - bibtex-ruby (6.1.0) + rouge (>= 1.0.0) + bibtex-ruby (6.2.0) latex-decode (~> 0.0) + logger (~> 1.7) racc (~> 1.7) bigdecimal (3.3.1) - binding_of_caller (1.0.0) - debug_inspector (>= 0.0.1) - bolognese (2.5.1) - activesupport (= 7.2.3) - benchmark_methods (~> 0.7) - bibtex-ruby (>= 5.1.0) - builder (~> 3.2, >= 3.2.2) - citeproc-ruby (~> 1.1, >= 1.1.12) - colorize (~> 0.8.1) - concurrent-ruby (~> 1.1, >= 1.1.5) - csl-styles (~> 1.0, >= 1.0.1.10) - edtf (~> 3.0, >= 3.0.4) - gender_detector (~> 0.1.2) - iso8601 (~> 0.9.1) - json-ld-preloaded (~> 3.1, >= 3.1.3) - jsonlint (~> 0.3.0) - loofah (~> 2.0, >= 2.0.3) - maremma (~> 5.0) - namae (~> 1.0) - nokogiri (~> 1.16, >= 1.16.2) - oj (~> 3.10) - oj_mimic_json (~> 1.0, >= 1.0.1) - postrank-uri (~> 1.0, >= 1.0.18) - rdf-rdfxml (~> 3.1) - rdf-turtle (~> 3.1) - thor (>= 0.19) - bootsnap (1.9.1) - msgpack (~> 1.0) + binding_of_caller (2.0.0) + debug_inspector (>= 1.2.0) + bolognese (2.6.0) + activesupport (~> 8.1, >= 8.1.2) + bibtex-ruby (~> 6.2) + builder (~> 3.3) + citeproc-ruby (~> 2.1, >= 2.1.8) + concurrent-ruby (~> 1.3, >= 1.3.6) + csl-styles (~> 2.0, >= 2.0.2) + csv (~> 3.3, >= 3.3.5) + edtf (~> 3.2) + gender_detector (~> 2.1) + iso8601 (~> 0.13.0) + json-ld-preloaded (~> 3.3, >= 3.3.2) + jsonlint (~> 0.4.0) + loofah (~> 2.25) + maremma (~> 6.0) + namae (~> 1.2) + nokogiri (~> 1.19, >= 1.19.1) + oj (~> 3.16, >= 3.16.15) + rdf-rdfxml (~> 3.3) + rdf-turtle (~> 3.3, >= 3.3.1) + thor (~> 1.5) + bootsnap (1.23.0) + msgpack (~> 1.2) builder (3.3.0) - byebug (11.1.3) - cancancan (3.5.0) - capybara (3.35.3) + byebug (13.0.0) + reline (>= 0.6.0) + cancancan (3.6.1) + capybara (3.40.0) addressable + matrix mini_mime (>= 0.1.3) - nokogiri (~> 1.8) + nokogiri (~> 1.11) rack (>= 1.6.0) rack-test (>= 0.6.3) regexp_parser (>= 1.5, < 3.0) xpath (~> 3.2) - capybara-screenshot (1.0.25) + capybara-screenshot (1.0.27) capybara (>= 1.0, < 4) launchy case_transform (0.2) activesupport - cgi (0.5.1) - citeproc (1.0.10) + citeproc (1.1.0) + date + forwardable + json namae (~> 1.0) - citeproc-ruby (1.1.14) + observer (< 1.0) + open-uri (< 1.0) + citeproc-ruby (2.1.8) citeproc (~> 1.0, >= 1.0.9) - csl (~> 1.6) - cliver (0.3.2) - coderay (1.1.3) - coffee-rails (4.2.2) - coffee-script (>= 2.2.0) - railties (>= 4.0.0) - coffee-script (2.4.1) - coffee-script-source - execjs - coffee-script-source (1.12.2) - colorize (0.8.1) - commonmarker (0.21.2) - ruby-enum (~> 0.5) + csl (~> 2.0) + observer (< 1.0) concurrent-ruby (1.3.6) - config (5.4.0) + config (5.6.1) deep_merge (~> 1.2, >= 1.2.1) - connection_pool (2.5.5) - countries (3.1.0) - i18n_data (~> 0.11.0) - sixarm_ruby_unaccent (~> 1.1) - unicode_utils (~> 1.4) - country_select (4.0.0) - countries (~> 3.0) - sort_alphabetical (~> 1.0) + ostruct + connection_pool (3.0.2) crack (0.4.5) rexml crass (1.0.6) - csl (1.6.0) - namae (~> 1.0) - rexml - csl-styles (1.0.1.11) - csl (~> 1.0) - cuprite (0.13) - capybara (>= 2.1, < 4) - ferrum (~> 0.11.0) - dalli (2.7.11) + csl (2.2.1) + forwardable (~> 1.3) + namae (~> 1.2) + open-uri (< 1.0) + rexml (~> 3.0) + set (~> 1.1) + singleton (< 1.0) + time (< 1.0) + csl-styles (2.0.2) + csl (~> 2.0) + csv (3.3.5) + cuprite (0.17) + capybara (~> 3.0) + ferrum (~> 0.17.0) + dalli (5.0.2) + logger database_cleaner-active_record (2.2.2) activerecord (>= 5.a) database_cleaner-core (~> 2.0) database_cleaner-core (2.0.1) date (3.5.1) - debug_inspector (1.1.0) + debug_inspector (1.2.0) deep_merge (1.2.2) - devise (4.9.4) + devise (5.0.2) bcrypt (~> 3.0) orm_adapter (~> 0.1) - railties (>= 4.1.0) + railties (>= 7.0) responders warden (~> 1.2.3) diff-lcs (1.4.4) docile (1.4.0) - domain_name (0.5.20190701) - unf (>= 0.0.5, < 1.0.0) - dotenv (2.7.6) + dotenv (3.2.0) drb (2.2.3) - ebnf (2.5.0) + ebnf (2.6.0) + base64 (~> 0.2) htmlentities (~> 4.3) rdf (~> 3.3) scanf (~> 1.0) sxp (~> 2.0) unicode-types (~> 1.8) - edtf (3.1.1) - activesupport (>= 3.0, < 8.0) - elasticsearch (7.1.0) - elasticsearch-api (= 7.1.0) - elasticsearch-transport (= 7.1.0) - elasticsearch-api (7.1.0) + edtf (3.2.0) + activesupport (>= 3.0, < 9.0) + elastic-transport (8.4.1) + faraday (< 3) multi_json - elasticsearch-extensions (0.0.33) - ansi - elasticsearch - elasticsearch-model (7.2.0) + elasticsearch (8.19.3) + elastic-transport (~> 8.3) + elasticsearch-api (= 8.19.3) + ostruct + elasticsearch-api (8.19.3) + multi_json + elasticsearch-model (8.0.1) activesupport (> 3) - elasticsearch (~> 7) + elasticsearch (~> 8) hashie - elasticsearch-rails (7.2.0) - elasticsearch-transport (7.1.0) - faraday - multi_json + elasticsearch-rails (8.0.1) email_spec (2.2.0) htmlentities (~> 4.3.3) launchy (~> 2.1) mail (~> 2.7) - erb (6.0.1) + erb (6.0.2) erubi (1.13.1) - excon (0.71.1) - execjs (2.8.1) - factory_bot (4.11.1) - activesupport (>= 3.0.0) - factory_bot_rails (4.11.1) - factory_bot (~> 4.11.1) - railties (>= 3.0.0) - faraday (2.9.0) - faraday-net_http (>= 2.0, < 3.2) - faraday-encoding (0.0.5) + excon (1.4.0) + logger + factory_bot (6.5.6) + activesupport (>= 6.1.0) + factory_bot_rails (6.5.1) + factory_bot (~> 6.5) + railties (>= 6.1.0) + faraday (2.14.1) + faraday-net_http (>= 2.0, < 3.5) + json + logger + faraday-encoding (0.0.6) faraday - faraday-excon (2.1.0) - excon (>= 0.27.4) - faraday (~> 2.0) - faraday-follow_redirects (0.3.0) + faraday-excon (2.4.0) + excon (>= 1.0.0) + faraday (>= 2.11.0, < 3) + faraday-follow_redirects (0.5.0) faraday (>= 1, < 3) - faraday-gzip (0.1.0) - faraday (>= 1.0) - zlib (~> 2.1) - faraday-multipart (1.0.4) - multipart-post (~> 2) + faraday-gzip (3.1.0) + faraday (>= 2.0, < 3) + zlib (~> 3.0) + faraday-multipart (1.2.0) + multipart-post (~> 2.0) faraday-net_http (3.1.0) net-http faraday_middleware-aws-sigv4 (0.3.0) aws-sigv4 (~> 1.0) faraday (>= 0.15) - ferrum (0.11) + ferrum (0.17.1) addressable (~> 2.5) - cliver (~> 0.3) + base64 (~> 0.2) concurrent-ruby (~> 1.1) - websocket-driver (>= 0.6, < 0.8) + webrick (~> 1.7) + websocket-driver (~> 0.7) ffi (1.16.3) - flipper (1.3.0) + fiber-storage (1.0.1) + flipper (1.4.0) concurrent-ruby (< 2) - flipper-active_support_cache_store (1.3.0) - activesupport (>= 4.2, < 8) - flipper (~> 1.3.0) - flipper-api (1.3.0) - flipper (~> 1.3.0) - rack (>= 1.4, < 4) - flipper-redis (1.3.0) - flipper (~> 1.3.0) + flipper-active_support_cache_store (1.4.0) + activesupport (>= 4.2, < 9) + flipper (~> 1.4.0) + flipper-redis (1.4.0) + flipper (~> 1.4.0) redis (>= 3.0, < 6) - flipper-ui (1.3.0) + flipper-ui (1.4.0) erubi (>= 1.0.0, < 2.0.0) - flipper (~> 1.3.0) + flipper (~> 1.4.0) rack (>= 1.4, < 4) rack-protection (>= 1.5.3, < 5.0.0) rack-session (>= 1.0.2, < 3.0.0) - sanitize (< 7) - gender_detector (0.1.2) - unicode_utils (>= 1.3.0) - git (1.9.1) - rchardet (~> 1.8) + sanitize (< 8) + forwardable (1.4.0) + gender_detector (2.1.0) globalid (1.3.0) activesupport (>= 6.1) - google-protobuf (3.19.6) - graphql (2.0.32) + google-protobuf (4.34.0) + bigdecimal + rake (~> 13.3) + graphql (2.5.21) base64 - graphql-batch (0.5.4) - graphql (>= 1.12.18, < 3) + fiber-storage + logger + graphql-batch (0.6.1) + graphql (>= 1.13, < 3) promise.rb (~> 0.7.2) - gravtastic (3.2.6) hashdiff (1.0.1) - hashie (4.1.0) + hashie (5.1.0) + logger htmlentities (4.3.4) - http-accept (1.7.0) - http-cookie (1.0.4) - domain_name (~> 0.5) - i18n (1.14.7) + i18n (1.14.8) concurrent-ruby (~> 1.0) - i18n_data (0.11.0) io-console (0.8.2) - irb (1.16.0) + irb (1.17.0) pp (>= 0.6.0) + prism (>= 1.3.0) rdoc (>= 4.0.0) reline (>= 0.4.2) - iso8601 (0.9.1) + iso8601 (0.13.0) jmespath (1.6.2) json (2.5.1) json-canonicalization (1.0.0) @@ -350,37 +335,44 @@ GEM rack (>= 2.2, < 4) rdf (~> 3.3) rexml (~> 3.2) - json-ld-preloaded (3.3.1) + json-ld-preloaded (3.3.2) json-ld (~> 3.3) rdf (~> 3.3) + json-schema (6.2.0) + addressable (~> 2.8) + bigdecimal (>= 3.1, < 5) jsonapi-renderer (0.2.2) jsonapi-serializer (2.2.0) activesupport (>= 4.2) - jsonlint (0.3.0) + jsonlint (0.4.0) oj (~> 3) optimist (~> 3) - jwt (2.2.3) - kaminari (1.2.1) + jwt (3.1.2) + base64 + kaminari (1.2.2) activesupport (>= 4.1.0) - kaminari-actionview (= 1.2.1) - kaminari-activerecord (= 1.2.1) - kaminari-core (= 1.2.1) - kaminari-actionview (1.2.1) + kaminari-actionview (= 1.2.2) + kaminari-activerecord (= 1.2.2) + kaminari-core (= 1.2.2) + kaminari-actionview (1.2.2) actionview - kaminari-core (= 1.2.1) - kaminari-activerecord (1.2.1) + kaminari-core (= 1.2.2) + kaminari-activerecord (1.2.2) activerecord - kaminari-core (= 1.2.1) - kaminari-core (1.2.1) - latex-decode (0.4.0) + kaminari-core (= 1.2.2) + kaminari-core (1.2.2) + language_server-protocol (3.17.0.5) + latex-decode (0.4.2) launchy (2.5.0) addressable (~> 2.7) link_header (0.0.8) - listen (3.9.0) + lint_roller (1.1.0) + listen (3.10.0) + logger rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) logger (1.7.0) - lograge (0.11.2) + lograge (0.14.0) actionpack (>= 4) activesupport (>= 4) railties (>= 4) @@ -397,41 +389,47 @@ GEM net-imap net-pop net-smtp - mailgun-ruby (1.2.5) - rest-client (>= 2.0.2) + mailgun-ruby (1.4.2) + faraday (~> 2.1) + faraday-multipart (< 2) + mini_mime + zeitwerk marcel (1.1.0) - maremma (5.0.0) - activesupport (>= 4.2.5) - addressable (>= 2.3.6) + maremma (6.0.0) + activesupport (~> 8.1, >= 8.1.2) + addressable (~> 2.8, >= 2.8.9) builder (~> 3.2, >= 3.2.2) - excon (~> 0.71.0) + excon (~> 1.3, >= 1.3.2) faraday (>= 2.0) - faraday-encoding (~> 0.0.5) - faraday-excon (~> 2.1.0) - faraday-follow_redirects (~> 0.3.0) - faraday-gzip (~> 0.1.0) - faraday-multipart (~> 1.0.4) - nokogiri (~> 1.16, >= 1.16.2) - oj (>= 2.8.3) + faraday-encoding (~> 0.0.6) + faraday-excon (~> 2.4.0) + faraday-follow_redirects (~> 0.5.0) + faraday-gzip (~> 3.1.0) + faraday-multipart (~> 1.2.0) + nokogiri (~> 1.19, >= 1.19.1) + oj (~> 3.16, >= 3.16.15) oj_mimic_json (~> 1.0, >= 1.0.1) - matrix (0.4.2) - mime-types (3.3.1) - mime-types-data (~> 3.2015) - mime-types-data (3.2021.0901) - mini_magick (4.11.0) + matrix (0.4.3) + mcp (0.8.0) + json-schema (>= 4.1) + mini_magick (5.3.1) + logger mini_mime (1.1.5) mini_portile2 (2.8.9) - minitest (6.0.0) + minitest (6.0.2) + drb (~> 2.0) prism (~> 1.5) - msgpack (1.4.5) + msgpack (1.8.0) multi_json (1.15.0) multi_xml (0.6.0) multipart-post (2.1.1) - mysql2 (0.5.6) - namae (1.0.2) + mysql2 (0.5.7) + bigdecimal + namae (1.2.0) + racc (~> 1.7) net-http (0.4.1) uri - net-imap (0.6.2) + net-imap (0.6.3) date net-protocol net-pop (0.1.2) @@ -440,111 +438,103 @@ GEM timeout net-smtp (0.5.1) net-protocol - netrc (0.11.0) - nilify_blanks (1.4.0) - activerecord (>= 4.0.0) - activesupport (>= 4.0.0) nio4r (2.7.5) - nokogiri (1.18.10) + nokogiri (1.19.1) mini_portile2 (~> 2.8.2) racc (~> 1.4) - oauth2 (1.4.11) - faraday (>= 0.17.3, < 3.0) - jwt (>= 1.0, < 3.0) - multi_json (~> 1.3) + oauth2 (2.0.18) + faraday (>= 0.17.3, < 4.0) + jwt (>= 1.0, < 4.0) + logger (~> 1.2) multi_xml (~> 0.5) rack (>= 1.2, < 4) - oj (3.13.9) + snaky_hash (~> 2.0, >= 2.0.3) + version_gem (~> 1.1, >= 1.1.9) + observer (0.1.2) + oj (3.16.16) + bigdecimal (>= 3.0) + ostruct (>= 0.2) oj_mimic_json (1.0.1) - omniauth (2.0.4) + omniauth (2.1.4) hashie (>= 3.4.6) - rack (>= 1.6.2, < 3) + logger + rack (>= 2.2.3) rack-protection omniauth-github (2.0.0) omniauth (~> 2.0) omniauth-oauth2 (~> 1.7.1) - omniauth-globus (0.9.1) - jwt (~> 2.0) - omniauth (>= 1.9) - omniauth-oauth2 (~> 1.6) - omniauth-oauth2 (1.7.1) - oauth2 (~> 1.4) + omniauth-oauth2 (1.7.3) + oauth2 (>= 1.4, < 3) omniauth (>= 1.9, < 3) omniauth-orcid (2.1.1) omniauth-oauth2 (~> 1.3) ruby_dig (~> 0.0.2) - omniauth-rails_csrf_protection (1.0.0) + omniauth-rails_csrf_protection (2.0.1) actionpack (>= 4.2) omniauth (~> 2.0) - optimist (3.2.0) - orcid_client (0.17.1) - activesupport (>= 7, < 8) - bolognese (~> 2.5.1) - builder (~> 3.2, >= 3.2.2) - dotenv (~> 2.1, >= 2.1.1) - maremma (>= 5.0) - namae (~> 1.0.1) - nokogiri (>= 1.16.4) + open-uri (0.5.0) + stringio + time + uri + optimist (3.2.1) + orcid_client (0.18.0) + activesupport (~> 8.1, >= 8.1.2) + bolognese (~> 2.6.0) + builder (~> 3.3) + dotenv (~> 3.2) + maremma (~> 6.0) + namae (~> 1.2) + nokogiri (>= 1.19.1, >= 1.19) orm_adapter (0.5.0) + ostruct (0.6.3) parallel (1.22.1) - parser (3.1.2.1) + parser (3.3.10.2) ast (~> 2.4.1) - postrank-uri (1.1) - addressable (>= 2.4.0) - nokogiri (>= 1.8.0) - public_suffix (>= 4.0.0, < 5) + racc pp (0.6.3) prettyprint prettyprint (0.2.0) - prism (1.7.0) + prism (1.9.0) promise.rb (0.7.4) psych (5.3.1) date stringio public_suffix (4.0.7) racc (1.8.1) - rack (2.2.21) - rack-cors (1.1.1) - rack (>= 2.0.0) - rack-jwt (0.4.0) - jwt (~> 2.0) - rack (>= 1.6.0) + rack (2.2.22) rack-protection (2.0.8.1) rack rack-session (1.0.2) rack (< 3) rack-test (2.2.0) rack (>= 1.3) - rack-utf8_sanitizer (1.7.0) - rack (>= 1.0, < 3.0) rackup (1.0.1) rack (< 3) webrick - rails (7.2.3) - actioncable (= 7.2.3) - actionmailbox (= 7.2.3) - actionmailer (= 7.2.3) - actionpack (= 7.2.3) - actiontext (= 7.2.3) - actionview (= 7.2.3) - activejob (= 7.2.3) - activemodel (= 7.2.3) - activerecord (= 7.2.3) - activestorage (= 7.2.3) - activesupport (= 7.2.3) + rails (8.1.2) + actioncable (= 8.1.2) + actionmailbox (= 8.1.2) + actionmailer (= 8.1.2) + actionpack (= 8.1.2) + actiontext (= 8.1.2) + actionview (= 8.1.2) + activejob (= 8.1.2) + activemodel (= 8.1.2) + activerecord (= 8.1.2) + activestorage (= 8.1.2) + activesupport (= 8.1.2) bundler (>= 1.15.0) - railties (= 7.2.3) + railties (= 8.1.2) rails-dom-testing (2.3.0) activesupport (>= 5.0.0) minitest nokogiri (>= 1.6) - rails-html-sanitizer (1.6.2) - loofah (~> 2.21) + rails-html-sanitizer (1.7.0) + loofah (~> 2.25) nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0) - railties (7.2.3) - actionpack (= 7.2.3) - activesupport (= 7.2.3) - cgi + railties (8.1.2) + actionpack (= 8.1.2) + activesupport (= 8.1.2) irb (~> 1.13) rackup (>= 1.0.0) rake (>= 12.2) @@ -552,14 +542,12 @@ GEM tsort (>= 0.2) zeitwerk (~> 2.6) rainbow (3.1.1) - rake (12.3.3) + rake (13.3.1) rb-fsevent (0.11.2) rb-inotify (0.10.1) ffi (~> 1.0) - rchardet (1.8.0) - rdf (3.3.2) + rdf (3.3.1) bcp47_spec (~> 0.2) - bigdecimal (~> 3.1, >= 3.1.5) link_header (~> 0.0, >= 0.0.8) rdf-rdfxml (3.3.0) builder (~> 3.2, >= 3.2.4) @@ -574,80 +562,70 @@ GEM rdf-xsd (3.3.0) rdf (~> 3.3) rexml (~> 3.2) - rdoc (7.0.1) + rdoc (7.2.0) erb psych (>= 4.0.0) tsort redis (4.4.0) - regexp_parser (2.1.1) + regexp_parser (2.11.3) reline (0.6.3) io-console (~> 0.5) - remotipart (1.4.4) - repost (0.3.8) + repost (0.5.1) request_store (1.5.0) rack (>= 1.4) responders (3.1.1) actionpack (>= 5.2) railties (>= 5.2) - rest-client (2.1.0) - http-accept (>= 1.7.0, < 2.0) - http-cookie (>= 1.0.2, < 2.0) - mime-types (>= 1.16, < 4.0) - netrc (~> 0.8) rexml (3.2.5) - rouge (3.26.1) - rspec (3.13.0) - rspec-core (~> 3.13.0) - rspec-expectations (~> 3.13.0) - rspec-mocks (~> 3.13.0) - rspec-benchmark (0.4.0) - benchmark-perf (~> 0.4.0) - benchmark-trend (~> 0.2.0) - rspec (>= 3.0.0, < 4.0.0) + rouge (4.7.0) rspec-core (3.13.0) rspec-support (~> 3.13.0) rspec-expectations (3.13.0) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.13.0) - rspec-graphql_matchers (2.0.0.pre.rc.0) - graphql (~> 2.0) - rspec (~> 3.0) rspec-mocks (3.13.0) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.13.0) - rspec-rails (6.1.2) - actionpack (>= 6.1) - activesupport (>= 6.1) - railties (>= 6.1) - rspec-core (~> 3.13) - rspec-expectations (~> 3.13) - rspec-mocks (~> 3.13) - rspec-support (~> 3.13) + rspec-rails (8.0.4) + actionpack (>= 7.2) + activesupport (>= 7.2) + railties (>= 7.2) + rspec-core (>= 3.13.0, < 5.0.0) + rspec-expectations (>= 3.13.0, < 5.0.0) + rspec-mocks (>= 3.13.0, < 5.0.0) + rspec-support (>= 3.13.0, < 5.0.0) rspec-support (3.13.1) - rubocop (1.38.0) + rubocop (1.85.1) json (~> 2.3) + language_server-protocol (~> 3.17.0.2) + lint_roller (~> 1.1.0) + mcp (~> 0.6) parallel (~> 1.10) - parser (>= 3.1.2.1) + parser (>= 3.3.0.2) rainbow (>= 2.2.2, < 4.0) - regexp_parser (>= 1.8, < 3.0) - rexml (>= 3.2.5, < 4.0) - rubocop-ast (>= 1.23.0, < 2.0) + regexp_parser (>= 2.9.3, < 3.0) + rubocop-ast (>= 1.49.0, < 2.0) ruby-progressbar (~> 1.7) - unicode-display_width (>= 1.4.0, < 3.0) - rubocop-ast (1.23.0) - parser (>= 3.1.1.0) - rubocop-packaging (0.5.2) - rubocop (>= 1.33, < 2.0) - rubocop-performance (1.6.1) - rubocop (>= 0.71.0) - rubocop-rails (2.17.2) + unicode-display_width (>= 2.4.0, < 4.0) + rubocop-ast (1.49.1) + parser (>= 3.3.7.2) + prism (~> 1.7) + rubocop-packaging (0.6.0) + lint_roller (~> 1.1.0) + rubocop (>= 1.72.1, < 2.0) + rubocop-performance (1.26.1) + lint_roller (~> 1.1) + rubocop (>= 1.75.0, < 2.0) + rubocop-ast (>= 1.47.1, < 2.0) + rubocop-rails (2.34.3) activesupport (>= 4.2.0) + lint_roller (~> 1.1) rack (>= 1.1) - rubocop (>= 1.33.0, < 2.0) - rubocop-rspec (2.15.0) - rubocop (~> 1.33) - ruby-enum (0.9.0) - i18n + rubocop (>= 1.75.0, < 2.0) + rubocop-ast (>= 1.44.0, < 2.0) + rubocop-rspec (3.9.0) + lint_roller (~> 1.1) + rubocop (~> 1.81) ruby-progressbar (1.11.0) ruby_dig (0.0.2) sanitize (6.1.0) @@ -655,72 +633,73 @@ GEM nokogiri (>= 1.12.0) scanf (1.0.0) securerandom (0.4.1) - sentry-raven (3.1.2) - faraday (>= 1.0) - shoryuken (7.0.0) + sentry-rails (6.4.1) + railties (>= 5.2.0) + sentry-ruby (~> 6.4.1) + sentry-ruby (6.4.1) + bigdecimal + concurrent-ruby (~> 1.0, >= 1.0.2) + logger + set (1.1.2) + shoryuken (7.0.1) aws-sdk-sqs (>= 1.66.0) concurrent-ruby thor zeitwerk (~> 2.6) - shoulda-matchers (4.5.1) - activesupport (>= 4.2.0) - simple_form (4.1.0) - actionpack (>= 5.0) - activemodel (>= 5.0) + shoulda-matchers (7.0.1) + activesupport (>= 7.1) + simple_form (5.4.1) + actionpack (>= 7.0) + activemodel (>= 7.0) simplecov (0.22.0) docile (~> 1.1) simplecov-html (~> 0.11) simplecov_json_formatter (~> 0.1) simplecov-html (0.12.3) simplecov_json_formatter (0.1.4) - sixarm_ruby_unaccent (1.2.0) - sort_alphabetical (1.1.0) - unicode_utils (>= 1.2.2) - spring (4.2.1) - spring-commands-rspec (1.0.4) - spring (>= 0.9.1) + singleton (0.3.0) + snaky_hash (2.0.3) + hashie (>= 0.1.0, < 6) + version_gem (>= 1.1.8, < 3) + spring (4.4.2) spring-watcher-listen (2.1.0) listen (>= 2.7, < 4.0) spring (>= 4) - sprockets (3.7.3) - base64 + sprockets (4.2.2) concurrent-ruby (~> 1.0) - rack (> 1, < 3) - sprockets-rails (3.4.2) - actionpack (>= 5.2) - activesupport (>= 5.2) + logger + rack (>= 2.2.4, < 4) + sprockets-rails (3.5.2) + actionpack (>= 6.1) + activesupport (>= 6.1) sprockets (>= 3.0.0) stringio (3.2.0) - strip_attributes (1.13.0) - activemodel (>= 3.0, < 8.0) + strip_attributes (1.14.1) + activemodel (>= 3.0, < 9.0) sxp (2.0.0) matrix (~> 0.4) rdf (~> 3.3) - test-prof (0.10.2) + test-prof (1.5.2) thor (1.5.0) - timeout (0.6.0) + time (0.4.2) + date + timeout (0.6.1) tsort (0.2.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) - tzinfo-data (1.2021.2) + tzinfo-data (1.2026.1) tzinfo (>= 1.0.0) - uglifier (2.7.2) - execjs (>= 0.3.0) - json (>= 1.8.0) - unf (0.1.4) - unf_ext - unf_ext (0.0.8) - unicode-display_width (2.3.0) - unicode-types (1.10.0) - unicode_utils (1.4.0) - uri (0.13.0) + unicode-display_width (3.2.0) + unicode-emoji (~> 4.1) + unicode-emoji (4.2.0) + unicode-types (1.11.0) + uri (1.1.1) useragent (0.16.11) - validates_email_format_of (1.6.3) - i18n - vcr (6.2.0) + vcr (6.4.0) + version_gem (1.1.9) warden (1.2.9) rack (>= 2.0.9) - webmock (3.14.0) + webmock (3.26.1) addressable (>= 2.8.0) crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) @@ -729,119 +708,94 @@ GEM base64 websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) - with_env (1.1.0) xpath (3.2.0) nokogiri (~> 1.8) - zeitwerk (2.7.4) - zlib (2.1.1) + zeitwerk (2.7.5) + zlib (3.2.3) PLATFORMS ruby DEPENDENCIES - aasm (~> 5.0, >= 5.0.6) - active_model_serializers (~> 0.10.10) - addressable (~> 2.7) - apollo-federation (~> 1.0) - aws-sdk-s3 - aws-sdk-sqs (~> 1.23, >= 1.23.1) - base32-crockford-checksum (~> 0.2.3) - batch-loader (~> 1.4, >= 1.4.1) - better_errors - binding_of_caller - bootsnap (~> 1.4, >= 1.4.4) - byebug - cancancan (~> 3.0) - capybara (~> 3.31) - capybara-screenshot (~> 1.0, >= 1.0.24) - coffee-rails (~> 4.1, >= 4.1.1) - commonmarker (~> 0.21.0) - config (~> 5.4) - connection_pool (< 3.0) - country_select (~> 4.0) - cuprite (~> 0.9) - dalli (~> 2.7, >= 2.7.10) + aasm (~> 5.5, >= 5.5.2) + active_model_serializers (~> 0.10.16) + addressable (~> 2.8, >= 2.8.9) + apollo-federation (~> 3.10, >= 3.10.3) + aws-sdk-s3 (~> 1.215) + aws-sdk-sqs (~> 1.111) + better_errors (~> 2.10, >= 2.10.1) + binding_of_caller (~> 2.0) + bootsnap (~> 1.23) + byebug (~> 13.0) + cancancan (~> 3.6, >= 3.6.1) + capybara (~> 3.40) + capybara-screenshot (~> 1.0, >= 1.0.27) + config (~> 5.6, >= 5.6.1) + connection_pool (~> 3.0, >= 3.0.2) + cuprite (~> 0.17) + dalli (~> 5.0, >= 5.0.2) database_cleaner-active_record (~> 2.2, >= 2.2.2) - devise (~> 4.8, >= 4.8.1) - dotenv (~> 2.7, >= 2.7.5) - elasticsearch (~> 7.1.0) - elasticsearch-extensions (~> 0.0.29) - elasticsearch-model (~> 7.0) - elasticsearch-rails (~> 7.0) + devise (~> 5.0, >= 5.0.2) + dotenv (~> 3.2) + elastic-transport (~> 8.0, >= 8.0.1) + elasticsearch (~> 8.19, >= 8.19.3) + elasticsearch-model (~> 8.0, >= 8.0.1) + elasticsearch-rails (~> 8.0, >= 8.0.1) email_spec (~> 2.2) - factory_bot_rails (~> 4.8, >= 4.8.2) + factory_bot_rails (~> 6.5, >= 6.5.1) faraday_middleware-aws-sigv4 (~> 0.3.0) - flipper (~> 1.3) - flipper-active_support_cache_store - flipper-api - flipper-redis - flipper-ui - git (~> 1.5) - google-protobuf (= 3.19.6) - graphql (~> 2.0.0) - graphql-batch (~> 0.5.1) - gravtastic (~> 3.2, >= 3.2.6) - hashdiff (>= 1.0.0.beta1, < 2.0.0) - hashie + flipper (~> 1.4) + flipper-active_support_cache_store (~> 1.4) + flipper-redis (~> 1.4) + flipper-ui (~> 1.4) + google-protobuf (= 4.34) + graphql (~> 2.5, >= 2.5.21) + graphql-batch (~> 0.6.1) + hashie (~> 5.1) jsonapi-serializer (~> 2.2) - jwt (~> 2.2, >= 2.2.1) - kaminari (~> 1.2) - listen (~> 3.9) - lograge (~> 0.11.2) + jwt (~> 3.1, >= 3.1.2) + kaminari (~> 1.2, >= 1.2.2) + listen (~> 3.10) + lograge (~> 0.14.0) logstash-event (~> 1.2, >= 1.2.02) logstash-logger (~> 0.26.1) - mailgun-ruby (~> 1.2) - maremma (~> 5.0) - mini_magick (~> 4.5, >= 4.5.1) - msgpack (~> 1.4.4) - mysql2 (~> 0.5.0) - namae (~> 1.0, >= 1.0.1) - nilify_blanks (~> 1.3) - nokogiri (~> 1.10, >= 1.10.7) - oauth2 (~> 1.4) - oj (>= 2.8.3) - oj_mimic_json (~> 1.0, >= 1.0.1) - omniauth (~> 2.0, >= 2.0.4) + mailgun-ruby (~> 1.4, >= 1.4.2) + maremma (~> 6.0) + mini_magick (~> 5.3, >= 5.3.1) + msgpack (~> 1.8) + mysql2 (~> 0.5.7) + namae (~> 1.2) + nokogiri (~> 1.19, >= 1.19.1) + oj (~> 3.16, >= 3.16.16) + omniauth (~> 2.1, >= 2.1.4) omniauth-github (~> 2.0) - omniauth-globus (~> 0.9.1) omniauth-orcid (~> 2.0) - omniauth-rails_csrf_protection (~> 1.0) - orcid_client (~> 0.17.1) - postrank-uri (~> 1.1) - rack-cors (~> 1.0) - rack-jwt - rack-utf8_sanitizer (~> 1.6) - rails (~> 7.2, >= 7.2.3) - rake (~> 12.0) - remotipart (~> 1.2) - repost (~> 0.3.7) - rouge (~> 3.15) - rspec-benchmark (~> 0.4.0) - rspec-graphql_matchers (= 2.0.0.pre.rc.0) - rspec-rails (~> 6.1, >= 6.1.1) - rubocop (~> 1.3, >= 1.3.1) - rubocop-packaging (~> 0.5.1) - rubocop-performance (~> 1.5, >= 1.5.1) - rubocop-rails (~> 2.8, >= 2.8.1) - rubocop-rspec (~> 2.0) - sentry-raven (~> 3.1, >= 3.1.2) - shoryuken (~> 7.0) - shoulda-matchers (~> 4.1, >= 4.1.2) - simple_form (~> 4.1.0) + omniauth-rails_csrf_protection (~> 2.0, >= 2.0.1) + orcid_client (~> 0.18.0) + rails (~> 8.1, >= 8.1.2) + rake (~> 13.3, >= 13.3.1) + repost (~> 0.5.1) + rspec-rails (~> 8.0, >= 8.0.4) + rubocop (~> 1.85, >= 1.85.1) + rubocop-packaging (~> 0.6.0) + rubocop-performance (~> 1.26, >= 1.26.1) + rubocop-rails (~> 2.34, >= 2.34.3) + rubocop-rspec (~> 3.9) + sentry-rails (~> 6.4, >= 6.4.1) + sentry-ruby (~> 6.4, >= 6.4.1) + shoryuken (~> 7.0, >= 7.0.1) + shoulda-matchers (~> 7.0, >= 7.0.1) + simple_form (~> 5.4, >= 5.4.1) simplecov (~> 0.22.0) - spring - spring-commands-rspec + spring (~> 4.4, >= 4.4.2) spring-watcher-listen (~> 2.1) - sprockets (~> 3.7, >= 3.7.2) - sprockets-rails (~> 3.2, >= 3.2.1) + sprockets (~> 4.2, >= 4.2.2) + sprockets-rails (~> 3.5, >= 3.5.2) strip_attributes (~> 1.9, >= 1.9.2) - test-prof (~> 0.10.2) - tzinfo-data (~> 1.2019, >= 1.2019.3) - uglifier (~> 2.7, >= 2.7.2) - validates_email_format_of (~> 1.6, >= 1.6.3) - vcr (~> 6.1) - webmock (~> 3.1) - with_env (~> 1.1) + test-prof (~> 1.5, >= 1.5.2) + tzinfo-data (~> 1.2026, >= 1.2026.1) + vcr (~> 6.4) + webmock (~> 3.26, >= 3.26.1) BUNDLED WITH 2.6.9 diff --git a/README.md b/README.md index ebb42fa8..d2d138d1 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [](https://travis-ci.org/datacite/volpino) [](https://codeclimate.com/github/datacite/volpino) [](https://codeclimate.com/github/datacite/volpino/coverage) -The DataCite service for user accounts. Users are authenticated via Globus Auth. Single-sign to various DataCite services via JWT. +The DataCite service for user accounts. Users are authenticated via Orcid Auth. Single-sign to various DataCite services via JWT. ## Installation diff --git a/app/assets/config/manifest.js b/app/assets/config/manifest.js new file mode 100644 index 00000000..7d52bcf3 --- /dev/null +++ b/app/assets/config/manifest.js @@ -0,0 +1,3 @@ +//= link_tree ../images +//= link_directory ../stylesheets .css +//= link_directory ../javascripts .js diff --git a/app/controllers/base_controller.rb b/app/controllers/base_controller.rb index 18786943..7f494fce 100644 --- a/app/controllers/base_controller.rb +++ b/app/controllers/base_controller.rb @@ -22,7 +22,7 @@ class BaseController < ApplicationController serialization_scope :current_ability skip_before_action :verify_authenticity_token - before_action :default_format_json, :transform_params, :set_raven_context + before_action :default_format_json, :transform_params, :set_sentry_context after_action :set_jsonp_format, :set_consumer_header # from https://github.com/spree/spree/blob/master/api/app/controllers/spree/api/base_controller.rb @@ -103,7 +103,7 @@ def token_from_request_headers elsif ["JSON::ParserError", "Nokogiri::XML::SyntaxError", "ActionDispatch::Http::Parameters::ParseError"].include?(exception.class.to_s) message = exception.message else - Raven.capture_exception(exception) + Sentry.capture_exception(exception) message = exception.message end @@ -125,15 +125,15 @@ def current_ability # current_user && %w(staff_admin staff_user).include?(current_user.role) # end - def set_raven_context + def set_sentry_context if current_user.try(:uid) - Raven.user_context( + Sentry.set_user( email: current_user.email, id: current_user.uid, ip_address: request.ip, ) else - Raven.user_context( + Sentry.set_user( ip_address: request.ip, ) end diff --git a/app/controllers/claims_controller.rb b/app/controllers/claims_controller.rb index 0a916558..42513d6f 100644 --- a/app/controllers/claims_controller.rb +++ b/app/controllers/claims_controller.rb @@ -88,8 +88,8 @@ def index else render json: ClaimSerializer.new(response.results, options).serializable_hash.to_json, status: :ok end - rescue Elasticsearch::Transport::Transport::Errors::BadRequest => e - Raven.capture_exception(e) + rescue Elastic::Transport::Transport::Errors::BadRequest => e + Sentry.capture_exception(e) message = JSON.parse(e.message[6..-1]).to_h.dig("error", "root_cause", 0, "reason") diff --git a/app/controllers/users/omniauth_callbacks_controller.rb b/app/controllers/users/omniauth_callbacks_controller.rb index cd0e52bd..9ad8f57c 100644 --- a/app/controllers/users/omniauth_callbacks_controller.rb +++ b/app/controllers/users/omniauth_callbacks_controller.rb @@ -32,7 +32,7 @@ def orcid if current_user.present? @user = current_user else - @user = User.from_omniauth(auth, provider: "globus") + @user = User.from_omniauth(auth, provider: "orcid") end if Time.zone.now > @user.expires_at || omniauth.present? diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 948af989..dfce078c 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -82,8 +82,8 @@ def index else render json: UserSerializer.new(response.results, options).serializable_hash.to_json, status: :ok end - rescue Elasticsearch::Transport::Transport::Errors::BadRequest => e - Raven.capture_exception(e) + rescue Elastic::Transport::Transport::Errors::BadRequest => e + Sentry.capture_exception(e) message = JSON.parse(e.message[6..-1]).to_h.dig("error", "root_cause", 0, "reason") @@ -114,7 +114,7 @@ def update @user.assign_attributes(safe_params) status = :ok else - @user = User.new(safe_params.merge(uid: params[:id], provider: "globus")) + @user = User.new(safe_params.merge(uid: params[:id], provider: "orcid")) authorize! :new, @user status = :created end diff --git a/app/graphql/volpino_schema.rb b/app/graphql/volpino_schema.rb index a236e055..d1f1f09b 100644 --- a/app/graphql/volpino_schema.rb +++ b/app/graphql/volpino_schema.rb @@ -22,7 +22,7 @@ class VolpinoSchema < GraphQL::Schema end rescue_from StandardError do |exception| - Raven.capture_exception(exception) + Sentry.capture_exception(exception) message = Rails.env.production? ? "We are sorry, but an error has occured. This problem has been logged and support has been notified. Please try again later. If the error persists please contact support." : exception.message raise GraphQL::ExecutionError, message end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 5b2599af..9b0c9fef 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -16,88 +16,6 @@ def icon(icon, text = nil, html_options = {}) html end - def markdown(text) - text = CommonMarker.render_html(text) - syntax_highlighter(text).html_safe - end - - def syntax_highlighter(html) - formatter = Rouge::Formatters::HTML.new(css_class: "hll") - lexer = Rouge::Lexers::Shell.new - - doc = Nokogiri::HTML::DocumentFragment.parse(html) - doc.search("//pre").each { |pre| pre.replace formatter.format(lexer.lex(pre.text)) } - doc.to_s - end - - def public_text - if !user_signed_in? - "panel-default" - elsif current_user.is_public - "panel-success" - else - "panel-warning" - end - end - - def auto_update_text - if !user_signed_in? - "panel-default" - elsif current_user.auto_update - "panel-success" - else - "panel-warning" - end - end - - def email_text - if current_user.has_email? - "success" - else - "warning" - end - end - - def claim_text - if current_user.claims.failed.count > 0 - "panel-warning" - elsif current_user.claims.done.count > 0 - "panel-success" - elsif current_user.claims.stale.count > 0 - "panel-info" - else - "panel-default" - end - end - - def true_text - if !user_signed_in? - "" - elsif current_user.is_public - 'true' - else - 'false' - end - end - - def enabled_text - if !user_signed_in? - "" - elsif current_user.auto_update - 'enabled' - else - 'disabled' - end - end - - def subscribed_text - if current_user.has_email? - 'subscribed' - else - 'not subscribed' - end - end - def devise_current_user @devise_current_user ||= warden.authenticate(scope: :user) end @@ -111,15 +29,6 @@ def current_user end end - def human_source_name(source_id) - sources.fetch(source_id, nil) - end - - def sources - { "orcid_search" => "ORCID Search and Link", - "orcid_update" => "ORCID Auto-Update" } - end - def aasm_states ["waiting", "working", "done", "failed", "ignored", "notified"] end @@ -128,14 +37,6 @@ def settings Settings[ENV["MODE"]] end - def worker_label(status) - case status - when "working" then "panel-success" - when "waiting" then "panel-default" - else "panel-warning" - end - end - def state_label(state) case state when "done" then "label-success" diff --git a/app/jobs/claim_import_by_id_job.rb b/app/jobs/claim_import_by_id_job.rb index 788bcfb9..26c83984 100644 --- a/app/jobs/claim_import_by_id_job.rb +++ b/app/jobs/claim_import_by_id_job.rb @@ -3,7 +3,7 @@ class ClaimImportByIdJob < ApplicationJob queue_as :volpino - rescue_from ActiveJob::DeserializationError, Elasticsearch::Transport::Transport::Errors::BadRequest do |error| + rescue_from ActiveJob::DeserializationError, Elastic::Transport::Transport::Errors::BadRequest do |error| Rails.logger.error error.message end diff --git a/app/jobs/index_job.rb b/app/jobs/index_job.rb index 5f8c4f10..c6bb11a9 100644 --- a/app/jobs/index_job.rb +++ b/app/jobs/index_job.rb @@ -3,7 +3,7 @@ class IndexJob < ApplicationJob queue_as :volpino - rescue_from ActiveJob::DeserializationError, SocketError, Elasticsearch::Transport::Transport::Errors::BadRequest do |error| + rescue_from ActiveJob::DeserializationError, SocketError, Elastic::Transport::Transport::Errors::BadRequest do |error| Rails.logger.error error.message end diff --git a/app/jobs/user_import_by_id_job.rb b/app/jobs/user_import_by_id_job.rb index 6271e439..11f748d2 100644 --- a/app/jobs/user_import_by_id_job.rb +++ b/app/jobs/user_import_by_id_job.rb @@ -3,7 +3,7 @@ class UserImportByIdJob < ApplicationJob queue_as :volpino - rescue_from ActiveJob::DeserializationError, Elasticsearch::Transport::Transport::Errors::BadRequest do |error| + rescue_from ActiveJob::DeserializationError, Elastic::Transport::Transport::Errors::BadRequest do |error| Rails.logger.error error.message end diff --git a/app/models/claim.rb b/app/models/claim.rb index eb3f4be7..a5efa413 100644 --- a/app/models/claim.rb +++ b/app/models/claim.rb @@ -336,7 +336,6 @@ def self.import_by_id(options = {}) Claim.where(id: id..(id + 499)).find_in_batches(batch_size: 500) do |claims| response = Claim.__elasticsearch__.client.bulk \ index: index, - type: Claim.document_type, body: claims.map { |claim| { index: { _id: claim.id, data: claim.as_indexed_json } } } # try to handle errors @@ -357,7 +356,7 @@ def self.import_by_id(options = {}) end count - rescue Elasticsearch::Transport::Transport::Errors::RequestEntityTooLarge, Faraday::ConnectionFailed, ActiveRecord::LockWaitTimeout => e + rescue Elastic::Transport::Transport::Errors::RequestEntityTooLarge, Faraday::ConnectionFailed, ActiveRecord::LockWaitTimeout => e Rails.logger.error "[Elasticsearch] Error #{e.message} importing claims with IDs #{id} - #{(id + 499)}." count = 0 diff --git a/app/models/concerns/indexable.rb b/app/models/concerns/indexable.rb index 057d391a..8adb1bf6 100644 --- a/app/models/concerns/indexable.rb +++ b/app/models/concerns/indexable.rb @@ -18,7 +18,7 @@ module Indexable before_destroy do __elasticsearch__.delete_document - rescue Elasticsearch::Transport::Transport::Errors::NotFound + rescue Elastic::Transport::Transport::Errors::NotFound nil end end diff --git a/app/models/concerns/resolvable.rb b/app/models/concerns/resolvable.rb index 92f45f50..3f501990 100644 --- a/app/models/concerns/resolvable.rb +++ b/app/models/concerns/resolvable.rb @@ -7,12 +7,22 @@ module Resolvable require "addressable/uri" def get_normalized_url(url) - url = PostRank::URI.clean(url) - if PostRank::URI.valid?(url) - url + uri = Addressable::URI.parse(url) + return nil if uri.host.blank? + + uri.normalize! + + if uri.query_values + uri.query_values = uri.query_values.reject do |k, _| + k.match?(/^utm_|^ref$|^source$/) + end end - rescue Addressable::URI::InvalidURIError => e - { error: e.message } + + uri.fragment = nil # optional: remove #stuff + + uri.to_s + rescue Addressable::URI::InvalidURIError + nil end def doi_as_url(doi) diff --git a/app/models/heartbeat.rb b/app/models/heartbeat.rb index 3ff77432..d4565f26 100644 --- a/app/models/heartbeat.rb +++ b/app/models/heartbeat.rb @@ -21,7 +21,7 @@ def services_up? def memcached_up? host = ENV["MEMCACHE_SERVERS"] || ENV["HOSTNAME"] - memcached_client = Dalli::Client.new("#{host}:11211") + memcached_client = Dalli::Client.new("#{host}:11211", serializer: JSON) memcached_client.alive! true rescue StandardError diff --git a/app/models/user.rb b/app/models/user.rb index f256b7ce..b2650484 100755 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -20,8 +20,17 @@ class User < ApplicationRecord include Elasticsearch::Model - nilify_blanks - strip_attributes only: %i[given_names family_name name other_names] + strip_attributes except: %i[ + authentication_token + confirmation_token + github_token + orcid_token + orcid_auto_update_access_token + orcid_auto_update_refresh_token + orcid_search_and_link_access_token + orcid_search_and_link_refresh_token + ], + collapse_spaces: true # include hash helper include Hashie::Extensions::DeepFetch @@ -38,7 +47,7 @@ class User < ApplicationRecord has_many :claims, primary_key: "uid", foreign_key: "orcid", inverse_of: :user - devise :omniauthable, omniauth_providers: %i[orcid github globus] + devise :omniauthable, omniauth_providers: %i[orcid github] validates :uid, presence: true, uniqueness: { case_sensitive: false } validate :validate_email @@ -170,7 +179,6 @@ def self.import_by_id(options = {}) User.where(id: id..(id + 499)).find_in_batches(batch_size: 500) do |users| response = User.__elasticsearch__.client.bulk \ index: index, - type: User.document_type, body: users.map { |user| { index: { _id: user.id, data: user.as_indexed_json } } } # try to handle errors @@ -191,7 +199,7 @@ def self.import_by_id(options = {}) end count - rescue Elasticsearch::Transport::Transport::Errors::RequestEntityTooLarge, Faraday::ConnectionFailed, ActiveRecord::LockWaitTimeout => e + rescue Elastic::Transport::Transport::Errors::RequestEntityTooLarge, Faraday::ConnectionFailed, ActiveRecord::LockWaitTimeout => e Rails.logger.info "[Elasticsearch] Error #{e.message} importing users with IDs #{id} - #{(id + 499)}." count = 0 @@ -422,9 +430,6 @@ def process_data(options = {}) if result.body["skip"] elsif result.body["errors"] - # send notification to Sentry - # Raven.capture_exception(RuntimeError.new(result.body["errors"].first["title"]))if ENV["SENTRY_DSN"] - logger.error result.body["errors"].inspect else write_attribute(:github_put_code, result.body["put_code"]) diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index d0f0675d..00f34419 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -27,6 +27,5 @@
<% end %> - <%= render partial: "layouts/#{ENV['MODE']}/footer" -%>