]> git.openstreetmap.org Git - rails.git/commitdiff
Merge remote-tracking branch 'upstream/pull/5245'
authorTom Hughes <tom@compton.nu>
Wed, 2 Oct 2024 17:36:03 +0000 (18:36 +0100)
committerTom Hughes <tom@compton.nu>
Wed, 2 Oct 2024 17:36:03 +0000 (18:36 +0100)
34 files changed:
.github/workflows/lint.yml
.github/workflows/tests.yml
.rubocop.yml
Gemfile
Gemfile.lock
INSTALL.md
Vagrantfile
app/controllers/api_controller.rb
app/controllers/application_controller.rb
app/helpers/browse_helper.rb
app/helpers/user_mailer_helper.rb
app/mailers/user_mailer.rb
app/models/old_node.rb
app/models/old_node_tag.rb
app/models/old_relation.rb
app/models/old_relation_member.rb
app/models/old_relation_tag.rb
app/models/old_way.rb
app/models/old_way_node.rb
app/models/old_way_tag.rb
bin/brakeman [new file with mode: 0755]
bin/rubocop [new file with mode: 0755]
bin/setup
config/environments/development.rb
config/environments/production.rb
config/environments/test.rb
config/initializers/new_framework_defaults_7_2.rb [new file with mode: 0644]
config/puma.rb
lib/classic_pagination/pagination.rb
test/application_system_test_case.rb
test/helpers/application_helper_test.rb
test/integration/user_creation_test.rb
test/system/history_test.rb
test/test_helper.rb

index 9fc1320141d9f50d0ac19a5940bc48fdbe9dd87f..343084b0f8b6b4c52efb4e1f8887f450a7c465ff 100644 (file)
@@ -7,7 +7,7 @@ concurrency:
   cancel-in-progress: true
 env:
   os: ubuntu-22.04
-  ruby: '3.0'
+  ruby: '3.1'
 jobs:
   rubocop:
     name: RuboCop
index 46ab75482815eb90b5d9aa23f7a8ac8e4418f6f5..6e2b77059d1d4df4204cad333906129a299f1732 100644 (file)
@@ -10,8 +10,8 @@ jobs:
     name: Ubuntu ${{ matrix.ubuntu }}, Ruby ${{ matrix.ruby }}
     strategy:
       matrix:
-        ubuntu: [20.04, 22.04]
-        ruby: ['3.0', '3.1', '3.2', '3.3']
+        ubuntu: [22.04, 24.04]
+        ruby: ['3.1', '3.2', '3.3']
     runs-on: ubuntu-${{ matrix.ubuntu }}
     env:
       RAILS_ENV: test
index c0f0c1fa08053ec082a77ae9cd8e6e3d0facb874..8b6ed018032c66c116e4b08fe6ba697e9c608a9d 100644 (file)
@@ -9,7 +9,7 @@ require:
   - rubocop-rake
 
 AllCops:
-  TargetRubyVersion: 3.0
+  TargetRubyVersion: 3.1
   NewCops: enable
   Exclude:
     - 'vendor/**/*'
diff --git a/Gemfile b/Gemfile
index 27f295eb654f1ff36bd7c248aae85ecd37b08b01..b25255320c5614ec01e9795a0632d6fe3a676458 100644 (file)
--- a/Gemfile
+++ b/Gemfile
@@ -1,7 +1,7 @@
 source "https://rubygems.org"
 
 # Require rails
-gem "rails", "~> 7.1.0"
+gem "rails", "~> 7.2.0"
 gem "turbo-rails"
 
 # Require json for multi_json
@@ -130,7 +130,7 @@ gem "gd2-ffij", ">= 0.4.0"
 gem "marcel"
 
 # Used for browser detection
-gem "browser", "< 6" # for ruby 3.0 support
+gem "browser", "< 6" # for ruby 3.1 support
 
 # Used for S3 object storage
 gem "aws-sdk-s3"
@@ -141,9 +141,6 @@ gem "image_processing"
 # Used to validate widths
 gem "unicode-display_width"
 
-# Keep ruby 3.0 compatibility
-gem "multi_xml", "~> 0.6.0"
-
 # Gems useful for development
 group :development do
   gem "better_errors"
index 8872f2e7e7018c24dc6ccf9554e2abbb15c48ab5..f334b3ac104f8e4cfc3b136f0174918b8c3e4ffb 100644 (file)
@@ -3,86 +3,82 @@ GEM
   specs:
     aasm (5.5.0)
       concurrent-ruby (~> 1.0)
-    actioncable (7.1.4)
-      actionpack (= 7.1.4)
-      activesupport (= 7.1.4)
+    actioncable (7.2.0)
+      actionpack (= 7.2.0)
+      activesupport (= 7.2.0)
       nio4r (~> 2.0)
       websocket-driver (>= 0.6.1)
       zeitwerk (~> 2.6)
-    actionmailbox (7.1.4)
-      actionpack (= 7.1.4)
-      activejob (= 7.1.4)
-      activerecord (= 7.1.4)
-      activestorage (= 7.1.4)
-      activesupport (= 7.1.4)
-      mail (>= 2.7.1)
-      net-imap
-      net-pop
-      net-smtp
-    actionmailer (7.1.4)
-      actionpack (= 7.1.4)
-      actionview (= 7.1.4)
-      activejob (= 7.1.4)
-      activesupport (= 7.1.4)
-      mail (~> 2.5, >= 2.5.4)
-      net-imap
-      net-pop
-      net-smtp
+    actionmailbox (7.2.0)
+      actionpack (= 7.2.0)
+      activejob (= 7.2.0)
+      activerecord (= 7.2.0)
+      activestorage (= 7.2.0)
+      activesupport (= 7.2.0)
+      mail (>= 2.8.0)
+    actionmailer (7.2.0)
+      actionpack (= 7.2.0)
+      actionview (= 7.2.0)
+      activejob (= 7.2.0)
+      activesupport (= 7.2.0)
+      mail (>= 2.8.0)
       rails-dom-testing (~> 2.2)
