diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 050be3e..1c6ead0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,7 +21,7 @@ jobs: persist-credentials: false - name: Set up Ruby - uses: ruby/setup-ruby@a0102e0972be65f351c307e2d64b9314a57c8073 # v1.324.0 + uses: ruby/setup-ruby@14594264cd68ce8a2345dd349bc3d138a4ef85c8 # v1.327.0 with: ruby-version: .ruby-version bundler-cache: true @@ -40,7 +40,7 @@ jobs: persist-credentials: false - name: Set up Ruby - uses: ruby/setup-ruby@a0102e0972be65f351c307e2d64b9314a57c8073 # v1.324.0 + uses: ruby/setup-ruby@14594264cd68ce8a2345dd349bc3d138a4ef85c8 # v1.327.0 with: ruby-version: .ruby-version bundler-cache: true @@ -48,6 +48,29 @@ jobs: - name: Lint code for consistent style run: bin/rubocop + herb: + name: Herb check + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - name: Install packages + run: sudo apt-get update && sudo apt-get install --no-install-recommends -y libvips + + - name: Checkout code + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + + - name: Set up Ruby + uses: ruby/setup-ruby@a0102e0972be65f351c307e2d64b9314a57c8073 # v1.324.0 + with: + ruby-version: .ruby-version + bundler-cache: true + + - name: Check that every HTML template compiles through Herb + run: bin/rails herb:check + lint-actions: name: GitHub Actions audit runs-on: ubuntu-latest @@ -87,7 +110,7 @@ jobs: persist-credentials: false - name: Set up Ruby - uses: ruby/setup-ruby@a0102e0972be65f351c307e2d64b9314a57c8073 # v1.324.0 + uses: ruby/setup-ruby@14594264cd68ce8a2345dd349bc3d138a4ef85c8 # v1.327.0 env: REDIS_URL: redis://localhost:6379/0 with: @@ -117,7 +140,7 @@ jobs: persist-credentials: false - name: Set up Ruby - uses: ruby/setup-ruby@a0102e0972be65f351c307e2d64b9314a57c8073 # v1.324.0 + uses: ruby/setup-ruby@14594264cd68ce8a2345dd349bc3d138a4ef85c8 # v1.327.0 env: REDIS_URL: redis://localhost:6379/0 with: diff --git a/Gemfile.lock b/Gemfile.lock index 39516d2..842fcb4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -23,16 +23,16 @@ GIT GIT remote: https://github.com/rails/propshaft.git - revision: e49a9de659ff27462015e54dd832e86e762a6ddc + revision: dc979db89cd07c72ee4d11d415ae1cb4fd072623 specs: - propshaft (1.2.1) + propshaft (1.3.2) actionpack (>= 7.0.0) activesupport (>= 7.0.0) rack GIT remote: https://github.com/rails/rails.git - revision: 1a02651ac37fb64b4de2a2b73461d86acf9c98fb + revision: e3d5c569d217c56c022b04acb127a8c24dbe9685 branch: main specs: actioncable (8.2.0.alpha) @@ -63,10 +63,10 @@ GIT rack-session (>= 1.0.1) rack-test (>= 0.6.3) rails-dom-testing (~> 2.2) - rails-html-sanitizer (~> 1.6) + rails-html-sanitizer (~> 1.7) useragent (~> 0.16) actiontext (8.2.0.alpha) - action_text-trix (~> 2.1.15) + action_text-trix (~> 2.1.16) actionpack (= 8.2.0.alpha) activerecord (= 8.2.0.alpha) activestorage (= 8.2.0.alpha) @@ -77,11 +77,12 @@ GIT activesupport (= 8.2.0.alpha) builder (~> 3.1) erubi (~> 1.11) + herb (>= 0.10) rails-dom-testing (~> 2.2) - rails-html-sanitizer (~> 1.6) + rails-html-sanitizer (~> 1.7) activejob (8.2.0.alpha) activesupport (= 8.2.0.alpha) - globalid (>= 0.3.6) + globalid (>= 1.4.0) activemodel (8.2.0.alpha) activesupport (= 8.2.0.alpha) activerecord (8.2.0.alpha) @@ -93,7 +94,7 @@ GIT activejob (= 8.2.0.alpha) activerecord (= 8.2.0.alpha) activesupport (= 8.2.0.alpha) - marcel (~> 1.0) + marcel (~> 2.0) activesupport (8.2.0.alpha) base64 bigdecimal @@ -104,6 +105,8 @@ GIT json logger (>= 1.4.2) minitest (>= 5.1) + psych (>= 4) + ractor-dispatch (>= 0.3.0) securerandom (>= 0.3) tzinfo (~> 2.0, >= 2.0.5) uri (>= 0.13.1) @@ -142,7 +145,7 @@ GEM base64 (0.3.0) bcrypt (3.1.22) benchmark (0.5.0) - bigdecimal (3.3.1) + bigdecimal (4.1.3) brakeman (8.0.6) racc builder (3.3.0) @@ -159,7 +162,7 @@ GEM regexp_parser (>= 1.5, < 3.0) xpath (~> 3.2) chunky_png (1.4.0) - concurrent-ruby (1.3.7) + concurrent-ruby (1.3.8) connection_pool (2.5.5) crack (1.0.0) bigdecimal @@ -170,9 +173,9 @@ GEM irb (~> 1.10) reline (>= 0.3.8) drb (2.2.3) - erb (6.0.4) + erb (6.0.7) erubi (1.13.1) - faker (3.5.2) + faker (3.8.0) i18n (>= 1.8.11, < 2) ffi (1.17.2) ffi (1.17.2-aarch64-linux-gnu) @@ -182,17 +185,22 @@ GEM geared_pagination (1.2.0) activesupport (>= 5.0) addressable (>= 2.5.0) - globalid (1.3.0) + globalid (1.4.0) activesupport (>= 6.1) hashdiff (1.2.0) - i18n (1.14.7) + herb (0.11.0-aarch64-linux-gnu) + herb (0.11.0-arm64-darwin) + herb (0.11.0-x86_64-darwin) + herb (0.11.0-x86_64-linux-gnu) + i18n (1.15.2) concurrent-ruby (~> 1.0) image_processing (1.14.0) mini_magick (>= 4.9.5, < 6) ruby-vips (>= 2.0.17, < 3) - io-console (0.8.1) - irb (1.15.3) + io-console (0.9.4) + irb (1.18.0) pp (>= 0.6.0) + prism (>= 1.3.0) rdoc (>= 4.0.0) reline (>= 0.4.2) jbuilder (2.14.1) @@ -219,26 +227,28 @@ GEM net-imap net-pop net-smtp - marcel (1.1.0) + marcel (2.1.0) matrix (0.4.3) mini_magick (5.3.1) logger mini_mime (1.1.5) - minitest (5.26.2) + minitest (6.0.6) + drb (~> 2.0) + prism (~> 1.5) mocha (3.1.0) ruby2_keywords (>= 0.0.5) mono_logger (1.1.2) multi_json (1.17.0) mustermann (3.0.4) ruby2_keywords (~> 0.0.1) - net-imap (0.6.4.1) + net-imap (0.6.7) date net-protocol net-pop (0.1.2) net-protocol - net-protocol (0.2.2) + net-protocol (0.4.0) timeout - net-smtp (0.5.1) + net-smtp (0.5.2) net-protocol nio4r (2.7.5) nokogiri (1.19.4-aarch64-linux-gnu) @@ -258,18 +268,18 @@ GEM platform_agent (1.0.1) activesupport (>= 5.2.0) useragent (~> 0.16.3) - pp (0.6.3) + pp (0.6.4) prettyprint prettyprint (0.2.0) - prism (1.4.0) - psych (5.2.6) + prism (1.9.0) + psych (5.5.0) date stringio public_suffix (6.0.2) puma (7.2.1) nio4r (~> 2.0) racc (1.8.1) - rack (3.2.6) + rack (3.2.7) rack-protection (4.2.1) base64 (>= 0.1.0) logger (>= 1.6.0) @@ -279,8 +289,9 @@ GEM rack (>= 3.0.0) rack-test (2.2.0) rack (>= 1.3) - rackup (2.2.1) + rackup (2.3.1) rack (>= 3) + ractor-dispatch (0.3.0) rails-dom-testing (2.3.0) activesupport (>= 5.0.0) minitest @@ -293,19 +304,24 @@ GEM activesupport (> 3.1) railties (> 3.1) rainbow (3.1.1) - rake (13.3.1) - rdoc (6.16.1) + rake (13.4.2) + rbs (4.2.0) + logger + prism (>= 1.6.0) + tsort + rdoc (8.1.0) erb - psych (>= 4.0.0) + prism (>= 1.6.0) + rbs (>= 4.0.0) tsort redis (5.4.1) redis-client (>= 0.22.0) - redis-client (0.25.2) + redis-client (0.30.1) connection_pool redis-namespace (1.11.0) redis (>= 4) regexp_parser (2.11.2) - reline (0.6.3) + reline (0.7.0) io-console (~> 0.5) resque (2.7.0) mono_logger (~> 1) @@ -353,9 +369,9 @@ GEM ffi (~> 1.12) logger ruby2_keywords (0.0.5) - rubyzip (3.4.0) + rubyzip (3.7.0) securerandom (0.4.1) - selenium-webdriver (4.35.0) + selenium-webdriver (4.49.0) base64 (~> 0.2) logger (~> 1.4) rexml (~> 3.2, >= 3.2.5) @@ -380,8 +396,8 @@ GEM sqlite3 (2.9.6-x86_64-linux-gnu) stimulus-rails (1.3.4) railties (>= 6.0.0) - stringio (3.1.8) - thor (1.4.0) + stringio (3.2.0) + thor (1.5.0) thruster (0.1.23-aarch64-linux) thruster (0.1.23-arm64-darwin) thruster (0.1.23-x86_64-darwin) @@ -410,7 +426,7 @@ GEM websocket-extensions (0.1.5) xpath (3.2.0) nokogiri (~> 1.8) - zeitwerk (2.7.3) + zeitwerk (2.8.3) PLATFORMS aarch64-linux diff --git a/app/controllers/searches_controller.rb b/app/controllers/searches_controller.rb index 221218d..735da0c 100644 --- a/app/controllers/searches_controller.rb +++ b/app/controllers/searches_controller.rb @@ -20,7 +20,7 @@ class SearchesController < ApplicationController private def set_messages if query.present? - @messages = Current.user.reachable_messages.search(query).with_presentation.last_page_of(100) + @messages = Current.user.reachable_messages.search(query).with_presentation.last_page_of_matches(100) else @messages = Message.none end diff --git a/app/models/message/searchable.rb b/app/models/message/searchable.rb index b792cd0..9245ead 100644 --- a/app/models/message/searchable.rb +++ b/app/models/message/searchable.rb @@ -17,6 +17,14 @@ module Message::Searchable end end + class_methods do + # Orders by the index's rowid, which is the message id, so SQLite walks the full-text index + # newest first and stops at the page. Ordering by created_at sorted every match before paging. + def last_page_of_matches(size) + Message::Pagination::Page.load(reorder("idx.rowid"), :last, size) + end + end + private def create_in_index execute_sql_with_binds "insert into message_search_index(rowid, body) values (?, ?)", id, plain_text_body diff --git a/app/models/user/mentionable.rb b/app/models/user/mentionable.rb index b028284..a48df75 100644 --- a/app/models/user/mentionable.rb +++ b/app/models/user/mentionable.rb @@ -11,6 +11,11 @@ module User::Mentionable "users/mention" end + # How a mention appears inside the editor, matching the prompt's editor template. + def to_editor_content_attachment_partial_path + "users/mention" + end + def attachable_plain_text_representation(caption) "@#{name}" end diff --git a/app/models/webhook.rb b/app/models/webhook.rb index 5c307e7..f386e5f 100644 --- a/app/models/webhook.rb +++ b/app/models/webhook.rb @@ -63,7 +63,7 @@ class Webhook < ApplicationRecord end def extract_attachment_from(response) - if response.content_type && mime_type = Mime::Type.lookup(response.content_type) + if response.code == "200" && response.content_type && mime_type = Mime::Type.lookup(response.content_type) ActiveStorage::Blob.create_and_upload! \ io: StringIO.new(response.body), filename: "attachment.#{mime_type.symbol}", content_type: mime_type.to_s end diff --git a/app/views/accounts/edit.html.erb b/app/views/accounts/edit.html.erb index cfa750d..f2d1ae8 100644 --- a/app/views/accounts/edit.html.erb +++ b/app/views/accounts/edit.html.erb @@ -76,10 +76,9 @@ <% end %>