From 534d4936936d9eea0ef8615d804ef52534770a89 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Jun 2025 09:27:09 +0000 Subject: [PATCH 01/33] Bump bullet from 8.0.7 to 8.0.8 Bumps [bullet](https://github.com/flyerhzm/bullet) from 8.0.7 to 8.0.8. - [Changelog](https://github.com/flyerhzm/bullet/blob/main/CHANGELOG.md) - [Commits](https://github.com/flyerhzm/bullet/compare/8.0.7...8.0.8) --- updated-dependencies: - dependency-name: bullet dependency-version: 8.0.8 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index a713c495d..c3bb0d3b2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -156,7 +156,7 @@ GEM actionpack (>= 6.1) activemodel (>= 6.1) builder (3.3.0) - bullet (8.0.7) + bullet (8.0.8) activesupport (>= 3.0.0) uniform_notifier (~> 1.11) byebug (12.0.0) From 5fc41ca50f127e4ba87badb846781386136f16a7 Mon Sep 17 00:00:00 2001 From: Daniel O'Connor Date: Sun, 10 Aug 2025 02:47:44 +0000 Subject: [PATCH 02/33] Opt into view transitions --- app/assets/stylesheets/application.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 1825ff9fb..d8d75004d 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -30,3 +30,7 @@ @import "predictions"; @import "homepage"; @import "maps"; + +@view-transition { + navigation: auto; +} \ No newline at end of file From 4bd322d8cacdde9f2deeddb811ceeb9d336ec107 Mon Sep 17 00:00:00 2001 From: Daniel O'Connor Date: Sun, 10 Aug 2025 02:55:34 +0000 Subject: [PATCH 03/33] Target a desktop --- spec/rails_helper.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index 3c17087a9..b85f2e627 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -22,6 +22,7 @@ Capybara.register_driver :selenium_chrome_customised_headless do |app| options = Selenium::WebDriver::Options.chrome options.add_argument("--headless") options.add_argument("--no-sandbox") + options.add_argument("--window-size=1920,1080") # driver = Selenium::WebDriver.for :chrome, options: options From ea530754aa913e746c6c60c0cc071d529b515d14 Mon Sep 17 00:00:00 2001 From: Daniel O'Connor Date: Sun, 10 Aug 2025 03:06:38 +0000 Subject: [PATCH 04/33] Disable dev shm usage on some environments --- spec/rails_helper.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index b85f2e627..779789d20 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -23,6 +23,7 @@ Capybara.register_driver :selenium_chrome_customised_headless do |app| options.add_argument("--headless") options.add_argument("--no-sandbox") options.add_argument("--window-size=1920,1080") + options.add_argument("--disable-dev-shm-usage") # driver = Selenium::WebDriver.for :chrome, options: options @@ -121,8 +122,8 @@ RSpec.configure do |config| # Prevent Poltergeist from fetching external URLs during feature tests config.before(:each, :js) do # TODO: Why are we setting this page size then straight afterwards, maximising? - width = 1280 - height = 1280 + width = 1920 + height = 1080 Capybara.current_session.driver.browser.manage.window.resize_to(width, height) if page.driver.browser.respond_to?(:url_blacklist) From d99d4a1bbe6109b5c0b586440fa676354b422b41 Mon Sep 17 00:00:00 2001 From: Daniel O'Connor Date: Sun, 10 Aug 2025 03:08:57 +0000 Subject: [PATCH 05/33] Disable dev shm usage on some environments --- spec/rails_helper.rb | 2 -- 1 file changed, 2 deletions(-) diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index 779789d20..9f1f1805d 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -15,8 +15,6 @@ require 'capybara-screenshot/rspec' require 'axe-capybara' require 'axe-rspec' -# TODO: We may want to trial options.add_argument('--disable-dev-shm-usage') ### optional - # Required for running in the dev container Capybara.register_driver :selenium_chrome_customised_headless do |app| options = Selenium::WebDriver::Options.chrome From 7e3be99aacce08feee9654004d8d2170db5e8ca1 Mon Sep 17 00:00:00 2001 From: Daniel O'Connor Date: Sun, 10 Aug 2025 03:12:58 +0000 Subject: [PATCH 06/33] Comment out and explain why --- spec/rails_helper.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index 9f1f1805d..bd64cd333 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -132,6 +132,9 @@ RSpec.configure do |config| ] end - page.driver.browser.manage.window.maximize if page.driver.browser.respond_to?(:manage) + # Historically, we wanted to .maximize; but this actually undoes the resize_to step above + # with chrome headless + # page.driver.browser.manage.window.maximize if page.driver.browser.respond_to?(:manage) + # puts "Maximized window size: #{page.driver.browser.manage.window.size}" end end From d20ceb54b5808ccb3246a6081da8213c2c4e94e6 Mon Sep 17 00:00:00 2001 From: Daniel O'Connor Date: Sun, 10 Aug 2025 03:19:24 +0000 Subject: [PATCH 07/33] Avoid double running plantings features --- .github/workflows/ci-features.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/ci-features.yml b/.github/workflows/ci-features.yml index 693c6521c..8bfffe9f2 100644 --- a/.github/workflows/ci-features.yml +++ b/.github/workflows/ci-features.yml @@ -110,9 +110,6 @@ jobs: - name: Run rspec (places/) run: bundle exec rspec spec/features/places/ -fd - - name: Run rspec (plantings/) - run: bundle exec rspec spec/features/plantings/ -fd - - name: Run rspec (posts/) run: bundle exec rspec spec/features/posts/ -fd From 8ecae23d61c3e9dadbb6c3c3d339bed9f93abcae Mon Sep 17 00:00:00 2001 From: Daniel O'Connor Date: Sun, 10 Aug 2025 03:20:57 +0000 Subject: [PATCH 08/33] Split up posts --- .github/workflows/ci-features-posts.yml | 102 ++++++++++++++++++++++++ .github/workflows/ci-features.yml | 3 - 2 files changed, 102 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/ci-features-posts.yml diff --git a/.github/workflows/ci-features-posts.yml b/.github/workflows/ci-features-posts.yml new file mode 100644 index 000000000..0779735fc --- /dev/null +++ b/.github/workflows/ci-features-posts.yml @@ -0,0 +1,102 @@ +name: CI Features - Admin + +on: [pull_request] + +jobs: + rspec: + runs-on: ubuntu-latest + services: + db: + image: postgres + env: + ## + # The Postgres service fails its docker health check unless you + # specify these environment variables + # + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + POSTGRES_DB: growstuff_test + ports: ['5432:5432'] + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + env: + APP_DOMAIN_NAME: localhost:3000 + APP_PROTOCOL: http + CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }} + DATABASE_URL: postgres://postgres:postgres@localhost:5432/growstuff_test + DEVISE_SECRET_KEY: secret + ELASTIC_SEARCH_VERSION: "7.5.1-amd64" + GROWSTUFF_EMAIL: "noreply@test.growstuff.org" + GROWSTUFF_FLICKR_KEY: secretkey" + GROWSTUFF_FLICKR_SECRET: secretsecret + GROWSTUFF_SITE_NAME: "Growstuff (travis)" + RAILS_ENV: test + RAILS_SECRET_TOKEN: supersecret + + steps: + - name: Checkout this repo + uses: actions/checkout@v4 + + - name: Configure sysctl limits + run: | + sudo swapoff -a + sudo sysctl -w vm.swappiness=1 + sudo sysctl -w fs.file-max=262144 + sudo sysctl -w vm.max_map_count=262144 + + - name: Start Elasticsearch + uses: elastic/elastic-github-actions/elasticsearch@master + with: + stack-version: 7.5.1 + + ## + # Cache Yarn modules + # + # See https://github.com/actions/cache/blob/master/examples.md#node---yarn for details + # + - name: Get yarn cache directory path + id: yarn-cache-dir-path + run: echo "::set-output name=dir::$(yarn cache dir)" + - name: Setup yarn cache + uses: actions/cache@v4 + id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-yarn- + + - name: Install required OS packages + run: | + sudo apt-get -y install libpq-dev google-chrome-stable + + - name: Install NodeJS + uses: actions/setup-node@v4 + with: + node-version: '12' + + - name: Install Ruby (version given by .ruby-version) and Bundler + uses: ruby/setup-ruby@v1 + with: + bundler-cache: true + + - name: Install required JS packages + run: yarn install + + - name: install chrome + run: sudo apt-get install google-chrome-stable + + - name: Prepare database for testing + run: bundle exec rails db:prepare + + - name: precompile assets + run: bundle exec rails assets:precompile + + - name: index into elastic search + run: bundle exec rails search:reindex + + - name: Run rspec (posts/) + run: bundle exec rspec spec/features/posts/ -fd diff --git a/.github/workflows/ci-features.yml b/.github/workflows/ci-features.yml index 8bfffe9f2..fe628e2b9 100644 --- a/.github/workflows/ci-features.yml +++ b/.github/workflows/ci-features.yml @@ -110,8 +110,5 @@ jobs: - name: Run rspec (places/) run: bundle exec rspec spec/features/places/ -fd - - name: Run rspec (posts/) - run: bundle exec rspec spec/features/posts/ -fd - - name: Run rspec (rss/) run: bundle exec rspec spec/features/rss/ -fd \ No newline at end of file From 59d95dfd777e1f640af4005a804ce75a0d769898 Mon Sep 17 00:00:00 2001 From: Daniel O'Connor Date: Sun, 10 Aug 2025 03:22:32 +0000 Subject: [PATCH 09/33] Split up --- .github/workflows/ci-features-places.yml | 102 +++++++++++++++++++++++ .github/workflows/ci-features.yml | 3 - 2 files changed, 102 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/ci-features-places.yml diff --git a/.github/workflows/ci-features-places.yml b/.github/workflows/ci-features-places.yml new file mode 100644 index 000000000..aa64a8bc6 --- /dev/null +++ b/.github/workflows/ci-features-places.yml @@ -0,0 +1,102 @@ +name: CI Features - Admin + +on: [pull_request] + +jobs: + rspec: + runs-on: ubuntu-latest + services: + db: + image: postgres + env: + ## + # The Postgres service fails its docker health check unless you + # specify these environment variables + # + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + POSTGRES_DB: growstuff_test + ports: ['5432:5432'] + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + env: + APP_DOMAIN_NAME: localhost:3000 + APP_PROTOCOL: http + CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }} + DATABASE_URL: postgres://postgres:postgres@localhost:5432/growstuff_test + DEVISE_SECRET_KEY: secret + ELASTIC_SEARCH_VERSION: "7.5.1-amd64" + GROWSTUFF_EMAIL: "noreply@test.growstuff.org" + GROWSTUFF_FLICKR_KEY: secretkey" + GROWSTUFF_FLICKR_SECRET: secretsecret + GROWSTUFF_SITE_NAME: "Growstuff (travis)" + RAILS_ENV: test + RAILS_SECRET_TOKEN: supersecret + + steps: + - name: Checkout this repo + uses: actions/checkout@v4 + + - name: Configure sysctl limits + run: | + sudo swapoff -a + sudo sysctl -w vm.swappiness=1 + sudo sysctl -w fs.file-max=262144 + sudo sysctl -w vm.max_map_count=262144 + + - name: Start Elasticsearch + uses: elastic/elastic-github-actions/elasticsearch@master + with: + stack-version: 7.5.1 + + ## + # Cache Yarn modules + # + # See https://github.com/actions/cache/blob/master/examples.md#node---yarn for details + # + - name: Get yarn cache directory path + id: yarn-cache-dir-path + run: echo "::set-output name=dir::$(yarn cache dir)" + - name: Setup yarn cache + uses: actions/cache@v4 + id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-yarn- + + - name: Install required OS packages + run: | + sudo apt-get -y install libpq-dev google-chrome-stable + + - name: Install NodeJS + uses: actions/setup-node@v4 + with: + node-version: '12' + + - name: Install Ruby (version given by .ruby-version) and Bundler + uses: ruby/setup-ruby@v1 + with: + bundler-cache: true + + - name: Install required JS packages + run: yarn install + + - name: install chrome + run: sudo apt-get install google-chrome-stable + + - name: Prepare database for testing + run: bundle exec rails db:prepare + + - name: precompile assets + run: bundle exec rails assets:precompile + + - name: index into elastic search + run: bundle exec rails search:reindex + + - name: Run rspec (places/) + run: bundle exec rspec spec/features/places/ -fd diff --git a/.github/workflows/ci-features.yml b/.github/workflows/ci-features.yml index fe628e2b9..6b94c7d60 100644 --- a/.github/workflows/ci-features.yml +++ b/.github/workflows/ci-features.yml @@ -107,8 +107,5 @@ jobs: - name: Run rspec (photos/) run: bundle exec rspec spec/features/photos/ -fd - - name: Run rspec (places/) - run: bundle exec rspec spec/features/places/ -fd - - name: Run rspec (rss/) run: bundle exec rspec spec/features/rss/ -fd \ No newline at end of file From ed7102330661f184be0bc9f40fb313483d0f301c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 10 Aug 2025 03:47:36 +0000 Subject: [PATCH 10/33] Bump rubocop from 1.79.1 to 1.79.2 Bumps [rubocop](https://github.com/rubocop/rubocop) from 1.79.1 to 1.79.2. - [Release notes](https://github.com/rubocop/rubocop/releases) - [Changelog](https://github.com/rubocop/rubocop/blob/master/CHANGELOG.md) - [Commits](https://github.com/rubocop/rubocop/compare/v1.79.1...v1.79.2) --- updated-dependencies: - dependency-name: rubocop dependency-version: 1.79.2 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 6ce46e85f..234508831 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -553,7 +553,7 @@ GEM recaptcha (5.19.0) redis-client (0.23.2) connection_pool - regexp_parser (2.11.0) + regexp_parser (2.11.1) reline (0.6.1) io-console (~> 0.5) responders (3.1.1) @@ -606,7 +606,7 @@ GEM rswag-ui (2.16.0) actionpack (>= 5.2, < 8.1) railties (>= 5.2, < 8.1) - rubocop (1.79.1) + rubocop (1.79.2) json (~> 2.3) language_server-protocol (~> 3.17.0.2) lint_roller (~> 1.1.0) From 75d93bb3c34b8550ec2f1ee44afc4a380fec4dcd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 10 Aug 2025 04:04:03 +0000 Subject: [PATCH 11/33] Bump rake from 13.2.1 to 13.3.0 Bumps [rake](https://github.com/ruby/rake) from 13.2.1 to 13.3.0. - [Release notes](https://github.com/ruby/rake/releases) - [Changelog](https://github.com/ruby/rake/blob/master/History.rdoc) - [Commits](https://github.com/ruby/rake/compare/v13.2.1...v13.3.0) --- updated-dependencies: - dependency-name: rake dependency-version: 13.3.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 6ce46e85f..be2d16922 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -542,7 +542,7 @@ GEM zeitwerk (~> 2.6) rainbow (3.1.1) raindrops (0.20.1) - rake (13.2.1) + rake (13.3.0) rate_throttle_client (0.1.2) rb-fsevent (0.11.2) rb-inotify (0.10.1) From 3eb2fe76376bdd48535357fca4aa49d579241f2c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 10 Aug 2025 04:16:17 +0000 Subject: [PATCH 12/33] Bump recaptcha from 5.19.0 to 5.20.1 Bumps [recaptcha](https://github.com/ambethia/recaptcha) from 5.19.0 to 5.20.1. - [Changelog](https://github.com/ambethia/recaptcha/blob/master/CHANGELOG.md) - [Commits](https://github.com/ambethia/recaptcha/compare/v5.19.0...v5.20.1) --- updated-dependencies: - dependency-name: recaptcha dependency-version: 5.20.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 234508831..421cb7b34 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -550,7 +550,7 @@ GEM rdoc (6.14.2) erb psych (>= 4.0.0) - recaptcha (5.19.0) + recaptcha (5.20.1) redis-client (0.23.2) connection_pool regexp_parser (2.11.1) From 6ae2de7e47fbad20467ff74d643f4090943ac991 Mon Sep 17 00:00:00 2001 From: Daniel O'Connor Date: Sun, 10 Aug 2025 14:57:39 +0930 Subject: [PATCH 13/33] Merge pull request #4086 from Growstuff/mailboxer-translations Mailboxer translations --- config/initializers/mailboxer.rb | 2 +- config/locales/mailboxer.en.yml | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 config/locales/mailboxer.en.yml diff --git a/config/initializers/mailboxer.rb b/config/initializers/mailboxer.rb index b43a61519..0c9bf8213 100644 --- a/config/initializers/mailboxer.rb +++ b/config/initializers/mailboxer.rb @@ -5,7 +5,7 @@ Mailboxer.setup do |config| config.uses_emails = true # Configures the default from for emails sent for Messages and Notifications - config.default_from = "no-reply@growstuff.org" + config.default_from = "Growstuff <#{ENV.fetch('GROWSTUFF_EMAIL', "no-reply@growstuff.org")}>" # Configures the methods needed by mailboxer # config.email_method = :email diff --git a/config/locales/mailboxer.en.yml b/config/locales/mailboxer.en.yml new file mode 100644 index 000000000..032a9a7c7 --- /dev/null +++ b/config/locales/mailboxer.en.yml @@ -0,0 +1,7 @@ +en: + mailboxer: + message_mailer: + subject_new: "New Notification: %{subject}" + subject_reply: "New Reply: %{subject}" + notification_mailer: + subject: "New notification: %{subject}" \ No newline at end of file From ed891633115bd822f7528e2843dfc83dfb72279d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 10 Aug 2025 05:43:20 +0000 Subject: [PATCH 14/33] Bump faker from 3.5.1 to 3.5.2 Bumps [faker](https://github.com/faker-ruby/faker) from 3.5.1 to 3.5.2. - [Release notes](https://github.com/faker-ruby/faker/releases) - [Changelog](https://github.com/faker-ruby/faker/blob/main/CHANGELOG.md) - [Commits](https://github.com/faker-ruby/faker/compare/v3.5.1...v3.5.2) --- updated-dependencies: - dependency-name: faker dependency-version: 3.5.2 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 421cb7b34..fc83e6c36 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -262,7 +262,7 @@ GEM factory_bot_rails (6.5.0) factory_bot (~> 6.5) railties (>= 6.1.0) - faker (3.5.1) + faker (3.5.2) i18n (>= 1.8.11, < 2) faraday (2.13.2) faraday-net_http (>= 2.0, < 3.5) From d383c8e2e4ffc89076af8d089c869d9fa15b456f Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sun, 10 Aug 2025 15:44:01 +0930 Subject: [PATCH 15/33] Add filtering for tradeable seeds (#4111) * feat: Add filtering for tradeable seeds This change introduces a new feature to filter seeds based on their tradeability. - Adds a link on the homepage to view all tradeable seeds. - Modifies the seeds controller to support filtering by `tradeable_to`, allowing multiple values to be selected. - Adds links to the seeds index page to filter by the various `tradeable_to` values. * Update index.html.haml --------- Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> Co-authored-by: Daniel O'Connor --- app/controllers/seeds_controller.rb | 4 ++++ app/views/home/index.html.haml | 3 ++- app/views/seeds/index.html.haml | 8 ++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/app/controllers/seeds_controller.rb b/app/controllers/seeds_controller.rb index 89ab9daff..2425554d5 100644 --- a/app/controllers/seeds_controller.rb +++ b/app/controllers/seeds_controller.rb @@ -19,6 +19,10 @@ class SeedsController < DataController where['parent_planting'] = @planting.id end + if params[:tradeable_to].present? + where['tradeable_to'] = params[:tradeable_to] + end + @show_all = (params[:all] == '1') where['finished'] = false unless @show_all diff --git a/app/views/home/index.html.haml b/app/views/home/index.html.haml index 929b40bd9..01a4d6b26 100644 --- a/app/views/home/index.html.haml +++ b/app/views/home/index.html.haml @@ -51,7 +51,8 @@ %section.seeds = cute_icon = render 'seeds' - %p.text-right= link_to "#{t('home.seeds.view_all')} »", seeds_path, class: 'btn btn-block' + %p.text-right + = link_to "#{t('home.seeds.view_all')} »", seeds_path(tradeable_to: ['locally', 'nationally', 'internationally']), class: 'btn btn-block' .col-12.col-lg-6 %section.discussion.text-center = cute_icon diff --git a/app/views/seeds/index.html.haml b/app/views/seeds/index.html.haml index e50747b46..a05f54362 100644 --- a/app/views/seeds/index.html.haml +++ b/app/views/seeds/index.html.haml @@ -17,6 +17,14 @@ = check_box_tag 'active', 'all', @show_all include finished %hr/ + %section.filters + %h2 Tradeable + %ul.nav.flex-column + %li.nav-item= link_to "All tradable seeds", seeds_path(tradeable_to: ['locally', 'nationally', 'internationally']) + - Seed::TRADABLE_TO_VALUES.each do |value| + - unless value == 'nowhere' + %li.nav-item= link_to value.capitalize, seeds_path(tradeable_to: value) + %hr/ - if @owner = render @owner - if @crop From d264905aa9257632ce97669e76acc3b37ff3b225 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 10 Aug 2025 15:54:37 +0930 Subject: [PATCH 16/33] Bump faraday from 2.13.2 to 2.13.4 (#4101) Bumps [faraday](https://github.com/lostisland/faraday) from 2.13.2 to 2.13.4. - [Release notes](https://github.com/lostisland/faraday/releases) - [Changelog](https://github.com/lostisland/faraday/blob/main/CHANGELOG.md) - [Commits](https://github.com/lostisland/faraday/compare/v2.13.2...v2.13.4) --- updated-dependencies: - dependency-name: faraday dependency-version: 2.13.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 421cb7b34..e3da7aa99 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -264,7 +264,7 @@ GEM railties (>= 6.1.0) faker (3.5.1) i18n (>= 1.8.11, < 2) - faraday (2.13.2) + faraday (2.13.4) faraday-net_http (>= 2.0, < 3.5) json logger From 0b4820e5df97400d2bf0bdc23fbd4cf58052a70d Mon Sep 17 00:00:00 2001 From: Daniel O'Connor Date: Sun, 10 Aug 2025 15:55:52 +0930 Subject: [PATCH 17/33] Add rspec-retry (#4129) * Add rspec-retry * Add config * Swap to rspec-rebound, which is a fork * Swap to rspec-rebound, which is a fork --- Gemfile | 4 +++- Gemfile.lock | 3 +++ spec/spec_helper.rb | 17 +++++++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 06d4cc318..28de94c3b 100644 --- a/Gemfile +++ b/Gemfile @@ -193,10 +193,12 @@ group :test do gem 'selenium-webdriver' gem 'timecop' gem 'vcr' + gem "rspec-rebound" + gem "percy-capybara", "~> 5.0.0" end group :travis do gem 'platform-api' end -gem "percy-capybara", "~> 5.0.0" + diff --git a/Gemfile.lock b/Gemfile.lock index e3da7aa99..60440ffea 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -590,6 +590,8 @@ GEM rspec-expectations (~> 3.13) rspec-mocks (~> 3.13) rspec-support (~> 3.13) + rspec-rebound (0.2.1) + rspec-core (~> 3.3) rspec-support (3.13.4) rspectre (0.2.0) parser (>= 3.3.7.1) @@ -825,6 +827,7 @@ DEPENDENCIES responders rspec-activemodel-mocks rspec-rails + rspec-rebound rspectre rswag-api rswag-specs diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 40c0db74a..0bd6f9a1c 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -17,6 +17,7 @@ # # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration require 'percy/capybara' +require 'rspec/rebound' require 'vcr' VCR.configure do |c| @@ -123,4 +124,20 @@ RSpec.configure do |config| # Remember which tests failed, so you can run rspec with the `--only-failures` flag. config.example_status_persistence_file_path = "tmp/examples.txt" + + # show retry status in spec process + config.verbose_retry = true + # show exception that triggers a retry if verbose_retry is set to true + config.display_try_failure_messages = true + + # run retry only on features + config.around :each, :js do |ex| + ex.run_with_retry retry: 3 + end + + # callback to be run between retries + config.retry_callback = proc do |ex| + # run some additional clean up task - can be filtered by example metadata + Capybara.reset! if ex.metadata[:js] + end end From e4de08f47fcad892c8f632353c31d303b3b412fc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 10 Aug 2025 06:29:48 +0000 Subject: [PATCH 18/33] Bump rspec-activemodel-mocks from 1.2.1 to 1.3.0 Bumps [rspec-activemodel-mocks](https://github.com/rspec/rspec-activemodel-mocks) from 1.2.1 to 1.3.0. - [Changelog](https://github.com/rspec/rspec-activemodel-mocks/blob/main/CHANGELOG.md) - [Commits](https://github.com/rspec/rspec-activemodel-mocks/compare/v1.2.1...v1.3.0) --- updated-dependencies: - dependency-name: rspec-activemodel-mocks dependency-version: 1.3.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 60440ffea..afa1a7d77 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -570,7 +570,7 @@ GEM rspec-core (~> 3.13.0) rspec-expectations (~> 3.13.0) rspec-mocks (~> 3.13.0) - rspec-activemodel-mocks (1.2.1) + rspec-activemodel-mocks (1.3.0) activemodel (>= 3.0) activesupport (>= 3.0) rspec-mocks (>= 2.99, < 4.0) From 9eda4bb2f20ef0523d18e087cb210bcccc2ef66a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 10 Aug 2025 06:44:35 +0000 Subject: [PATCH 19/33] Bump puma from 6.6.0 to 6.6.1 Bumps [puma](https://github.com/puma/puma) from 6.6.0 to 6.6.1. - [Release notes](https://github.com/puma/puma/releases) - [Changelog](https://github.com/puma/puma/blob/master/History.md) - [Commits](https://github.com/puma/puma/compare/v6.6.0...v6.6.1) --- updated-dependencies: - dependency-name: puma dependency-version: 6.6.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index afa1a7d77..47a453b1a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -482,7 +482,7 @@ GEM date stringio public_suffix (6.0.1) - puma (6.6.0) + puma (6.6.1) nio4r (~> 2.0) query_diet (0.7.2) racc (1.8.1) From 1c47e421b960791251213af2f1d890867a819646 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 10 Aug 2025 07:19:44 +0000 Subject: [PATCH 20/33] Bump scout_apm from 5.6.4 to 5.7.0 Bumps [scout_apm](https://github.com/scoutapp/scout_apm_ruby) from 5.6.4 to 5.7.0. - [Changelog](https://github.com/scoutapp/scout_apm_ruby/blob/master/CHANGELOG.markdown) - [Commits](https://github.com/scoutapp/scout_apm_ruby/compare/v5.6.4...v5.7.0) --- updated-dependencies: - dependency-name: scout_apm dependency-version: 5.7.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 094ab9bcf..80510a03d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -662,7 +662,7 @@ GEM sprockets (> 3.0) sprockets-rails tilt - scout_apm (5.6.4) + scout_apm (5.7.0) parser searchkick (5.3.1) activemodel (>= 6.1) From 9efb1f848694e2da993babec8c468cfabe511bcc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Aug 2025 15:37:57 +0000 Subject: [PATCH 21/33] Bump actions/checkout from 4 to 5 Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/ci-features-admin.yml | 2 +- .github/workflows/ci-features-comments.yml | 2 +- .github/workflows/ci-features-conversations.yml | 2 +- .github/workflows/ci-features-crops.yml | 2 +- .github/workflows/ci-features-gardens.yml | 2 +- .github/workflows/ci-features-harvests.yml | 2 +- .github/workflows/ci-features-home.yml | 2 +- .github/workflows/ci-features-members.yml | 2 +- .github/workflows/ci-features-places.yml | 2 +- .github/workflows/ci-features-plantings.yml | 2 +- .github/workflows/ci-features-posts.yml | 2 +- .github/workflows/ci-features-seeds.yml | 2 +- .github/workflows/ci-features-timeline.yml | 2 +- .github/workflows/ci-features.yml | 2 +- .github/workflows/ci.yml | 4 ++-- 15 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.github/workflows/ci-features-admin.yml b/.github/workflows/ci-features-admin.yml index b3315a5f6..870e6942c 100644 --- a/.github/workflows/ci-features-admin.yml +++ b/.github/workflows/ci-features-admin.yml @@ -38,7 +38,7 @@ jobs: steps: - name: Checkout this repo - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Configure sysctl limits run: | diff --git a/.github/workflows/ci-features-comments.yml b/.github/workflows/ci-features-comments.yml index ec5486d2e..aa14b2078 100644 --- a/.github/workflows/ci-features-comments.yml +++ b/.github/workflows/ci-features-comments.yml @@ -38,7 +38,7 @@ jobs: steps: - name: Checkout this repo - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Configure sysctl limits run: | diff --git a/.github/workflows/ci-features-conversations.yml b/.github/workflows/ci-features-conversations.yml index 7ce8cd1d6..1548c4ebb 100644 --- a/.github/workflows/ci-features-conversations.yml +++ b/.github/workflows/ci-features-conversations.yml @@ -38,7 +38,7 @@ jobs: steps: - name: Checkout this repo - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Configure sysctl limits run: | diff --git a/.github/workflows/ci-features-crops.yml b/.github/workflows/ci-features-crops.yml index 752df28a2..182cbe9b6 100644 --- a/.github/workflows/ci-features-crops.yml +++ b/.github/workflows/ci-features-crops.yml @@ -38,7 +38,7 @@ jobs: steps: - name: Checkout this repo - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Configure sysctl limits run: | diff --git a/.github/workflows/ci-features-gardens.yml b/.github/workflows/ci-features-gardens.yml index 05a7c8265..cc96d742e 100644 --- a/.github/workflows/ci-features-gardens.yml +++ b/.github/workflows/ci-features-gardens.yml @@ -38,7 +38,7 @@ jobs: steps: - name: Checkout this repo - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Configure sysctl limits run: | diff --git a/.github/workflows/ci-features-harvests.yml b/.github/workflows/ci-features-harvests.yml index 6435017e1..c3047c533 100644 --- a/.github/workflows/ci-features-harvests.yml +++ b/.github/workflows/ci-features-harvests.yml @@ -38,7 +38,7 @@ jobs: steps: - name: Checkout this repo - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Configure sysctl limits run: | diff --git a/.github/workflows/ci-features-home.yml b/.github/workflows/ci-features-home.yml index 586d1b993..43c72a922 100644 --- a/.github/workflows/ci-features-home.yml +++ b/.github/workflows/ci-features-home.yml @@ -38,7 +38,7 @@ jobs: steps: - name: Checkout this repo - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Configure sysctl limits run: | diff --git a/.github/workflows/ci-features-members.yml b/.github/workflows/ci-features-members.yml index 17281f688..c542c93e9 100644 --- a/.github/workflows/ci-features-members.yml +++ b/.github/workflows/ci-features-members.yml @@ -38,7 +38,7 @@ jobs: steps: - name: Checkout this repo - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Configure sysctl limits run: | diff --git a/.github/workflows/ci-features-places.yml b/.github/workflows/ci-features-places.yml index aa64a8bc6..6a4cd4256 100644 --- a/.github/workflows/ci-features-places.yml +++ b/.github/workflows/ci-features-places.yml @@ -38,7 +38,7 @@ jobs: steps: - name: Checkout this repo - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Configure sysctl limits run: | diff --git a/.github/workflows/ci-features-plantings.yml b/.github/workflows/ci-features-plantings.yml index 72f7e2b62..6a7e50146 100644 --- a/.github/workflows/ci-features-plantings.yml +++ b/.github/workflows/ci-features-plantings.yml @@ -38,7 +38,7 @@ jobs: steps: - name: Checkout this repo - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Configure sysctl limits run: | diff --git a/.github/workflows/ci-features-posts.yml b/.github/workflows/ci-features-posts.yml index 0779735fc..1353c891f 100644 --- a/.github/workflows/ci-features-posts.yml +++ b/.github/workflows/ci-features-posts.yml @@ -38,7 +38,7 @@ jobs: steps: - name: Checkout this repo - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Configure sysctl limits run: | diff --git a/.github/workflows/ci-features-seeds.yml b/.github/workflows/ci-features-seeds.yml index 85dc5d4be..41bbecbf2 100644 --- a/.github/workflows/ci-features-seeds.yml +++ b/.github/workflows/ci-features-seeds.yml @@ -38,7 +38,7 @@ jobs: steps: - name: Checkout this repo - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Configure sysctl limits run: | diff --git a/.github/workflows/ci-features-timeline.yml b/.github/workflows/ci-features-timeline.yml index fe390d7de..3560dbd81 100644 --- a/.github/workflows/ci-features-timeline.yml +++ b/.github/workflows/ci-features-timeline.yml @@ -38,7 +38,7 @@ jobs: steps: - name: Checkout this repo - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Configure sysctl limits run: | diff --git a/.github/workflows/ci-features.yml b/.github/workflows/ci-features.yml index 6b94c7d60..4f0e1ad2f 100644 --- a/.github/workflows/ci-features.yml +++ b/.github/workflows/ci-features.yml @@ -38,7 +38,7 @@ jobs: steps: - name: Checkout this repo - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Configure sysctl limits run: | diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b1f9659fc..eaed8103e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,7 +6,7 @@ jobs: contributors: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Install ruby version specified in .ruby-version uses: ruby/setup-ruby@v1 with: @@ -53,7 +53,7 @@ jobs: steps: - name: Checkout this repo - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Configure sysctl limits run: | From 496a6ac2b6457551fbcca66884f28fa3aed6a61d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Aug 2025 07:17:23 +0000 Subject: [PATCH 22/33] Bump rspec-rails from 8.0.1 to 8.0.2 Bumps [rspec-rails](https://github.com/rspec/rspec-rails) from 8.0.1 to 8.0.2. - [Changelog](https://github.com/rspec/rspec-rails/blob/main/Changelog.md) - [Commits](https://github.com/rspec/rspec-rails/compare/v8.0.1...v8.0.2) --- updated-dependencies: - dependency-name: rspec-rails dependency-version: 8.0.2 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 38f9360f0..3f4b12c78 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -251,7 +251,7 @@ GEM elasticsearch-transport (7.0.0) faraday multi_json - erb (5.0.1) + erb (5.0.2) erubi (1.13.1) erubis (2.7.0) excon (1.2.5) @@ -351,7 +351,7 @@ GEM image_processing (1.12.2) mini_magick (>= 4.9.5, < 5) ruby-vips (>= 2.0.17, < 3) - io-console (0.8.0) + io-console (0.8.1) irb (1.15.2) pp (>= 0.6.0) rdoc (>= 4.0.0) @@ -554,7 +554,7 @@ GEM redis-client (0.23.2) connection_pool regexp_parser (2.11.1) - reline (0.6.1) + reline (0.6.2) io-console (~> 0.5) responders (3.1.1) actionpack (>= 5.2) @@ -582,7 +582,7 @@ GEM rspec-mocks (3.13.5) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.13.0) - rspec-rails (8.0.1) + rspec-rails (8.0.2) actionpack (>= 7.2) activesupport (>= 7.2) railties (>= 7.2) From 005efab3be86cfec5a28cd93775561351c3eebc0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Aug 2025 07:08:38 +0000 Subject: [PATCH 23/33] Bump rails from 7.2.2.1 to 7.2.2.2 Bumps [rails](https://github.com/rails/rails) from 7.2.2.1 to 7.2.2.2. - [Release notes](https://github.com/rails/rails/releases) - [Commits](https://github.com/rails/rails/compare/v7.2.2.1...v7.2.2.2) --- updated-dependencies: - dependency-name: rails dependency-version: 7.2.2.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 113 ++++++++++++++++++++++++++------------------------- 1 file changed, 57 insertions(+), 56 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 3f4b12c78..f934cbd58 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -33,29 +33,29 @@ GEM GEM remote: https://rubygems.org/ specs: - actioncable (7.2.2.1) - actionpack (= 7.2.2.1) - activesupport (= 7.2.2.1) + actioncable (7.2.2.2) + actionpack (= 7.2.2.2) + activesupport (= 7.2.2.2) nio4r (~> 2.0) websocket-driver (>= 0.6.1) zeitwerk (~> 2.6) - actionmailbox (7.2.2.1) - actionpack (= 7.2.2.1) - activejob (= 7.2.2.1) - activerecord (= 7.2.2.1) - activestorage (= 7.2.2.1) - activesupport (= 7.2.2.1) + actionmailbox (7.2.2.2) + actionpack (= 7.2.2.2) + activejob (= 7.2.2.2) + activerecord (= 7.2.2.2) + activestorage (= 7.2.2.2) + activesupport (= 7.2.2.2) mail (>= 2.8.0) - actionmailer (7.2.2.1) - actionpack (= 7.2.2.1) - actionview (= 7.2.2.1) - activejob (= 7.2.2.1) - activesupport (= 7.2.2.1) + actionmailer (7.2.2.2) + actionpack (= 7.2.2.2) + actionview (= 7.2.2.2) + activejob (= 7.2.2.2) + activesupport (= 7.2.2.2) mail (>= 2.8.0) rails-dom-testing (~> 2.2) - actionpack (7.2.2.1) - actionview (= 7.2.2.1) - activesupport (= 7.2.2.1) + actionpack (7.2.2.2) + actionview (= 7.2.2.2) + activesupport (= 7.2.2.2) nokogiri (>= 1.8.5) racc rack (>= 2.2.4, < 3.2) @@ -64,15 +64,15 @@ GEM rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) useragent (~> 0.16) - actiontext (7.2.2.1) - actionpack (= 7.2.2.1) - activerecord (= 7.2.2.1) - activestorage (= 7.2.2.1) - activesupport (= 7.2.2.1) + actiontext (7.2.2.2) + actionpack (= 7.2.2.2) + activerecord (= 7.2.2.2) + activestorage (= 7.2.2.2) + activesupport (= 7.2.2.2) globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (7.2.2.1) - activesupport (= 7.2.2.1) + actionview (7.2.2.2) + activesupport (= 7.2.2.2) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) @@ -87,22 +87,22 @@ GEM active_utils (3.5.0) activesupport (>= 4.2) i18n - activejob (7.2.2.1) - activesupport (= 7.2.2.1) + activejob (7.2.2.2) + activesupport (= 7.2.2.2) globalid (>= 0.3.6) - activemodel (7.2.2.1) - activesupport (= 7.2.2.1) - activerecord (7.2.2.1) - activemodel (= 7.2.2.1) - activesupport (= 7.2.2.1) + activemodel (7.2.2.2) + activesupport (= 7.2.2.2) + activerecord (7.2.2.2) + activemodel (= 7.2.2.2) + activesupport (= 7.2.2.2) timeout (>= 0.4.0) - activestorage (7.2.2.1) - actionpack (= 7.2.2.1) - activejob (= 7.2.2.1) - activerecord (= 7.2.2.1) - activesupport (= 7.2.2.1) + activestorage (7.2.2.2) + actionpack (= 7.2.2.2) + activejob (= 7.2.2.2) + activerecord (= 7.2.2.2) + activesupport (= 7.2.2.2) marcel (~> 1.0) - activesupport (7.2.2.1) + activesupport (7.2.2.2) base64 benchmark (>= 0.3) bigdecimal @@ -423,14 +423,14 @@ GEM bigdecimal (~> 3.1) net-http (0.6.0) uri - net-imap (0.4.20) + net-imap (0.5.9) date net-protocol net-pop (0.1.2) net-protocol net-protocol (0.2.2) timeout - net-smtp (0.5.0) + net-smtp (0.5.1) net-protocol netrc (0.11.0) nio4r (2.7.4) @@ -499,20 +499,20 @@ GEM rackup (1.0.1) rack (< 3) webrick - rails (7.2.2.1) - actioncable (= 7.2.2.1) - actionmailbox (= 7.2.2.1) - actionmailer (= 7.2.2.1) - actionpack (= 7.2.2.1) - actiontext (= 7.2.2.1) - actionview (= 7.2.2.1) - activejob (= 7.2.2.1) - activemodel (= 7.2.2.1) - activerecord (= 7.2.2.1) - activestorage (= 7.2.2.1) - activesupport (= 7.2.2.1) + rails (7.2.2.2) + actioncable (= 7.2.2.2) + actionmailbox (= 7.2.2.2) + actionmailer (= 7.2.2.2) + actionpack (= 7.2.2.2) + actiontext (= 7.2.2.2) + actionview (= 7.2.2.2) + activejob (= 7.2.2.2) + activemodel (= 7.2.2.2) + activerecord (= 7.2.2.2) + activestorage (= 7.2.2.2) + activesupport (= 7.2.2.2) bundler (>= 1.15.0) - railties (= 7.2.2.1) + railties (= 7.2.2.2) rails-controller-testing (1.0.5) actionpack (>= 5.0.1.rc1) actionview (>= 5.0.1.rc1) @@ -532,9 +532,9 @@ GEM rails_stdout_logging rails_serve_static_assets (0.0.5) rails_stdout_logging (0.0.5) - railties (7.2.2.1) - actionpack (= 7.2.2.1) - activesupport (= 7.2.2.1) + railties (7.2.2.2) + actionpack (= 7.2.2.2) + activesupport (= 7.2.2.2) irb (~> 1.13) rackup (>= 1.0.0) rake (>= 12.2) @@ -730,7 +730,8 @@ GEM rack-test (>= 0.5.3) webrick (1.9.1) websocket (1.2.11) - websocket-driver (0.7.6) + websocket-driver (0.8.0) + base64 websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) will_paginate (4.0.1) From 2f7ce2721f0b03a5fa14c8d9105d430709ee74d9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Aug 2025 13:53:23 +0000 Subject: [PATCH 24/33] Bump rubocop-rails from 2.32.0 to 2.33.3 Bumps [rubocop-rails](https://github.com/rubocop/rubocop-rails) from 2.32.0 to 2.33.3. - [Release notes](https://github.com/rubocop/rubocop-rails/releases) - [Changelog](https://github.com/rubocop/rubocop-rails/blob/master/CHANGELOG.md) - [Commits](https://github.com/rubocop/rubocop-rails/compare/v2.32.0...v2.33.3) --- updated-dependencies: - dependency-name: rubocop-rails dependency-version: 2.33.3 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index f934cbd58..c76fe562f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -553,7 +553,7 @@ GEM recaptcha (5.20.1) redis-client (0.23.2) connection_pool - regexp_parser (2.11.1) + regexp_parser (2.11.2) reline (0.6.2) io-console (~> 0.5) responders (3.1.1) @@ -628,7 +628,7 @@ GEM rubocop-factory_bot (2.27.1) lint_roller (~> 1.1) rubocop (~> 1.72, >= 1.72.1) - rubocop-rails (2.32.0) + rubocop-rails (2.33.3) activesupport (>= 4.2.0) lint_roller (~> 1.1) rack (>= 1.1) From 810a9e39e32a90f38f459c8511b6a699cf40aa45 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Aug 2025 14:09:03 +0000 Subject: [PATCH 25/33] Bump selenium-webdriver from 4.34.0 to 4.35.0 Bumps [selenium-webdriver](https://github.com/SeleniumHQ/selenium) from 4.34.0 to 4.35.0. - [Release notes](https://github.com/SeleniumHQ/selenium/releases) - [Changelog](https://github.com/SeleniumHQ/selenium/blob/trunk/rb/CHANGES) - [Commits](https://github.com/SeleniumHQ/selenium/compare/selenium-4.34.0...selenium-4.35.0) --- updated-dependencies: - dependency-name: selenium-webdriver dependency-version: 4.35.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index c76fe562f..a0bd14c00 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -648,7 +648,7 @@ GEM ruby-units (4.1.0) ruby-vips (2.2.1) ffi (~> 1.12) - rubyzip (2.4.1) + rubyzip (3.0.1) sass (3.7.4) sass-listen (~> 4.0.0) sass-listen (4.0.0) @@ -668,11 +668,11 @@ GEM activemodel (>= 6.1) hashie securerandom (0.4.1) - selenium-webdriver (4.34.0) + selenium-webdriver (4.35.0) base64 (~> 0.2) logger (~> 1.4) rexml (~> 3.2, >= 3.2.5) - rubyzip (>= 1.2.2, < 3.0) + rubyzip (>= 1.2.2, < 4.0) websocket (~> 1.0) sidekiq (7.3.9) base64 From b72aeab13648dc1c8c17071f6fa2b8be1c615940 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sun, 24 Aug 2025 06:21:19 +0000 Subject: [PATCH 26/33] Amend delete_pictures rake task to remove legacy S3 photos The `delete_pictures` rake task in `openfarm.rake` is amended to also remove Photos where the `fullsize_url` starts with `https://s3.amazonaws.com/openfarm-project/`. This change helps in cleaning up legacy photos that are no longer needed. The task description has also been updated to reflect this change. --- lib/tasks/openfarm.rake | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/tasks/openfarm.rake b/lib/tasks/openfarm.rake index f49857d4d..b61b7f992 100644 --- a/lib/tasks/openfarm.rake +++ b/lib/tasks/openfarm.rake @@ -9,10 +9,12 @@ namespace :openfarm do OpenfarmService.new.import! end - desc "Delete all pictures with source OpenFarm" + desc "Delete all pictures with source OpenFarm or from legacy S3 URL" task delete_pictures: :environment do - puts "Deleting pictures with source OpenFarm..." + puts "Deleting pictures with source OpenFarm or from legacy S3 URL..." + s3_legacy_url = 'https://s3.amazonaws.com/openfarm-project/%' photos_to_delete = Photo.where(source: 'openfarm') + .or(Photo.where('fullsize_url LIKE ?', s3_legacy_url)) count = photos_to_delete.count photos_to_delete.each do |photo| photo.associations.each do |photo_association| From 112a626941d45931c29cff0fa0f27e9209b7b634 Mon Sep 17 00:00:00 2001 From: Daniel O'Connor Date: Sun, 24 Aug 2025 06:48:40 +0000 Subject: [PATCH 27/33] Adjust Bio layout --- app/views/members/_bio.html.haml | 12 ------------ app/views/members/show.html.haml | 27 +++++++++++++++++++++++---- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/app/views/members/_bio.html.haml b/app/views/members/_bio.html.haml index 221f6d141..6bb67eed0 100644 --- a/app/views/members/_bio.html.haml +++ b/app/views/members/_bio.html.haml @@ -1,13 +1 @@ %h2 All about #{member.login_name} -%p - %small - %a{href: "#content"} - Skip to main content -- if member.bio.blank? - - if can? :edit, member - = link_to "Add a bio to complete your profile.", edit_member_registration_path - - else - #{member.login_name} hasn't written a bio yet. -- else - :markdown - #{ strip_tags markdownify(member.bio) } diff --git a/app/views/members/show.html.haml b/app/views/members/show.html.haml index e8f06f111..c231a8cc8 100644 --- a/app/views/members/show.html.haml +++ b/app/views/members/show.html.haml @@ -21,6 +21,21 @@ .row .col= render "bio", member: @member .col= render "avatar", member: @member + .row + .col + %p + %small + %a{href: "#content"} + Skip to main content + - if @member.bio.blank? + - if can? :edit, @member + = link_to "Add a bio to complete your profile.", edit_member_registration_path + - else + #{@member.login_name} hasn't written a bio yet. + - else + :markdown + #{ strip_tags markdownify(@member.bio) } + - if @member.roles.any? %p - @member.roles.each do |role| @@ -30,12 +45,16 @@ = icon 'fas', 'map-marker' = truncate(@member.location, length: 15, separator: ' ', omission: '... ') %p - %strong Member since - = @member.created_at.to_fs(:date) + %small + %strong Member since + %br + = @member.created_at.to_fs(:date) - if @member.last_sign_in_at %p - %strong Last Login - = @member.last_sign_in_at&.to_fs(:default) + %small + %strong Last Login + %br + = @member.last_sign_in_at&.to_fs(:default) - if can? :update, @member = link_to edit_member_registration_path, class: 'btn btn-block' do From b7f4de782dce41827ba9eed5ffbd6cdce133a9fd Mon Sep 17 00:00:00 2001 From: Daniel O'Connor Date: Sun, 24 Aug 2025 06:50:53 +0000 Subject: [PATCH 28/33] Styling --- app/assets/stylesheets/_members.scss | 7 ------- app/views/members/_map.html.haml | 4 ++-- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/app/assets/stylesheets/_members.scss b/app/assets/stylesheets/_members.scss index 79692355e..2af24fe7e 100644 --- a/app/assets/stylesheets/_members.scss +++ b/app/assets/stylesheets/_members.scss @@ -33,13 +33,6 @@ } } -.location-not-set { - background-image: image-url("location-not-set.en.png"); - background-position: center; - background-repeat: no-repeat; - height: 250px; - width: 100%; -} .card { .badge-location { background-color: darken($blue, 10%); diff --git a/app/views/members/_map.html.haml b/app/views/members/_map.html.haml index 6a2060043..b130a5c20 100644 --- a/app/views/members/_map.html.haml +++ b/app/views/members/_map.html.haml @@ -5,5 +5,5 @@ = link_to member.location, place_path(member.location, anchor: "members") - else .location-not-set - .sr-only Location not known - .sr-only We can't show you what's nearby + %h1 Location not known or geocodable + %p We can't show you what's nearby From 76a6c1d849f78eeb838d0f9b3e3dd5ccb3986b53 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sun, 24 Aug 2025 16:21:05 +0930 Subject: [PATCH 29/33] Merge pull request #4131 from Growstuff/feature/add-social-media-links feat: Add social media links to user profiles --- app/controllers/application_controller.rb | 1 + app/models/member.rb | 3 ++ .../registrations/_edit_profile.html.haml | 27 ++++++++++++++- app/views/members/_contact.html.haml | 33 ++++++++++++++++--- ...40716120000_add_social_media_to_members.rb | 9 +++++ ...me_other_handle_to_other_url_in_members.rb | 5 +++ db/schema.rb | 5 +++ 7 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 db/migrate/20240716120000_add_social_media_to_members.rb create mode 100644 db/migrate/20240716120001_rename_other_handle_to_other_url_in_members.rb diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 7db3be745..7c7e58d6f 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -78,6 +78,7 @@ class ApplicationController < ActionController::Base :tos_agreement, # profile stuff :bio, :location, :latitude, :longitude, + :website_url, :instagram_handle, :facebook_handle, :bluesky_handle, :other_url, # email settings :show_email, :newsletter, :send_notification_email, :send_planting_reminder, # update password diff --git a/app/models/member.rb b/app/models/member.rb index 1c63a9a17..2427092f6 100644 --- a/app/models/member.rb +++ b/app/models/member.rb @@ -91,6 +91,9 @@ class Member < ApplicationRecord uniqueness: { case_sensitive: false } + validates :website_url, format: { with: /\Ahttps?:\/\//, message: "must start with http:// or https://" }, allow_blank: true + validates :other_url, format: { with: /\Ahttps?:\/\//, message: "must start with http:// or https://" }, allow_blank: true + validates :instagram_handle, :facebook_handle, :bluesky_handle, format: { without: %r{\Ahttps?:\/\/|\/}, message: "should be a handle, not a URL" }, allow_blank: true # # Triggers diff --git a/app/views/devise/registrations/_edit_profile.html.haml b/app/views/devise/registrations/_edit_profile.html.haml index 869bf60be..6feb02d13 100644 --- a/app/views/devise/registrations/_edit_profile.html.haml +++ b/app/views/devise/registrations/_edit_profile.html.haml @@ -13,7 +13,32 @@ .form-group = f.label :bio, class: 'control-label col-md-2' .col-md-8 - = f.text_area :bio, rows: 6, class: 'form-control' + = f.text_area :bio, rows: 6, class: 'form-control', placeholder: "I'm am XYZ gardener interested in A, B, C" + + .form-group + = f.label :website_url, 'Website', class: 'control-label col-md-2' + .col-md-8 + = f.url_field :website_url, class: 'form-control', placeholder: "https://you.example.com/" + + .form-group + = f.label :instagram_handle, 'Instagram', class: 'control-label col-md-2' + .col-md-8 + = f.text_field :instagram_handle, class: 'form-control', placeholder: 'your_handle' + + .form-group + = f.label :facebook_handle, 'Facebook', class: 'control-label col-md-2' + .col-md-8 + = f.text_field :facebook_handle, class: 'form-control', placeholder: 'your_handle' + + .form-group + = f.label :bluesky_handle, 'Bluesky', class: 'control-label col-md-2' + .col-md-8 + = f.text_field :bluesky_handle, class: 'form-control', placeholder: 'your_handle' + + .form-group + = f.label :other_url, 'Other URL', class: 'control-label col-md-2' + .col-md-8 + = f.url_field :other_url, class: 'form-control', placeholder: "https://you.example.com/" .form-group %label.control-label.col-md-2 diff --git a/app/views/members/_contact.html.haml b/app/views/members/_contact.html.haml index d6bdb7cb9..ce07b2246 100644 --- a/app/views/members/_contact.html.haml +++ b/app/views/members/_contact.html.haml @@ -1,17 +1,42 @@ -- if twitter_auth || flickr_auth || member.show_email +- if member.website_url.present? || member.instagram_handle.present? || member.facebook_handle.present? || member.bluesky_handle.present? || member.other_url.present? || twitter_auth || flickr_auth || member.show_email %h4 Contact + - if member.website_url.present? + %p + = icon 'fas', 'globe', class: 'fa-fw' + = link_to "Website", member.website_url, target: '_blank', rel: 'noopener noreferrer' + + - if member.instagram_handle.present? + %p + = icon 'fab', 'instagram', class: 'fa-fw' + = link_to member.instagram_handle, "https://instagram.com/#{member.instagram_handle}", target: '_blank', rel: 'noopener noreferrer' + + - if member.facebook_handle.present? + %p + = icon 'fab', 'facebook', class: 'fa-fw' + = link_to member.facebook_handle, "https://facebook.com/#{member.facebook_handle}", target: '_blank', rel: 'noopener noreferrer' + + - if member.bluesky_handle.present? + %p + = icon 'fas', 'comment-dots', class: 'fa-fw' + = link_to member.bluesky_handle, "https://bsky.app/profile/#{member.bluesky_handle}", target: '_blank', rel: 'noopener noreferrer' + + - if member.other_url.present? + %p + = icon 'fas', 'link', class: 'fa-fw' + = link_to "More...", member.other_url, target: '_blank', rel: 'noopener noreferrer' + - if twitter_auth %p = image_tag "twitter_32.png", size: "32x32", alt: 'Twitter logo' - = link_to twitter_auth.name, "https://twitter.com/#{twitter_auth.name}" + = link_to twitter_auth.name, "https://twitter.com/#{twitter_auth.name}", target: '_blank', rel: 'noopener noreferrer' - if flickr_auth %p = image_tag "flickr_32.png", size: "32x32", alt: 'Flickr logo' - = link_to flickr_auth.name, "https://flickr.com/photos/#{flickr_auth.uid}" + = link_to flickr_auth.name, "https://flickr.com/photos/#{flickr_auth.uid}", target: '_blank', rel: 'noopener noreferrer' - if member.show_email %p - Email: + = icon 'fas', 'envelope', class: 'fa-fw' = mail_to member.email diff --git a/db/migrate/20240716120000_add_social_media_to_members.rb b/db/migrate/20240716120000_add_social_media_to_members.rb new file mode 100644 index 000000000..1b7fc97ec --- /dev/null +++ b/db/migrate/20240716120000_add_social_media_to_members.rb @@ -0,0 +1,9 @@ +class AddSocialMediaToMembers < ActiveRecord::Migration[6.0] + def change + add_column :members, :website_url, :string + add_column :members, :instagram_handle, :string + add_column :members, :facebook_handle, :string + add_column :members, :bluesky_handle, :string + add_column :members, :other_handle, :string + end +end diff --git a/db/migrate/20240716120001_rename_other_handle_to_other_url_in_members.rb b/db/migrate/20240716120001_rename_other_handle_to_other_url_in_members.rb new file mode 100644 index 000000000..e78eb12eb --- /dev/null +++ b/db/migrate/20240716120001_rename_other_handle_to_other_url_in_members.rb @@ -0,0 +1,5 @@ +class RenameOtherHandleToOtherUrlInMembers < ActiveRecord::Migration[6.0] + def change + rename_column :members, :other_handle, :other_url + end +end diff --git a/db/schema.rb b/db/schema.rb index 44f298856..2ce2a6b6d 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -446,6 +446,11 @@ ActiveRecord::Schema[7.2].define(version: 2024_09_29_041435) do t.integer "photos_count" t.integer "forums_count" t.integer "activities_count" + t.string "website_url" + t.string "instagram_handle" + t.string "facebook_handle" + t.string "bluesky_handle" + t.string "other_url" t.index ["confirmation_token"], name: "index_members_on_confirmation_token", unique: true t.index ["discarded_at"], name: "index_members_on_discarded_at" t.index ["email"], name: "index_members_on_email", unique: true From e88e54b0c1f28fc2ad82f08add49119b80c69351 Mon Sep 17 00:00:00 2001 From: Daniel O'Connor Date: Sun, 24 Aug 2025 06:52:37 +0000 Subject: [PATCH 30/33] Image redundant now --- app/assets/images/location-not-set.en.png | Bin 20018 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 app/assets/images/location-not-set.en.png diff --git a/app/assets/images/location-not-set.en.png b/app/assets/images/location-not-set.en.png deleted file mode 100644 index 8c02672dadc987ad749f6abd7e8817205d853d97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20018 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 From 65406b9e564a746685d53b57aa1ea18967712fa7 Mon Sep 17 00:00:00 2001 From: Daniel O'Connor Date: Sun, 24 Aug 2025 16:31:24 +0930 Subject: [PATCH 31/33] Update CONTRIBUTORS.md --- CONTRIBUTORS.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 0f860bec3..6f43e0e69 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -95,7 +95,8 @@ submit the change with your pull request. - Ítalo Pires / [italopires](https://github.com/italopires) - Bennett Zink / [bennett-zink](https://github.com/bennett-zink) - Dominick Thornton / [domthor](https://github.com/domthor) - +- [google-labs-jules[bot]](https://github.com/apps/google-labs-jules) + ## Bots ### Security and Dependency Updates From cac0e3cb123f731b9ca6dc3c878292c12610e97f Mon Sep 17 00:00:00 2001 From: Daniel O'Connor Date: Sun, 24 Aug 2025 16:32:03 +0930 Subject: [PATCH 32/33] Update CONTRIBUTORS.md --- CONTRIBUTORS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 6f43e0e69..ed0aaa4d5 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -12,6 +12,7 @@ submit the change with your pull request. - Miles Gould / [pozorvlak](https://github.com/pozorvlak) - Mackenzie Morgan / [maco](https://github.com/maco) - Brenda Wallace / [br3nda](https://github.com/br3nda) +- Daniel O'Connor / [CloCkWeRX](https://github.com/CloCkWeRX) ## Contributors @@ -68,7 +69,6 @@ submit the change with your pull request. - Jym Paul Carandang / [jacarandang](https://github.com/jacarandang) - Anthony Atkinson / [sha1sum](https://github.com/sha1sum) - Terence Conquest / [twconquest](https://github.com/twconquest) -- Daniel O'Connor / [CloCkWeRX](https://github.com/CloCkWeRX) - DV Dasari / [dv2](https://github.com/dv2) - Eric Tillberg / [Thrillberg](https://github.com/Thrillberg) - Lucas Nogueira / [lucasnogueira](https://github.com/lucasnogueira) From 967c0f4638190dab5da1babc54f06b37825930c2 Mon Sep 17 00:00:00 2001 From: Daniel O'Connor Date: Sun, 24 Aug 2025 16:32:40 +0930 Subject: [PATCH 33/33] Update CONTRIBUTORS.md --- CONTRIBUTORS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index ed0aaa4d5..e2d7259f0 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -95,7 +95,6 @@ submit the change with your pull request. - Ítalo Pires / [italopires](https://github.com/italopires) - Bennett Zink / [bennett-zink](https://github.com/bennett-zink) - Dominick Thornton / [domthor](https://github.com/domthor) -- [google-labs-jules[bot]](https://github.com/apps/google-labs-jules) ## Bots @@ -103,3 +102,4 @@ submit the change with your pull request. - `codefactor-io[bot]` - DeppBot / [deppbot](https://github.com/deppbot) - `dependabot[bot]` [dependabot](https://github.com/dependabot-bot) / [dependabot-preview](https://github.com/apps/dependabot-preview) +- [google-labs-jules[bot]](https://github.com/apps/google-labs-jules)