-    actionpack (7.1.4)
-      actionview (= 7.1.4)
-      activesupport (= 7.1.4)
+    actionpack (7.2.0)
+      actionview (= 7.2.0)
+      activesupport (= 7.2.0)
       nokogiri (>= 1.8.5)
       racc
-      rack (>= 2.2.4)
+      rack (>= 2.2.4, < 3.2)
       rack-session (>= 1.0.1)
       rack-test (>= 0.6.3)
       rails-dom-testing (~> 2.2)
       rails-html-sanitizer (~> 1.6)
+      useragent (~> 0.16)
     actionpack-page_caching (1.2.4)
       actionpack (>= 4.0.0)
-    actiontext (7.1.4)
-      actionpack (= 7.1.4)
-      activerecord (= 7.1.4)
-      activestorage (= 7.1.4)
-      activesupport (= 7.1.4)
+    actiontext (7.2.0)
+      actionpack (= 7.2.0)
+      activerecord (= 7.2.0)
+      activestorage (= 7.2.0)
+      activesupport (= 7.2.0)
       globalid (>= 0.6.0)
       nokogiri (>= 1.8.5)
-    actionview (7.1.4)
-      activesupport (= 7.1.4)
+    actionview (7.2.0)
+      activesupport (= 7.2.0)
       builder (~> 3.1)
       erubi (~> 1.11)
       rails-dom-testing (~> 2.2)
       rails-html-sanitizer (~> 1.6)
     active_record_union (1.3.0)
       activerecord (>= 4.0)
-    activejob (7.1.4)
-      activesupport (= 7.1.4)
+    activejob (7.2.0)
+      activesupport (= 7.2.0)
       globalid (>= 0.3.6)
-    activemodel (7.1.4)
-      activesupport (= 7.1.4)
-    activerecord (7.1.4)
-      activemodel (= 7.1.4)
-      activesupport (= 7.1.4)
+    activemodel (7.2.0)
+      activesupport (= 7.2.0)
+    activerecord (7.2.0)
+      activemodel (= 7.2.0)
+      activesupport (= 7.2.0)
       timeout (>= 0.4.0)
     activerecord-import (1.8.1)
       activerecord (>= 4.2)
-    activestorage (7.1.4)
-      actionpack (= 7.1.4)
-      activejob (= 7.1.4)
-      activerecord (= 7.1.4)
-      activesupport (= 7.1.4)
+    activestorage (7.2.0)
+      actionpack (= 7.2.0)
+      activejob (= 7.2.0)
+      activerecord (= 7.2.0)
+      activesupport (= 7.2.0)
       marcel (~> 1.0)
-    activesupport (7.1.4)
+    activesupport (7.2.0)
       base64
       bigdecimal
-      concurrent-ruby (~> 1.0, >= 1.0.2)
+      concurrent-ruby (~> 1.0, >= 1.3.1)
       connection_pool (>= 2.2.5)
       drb
       i18n (>= 1.6, < 2)
+      logger (>= 1.4.2)
       minitest (>= 5.1)
-      mutex_m
-      tzinfo (~> 2.0)
+      securerandom (>= 0.3)
+      tzinfo (~> 2.0, >= 2.0.5)
     addressable (2.8.7)
       public_suffix (>= 2.0.2, < 7.0)
     annotate (3.2.0)
@@ -346,8 +342,8 @@ GEM
       minitest (>= 4, < 6)
     msgpack (1.7.2)
     multi_json (1.15.0)
-    multi_xml (0.6.0)
-    mutex_m (0.2.0)
+    multi_xml (0.7.1)
+      bigdecimal (~> 3.1)
     net-http (0.4.1)
       uri
     net-imap (0.4.16)
@@ -448,20 +444,20 @@ GEM
     rackup (1.0.0)
       rack (< 3)
       webrick
-    rails (7.1.4)
-      actioncable (= 7.1.4)
-      actionmailbox (= 7.1.4)
-      actionmailer (= 7.1.4)
-      actionpack (= 7.1.4)
-      actiontext (= 7.1.4)
-      actionview (= 7.1.4)
-      activejob (= 7.1.4)
-      activemodel (= 7.1.4)
-      activerecord (= 7.1.4)
-      activestorage (= 7.1.4)
-      activesupport (= 7.1.4)
+    rails (7.2.0)
+      actioncable (= 7.2.0)
+      actionmailbox (= 7.2.0)
+      actionmailer (= 7.2.0)
+      actionpack (= 7.2.0)
+      actiontext (= 7.2.0)
+      actionview (= 7.2.0)
+      activejob (= 7.2.0)
+      activemodel (= 7.2.0)
+      activerecord (= 7.2.0)
+      activestorage (= 7.2.0)
+      activesupport (= 7.2.0)
       bundler (>= 1.15.0)
-      railties (= 7.1.4)
+      railties (= 7.2.0)
     rails-controller-testing (1.0.5)
       actionpack (>= 5.0.1.rc1)
       actionview (>= 5.0.1.rc1)
@@ -479,10 +475,10 @@ GEM
     rails_param (1.3.1)
       actionpack (>= 3.2.0)
       activesupport (>= 3.2.0)
-    railties (7.1.4)
-      actionpack (= 7.1.4)
-      activesupport (= 7.1.4)
-      irb
+    railties (7.2.0)
+      actionpack (= 7.2.0)
+      activesupport (= 7.2.0)
+      irb (~> 1.13)
       rackup (>= 1.0.0)
       rake (>= 12.2)
       thor (~> 1.0, >= 1.2.2)
@@ -546,6 +542,7 @@ GEM
     sass-embedded (1.64.2)
       google-protobuf (~> 3.23)
       rake (>= 13.0.0)
+    securerandom (0.3.1)
     selenium-webdriver (4.23.0)
       base64 (~> 0.2)
       logger (~> 1.4)
@@ -591,6 +588,7 @@ GEM
       concurrent-ruby (~> 1.0)
     unicode-display_width (2.6.0)
     uri (0.13.1)
+    useragent (0.16.10)
     validates_email_format_of (1.8.2)
       i18n (>= 0.8.0)
       simpleidn
@@ -672,7 +670,6 @@ DEPENDENCIES
   minitest (~> 5.1)
   minitest-focus
   multi_json
-  multi_xml (~> 0.6.0)
   omniauth (~> 2.0.2)
   omniauth-facebook
   omniauth-github
@@ -688,7 +685,7 @@ DEPENDENCIES
   quad_tile (~> 1.0.1)
   rack-cors
   rack-uri_sanitizer
-  rails (~> 7.1.0)
+  rails (~> 7.2.0)
   rails-controller-testing
   rails-i18n (~> 7.0.0)
   rails_param
@@ -717,4 +714,4 @@ DEPENDENCIES
   webmock
 
 BUNDLED WITH
-   2.4.19
+   2.5.11
index c8e28a62fbc20cd2b06166cbf2992dc91968946b..8667fb5129161efca38295559202e64fd86475b4 100644 (file)
@@ -9,7 +9,7 @@ are two alternatives which make it easier to get a consistent development enviro
 * **Vagrant** This installs the software into a virtual machine. For Vagrant instructions see [VAGRANT.md](VAGRANT.md).
 * **Docker** This installs the software using containerization. For Docker instructions see [DOCKER.md](DOCKER.md).
 
-These instructions are based on Ubuntu 22.04 LTS, which is the platform used by the OSMF servers.
+These instructions are based on Ubuntu 24.04 LTS, which is the platform used by the OSMF servers.
 The instructions also work, with only minor amendments, for all other current Ubuntu releases, Fedora and MacOSX
 
 We don't recommend attempting to develop or deploy this software on Windows. Some Ruby gems may not be supported. If you need to use Windows the easiest solutions in order are [Docker](DOCKER.md), [Vagrant](VAGRANT.md), and Ubuntu in a virtual machine.
@@ -22,12 +22,12 @@ of packages required before you can get the various gems installed.
 
 ## Minimum requirements
 
-* Ruby 3.0+
+* Ruby 3.1+
 * PostgreSQL 13+
 * Bundler (see note below about [developer Ruby setup](#rbenv))
 * Javascript Runtime
 
-These can be installed on Ubuntu 22.04 or later with:
+These can be installed on Ubuntu 24.04 or later with:
 
 ```
 sudo apt-get update
index 7895d3b86cc4c0f6bf25bb5997fc6343d4286a2c..c2869cd5f661c38846251efee9d222a23de08ecd 100644 (file)
@@ -4,7 +4,7 @@
 Vagrant.configure("2") do |config|
   # use official ubuntu image for virtualbox
   config.vm.provider "virtualbox" do |vb, override|
-    override.vm.box = "ubuntu/jammy64"
+    override.vm.box = "ubuntu/noble64"
     override.vm.synced_folder ".", "/srv/openstreetmap-website"
     vb.customize ["modifyvm", :id, "--memory", "4096"]
     vb.customize ["modifyvm", :id, "--cpus", "2"]
@@ -16,13 +16,13 @@ Vagrant.configure("2") do |config|
 
   # use third party image and sshfs or NFS sharing for lxc
   config.vm.provider "lxc" do |_, override|
-    override.vm.box = "generic/ubuntu2204"
+    override.vm.box = "generic/ubuntu2404"
     override.vm.synced_folder ".", "/srv/openstreetmap-website", :type => sharing_type
   end
 
   # use third party image and sshfs or NFS sharing for libvirt
   config.vm.provider "libvirt" do |_, override|
-    override.vm.box = "generic/ubuntu2204"
+    override.vm.box = "generic/ubuntu2404"
     override.vm.synced_folder ".", "/srv/openstreetmap-website", :type => sharing_type
   end
 
index 6ce8a0ef2d18045309e36784db5cb07d0f53483e..17c98fe8b657e4c52acf6133084a786110405d90 100644 (file)
@@ -144,8 +144,8 @@ class ApiController < ApplicationController
 
   ##
   # wrap an api call in a timeout
-  def api_call_timeout(&block)
-    Timeout.timeout(Settings.api_timeout, &block)
+  def api_call_timeout(&)
+    Timeout.timeout(Settings.api_timeout, &)
   rescue ActionView::Template::Error => e
     e = e.cause
 
index fdc2ac4e8694191790ffadab11ae9bbe5e55dc54..7ce804ced01af000ada0560ee4f27f99046618ac 100644 (file)
@@ -215,10 +215,10 @@ class ApplicationController < ActionController::Base
 
   ##
   # wrap a web page in a timeout
-  def web_timeout(&block)
+  def web_timeout(&)
     raise Timeout::Error if Settings.web_timeout.negative?
 
-    Timeout.timeout(Settings.web_timeout, &block)
+    Timeout.timeout(Settings.web_timeout, &)
   rescue ActionView::Template::Error => e
     e = e.cause
 
index 9ea38481137d77afeb46ccfe615860e4b2cecf24..69a8f8fa2e57eb5b76a717f98506c5f4752c33da 100644 (file)
@@ -44,9 +44,9 @@ module BrowseHelper
     t "printable_name.version", :version => object.version
   end
 
-  def element_strikethrough(object, &block)
+  def element_strikethrough(object, &)
     if object.redacted? || !object.visible?
-      tag.s(&block)
+      tag.s(&)
     else
       yield
     end
index e5d6e39aca4a6259f95a92c1ed2c873d63877ed0..d47827074afd0c939facc643d5b246e5233df517 100644 (file)
@@ -18,10 +18,10 @@ module UserMailerHelper
     )
   end
 
-  def message_body(&block)
+  def message_body(&)
     render(
       :partial => "message_body",
-      :locals => { :body => capture(&block) }
+      :locals => { :body => capture(&) }
     )
   end
 
index 86e77703b697569f021e281e575349c8595753b2..dee3dafbed35562ab865f11c64fcad4d61e8a067 100644 (file)
@@ -247,8 +247,8 @@ class UserMailer < ApplicationMailer
     end
   end
 
-  def with_recipient_locale(recipient, &block)
-    I18n.with_locale(Locale.available.preferred(recipient.preferred_languages), &block)
+  def with_recipient_locale(recipient, &)
+    I18n.with_locale(Locale.available.preferred(recipient.preferred_languages), &)
   end
 
   def from_address(name, type, id, token, user_id = nil)
index 4585ed406b28cba2205aa82b37fa11e67a539068..f29eed9dda9cbaf7d3532fde9cd22432eca08b1f 100644 (file)
@@ -47,7 +47,7 @@ class OldNode < ApplicationRecord
   belongs_to :redaction, :optional => true
   belongs_to :current_node, :class_name => "Node", :foreign_key => "node_id", :inverse_of => :old_nodes
 
-  has_many :old_tags, :class_name => "OldNodeTag", :query_constraints => [:node_id, :version], :inverse_of => :old_node
+  has_many :old_tags, :class_name => "OldNodeTag", :foreign_key => [:node_id, :version], :inverse_of => :old_node
 
   def validate_position
     errors.add(:base, "Node is not in the world") unless in_world?
index 8f632a6713a04eccc5bc8c1bb8873e8b42698b16..503ecf27adaee5820f6b53bb003e3272531b3e20 100644 (file)
@@ -15,7 +15,7 @@
 class OldNodeTag < ApplicationRecord
   self.table_name = "node_tags"
 
-  belongs_to :old_node, :query_constraints => [:node_id, :version], :inverse_of => :old_tags
+  belongs_to :old_node, :foreign_key => [:node_id, :version], :inverse_of => :old_tags
 
   validates :old_node, :associated => true
   validates :k, :v, :allow_blank => true, :length => { :maximum => 255 }, :characters => true
index 7d5a3fbb4096e3c8e077a9595d8ec067ef969638..9f551d839fc2c57be000f37f67ccd952ec9a313c 100644 (file)
@@ -31,8 +31,8 @@ class OldRelation < ApplicationRecord
   belongs_to :redaction, :optional => true
   belongs_to :current_relation, :class_name => "Relation", :foreign_key => "relation_id", :inverse_of => :old_relations
 
-  has_many :old_members, -> { order(:sequence_id) }, :class_name => "OldRelationMember", :query_constraints => [:relation_id, :version], :inverse_of => :old_relation
-  has_many :old_tags, :class_name => "OldRelationTag", :query_constraints => [:relation_id, :version], :inverse_of => :old_relation
+  has_many :old_members, -> { order(:sequence_id) }, :class_name => "OldRelationMember", :foreign_key => [:relation_id, :version], :inverse_of => :old_relation
+  has_many :old_tags, :class_name => "OldRelationTag", :foreign_key => [:relation_id, :version], :inverse_of => :old_relation
 
   validates :changeset, :associated => true
   validates :timestamp, :presence => true
index 5a11566059c94c5479018928e3a6096567805a71..6d5aaf5c9653861db673981fd73b5eb5fcba12c6 100644 (file)
@@ -21,7 +21,7 @@
 class OldRelationMember < ApplicationRecord
   self.table_name = "relation_members"
 
-  belongs_to :old_relation, :query_constraints => [:relation_id, :version], :inverse_of => :old_members
+  belongs_to :old_relation, :foreign_key => [:relation_id, :version], :inverse_of => :old_members
   # A bit messy, referring to the current tables, should do for the data browser for now
   belongs_to :member, :polymorphic => true
 
index 31399c00d1dafefa296610403408b55bd918329a..39566aeb97b2c321636f30b19eb8a850bc36bcc8 100644 (file)
@@ -15,7 +15,7 @@
 class OldRelationTag < ApplicationRecord
   self.table_name = "relation_tags"
 
-  belongs_to :old_relation, :query_constraints => [:relation_id, :version], :inverse_of => :old_tags
+  belongs_to :old_relation, :foreign_key => [:relation_id, :version], :inverse_of => :old_tags
 
   validates :old_relation, :associated => true
   validates :k, :v, :allow_blank => true, :length => { :maximum => 255 }, :characters => true
index 8577330c52823dd808e5128b7047f7a17dcd9c5a..0c53f90bdbe2f84f1fc885499fe05cb27bbf4311 100644 (file)
@@ -31,8 +31,8 @@ class OldWay < ApplicationRecord
   belongs_to :redaction, :optional => true
   belongs_to :current_way, :class_name => "Way", :foreign_key => "way_id", :inverse_of => :old_ways
 
-  has_many :old_nodes, :class_name => "OldWayNode", :query_constraints => [:way_id, :version], :inverse_of => :old_way
-  has_many :old_tags, :class_name => "OldWayTag", :query_constraints => [:way_id, :version], :inverse_of => :old_way
+  has_many :old_nodes, :class_name => "OldWayNode", :foreign_key => [:way_id, :version], :inverse_of => :old_way
+  has_many :old_tags, :class_name => "OldWayTag", :foreign_key => [:way_id, :version], :inverse_of => :old_way
 
   validates :changeset, :associated => true
   validates :timestamp, :presence => true
index e031aba10f2bd47f269e5eea19eb5958dffe7cb1..b2a16c16b39af7cefe8646e0c17bde05953641b3 100644 (file)
@@ -19,7 +19,7 @@
 class OldWayNode < ApplicationRecord
   self.table_name = "way_nodes"
 
-  belongs_to :old_way, :query_constraints => [:way_id, :version], :inverse_of => :old_nodes
+  belongs_to :old_way, :foreign_key => [:way_id, :version], :inverse_of => :old_nodes
   # A bit messy, referring to current nodes and ways, should do for the data browser for now
   belongs_to :node
   belongs_to :way
index 96ec8baf5ea9c873fad49261c839cfa59add2672..82ce132ec8bf8051399bc246f6752f5a532c9811 100644 (file)
@@ -15,7 +15,7 @@
 class OldWayTag < ApplicationRecord
   self.table_name = "way_tags"
 
-  belongs_to :old_way, :query_constraints => [:way_id, :version], :inverse_of => :old_tags
+  belongs_to :old_way, :foreign_key => [:way_id, :version], :inverse_of => :old_tags
 
   validates :old_way, :associated => true
   validates :k, :v, :allow_blank => true, :length => { :maximum => 255 }, :characters => true
diff --git a/bin/brakeman b/bin/brakeman
new file mode 100755 (executable)
index 0000000..ace1c9b
--- /dev/null
@@ -0,0 +1,7 @@
+#!/usr/bin/env ruby
+require "rubygems"
+require "bundler/setup"
+
+ARGV.unshift("--ensure-latest")
+
+load Gem.bin_path("brakeman", "brakeman")
diff --git a/bin/rubocop b/bin/rubocop
new file mode 100755 (executable)
index 0000000..40330c0
--- /dev/null
@@ -0,0 +1,8 @@
+#!/usr/bin/env ruby
+require "rubygems"
+require "bundler/setup"
+
+# explicit rubocop config increases performance slightly while avoiding config confusion.
+ARGV.unshift("--config", File.expand_path("../.rubocop.yml", __dir__))
+
+load Gem.bin_path("rubocop", "rubocop")
index b5accee8aca084a9d9d65a33eb4fd995f714eef4..ff6a47532311f69c591687838c96795d49608cde 100755 (executable)
--- a/bin/setup
+++ b/bin/setup
@@ -1,8 +1,8 @@
 #!/usr/bin/env ruby
 require "fileutils"
 
-# path to your application root.
 APP_ROOT = File.expand_path("..", __dir__)
+APP_NAME = "openstreetmap".freeze
 
 def system!(*args)
   system(*args, :exception => true)
@@ -30,4 +30,8 @@ FileUtils.chdir APP_ROOT do
 
   puts "\n== Restarting application server =="
   system! "bin/rails restart"
+
+  # puts "\n== Configuring puma-dev =="
+  # system "ln -nfs #{APP_ROOT} ~/.puma-dev/#{APP_NAME}"
+  # system "curl -Is https://#{APP_NAME}.test/up | head -n 1"
 end
index bf49d70da412c24590fbeeb0417d1f6e9f7c54f9..bc4b587486a3225b67cf0d1b74b83fd56f78d661 100644 (file)
@@ -14,7 +14,7 @@ Rails.application.configure do
   # Show full error reports.
   config.consider_all_requests_local = true
 
-  # Enable server timing
+  # Enable server timing.
   config.server_timing = true
 
   # Enable/disable caching. By default caching is disabled.
@@ -24,9 +24,7 @@ Rails.application.configure do
     config.action_controller.enable_fragment_cache_logging = true
 
     config.cache_store = :memory_store
-    config.public_file_server.headers = {
-      "Cache-Control" => "public, max-age=#{2.days.to_i}"
-    }
+    config.public_file_server.headers = { "Cache-Control" => "public, max-age=#{2.days.to_i}" }
   else
     config.action_controller.perform_caching = false
 
@@ -39,8 +37,12 @@ Rails.application.configure do
   # Don't care if the mailer can't send.
   config.action_mailer.raise_delivery_errors = false
 
+  # Disable caching for Action Mailer templates even if Action Controller
+  # caching is enabled.
   config.action_mailer.perform_caching = false
 
+  config.action_mailer.default_url_options = { :host => "localhost", :port => 3000 }
+
   # Print deprecation notices to the Rails logger.
   config.active_support.deprecation = :log
 
@@ -59,11 +61,6 @@ Rails.application.configure do
   # Highlight code that enqueued background job in logs.
   config.active_job.verbose_enqueue_logs = true
 
-  # Debug mode disables concatenation and preprocessing of assets.
-  # This option may cause significant delays in view rendering with a large
-  # number of complex assets.
-  config.assets.debug = true
-
   # Suppress logger output for asset requests.
   config.assets.quiet = true
 
@@ -74,14 +71,17 @@ Rails.application.configure do
   # config.i18n.raise_on_missing_translations = true
 
   # Annotate rendered view with file names.
-  config.action_view.annotate_rendered_view_with_filenames = true
+  config.action_view.annotate_rendered_view_with_filenames = true
 
   # Uncomment if you wish to allow Action Cable access from any origin.
   # config.action_cable.disable_request_forgery_protection = true
 
-  # Raise error when a before_action's only/except options reference missing actions
+  # Raise error when a before_action's only/except options reference missing actions.
   config.action_controller.raise_on_missing_callback_actions = true
 
+  # Apply autocorrection by RuboCop to files generated by `bin/rails generate`.
+  # config.generators.apply_rubocop_autocorrect_after_generate!
+
   # Disable host validation.
   config.hosts = []
 end
index 5ce25fc2c649e86f6cf5a03682d7fb24503b9eec..9a7e072b4ec6889fc419dca02c3ca5912285d5a8 100644 (file)
@@ -13,21 +13,23 @@ Rails.application.configure do
   config.eager_load = true
 
   # Full error reports are disabled and caching is turned on.
-  config.consider_all_requests_local       = false
+  config.consider_all_requests_local = false
   config.action_controller.perform_caching = true
 
   # Ensures that a master key has been made available in ENV["RAILS_MASTER_KEY"], config/master.key, or an environment
   # key such as config/credentials/production.key. This key is used to decrypt credentials (and other encrypted files).
   # config.require_master_key = true
 
-  # Enable static file serving from the `/public` folder (turn off if using NGINX/Apache for it).
-  config.public_file_server.enabled = true
+  # Disable serving static files from `public/`, relying on NGINX/Apache to do so instead.
+  # config.public_file_server.enabled = false
 
-  # Compress JavaScripts and CSS.
+  # Compress JavaScripts using a preprocessor.
   config.assets.js_compressor = Terser.new
+
+  # Compress CSS using a preprocessor.
   # config.assets.css_compressor = :sass
 
-  # Do not fallback to assets pipeline if a precompiled asset is missed.
+  # Do not fall back to assets pipeline if a precompiled asset is missed.
   config.assets.compile = false
 
   # Enable serving of images, stylesheets, and JavaScripts from an asset server.
@@ -52,15 +54,18 @@ Rails.application.configure do
   # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
   # config.force_ssl = true
 
+  # Skip http-to-https redirect for the default health check endpoint.
+  # config.ssl_options = { redirect: { exclude: ->(request) { request.path == "/up" } } }
+
   # Log to STDOUT by default
-  # config.logger = ActiveSupport::Logger.new($stdout)
-  #                                      .tap  { |logger| logger.formatter = Logger::Formatter.new }
-  #                                      .then { |logger| ActiveSupport::TaggedLogging.new(logger) }
+  # config.logger = ActiveSupport::Logger.new(STDOUT)
+  #   .tap  { |logger| logger.formatter = ::Logger::Formatter.new }
+  #   .then { |logger| ActiveSupport::TaggedLogging.new(logger) }
 
   # Prepend all log lines with the following tags.
   config.log_tags = [:request_id]
 
-  # Info include generic and useful information about system operation, but avoids logging too much
+  # "info" includes generic and useful information about system operation, but avoids logging too much
   # information to avoid inadvertent exposure of personally identifiable information (PII). If you
   # want to log everything, set the level to "debug".
   config.log_level = ENV.fetch("RAILS_LOG_LEVEL", "info")
@@ -72,9 +77,11 @@ Rails.application.configure do
   # config.cache_store = :mem_cache_store
 
   # Use a real queuing backend for Active Job (and separate queues per environment).
-  # config.active_job.queue_adapter     = :resque
+  # config.active_job.queue_adapter = :resque
   # config.active_job.queue_name_prefix = "openstreetmap_production"
 
+  # Disable caching for Action Mailer templates even if Action Controller
+  # caching is enabled.
   config.action_mailer.perform_caching = false
 
   # Configure caching of static assets
index 451eecc50f5acbc79ed7f86e184ab847002c11bb..7ac52c5e4d3030b29432f45f2f7b06803d3ae1b9 100644 (file)
@@ -18,17 +18,14 @@ Rails.application.configure do
   config.eager_load = ENV["CI"].present?
 
   # Configure public file server for tests with Cache-Control for performance.
-  config.public_file_server.enabled = true
-  config.public_file_server.headers = {
-    "Cache-Control" => "public, max-age=#{1.hour.to_i}"
-  }
+  config.public_file_server.headers = { "Cache-Control" => "public, max-age=#{1.hour.to_i}" }
 
   # Show full error reports and disable caching.
-  config.consider_all_requests_local       = true
+  config.consider_all_requests_local = true
   config.action_controller.perform_caching = false
   config.cache_store = :null_store
 
-  # Raise exceptions instead of rendering exception templates.
+  # Render exception templates for rescuable exceptions and raise for other exceptions.
   config.action_dispatch.show_exceptions = :rescuable
 
   # Disable request forgery protection in test environment.
@@ -40,6 +37,8 @@ Rails.application.configure do
   # Disable logging in tests, for speed increases. Set to :info to bring back logging
   config.log_level = :warn
 
+  # Disable caching for Action Mailer templates even if Action Controller
+  # caching is enabled.
   config.action_mailer.perform_caching = false
 
   # Tell Action Mailer not to deliver emails to the real world.
@@ -47,6 +46,10 @@ Rails.application.configure do
   # ActionMailer::Base.deliveries array.
   config.action_mailer.delivery_method = :test
 
+  # Unlike controllers, the mailer instance doesn't have any context about the
+  # incoming request so you'll need to provide the :host parameter yourself.
+  config.action_mailer.default_url_options = { :host => Settings.server_url }
+
   # Print deprecation notices to the stderr.
   config.active_support.deprecation = :stderr
 
@@ -65,7 +68,7 @@ Rails.application.configure do
   # Annotate rendered view with file names.
   # config.action_view.annotate_rendered_view_with_filenames = true
 
-  # Raise error when a before_action's only/except options reference missing actions
+  # Raise error when a before_action's only/except options reference missing actions.
   config.action_controller.raise_on_missing_callback_actions = true
 
   # Use the test adapter for ActiveJob during testing.
diff --git a/config/initializers/new_framework_defaults_7_2.rb b/config/initializers/new_framework_defaults_7_2.rb
new file mode 100644 (file)
index 0000000..b549c4a
--- /dev/null
@@ -0,0 +1,70 @@
+# Be sure to restart your server when you modify this file.
+#
+# This file eases your Rails 7.2 framework defaults upgrade.
+#
+# Uncomment each configuration one by one to switch to the new default.
+# Once your application is ready to run with all new defaults, you can remove
+# this file and set the `config.load_defaults` to `7.2`.
+#
+# Read the Guide for Upgrading Ruby on Rails for more info on each option.
+# https://guides.rubyonrails.org/upgrading_ruby_on_rails.html
+
+###
+# Controls whether Active Job's `#perform_later` and similar methods automatically defer
+# the job queuing to after the current Active Record transaction is committed.
+#
+# Example:
+#   Topic.transaction do
+#     topic = Topic.create(...)
+#     NewTopicNotificationJob.perform_later(topic)
+#   end
+#
+# In this example, if the configuration is set to `:never`, the job will
+# be enqueued immediately, even though the `Topic` hasn't been committed yet.
+# Because of this, if the job is picked up almost immediately, or if the
+# transaction doesn't succeed for some reason, the job will fail to find this
+# topic in the database.
+#
+# If `enqueue_after_transaction_commit` is set to `:default`, the queue adapter
+# will define the behaviour.
+#
+# Note: Active Job backends can disable this feature. This is generally done by
+# backends that use the same database as Active Record as a queue, hence they
+# don't need this feature.
+#++
+# Rails.application.config.active_job.enqueue_after_transaction_commit = :default
+
+###
+# Adds image/webp to the list of content types Active Storage considers as an image
+# Prevents automatic conversion to a fallback PNG, and assumes clients support WebP, as they support gif, jpeg, and png.
+# This is possible due to broad browser support for WebP, but older browsers and email clients may still not support
+# WebP. Requires imagemagick/libvips built with WebP support.
+#++
+# Rails.application.config.active_storage.web_image_content_types = %w[image/png image/jpeg image/gif image/webp]
+
+###
+# Enable validation of migration timestamps. When set, an ActiveRecord::InvalidMigrationTimestampError
+# will be raised if the timestamp prefix for a migration is more than a day ahead of the timestamp
+# associated with the current time. This is done to prevent forward-dating of migration files, which can
+# impact migration generation and other migration commands.
+#
+# Applications with existing timestamped migrations that do not adhere to the
+# expected format can disable validation by setting this config to `false`.
+#++
+# Rails.application.config.active_record.validate_migration_timestamps = true
+
+###
+# Controls whether the PostgresqlAdapter should decode dates automatically with manual queries.
+#
+# Example:
+#   ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.select_value("select '2024-01-01'::date") #=> Date
+#
+# This query used to return a `String`.
+#++
+# Rails.application.config.active_record.postgresql_adapter_decode_dates = true
+
+###
+# Enables YJIT as of Ruby 3.3, to bring sizeable performance improvements. If you are
+# deploying to a memory constrained environment you may want to set this to `false`.
+#++
+# Rails.application.config.yjit = true
index 283e163b1af2221500cbee5ffe3f88a0539b64a9..60e1b9c67a0b17400eee7a22935d1cf6312f5ae9 100644 (file)
@@ -1,38 +1,33 @@
-# Puma can serve each request in a thread from an internal thread pool.
-# The `threads` method setting takes two numbers: a minimum and maximum.
-# Any libraries that use thread pools should be configured to match
-# the maximum value specified for Puma. Default is set to 5 threads for minimum
-# and maximum; this matches the default thread size of Active Record.
-#
-max_threads_count = ENV.fetch("RAILS_MAX_THREADS", 5)
-min_threads_count = ENV.fetch("RAILS_MIN_THREADS") { max_threads_count }
-threads min_threads_count, max_threads_count
+# This configuration file will be evaluated by Puma. The top-level methods that
+# are invoked here are part of Puma's configuration DSL. For more information
+# about methods provided by the DSL, see https://puma.io/puma/Puma/DSL.html.
 
-# Specifies the `port` that Puma will listen on to receive requests; default is 3000.
+# Puma starts a configurable number of processes (workers) and each process
+# serves each request in a thread from an internal thread pool.
 #
-port        ENV.fetch("PORT", 3000)
-
-# Specifies the `environment` that Puma will run in.
+# The ideal number of threads per worker depends both on how much time the
+# application spends waiting for IO operations and on how much you wish to
+# to prioritize throughput over latency.
 #
-environment ENV.fetch("RAILS_ENV") { "development" }
-
-# Specifies the `pidfile` that Puma will use.
-pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" }
-
-# Specifies the number of `workers` to boot in clustered mode.
-# Workers are forked web server processes. If using threads and workers together
-# the concurrency of the application would be max `threads` * `workers`.
-# Workers do not work on JRuby or Windows (both of which do not support
-# processes).
+# As a rule of thumb, increasing the number of threads will increase how much
+# traffic a given process can handle (throughput), but due to CRuby's
+# Global VM Lock (GVL) it has diminishing returns and will degrade the
+# response time (latency) of the application.
 #
-# workers ENV.fetch("WEB_CONCURRENCY") { 2 }
-
-# Use the `preload_app!` method when specifying a `workers` number.
-# This directive tells Puma to first boot the application and load code
-# before forking the application. This takes advantage of Copy On Write
-# process behavior so workers use less memory.
+# The default is set to 3 threads as it's deemed a decent compromise between
+# throughput and latency for the average Rails application.
 #
-# preload_app!
+# Any libraries that use a connection pool or another resource pool should
+# be configured to provide at least as many connections as the number of
+# threads. This includes Active Record's `pool` parameter in `database.yml`.
+threads_count = ENV.fetch("RAILS_MAX_THREADS", 3)
+threads threads_count, threads_count
+
+# Specifies the `port` that Puma will listen on to receive requests; default is 3000.
+port ENV.fetch("PORT", 3000)
 
-# Allow puma to be restarted by `rails restart` command.
+# Allow puma to be restarted by `bin/rails restart` command.
 plugin :tmp_restart
+
+# Only use a pidfile when requested
+pidfile ENV["PIDFILE"] if ENV["PIDFILE"]
index c7022e0b0b914707c549c458f347f89b8bc530a4..b54b0e9f85a8b316ea296f1a42fae66720548784 100644 (file)
@@ -288,7 +288,7 @@ module ActionController
       end
 
       # Successively yields all the paginator's pages to the given block.
-      def each(&_block)
+      def each(&)
         page_count.times do |n|
           yield self[n + 1]
         end
index 63c8090a83d735929ab1421fcafb0d935dc813aa..d2c3d5196ab9b5ccbcae32aaaed086e03650d7f5 100644 (file)
@@ -38,7 +38,7 @@ class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
     click_on "Logout", :match => :first
   end
 
-  def within_sidebar(&block)
-    within "#sidebar_content", &block
+  def within_sidebar(&)
+    within("#sidebar_content", &)
   end
 end
index 24d74c85f3b0ad5d1a06aaad93f8eaf6f4739e2d..524851e63fe74ee3879a15a3da22e431578f3cb7 100644 (file)
@@ -88,8 +88,4 @@ class ApplicationHelperTest < ActionView::TestCase
     date = friendly_date_ago(Time.now.utc - 4.months)
     assert_match %r{^<time title=".*">4 months ago</time>$}, date
   end
-
-  def test_body_class; end
-
-  def test_header_nav_link_class; end
 end
index 1b0933d32b0f9c760f704ba707e49362cdc7f5ff..f75fde75e197be59b835632b71781f3cc7ab93ff 100644 (file)
@@ -171,13 +171,13 @@ class UserCreationTest < ActionDispatch::IntegrationTest
   end
 
   # Check that the user can successfully recover their password
-  def test_lost_password_recovery_success
-    # Open the lost password form
-    # Submit the lost password form
-    # Check the e-mail
-    # Submit the reset password token
-    # Check that the password has changed, and the user can login
-  end
+  def test_lost_password_recovery_success
+  #   Open the lost password form
+  #   Submit the lost password form
+  #   Check the e-mail
+  #   Submit the reset password token
+  #   Check that the password has changed, and the user can login
+  end
 
   def test_user_create_redirect
     new_email = "redirect_tester@osm.org"
index 335063db9f171cea45714b8b5737c4d236fecfaa..679f711b307fbcaf156f1e35f366c719983d5e91 100644 (file)
@@ -28,27 +28,29 @@ class HistoryTest < ApplicationSystemTestCase
       create_visible_changeset(user, "next-changeset")
     end
 
-    visit "#{user_path(user)}/history"
-    changesets = find "div.changesets"
-    changesets.assert_text "bottom-changeset-in-batch-1"
-    changesets.assert_no_text "bottom-changeset-in-batch-2"
-    changesets.assert_no_text "first-changeset-in-history"
-    changesets.assert_selector "ol", :count => 1
-    changesets.assert_selector "li", :count => PAGE_SIZE
-
-    changesets.find(".changeset_more a.btn").click
-    changesets.assert_text "bottom-changeset-in-batch-1"
-    changesets.assert_text "bottom-changeset-in-batch-2"
-    changesets.assert_no_text "first-changeset-in-history"
-    changesets.assert_selector "ol", :count => 1
-    changesets.assert_selector "li", :count => 2 * PAGE_SIZE
-
-    changesets.find(".changeset_more a.btn").click
-    changesets.assert_text "bottom-changeset-in-batch-1"
-    changesets.assert_text "bottom-changeset-in-batch-2"
-    changesets.assert_text "first-changeset-in-history"
-    changesets.assert_selector "ol", :count => 1
-    changesets.assert_selector "li", :count => (2 * PAGE_SIZE) + 1
+    assert_nothing_raised do
+      visit "#{user_path(user)}/history"
+      changesets = find "div.changesets"
+      changesets.assert_text "bottom-changeset-in-batch-1"
+      changesets.assert_no_text "bottom-changeset-in-batch-2"
+      changesets.assert_no_text "first-changeset-in-history"
+      changesets.assert_selector "ol", :count => 1
+      changesets.assert_selector "li", :count => PAGE_SIZE
+
+      changesets.find(".changeset_more a.btn").click
+      changesets.assert_text "bottom-changeset-in-batch-1"
+      changesets.assert_text "bottom-changeset-in-batch-2"
+      changesets.assert_no_text "first-changeset-in-history"
+      changesets.assert_selector "ol", :count => 1
+      changesets.assert_selector "li", :count => 2 * PAGE_SIZE
+
+      changesets.find(".changeset_more a.btn").click
+      changesets.assert_text "bottom-changeset-in-batch-1"
+      changesets.assert_text "bottom-changeset-in-batch-2"
+      changesets.assert_text "first-changeset-in-history"
+      changesets.assert_selector "ol", :count => 1
+      changesets.assert_selector "li", :count => (2 * PAGE_SIZE) + 1
+    end
   end
 
   def create_visible_changeset(user, comment)
index 171028f4bbabbb376a356137fdb737ede028316d..79d5d0d33664e53769d575684ae9dc86e7445c3c 100644 (file)
@@ -340,10 +340,10 @@ module ActiveSupport
       Settings.merge!(saved_settings)
     end
 
-    def with_user_account_deletion_delay(value, &block)
+    def with_user_account_deletion_delay(value, &)
       freeze_time
 
-      with_settings(:user_account_deletion_delay => value, &block)
+      with_settings(:user_account_deletion_delay => value, &)
     ensure
       unfreeze_time
     end