From 8fcd3364404edf54e64e096e4f1fc599fb125e62 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Nov 2024 16:49:14 -0600 Subject: [PATCH 01/28] Bump maintenance_tasks from 2.8.0 to 2.9.0 (#5248) --- Gemfile | 2 +- Gemfile.lock | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Gemfile b/Gemfile index 9fda599e5e8..9bbc41b9b04 100644 --- a/Gemfile +++ b/Gemfile @@ -52,7 +52,7 @@ gem "unpwn", "~> 1.0" gem "webauthn", "~> 3.1" gem "browser", "~> 6.1" gem "bcrypt", "~> 3.1" -gem "maintenance_tasks", "~> 2.8" +gem "maintenance_tasks", "~> 2.9" gem "strong_migrations", "~> 2.1" gem "phlex-rails", "~> 1.2" gem "discard", "~> 1.4" diff --git a/Gemfile.lock b/Gemfile.lock index af71d72ccf2..80221527724 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -354,7 +354,7 @@ GEM rdoc (>= 4.0.0) reline (>= 0.4.2) jmespath (1.6.2) - job-iteration (1.5.1) + job-iteration (1.7.0) activejob (>= 5.2) json (2.8.2) json-jwt (1.16.7) @@ -440,13 +440,13 @@ GEM net-imap net-pop net-smtp - maintenance_tasks (2.8.0) - actionpack (>= 6.0) - activejob (>= 6.0) - activerecord (>= 6.0) + maintenance_tasks (2.9.0) + actionpack (>= 6.1) + activejob (>= 6.1) + activerecord (>= 6.1) csv job-iteration (>= 1.3.6) - railties (>= 6.0) + railties (>= 6.1) zeitwerk (>= 2.6.2) marcel (1.0.4) matrix (0.4.2) @@ -922,7 +922,7 @@ DEPENDENCIES local_time (~> 3.0) lookbook (~> 2.3) mail (~> 2.8) - maintenance_tasks (~> 2.8) + maintenance_tasks (~> 2.9) memory_profiler (~> 1.1) minitest (~> 5.25) minitest-gcstats (~> 1.3) @@ -1119,7 +1119,7 @@ CHECKSUMS io-console (0.7.2) sha256=f0dccff252f877a4f60d04a4dc6b442b185ebffb4b320ab69212a92b48a7a221 irb (1.14.1) sha256=5975003b58d36efaf492380baa982ceedf5aed36967a4d5b40996bc5c66e80f8 jmespath (1.6.2) sha256=238d774a58723d6c090494c8879b5e9918c19485f7e840f2c1c7532cf84ebcb1 - job-iteration (1.5.1) sha256=1428ad5b308adbaae8776c16b7792a846eb1ad7f4ab3c6e0f9668dd2ab1179e5 + job-iteration (1.7.0) sha256=7e9db935ce021280a030414995047f370b458597405b316a0bf59ecc9c9cad5d json (2.8.2) sha256=dd4fa6c9c81daecf72b86ea36e56ed8955fdbb4d4dc379c93d313a59344486cf json-jwt (1.16.7) sha256=ccabff4c6d1a14276b23178e8bebe513ef236399b72a0b886d7ed94800d172a5 jwt (2.7.1) sha256=07357cd2f180739b2f8184eda969e252d850ac996ed0a23f616e8ff0a90ae19b @@ -1148,7 +1148,7 @@ CHECKSUMS loofah (2.23.1) sha256=d0a07422cb3b69272e124afa914ef6d517e30d5496b7f1c1fc5b95481f13f75e lookbook (2.3.4) sha256=16484c9eb514ac0c23c4b59cfd5a52697141d35056e3a9c2a22b314c1b887605 mail (2.8.1) sha256=ec3b9fadcf2b3755c78785cb17bc9a0ca9ee9857108a64b6f5cfc9c0b5bfc9ad - maintenance_tasks (2.8.0) sha256=7ee8aa37ab39c6c3a5f4637878c1a343cc296596742248112458b922968d4a16 + maintenance_tasks (2.9.0) sha256=7146aa49f66c17b83c8a8d097ed503260c857fa698f3038a6cffbb36df1257c5 marcel (1.0.4) sha256=0d5649feb64b8f19f3d3468b96c680bae9746335d02194270287868a661516a4 matrix (0.4.2) sha256=71083ccbd67a14a43bfa78d3e4dc0f4b503b9cc18e5b4b1d686dc0f9ef7c4cc0 memory_profiler (1.1.0) sha256=79a17df7980a140c83c469785905409d3027ca614c42c086089d128b805aa8f8 From dd89efd65599dc798ae50367d3c52034646a1563 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Nov 2024 00:21:05 +0000 Subject: [PATCH 02/28] Bump codecov/codecov-action from 5.0.1 to 5.0.2 (#5247) --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 29f6aae442a..ca35a8dce93 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -72,6 +72,6 @@ jobs: - name: Upload coverage to Codecov if: matrix.rubygems.name == 'locked' && (success() || failure()) - uses: codecov/codecov-action@3b1354a6c45db9f1008891f4eafc1a7e94ce1d18 # v5.0.1 + uses: codecov/codecov-action@5c47607acb93fed5485fdbf7232e8a31425f672a # v5.0.2 env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} From bf11fa18e65fe2d29a0de9d700d7963a47c82222 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Nov 2024 03:52:37 +0000 Subject: [PATCH 03/28] Bump webauthn from 3.1.0 to 3.2.2 (#5238) Bumps [webauthn](https://github.com/cedarcode/webauthn-ruby) from 3.1.0 to 3.2.2. - [Changelog](https://github.com/cedarcode/webauthn-ruby/blob/master/CHANGELOG.md) - [Commits](https://github.com/cedarcode/webauthn-ruby/compare/v3.1.0...v3.2.2) --- updated-dependencies: - dependency-name: webauthn dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile | 2 +- Gemfile.lock | 22 ++++++++++------------ 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/Gemfile b/Gemfile index 9bbc41b9b04..be27925f105 100644 --- a/Gemfile +++ b/Gemfile @@ -49,7 +49,7 @@ gem "rack-attack", "~> 6.6" gem "rqrcode", "~> 2.1" gem "rotp", "~> 6.2" gem "unpwn", "~> 1.0" -gem "webauthn", "~> 3.1" +gem "webauthn", "~> 3.2" gem "browser", "~> 6.1" gem "bcrypt", "~> 3.1" gem "maintenance_tasks", "~> 2.9" diff --git a/Gemfile.lock b/Gemfile.lock index 80221527724..a0b45b66977 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -133,7 +133,6 @@ GEM avo_upgrade (0.1.1) rails (>= 6.0.0) zeitwerk - awrence (1.2.1) aws-eventstream (1.3.0) aws-partitions (1.1008.0) aws-sdk-core (3.213.0) @@ -202,7 +201,7 @@ GEM compact_index (0.15.0) concurrent-ruby (1.3.4) connection_pool (2.4.1) - cose (1.3.0) + cose (1.3.1) cbor (~> 0.5.9) openssl-signature_algorithm (~> 1.0) crack (1.0.0) @@ -364,7 +363,8 @@ GEM bindata faraday (~> 2.0) faraday-follow_redirects - jwt (2.7.1) + jwt (2.9.3) + base64 kaminari (1.2.2) activesupport (>= 4.1.0) kaminari-actionview (= 1.2.2) @@ -808,7 +808,7 @@ GEM activesupport pg (~> 1.2) toxiproxy (2.0.2) - tpm-key_attestation (0.12.0) + tpm-key_attestation (0.12.1) bindata (~> 2.4) openssl (> 2.0) openssl-signature_algorithm (~> 1.0) @@ -836,9 +836,8 @@ GEM activesupport (>= 5.2.0, < 8.0) concurrent-ruby (~> 1.0) method_source (~> 1.0) - webauthn (3.1.0) + webauthn (3.2.2) android_key_attestation (~> 0.3.0) - awrence (~> 1.1) bindata (~> 2.4) cbor (~> 0.5.9) cose (~> 1.1) @@ -988,7 +987,7 @@ DEPENDENCIES user_agent_parser (~> 2.18) validates_formatting_of (~> 0.9) view_component (~> 3.14.0) - webauthn (~> 3.1) + webauthn (~> 3.2) webmock (~> 3.24) xml-simple (~> 1.1) @@ -1021,7 +1020,6 @@ CHECKSUMS avo-menu (3.14.0) sha256=f07243d2a52921d28718d7d9bdddb11eaebdc0dd5b07deed7a7fb767550be554 avo-pro (3.14.0) sha256=0a20743f5c5e685a9088c9b753bc8419a68aac57f7fa2966485e9ceb61a82c5f avo_upgrade (0.1.1) sha256=8d841083b9956392f5c8fe195f25bec0d139e3646d276f8a59e66b7d2e9ebf30 - awrence (1.2.1) sha256=dd1d214c12a91f449d1ef81d7ee3babc2816944e450752e7522c65521872483e aws-eventstream (1.3.0) sha256=f1434cc03ab2248756eb02cfa45e900e59a061d7fbdc4a9fd82a5dd23d796d3f aws-partitions (1.1008.0) sha256=6fb5e6b843ea1169480c804fc861a5de7407762097de75cf4734fbcd35466227 aws-sdk-core (3.213.0) sha256=6ca685be1d72d61776fdaaddf3c293e45a472ff0dd0b624880e7813d0c82db19 @@ -1053,7 +1051,7 @@ CHECKSUMS compact_index (0.15.0) sha256=5c6c404afca8928a7d9f4dde9524f6e1610db17e675330803055db282da84a8b concurrent-ruby (1.3.4) sha256=d4aa926339b0a86b5b5054a0a8c580163e6f5dcbdfd0f4bb916b1a2570731c32 connection_pool (2.4.1) sha256=0f40cf997091f1f04ff66da67eabd61a9fe0d4928b9a3645228532512fab62f4 - cose (1.3.0) sha256=63247c66a5bc76e53926756574fe3724cc0a88707e358c90532ae2a320e98601 + cose (1.3.1) sha256=d5d4dbcd6b035d513edc4e1ab9bc10e9ce13b4011c96e3d1b8fe5e6413fd6de5 crack (1.0.0) sha256=c83aefdb428cdc7b66c7f287e488c796f055c0839e6e545fec2c7047743c4a49 crass (1.0.6) sha256=dc516022a56e7b3b156099abc81b6d2b08ea1ed12676ac7a5657617f012bd45d css_parser (1.19.1) sha256=1940dce01e3b9be18d6880e6d65162d984cc04ff28998cf4759beb999275209e @@ -1122,7 +1120,7 @@ CHECKSUMS job-iteration (1.7.0) sha256=7e9db935ce021280a030414995047f370b458597405b316a0bf59ecc9c9cad5d json (2.8.2) sha256=dd4fa6c9c81daecf72b86ea36e56ed8955fdbb4d4dc379c93d313a59344486cf json-jwt (1.16.7) sha256=ccabff4c6d1a14276b23178e8bebe513ef236399b72a0b886d7ed94800d172a5 - jwt (2.7.1) sha256=07357cd2f180739b2f8184eda969e252d850ac996ed0a23f616e8ff0a90ae19b + jwt (2.9.3) sha256=55fd07ccdd64c622d36859748f2290fb9c119ce30b482867504e9f12654d6a65 kaminari (1.2.2) sha256=c4076ff9adccc6109408333f87b5c4abbda5e39dc464bd4c66d06d9f73442a3e kaminari-actionview (1.2.2) sha256=1330f6fc8b59a4a4ef6a549ff8a224797289ebf7a3a503e8c1652535287cc909 kaminari-activerecord (1.2.2) sha256=0dd3a67bab356a356f36b3b7236bcb81cef313095365befe8e98057dd2472430 @@ -1300,7 +1298,7 @@ CHECKSUMS timeout (0.4.2) sha256=8aca2d5ff98eb2f7a501c03f8c3622065932cc58bc58f725cd50a09e63b4cc19 timescaledb (0.3.0) sha256=9ce2b39417d30544054cb609fbd84e18e304c7b7952a793846b8f4489551a28f toxiproxy (2.0.2) sha256=2e3b53604fb921d40da3db8f78a52b3133fcae33e93d440725335b15974e440a - tpm-key_attestation (0.12.0) sha256=e133d80cf24fef0e7a7dfad00fd6aeff01fc79875fbfc66cd8537bbd622b1e6d + tpm-key_attestation (0.12.1) sha256=3c1315bed06ba3563aee98ff69c270d9b45b586a43ac2da250b23cad3c3caca3 turbo-rails (2.0.11) sha256=fc47674736372780abd2a4dc0d84bef242f5ca156a457cd7fa6308291e397fcf turbo_power (0.6.2) sha256=c9080d0d1bb79deed67bee2a7654dd38f9c903b57ad52b98d19d000958fde2cc tzinfo (2.0.6) sha256=8daf828cc77bcf7d63b0e3bdb6caa47e2272dcfaf4fbfe46f8c3a9df087a829b @@ -1313,7 +1311,7 @@ CHECKSUMS validates_formatting_of (0.9.0) sha256=139590a4b87596dbfb04d93e897bd2e6d30fb849d04fab0343e71ed2ca856e7e version_gem (1.1.1) sha256=3c2da6ded29045ddcc0387e152dc634e1f0c490b7128dce0697ccc1cf0915b6c view_component (3.14.0) sha256=96816de1c40d276d9fac49316ee4d196de90b1ce6eb39373b887c639749e630c - webauthn (3.1.0) sha256=e545fcf17d8a6b821161a37c1c4bc8c3d2ead0ff6ff3b098f57f417e731790b7 + webauthn (3.2.2) sha256=46e70b234963c85bbf8ea8febc9a3cbf04569e34a73a570d86f68556f3f36a38 webfinger (2.1.3) sha256=567a52bde77fb38ca6b67e55db755f988766ec4651c1d24916a65aa70540695c webmock (3.24.0) sha256=be01357f6fc773606337ca79f3ba332b7d52cbe5c27587671abc0572dbec7122 websocket (1.2.11) sha256=b7e7a74e2410b5e85c25858b26b3322f29161e300935f70a0e0d3c35e0462737 From a8986a78c5f9bbd9324dfc68a11637dc90798138 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Nov 2024 14:56:29 +0000 Subject: [PATCH 04/28] Bump aws-sdk-sqs from 1.88.0 to 1.89.0 Bumps [aws-sdk-sqs](https://github.com/aws/aws-sdk-ruby) from 1.88.0 to 1.89.0. - [Release notes](https://github.com/aws/aws-sdk-ruby/releases) - [Changelog](https://github.com/aws/aws-sdk-ruby/blob/version-3/gems/aws-sdk-sqs/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-ruby/commits) --- updated-dependencies: - dependency-name: aws-sdk-sqs dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Gemfile | 2 +- Gemfile.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Gemfile b/Gemfile index be27925f105..8aeb4b1ac32 100644 --- a/Gemfile +++ b/Gemfile @@ -6,7 +6,7 @@ gem "rails", "~> 7.2.1" gem "rails-i18n", "~> 7.0" gem "aws-sdk-s3", "~> 1.171" -gem "aws-sdk-sqs", "~> 1.88" +gem "aws-sdk-sqs", "~> 1.89" gem "bootsnap", "~> 1.18" gem "clearance", "~> 2.9" gem "dalli", "~> 3.2" diff --git a/Gemfile.lock b/Gemfile.lock index a0b45b66977..65874d1faf2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -134,7 +134,7 @@ GEM rails (>= 6.0.0) zeitwerk aws-eventstream (1.3.0) - aws-partitions (1.1008.0) + aws-partitions (1.1009.0) aws-sdk-core (3.213.0) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.992.0) @@ -147,7 +147,7 @@ GEM aws-sdk-core (~> 3, >= 3.210.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.5) - aws-sdk-sqs (1.88.0) + aws-sdk-sqs (1.89.0) aws-sdk-core (~> 3, >= 3.210.0) aws-sigv4 (~> 1.5) aws-sigv4 (1.10.1) @@ -880,7 +880,7 @@ DEPENDENCIES avo-advanced (~> 3.14)! avo_upgrade (~> 0.1.1) aws-sdk-s3 (~> 1.171) - aws-sdk-sqs (~> 1.88) + aws-sdk-sqs (~> 1.89) bcrypt (~> 3.1) better_html (~> 2.1) bootsnap (~> 1.18) @@ -1021,11 +1021,11 @@ CHECKSUMS avo-pro (3.14.0) sha256=0a20743f5c5e685a9088c9b753bc8419a68aac57f7fa2966485e9ceb61a82c5f avo_upgrade (0.1.1) sha256=8d841083b9956392f5c8fe195f25bec0d139e3646d276f8a59e66b7d2e9ebf30 aws-eventstream (1.3.0) sha256=f1434cc03ab2248756eb02cfa45e900e59a061d7fbdc4a9fd82a5dd23d796d3f - aws-partitions (1.1008.0) sha256=6fb5e6b843ea1169480c804fc861a5de7407762097de75cf4734fbcd35466227 + aws-partitions (1.1009.0) sha256=668e5ad6b7fd0eff01e9f38c88e443268eabe0e26d1d5fe407b8d0bfe949bd89 aws-sdk-core (3.213.0) sha256=6ca685be1d72d61776fdaaddf3c293e45a472ff0dd0b624880e7813d0c82db19 aws-sdk-kms (1.95.0) sha256=2ae508c642ddc59baa1296229108e9601a2fa00e57cf7a2153c9488f0587fd5e aws-sdk-s3 (1.171.0) sha256=94a2210c20f6102d8867937b021ef40683aa351e28912ac9cc6ef20509f85f4f - aws-sdk-sqs (1.88.0) sha256=3e4e022b9af1796eb87bb368a8bb2001ebcad3b5025d76aa9ba731acea01a2eb + aws-sdk-sqs (1.89.0) sha256=1db1e8a1dcf1a83a6328fe12a034fe89e1c7a73c6305b8cad089656e3a5389ba aws-sigv4 (1.10.1) sha256=8a140753f34de18125686b11e7adaed4ca3db06dfb50a478993bd437f7a203bb base64 (0.2.0) sha256=0f25e9b21a02a0cc0cea8ef92b2041035d39350946e8789c562b2d1a3da01507 bcrypt (3.1.20) sha256=8410f8c7b3ed54a3c00cd2456bf13917d695117f033218e2483b2e40b0784099 From e9b6b222acd9a038ddfa033bdcf8b12bdc9be709 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Nov 2024 14:58:34 +0000 Subject: [PATCH 05/28] Bump rdoc from 6.7.0 to 6.8.1 Bumps [rdoc](https://github.com/ruby/rdoc) from 6.7.0 to 6.8.1. - [Release notes](https://github.com/ruby/rdoc/releases) - [Changelog](https://github.com/ruby/rdoc/blob/master/History.rdoc) - [Commits](https://github.com/ruby/rdoc/compare/v6.7.0...v6.8.1) --- updated-dependencies: - dependency-name: rdoc dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Gemfile | 2 +- Gemfile.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index be27925f105..12ed84363e2 100644 --- a/Gemfile +++ b/Gemfile @@ -34,7 +34,7 @@ gem "rack", "~> 3.1" gem "rackup", "~> 2.2" gem "rack-sanitizer", "~> 2.0" gem "rbtrace", "~> 0.5.1" -gem "rdoc", "~> 6.7" +gem "rdoc", "~> 6.8" gem "roadie-rails", "~> 3.3" gem "ruby-magic", "~> 0.6" gem "shoryuken", "~> 6.2", require: false diff --git a/Gemfile.lock b/Gemfile.lock index a0b45b66977..61b02b780b7 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -673,7 +673,7 @@ GEM ffi (>= 1.0.6) msgpack (>= 0.4.3) optimist (>= 3.0.0) - rdoc (6.7.0) + rdoc (6.8.1) psych (>= 4.0.0) redcarpet (3.6.0) regexp_parser (2.9.2) @@ -958,7 +958,7 @@ DEPENDENCIES rails-i18n (~> 7.0) rails_semantic_logger (~> 4.17) rbtrace (~> 0.5.1) - rdoc (~> 6.7) + rdoc (~> 6.8) roadie-rails (~> 3.3) rotp (~> 6.2) rqrcode (~> 2.1) @@ -1237,7 +1237,7 @@ CHECKSUMS rb-fsevent (0.11.2) sha256=43900b972e7301d6570f64b850a5aa67833ee7d87b458ee92805d56b7318aefe rb-inotify (0.10.1) sha256=050062d4f31d307cca52c3f6a7f4b946df8de25fc4bd373e1a5142e41034a7ca rbtrace (0.5.1) sha256=e8cba64d462bfb8ba102d7be2ecaacc789247d52ac587d8003549d909cb9c5dc - rdoc (6.7.0) sha256=b17d5f0f57b0853d7b880d4360a32c7caf8dbb81f8503a36426df809e617f379 + rdoc (6.8.1) sha256=0128002d1bfc4892bdd780940841e4ca41275f63781fd832d11bc8ba4461462c redcarpet (3.6.0) sha256=8ad1889c0355ff4c47174af14edd06d62f45a326da1da6e8a121d59bdcd2e9e9 regexp_parser (2.9.2) sha256=5a27e767ad634f8a4b544520d5cd28a0db7aa1198a5d7c9d7e11d7b3d9066446 reline (0.5.11) sha256=868d5f4dbfd9caafa70182f7f6fa258b70baee4e565d7cd9e70b4d5b11a7cb65 From 802f0f8352424f1f1dac7b31835e72b218da2f78 Mon Sep 17 00:00:00 2001 From: Kingsley Chijioke Date: Tue, 19 Nov 2024 17:19:30 +0100 Subject: [PATCH 06/28] Unconfirmed email profile should return 404 (#5143) --- app/controllers/profiles_controller.rb | 3 ++- app/models/user.rb | 1 + test/functional/profiles_controller_test.rb | 13 +++++++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/app/controllers/profiles_controller.rb b/app/controllers/profiles_controller.rb index 1adbf233817..e2f466fba3d 100644 --- a/app/controllers/profiles_controller.rb +++ b/app/controllers/profiles_controller.rb @@ -8,7 +8,8 @@ class ProfilesController < ApplicationController before_action :disable_cache, only: :edit def show - @user = User.find_by_slug!(params[:id]) + @user = User.confirmed.find_by_slug!(params[:id]) + return render_not_found unless @user @rubygems = @user.rubygems_downloaded.includes(%i[latest_version gem_download]).strict_loading end diff --git a/app/models/user.rb b/app/models/user.rb index 8b25cd75531..3741b4c7003 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -27,6 +27,7 @@ class User < ApplicationRecord scope :not_deleted, -> { kept } scope :deleted, -> { with_discarded.discarded } scope :with_deleted, -> { with_discarded } + scope :confirmed, -> { where(email_confirmed: true) } has_many :ownerships, -> { confirmed }, dependent: :destroy, inverse_of: :user diff --git a/test/functional/profiles_controller_test.rb b/test/functional/profiles_controller_test.rb index 1cfbb165ec8..0cb3ab5a29d 100644 --- a/test/functional/profiles_controller_test.rb +++ b/test/functional/profiles_controller_test.rb @@ -12,6 +12,19 @@ class ProfilesControllerTest < ActionController::TestCase end end + context "for a user whose email is not confirmed" do + setup do + @user = create(:user) + @user.update(email_confirmed: false) + end + + should "render not found page" do + get :show, params: { id: @user.handle } + + assert_response :not_found + end + end + context "when not logged in" do setup { @user = create(:user) } From 8996a6cc0f900b4af335d605d5bf787e4849a4fa Mon Sep 17 00:00:00 2001 From: Samuel Giddins Date: Tue, 19 Nov 2024 11:58:12 -0800 Subject: [PATCH 07/28] Add more filters to api_key/version to help measure trusted publishing & attestation adoption (#5256) Signed-off-by: Samuel Giddins --- app/avo/resources/api_key.rb | 2 ++ app/avo/resources/version.rb | 5 +++++ app/models/api_key.rb | 3 +++ app/models/version.rb | 16 ++++++++++++++++ 4 files changed, 26 insertions(+) diff --git a/app/avo/resources/api_key.rb b/app/avo/resources/api_key.rb index c3c2251565e..4e47a01baf2 100644 --- a/app/avo/resources/api_key.rb +++ b/app/avo/resources/api_key.rb @@ -3,9 +3,11 @@ class Avo::Resources::ApiKey < Avo::BaseResource self.includes = [] class ExpiredFilter < Avo::Filters::ScopeBooleanFilter; end + class TrustedPublisherFilter < Avo::Filters::ScopeBooleanFilter; end def filters filter ExpiredFilter, arguments: { default: { expired: false, unexpired: true } } + filter TrustedPublisherFilter, arguments: { default: { trusted_publisher: true, not_trusted_publisher: true } } end def fields diff --git a/app/avo/resources/version.rb b/app/avo/resources/version.rb index 4e3e14de176..80c46c18658 100644 --- a/app/avo/resources/version.rb +++ b/app/avo/resources/version.rb @@ -13,9 +13,13 @@ def actions end class IndexedFilter < Avo::Filters::ScopeBooleanFilter; end + class TrustedPublisherFilter < Avo::Filters::ScopeBooleanFilter; end + class AttestationFilter < Avo::Filters::ScopeBooleanFilter; end def filters filter IndexedFilter, arguments: { default: { indexed: true, yanked: true } } + filter TrustedPublisherFilter, arguments: { default: { pushed_with_trusted_publishing: true, pushed_without_trusted_publishing: true } } + filter AttestationFilter, arguments: { default: { with_attestations: true, without_attestations: true } } end def fields # rubocop:disable Metrics @@ -74,6 +78,7 @@ def fields # rubocop:disable Metrics field :dependencies, as: :has_many field :gem_download, as: :has_one, name: "Downloads" field :deletion, as: :has_one + field :attestations, as: :has_many end end end diff --git a/app/models/api_key.rb b/app/models/api_key.rb index 924bf5fc3f2..efc228ced38 100644 --- a/app/models/api_key.rb +++ b/app/models/api_key.rb @@ -38,6 +38,9 @@ class ScopeError < RuntimeError; end scope :oidc, -> { joins(:oidc_id_token) } scope :not_oidc, -> { where.missing(:oidc_id_token) } + scope :trusted_publisher, -> { where("owner_type like ?", "OIDC::TrustedPublisher::%") } + scope :not_trusted_publisher, -> { where("owner_type not like ?", "OIDC::TrustedPublisher::%") } + def self.expire_all! transaction do unexpired.find_each.all?(&:expire!) diff --git a/app/models/version.rb b/app/models/version.rb index f3aa3e75413..7dee3eb7fe4 100644 --- a/app/models/version.rb +++ b/app/models/version.rb @@ -197,6 +197,22 @@ def self.created_between(start_time, end_time) where(created_at: start_time..end_time).order(:created_at, :id) end + def self.pushed_with_trusted_publishing + joins(:pusher_api_key).merge(ApiKey.trusted_publisher) + end + + def self.pushed_without_trusted_publishing + left_joins(:pusher_api_key).merge(ApiKey.not_trusted_publisher.or(where(pusher_api_key: nil).only(:where))) + end + + def self.with_attestations + where.associated(:attestations) + end + + def self.without_attestations + where.missing(:attestations) + end + def platformed? platform != "ruby" end From 9ae051d413ace2aa39ad52e5632303d48d36ad50 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Nov 2024 00:27:15 +0000 Subject: [PATCH 08/28] Bump aws-sdk-s3 from 1.171.0 to 1.172.0 Bumps [aws-sdk-s3](https://github.com/aws/aws-sdk-ruby) from 1.171.0 to 1.172.0. - [Release notes](https://github.com/aws/aws-sdk-ruby/releases) - [Changelog](https://github.com/aws/aws-sdk-ruby/blob/version-3/gems/aws-sdk-s3/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-ruby/commits) --- updated-dependencies: - dependency-name: aws-sdk-s3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Gemfile | 2 +- Gemfile.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Gemfile b/Gemfile index d5393364661..6344b7cf76a 100644 --- a/Gemfile +++ b/Gemfile @@ -5,7 +5,7 @@ ruby file: ".ruby-version" gem "rails", "~> 7.2.1" gem "rails-i18n", "~> 7.0" -gem "aws-sdk-s3", "~> 1.171" +gem "aws-sdk-s3", "~> 1.172" gem "aws-sdk-sqs", "~> 1.89" gem "bootsnap", "~> 1.18" gem "clearance", "~> 2.9" diff --git a/Gemfile.lock b/Gemfile.lock index 4d32247e405..851b53b3fe1 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -134,16 +134,16 @@ GEM rails (>= 6.0.0) zeitwerk aws-eventstream (1.3.0) - aws-partitions (1.1009.0) + aws-partitions (1.1010.0) aws-sdk-core (3.213.0) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.992.0) aws-sigv4 (~> 1.9) jmespath (~> 1, >= 1.6.1) - aws-sdk-kms (1.95.0) + aws-sdk-kms (1.96.0) aws-sdk-core (~> 3, >= 3.210.0) aws-sigv4 (~> 1.5) - aws-sdk-s3 (1.171.0) + aws-sdk-s3 (1.172.0) aws-sdk-core (~> 3, >= 3.210.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.5) @@ -879,7 +879,7 @@ DEPENDENCIES avo (~> 3.13) avo-advanced (~> 3.14)! avo_upgrade (~> 0.1.1) - aws-sdk-s3 (~> 1.171) + aws-sdk-s3 (~> 1.172) aws-sdk-sqs (~> 1.89) bcrypt (~> 3.1) better_html (~> 2.1) @@ -1021,10 +1021,10 @@ CHECKSUMS avo-pro (3.14.0) sha256=0a20743f5c5e685a9088c9b753bc8419a68aac57f7fa2966485e9ceb61a82c5f avo_upgrade (0.1.1) sha256=8d841083b9956392f5c8fe195f25bec0d139e3646d276f8a59e66b7d2e9ebf30 aws-eventstream (1.3.0) sha256=f1434cc03ab2248756eb02cfa45e900e59a061d7fbdc4a9fd82a5dd23d796d3f - aws-partitions (1.1009.0) sha256=668e5ad6b7fd0eff01e9f38c88e443268eabe0e26d1d5fe407b8d0bfe949bd89 + aws-partitions (1.1010.0) sha256=68bb673ab3275f0a41cd62d4550d2238053841f3f99498aa809bae66bcf3a6a0 aws-sdk-core (3.213.0) sha256=6ca685be1d72d61776fdaaddf3c293e45a472ff0dd0b624880e7813d0c82db19 - aws-sdk-kms (1.95.0) sha256=2ae508c642ddc59baa1296229108e9601a2fa00e57cf7a2153c9488f0587fd5e - aws-sdk-s3 (1.171.0) sha256=94a2210c20f6102d8867937b021ef40683aa351e28912ac9cc6ef20509f85f4f + aws-sdk-kms (1.96.0) sha256=b1818e140b4d1b3cbe154e6b2df1d157f8c65aa297d488f69b5745995a6ba375 + aws-sdk-s3 (1.172.0) sha256=a2ac83d570c573b240b694d72c9e83e2c233a75fcd5f1a73e1d6d348b8219243 aws-sdk-sqs (1.89.0) sha256=1db1e8a1dcf1a83a6328fe12a034fe89e1c7a73c6305b8cad089656e3a5389ba aws-sigv4 (1.10.1) sha256=8a140753f34de18125686b11e7adaed4ca3db06dfb50a478993bd437f7a203bb base64 (0.2.0) sha256=0f25e9b21a02a0cc0cea8ef92b2041035d39350946e8789c562b2d1a3da01507 From 13412bfd4676c98cd1fbf0da6cea75b24eed42cc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Nov 2024 00:29:33 +0000 Subject: [PATCH 09/28] Bump sigstore from 0.1.1 to 0.2.1 Bumps [sigstore](https://github.com/sigstore/sigstore-ruby) from 0.1.1 to 0.2.1. - [Release notes](https://github.com/sigstore/sigstore-ruby/releases) - [Commits](https://github.com/sigstore/sigstore-ruby/compare/v0.1.1...v0.2.1) --- updated-dependencies: - dependency-name: sigstore dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Gemfile | 2 +- Gemfile.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index d5393364661..ac44f2d00b7 100644 --- a/Gemfile +++ b/Gemfile @@ -60,7 +60,7 @@ gem "user_agent_parser", "~> 2.18" gem "pghero", "~> 3.6" gem "faraday-multipart", "~> 1.0" gem "timescaledb", "~> 0.3" -gem "sigstore", "~> 0.1.1" +gem "sigstore", "~> 0.2.1" # Admin dashboard gem "avo", "~> 3.13" diff --git a/Gemfile.lock b/Gemfile.lock index 4d32247e405..f907c197c0d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -765,7 +765,7 @@ GEM shoulda-context (3.0.0.rc1) shoulda-matchers (6.4.0) activesupport (>= 5.2.0) - sigstore (0.1.1) + sigstore (0.2.1) net-http protobug_sigstore_protos (~> 0.1.0) uri @@ -974,7 +974,7 @@ DEPENDENCIES shoryuken (~> 6.2) shoulda-context (~> 3.0.0.rc1) shoulda-matchers (~> 6.4) - sigstore (~> 0.1.1) + sigstore (~> 0.2.1) simplecov (~> 0.22) simplecov-cobertura (~> 2.1) statsd-instrument (~> 3.9) @@ -1276,7 +1276,7 @@ CHECKSUMS shoryuken (6.2.1) sha256=95ddc0a717624a54e799d25a0a05100cb5a0c3728a96211935c214faaf16b3b6 shoulda-context (3.0.0.rc1) sha256=6e0d9d52ab798c13bc2b490c8537d4bf30cfd318a1ea839c39a66d1d293c6a1a shoulda-matchers (6.4.0) sha256=9055bb7f4bb342125fb860809798855c630e05ef5e75837b3168b8e6ee1608b0 - sigstore (0.1.1) sha256=0c2c3c5d175b204252eeb1507bfb79e330009188d160525d2871b5272f958897 + sigstore (0.2.1) sha256=58031c34c7899dd6aac43c54d0ab1a5282a551804013d4b7cb6930a32cbc8775 simplecov (0.22.0) sha256=fe2622c7834ff23b98066bb0a854284b2729a569ac659f82621fc22ef36213a5 simplecov-cobertura (2.1.0) sha256=2c6532e34df2e38a379d72cef9a05c3b16c64ce90566beebc6887801c4ad3f02 simplecov-html (0.12.3) sha256=4b1aad33259ffba8b29c6876c12db70e5750cb9df829486e4c6e5da4fa0aa07b From fdebde8d2190a602ca87668b7dba481b9a385d9b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Nov 2024 16:53:41 -0800 Subject: [PATCH 10/28] Bump avo-advanced from 3.14.0 to 3.14.1 (#5252) Bumps avo-advanced from 3.14.0 to 3.14.1. --- updated-dependencies: - dependency-name: avo-advanced dependency-type: direct:development 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 | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index d9e30cd0afe..a8806df9a82 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,29 +1,29 @@ GEM remote: https://packager.dev/avo-hq/ specs: - avo-advanced (3.14.0) - avo (= 3.14.0) - avo-dynamic_filters (= 3.14.0) - avo-pro (= 3.14.0) + avo-advanced (3.14.1) + avo (= 3.14.1) + avo-dynamic_filters (= 3.14.1) + avo-pro (= 3.14.1) zeitwerk (>= 2.6.12) - avo-dashboards (3.14.0) - avo (= 3.14.0) + avo-dashboards (3.14.1) + avo (= 3.14.1) turbo-rails view_component (>= 3.7.0) zeitwerk (>= 2.6.12) - avo-dynamic_filters (3.14.0) - avo (= 3.14.0) + avo-dynamic_filters (3.14.1) + avo (= 3.14.1) ransack (>= 4.2.0) view_component (>= 3.7.0) zeitwerk (>= 2.6.12) - avo-menu (3.14.0) - avo (= 3.14.0) + avo-menu (3.14.1) + avo (= 3.14.1) docile zeitwerk (>= 2.6.12) - avo-pro (3.14.0) - avo (= 3.14.0) - avo-dashboards (= 3.14.0) - avo-menu (= 3.14.0) + avo-pro (3.14.1) + avo (= 3.14.1) + avo-dashboards (= 3.14.1) + avo-menu (= 3.14.1) zeitwerk (>= 2.6.12) GEM @@ -115,7 +115,7 @@ GEM ffi-compiler (~> 1.0) ast (2.4.2) attr_required (1.0.2) - avo (3.14.0) + avo (3.14.1) actionview (>= 6.1) active_link_to activerecord (>= 6.1) @@ -1013,12 +1013,12 @@ CHECKSUMS argon2 (2.3.0) sha256=980ef65172bf512ad37b6cbb0d61eef40b6dccab6a7db4e70557527e1dce9557 ast (2.4.2) sha256=1e280232e6a33754cde542bc5ef85520b74db2aac73ec14acef453784447cc12 attr_required (1.0.2) sha256=f0ebfc56b35e874f4d0ae799066dbc1f81efefe2364ca3803dc9ea6a4de6cb99 - avo (3.14.0) sha256=ae8744b3bde7c9b3d41869e58214abf288d7ef6f230420746f012df083f1c0be - avo-advanced (3.14.0) sha256=9b4a450819e7ea4aa2b25ff07d4e6f0bd36bcb6c99e86469a2fd1be733b9fe17 - avo-dashboards (3.14.0) sha256=5b2c30fee710fdfec6d47d940d5018cb1afcd2020720e5ef436001dc2ee6387b - avo-dynamic_filters (3.14.0) sha256=05fd9e5846ad247310fbffed61b40be310d9334646e8d59afe6c724faff5b28e - avo-menu (3.14.0) sha256=f07243d2a52921d28718d7d9bdddb11eaebdc0dd5b07deed7a7fb767550be554 - avo-pro (3.14.0) sha256=0a20743f5c5e685a9088c9b753bc8419a68aac57f7fa2966485e9ceb61a82c5f + avo (3.14.1) sha256=7fbf904afe5409064b8f03c7a14befe83184116e1ed789fb74a750090c39b15a + avo-advanced (3.14.1) sha256=5f9b18d20e7076731b736afe52bf04da2852c972f0aedeeb9b8323d9bf385ca3 + avo-dashboards (3.14.1) sha256=7c880e028138bc72082e0fec543a7af13d0ccf4580c8b58ce49b093379eef846 + avo-dynamic_filters (3.14.1) sha256=3fa32a404e99c9a0e97c973a6ddfd298bcb33dc2accb4d897064285043f5a84c + avo-menu (3.14.1) sha256=5b1ac111feabff7d0b3c718a8d67bd92bf3a822ef8e9af54014a91b6fa2bf4be + avo-pro (3.14.1) sha256=84e5474f9f311dc846a85ac3cfec02e04f187a54e91574686310eafaa21c503f avo_upgrade (0.1.1) sha256=8d841083b9956392f5c8fe195f25bec0d139e3646d276f8a59e66b7d2e9ebf30 aws-eventstream (1.3.0) sha256=f1434cc03ab2248756eb02cfa45e900e59a061d7fbdc4a9fd82a5dd23d796d3f aws-partitions (1.1010.0) sha256=68bb673ab3275f0a41cd62d4550d2238053841f3f99498aa809bae66bcf3a6a0 From 53ec71ec6dc2be8c5519beeb8cf3701dad6fe5f3 Mon Sep 17 00:00:00 2001 From: Jacklyn Ma <29336370+jacklynhma@users.noreply.github.com> Date: Wed, 20 Nov 2024 15:18:16 -0500 Subject: [PATCH 11/28] prevent submission of profile edit if password is not included (#5250) --- app/views/profiles/edit.html.erb | 2 +- test/system/profile_test.rb | 38 ++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 test/system/profile_test.rb diff --git a/app/views/profiles/edit.html.erb b/app/views/profiles/edit.html.erb index d56e7bdf80b..9328c5ba61d 100644 --- a/app/views/profiles/edit.html.erb +++ b/app/views/profiles/edit.html.erb @@ -66,7 +66,7 @@

<%= t('.enter_password') %>

- <%= form.password_field :password, autocomplete: 'current-password', class: 'form__input' %> + <%= form.password_field :password, autocomplete: 'current-password', class: 'form__input', required: true %> diff --git a/test/system/profile_test.rb b/test/system/profile_test.rb new file mode 100644 index 00000000000..5afb8195384 --- /dev/null +++ b/test/system/profile_test.rb @@ -0,0 +1,38 @@ +require "application_system_test_case" +require "test_helper" + +class ProfileTest < ApplicationSystemTestCase + setup do + @user = create(:user, email: "nick@example.com", password: PasswordHelpers::SECURE_TEST_PASSWORD, handle: "nick1", mail_fails: 1) + end + + def sign_in + visit sign_in_path + fill_in "Email or Username", with: @user.reload.email + fill_in "Password", with: @user.password + click_button "Sign in" + end + + test "adding X(formerly Twitter) username without filling in your password" do + twitter_username = "nick1twitter" + + sign_in + visit profile_path("nick1") + + click_link "Edit Profile" + fill_in "user_twitter_username", with: twitter_username + + assert_equal twitter_username, page.find_by_id("user_twitter_username").value + + click_button "Update" + + # Verify that the newly added Twitter username is still on the form so that the user does not need to re-enter it + assert_equal twitter_username, page.find_by_id("user_twitter_username").value + + fill_in "Password", with: PasswordHelpers::SECURE_TEST_PASSWORD + click_button "Update" + + assert page.has_content? "Your profile was updated." + assert_equal twitter_username, page.find_by_id("user_twitter_username").value + end +end From 6267f710bf810f1ed5fa2915a6c02e988ce31300 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Nov 2024 12:36:10 -0800 Subject: [PATCH 12/28] Bump codecov/codecov-action from 5.0.2 to 5.0.4 (#5259) Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5.0.2 to 5.0.4. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/5c47607acb93fed5485fdbf7232e8a31425f672a...985343d70564a82044c1b7fcb84c2fa05405c1a2) --- updated-dependencies: - dependency-name: codecov/codecov-action 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> --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ca35a8dce93..9111fbfef27 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -72,6 +72,6 @@ jobs: - name: Upload coverage to Codecov if: matrix.rubygems.name == 'locked' && (success() || failure()) - uses: codecov/codecov-action@5c47607acb93fed5485fdbf7232e8a31425f672a # v5.0.2 + uses: codecov/codecov-action@985343d70564a82044c1b7fcb84c2fa05405c1a2 # v5.0.4 env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} From 7aaff9c96c392e1e79d50835e7a878e8099b7576 Mon Sep 17 00:00:00 2001 From: Martin Emde Date: Wed, 20 Nov 2024 13:25:23 -0800 Subject: [PATCH 13/28] Increase coverage in policy tests (#5261) * Remove unused stubs from ApplicationPolicy * Fix membership policy tests * Remove unused RubygemPolicy predicates, update tests * Remove unused resolve not implemented, rely instead on NoMethodError * Add NilClassPolicy tests --- app/policies/api/application_policy.rb | 4 --- app/policies/api/nil_class_policy.rb | 2 +- app/policies/application_policy.rb | 36 ---------------------- app/policies/rubygem_policy.rb | 12 -------- test/policies/api/nil_class_policy_test.rb | 21 +++++++++++++ test/policies/membership_policy_test.rb | 18 +++++------ test/policies/rubygem_policy_test.rb | 8 +++++ 7 files changed, 38 insertions(+), 63 deletions(-) create mode 100644 test/policies/api/nil_class_policy_test.rb diff --git a/app/policies/api/application_policy.rb b/app/policies/api/application_policy.rb index 3d7d9b7f873..15b57a4bb8e 100644 --- a/app/policies/api/application_policy.rb +++ b/app/policies/api/application_policy.rb @@ -7,10 +7,6 @@ def initialize(api_key, scope) @scope = scope end - def resolve - raise NotImplementedError, "You must define #resolve in #{self.class}" - end - private attr_reader :api_key, :scope diff --git a/app/policies/api/nil_class_policy.rb b/app/policies/api/nil_class_policy.rb index 820bb9d6e89..f9718480442 100644 --- a/app/policies/api/nil_class_policy.rb +++ b/app/policies/api/nil_class_policy.rb @@ -6,6 +6,6 @@ def resolve end def destroy? - false + deny t(:forbidden) end end diff --git a/app/policies/application_policy.rb b/app/policies/application_policy.rb index 45051f2f443..d7bf716f226 100644 --- a/app/policies/application_policy.rb +++ b/app/policies/application_policy.rb @@ -9,10 +9,6 @@ def initialize(user, scope) @scope = scope end - def resolve - raise NotImplementedError, "You must define #resolve in #{self.class}" - end - private attr_reader :user, :scope @@ -26,38 +22,6 @@ def initialize(user, record) @error = nil end - def index? - false - end - - def show? - false - end - - def create? - false - end - - def new? - create? - end - - def update? - false - end - - def edit? - update? - end - - def destroy? - false - end - - def search? - index? - end - private delegate :t, to: I18n diff --git a/app/policies/rubygem_policy.rb b/app/policies/rubygem_policy.rb index 41d761d014c..8c23df1c0d0 100644 --- a/app/policies/rubygem_policy.rb +++ b/app/policies/rubygem_policy.rb @@ -8,22 +8,10 @@ class Scope < ApplicationPolicy::Scope alias rubygem record delegate :organization, to: :rubygem - def show? - true - end - def create? user.present? end - def update? - false - end - - def destroy? - false - end - def configure_oidc? rubygem_owned_by_with_role?(user, minimum_required_role: :owner, minimum_required_org_role: :admin) end diff --git a/test/policies/api/nil_class_policy_test.rb b/test/policies/api/nil_class_policy_test.rb new file mode 100644 index 00000000000..3472f8c9147 --- /dev/null +++ b/test/policies/api/nil_class_policy_test.rb @@ -0,0 +1,21 @@ +require "test_helper" + +class Api::NilClassPolicyTest < ApiPolicyTestCase + def policy!(api_key) + Pundit.policy!(api_key, [:api, nil]) + end + + context "::Scope.resolve" do + should "raise" do + assert_raises Pundit::NotDefinedError do + Api::NilClassPolicy::Scope.new(nil, nil).resolve + end + end + end + + context "#destroy?" do + should "not be authorized" do + refute_authorized policy!(nil), :destroy?, "Forbidden" + end + end +end diff --git a/test/policies/membership_policy_test.rb b/test/policies/membership_policy_test.rb index cc3e3465a3c..39a383f707e 100644 --- a/test/policies/membership_policy_test.rb +++ b/test/policies/membership_policy_test.rb @@ -96,26 +96,24 @@ def policy!(user, record = Membership) context "removing owner" do should "be authorized for org owners only" do membership = create(:membership, :owner, organization: @organization) - membership.role = :admin - assert_authorized policy!(@owner, membership), :update? + assert_authorized policy!(@owner, membership), :destroy? - refute_authorized policy!(@admin, membership), :update? - refute_authorized policy!(@maintainer, membership), :update? - refute_authorized policy!(@guest, membership), :update? + refute_authorized policy!(@admin, membership), :destroy? + refute_authorized policy!(@maintainer, membership), :destroy? + refute_authorized policy!(@guest, membership), :destroy? end end context "removing admin" do should "be authorized for org admins and owners" do membership = create(:membership, :admin, organization: @organization) - membership.role = :maintainer - assert_authorized policy!(@owner, membership), :update? - assert_authorized policy!(@admin, membership), :update? + assert_authorized policy!(@owner, membership), :destroy? + assert_authorized policy!(@admin, membership), :destroy? - refute_authorized policy!(@maintainer, membership), :update? - refute_authorized policy!(@guest, membership), :update? + refute_authorized policy!(@maintainer, membership), :destroy? + refute_authorized policy!(@guest, membership), :destroy? end end end diff --git a/test/policies/rubygem_policy_test.rb b/test/policies/rubygem_policy_test.rb index 4979fa27697..505dc93a4fd 100644 --- a/test/policies/rubygem_policy_test.rb +++ b/test/policies/rubygem_policy_test.rb @@ -33,6 +33,14 @@ def org_policy!(user) Pundit.policy!(user, @org_rubygem) end + context "#create?" do + should "allow users" do + assert_authorized policy!(@owner), :create? + assert_authorized policy!(@user), :create? + refute_authorized policy!(nil), :create? + end + end + context "#configure_oidc?" do should "only allow the owner" do assert_authorized policy!(@owner), :configure_oidc? From b414e83195b5c15e9779972e4151e921da96373d Mon Sep 17 00:00:00 2001 From: Martin Emde Date: Wed, 20 Nov 2024 13:27:55 -0800 Subject: [PATCH 14/28] Allow owners of fully yanked gems to access some sidebar controls (#5260) Access to control of ownership, trusted publishers, etc is still important so that new versions of the gem can be pushed. --- app/helpers/rubygems_helper.rb | 2 +- app/views/rubygems/_aside_yanked.html.erb | 23 +++++++++++++++++++++ app/views/rubygems/show_yanked.html.erb | 2 ++ config/locales/en.yml | 4 ++-- test/integration/rubygems_test.rb | 25 +++++++++++++++++++++++ 5 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 app/views/rubygems/_aside_yanked.html.erb diff --git a/app/helpers/rubygems_helper.rb b/app/helpers/rubygems_helper.rb index a6f2db4279c..d652cb01316 100644 --- a/app/helpers/rubygems_helper.rb +++ b/app/helpers/rubygems_helper.rb @@ -56,7 +56,7 @@ def unsubscribe_link(rubygem) link_to t("rubygems.aside.links.unsubscribe"), rubygem_subscription_path(rubygem.slug), class: [:toggler, "gem__link", "t-list__item", style], id: "unsubscribe", - method: :delete, remote: true + method: :delete end def change_diff_link(rubygem, latest_version) diff --git a/app/views/rubygems/_aside_yanked.html.erb b/app/views/rubygems/_aside_yanked.html.erb new file mode 100644 index 00000000000..8f38d52e008 --- /dev/null +++ b/app/views/rubygems/_aside_yanked.html.erb @@ -0,0 +1,23 @@ +
+ <% if @adoption %> + <%= link_to "adoption", rubygem_adoptions_path(@rubygem.slug), class: "adoption__tag" %> + <% end %> + + <% if @rubygem.metadata_mfa_required? %> +

+ <%= t('.requires_mfa') %>: + + true + +

+ <% end %> +
+ <%= unsubscribe_link(@rubygem) %> + <%= ownership_link(@rubygem) if policy(@rubygem).show_unconfirmed_ownerships? %> + <%= rubygem_trusted_publishers_link(@rubygem) if policy(@rubygem).configure_trusted_publishers? %> + <%= oidc_api_key_role_links(@rubygem) if policy(@rubygem).configure_oidc? %> + <%= resend_owner_confirmation_link(@rubygem) if @rubygem.unconfirmed_ownership?(current_user) %> + <%= rubygem_adoptions_link(@rubygem) if policy(@rubygem).show_adoption? %> + <%= rubygem_security_events_link(@rubygem) if policy(@rubygem).show_events? %> +
+
diff --git a/app/views/rubygems/show_yanked.html.erb b/app/views/rubygems/show_yanked.html.erb index 61b2755fa1a..c48eede221f 100644 --- a/app/views/rubygems/show_yanked.html.erb +++ b/app/views/rubygems/show_yanked.html.erb @@ -19,4 +19,6 @@ <%= render partial: "rubygems/gem_members", locals: { latest_version: @latest_version, rubygem: @rubygem } %> <% end %> + + <%= render "rubygems/aside_yanked" %> diff --git a/config/locales/en.yml b/config/locales/en.yml index d88cefe17e9..ae765c2669b 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -739,8 +739,8 @@ en: show_yanked: not_hosted_notice: This gem is not currently hosted on RubyGems.org. Yanked versions of this gem may already exist. reserved_namespace_html: - one: This gem previously existed, but has been removed by its owner. The RubyGems.org team has reserved this gem name for 1 more day. After that time is up, anyone will be able to claim this gem name using gem push.
If you are the previous owner of this gem, you can change ownership of this gem using the gem owner command. You can also create new versions of this gem using gem push. - other: This gem previously existed, but has been removed by its owner. The RubyGems.org team has reserved this gem name for %{count} more days. After that time is up, anyone will be able to claim this gem name using gem push.
If you are the previous owner of this gem, you can change ownership of this gem using the gem owner command. You can also create new versions of this gem using gem push. + one: This gem previously existed, but has been removed by its owner. The RubyGems.org team has reserved this gem name for 1 more day. After that time is up, anyone will be able to claim this gem name using gem push.

If you are the previous owner of this gem, you can change ownership of this gem using the gem owner command or create new versions of this gem using gem push. + other: This gem previously existed, but has been removed by its owner. The RubyGems.org team has reserved this gem name for %{count} more days. After that time is up, anyone will be able to claim this gem name using gem push.

If you are the previous owner of this gem, you can change ownership of this gem using the gem owner command or create new versions of this gem using gem push. security_events: title: Security Events description_html: "This page shows the security events that have occurred on %{gem}. If you see any suspicious activity, please contact support." diff --git a/test/integration/rubygems_test.rb b/test/integration/rubygems_test.rb index 1fc945eed7e..4ec6796efa7 100644 --- a/test/integration/rubygems_test.rb +++ b/test/integration/rubygems_test.rb @@ -28,4 +28,29 @@ class RubygemsTest < ActionDispatch::IntegrationTest assert page.has_content? "Provenance" end + + test "GET to show for a fully yanked gem as owner" do + user = create(:user, remember_token_expires_at: Gemcutter::REMEMBER_FOR.from_now) + rubygem = create(:rubygem, owners: [user], number: "1.0.0", created_at: 2.months.ago) + version = rubygem.versions.sole + user.deletions.create!(version:) + rubygem.reload + + assert_predicate rubygem.public_versions.to_a, :empty? + + get "/gems/#{rubygem.name}" + + assert page.has_content? "This gem previously existed, but has been removed by its owner." + refute page.has_link? "Owners" + refute page.has_link? "Trusted publishers" + refute page.has_link? "Security Events" + + post session_path(session: { who: user.handle, password: PasswordHelpers::SECURE_TEST_PASSWORD }) + + get "/gems/#{rubygem.name}" + + assert page.has_link? "Owners" + assert page.has_link? "Trusted publishers" + assert page.has_link? "Security Events" + end end From 323bbc577d66772362222cb932de00ce40808f8d Mon Sep 17 00:00:00 2001 From: Colby Swandale <996377+colby-swandale@users.noreply.github.com> Date: Wed, 20 Nov 2024 15:11:03 +1100 Subject: [PATCH 15/28] Update whitesource to mend.io --- app/assets/stylesheets/modules/footer.css | 4 ++-- app/views/layouts/application.html.erb | 2 +- public/sponsors.png | Bin 71257 -> 78816 bytes 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/assets/stylesheets/modules/footer.css b/app/assets/stylesheets/modules/footer.css index b544f3fc0cc..077499ad70b 100644 --- a/app/assets/stylesheets/modules/footer.css +++ b/app/assets/stylesheets/modules/footer.css @@ -96,8 +96,8 @@ background-position: 0 -717px; } .footer__sponsor__domainr { background-position: 0 -804px; } - .footer__sponsor__whitesource { - background-position: 0 -885px; } + .footer__sponsor__mend { + background-position: 0 -895px; } .footer__sponsor__logo { margin-top: 5px; diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 0c4f46be8b1..aa3422566f8 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -195,7 +195,7 @@ <%= t("layouts.application.footer.verified_by") %> Domainr - + <%= t("layouts.application.footer.secured_by") %> Whitesource diff --git a/public/sponsors.png b/public/sponsors.png index 867acc4296b8a1524120eb557666fedb80236b63..2d925845ca4f24155c1f56700a3cdf31239e444e 100644 GIT binary patch literal 78816 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%0Akm8Mbxq1jA%D#B7)RfczsYBm?fPHDIbn@ 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

t&0}JT_v1{>sBA3T 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 literal 71257 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 From 661b582083287c7a50e57bad549d2d4cb53b1305 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Nov 2024 21:56:05 +0000 Subject: [PATCH 16/28] Bump github/codeql-action from 3.27.4 to 3.27.5 (#5264) --- .github/workflows/codeql.yml | 6 +++--- .github/workflows/scorecards.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 7b2938fd879..44311095392 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -45,7 +45,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4 + uses: github/codeql-action/init@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -58,7 +58,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4 + uses: github/codeql-action/autobuild@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 # ℹ️ Command-line programs to run using the OS shell. # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun @@ -71,6 +71,6 @@ jobs: # ./location_of_script_within_repo/buildscript.sh - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4 + uses: github/codeql-action/analyze@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 with: category: "/language:${{matrix.language}}" diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml index 77d45a51c4d..168058dfbb3 100644 --- a/.github/workflows/scorecards.yml +++ b/.github/workflows/scorecards.yml @@ -67,6 +67,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4 + uses: github/codeql-action/upload-sarif@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 with: sarif_file: results.sarif From 8b0adff4420c78c33aaf52683398a86caeca8c64 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Nov 2024 21:56:15 +0000 Subject: [PATCH 17/28] Bump codecov/codecov-action from 5.0.4 to 5.0.7 (#5265) --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9111fbfef27..66bf812f8df 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -72,6 +72,6 @@ jobs: - name: Upload coverage to Codecov if: matrix.rubygems.name == 'locked' && (success() || failure()) - uses: codecov/codecov-action@985343d70564a82044c1b7fcb84c2fa05405c1a2 # v5.0.4 + uses: codecov/codecov-action@015f24e6818733317a2da2edd6290ab26238649a # v5.0.7 env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} From 9f4b969fb9260ee9dbe5e4c16b7bad97c2d939ac Mon Sep 17 00:00:00 2001 From: Martin Emde Date: Thu, 21 Nov 2024 17:39:55 -0800 Subject: [PATCH 18/28] Organizations CRUD actions, org gems views (#5187) --- app/assets/images/icons.svg | 2 +- .../organizations/gems_controller.rb | 22 +++++ app/controllers/organizations_controller.rb | 47 +++++++++- app/models/organization.rb | 12 +++ app/policies/organization_policy.rb | 2 + .../components/card/timeline_component.rb | 38 +++++++- app/views/components/card_component.rb | 20 ++--- app/views/dashboards/_subject.html.erb | 66 +++++++------- app/views/dashboards/show.html.erb | 20 ++--- .../layouts/hammy_component_preview.html.erb | 34 +++++++ app/views/organizations/_subject.html.erb | 25 ++++++ app/views/organizations/edit.html.erb | 26 ++++++ app/views/organizations/gems/index.html.erb | 41 +++++++++ app/views/organizations/index.html.erb | 34 +++++++ app/views/organizations/show.html.erb | 90 +++++++++++++++++++ app/views/subscriptions/index.html.erb | 34 +++---- config/initializers/better_html.rb | 4 +- config/initializers/lookbook.rb | 15 ++++ config/locales/de.yml | 12 +++ config/locales/en.yml | 12 +++ config/locales/es.yml | 12 +++ config/locales/fr.yml | 12 +++ config/locales/ja.yml | 12 +++ config/locales/nl.yml | 12 +++ config/locales/pt-BR.yml | 12 +++ config/locales/zh-CN.yml | 12 +++ config/locales/zh-TW.yml | 12 +++ config/routes.rb | 4 +- .../previews/alert_component_preview.rb | 12 +++ .../previews/button_component_preview.rb | 60 +++++++++++++ .../card/timeline_component_preview.rb | 35 ++++++++ .../previews/card_component_preview.rb | 56 ++++++++++++ test/integration/i18n_test.rb | 4 +- test/integration/organizations/gems_test.rb | 25 ++++++ test/integration/organizations_test.rb | 62 +++++++++++++ test/views/card/timeline_component_test.rb | 16 ++++ test/views/card_component_test.rb | 44 +++++++++ 37 files changed, 878 insertions(+), 80 deletions(-) create mode 100644 app/controllers/organizations/gems_controller.rb create mode 100644 app/views/layouts/hammy_component_preview.html.erb create mode 100644 app/views/organizations/_subject.html.erb create mode 100644 app/views/organizations/edit.html.erb create mode 100644 app/views/organizations/gems/index.html.erb create mode 100644 app/views/organizations/index.html.erb create mode 100644 app/views/organizations/show.html.erb create mode 100644 test/components/previews/alert_component_preview.rb create mode 100644 test/components/previews/button_component_preview.rb create mode 100644 test/components/previews/card/timeline_component_preview.rb create mode 100644 test/components/previews/card_component_preview.rb create mode 100644 test/integration/organizations/gems_test.rb create mode 100644 test/integration/organizations_test.rb create mode 100644 test/views/card/timeline_component_test.rb create mode 100644 test/views/card_component_test.rb diff --git a/app/assets/images/icons.svg b/app/assets/images/icons.svg index f261c13645c..981a3294875 100644 --- a/app/assets/images/icons.svg +++ b/app/assets/images/icons.svg @@ -6,7 +6,7 @@ - + diff --git a/app/controllers/organizations/gems_controller.rb b/app/controllers/organizations/gems_controller.rb new file mode 100644 index 00000000000..463f0c77adb --- /dev/null +++ b/app/controllers/organizations/gems_controller.rb @@ -0,0 +1,22 @@ +class Organizations::GemsController < ApplicationController + before_action :redirect_to_signin, unless: :signed_in? + before_action :redirect_to_new_mfa, if: :mfa_required_not_yet_enabled? + before_action :redirect_to_settings_strong_mfa_required, if: :mfa_required_weak_level_enabled? + + before_action :find_organization, only: %i[index] + + layout "subject" + + # GET /organizations/organization_id/gems + + def index + @gems = @organization.rubygems.with_versions.by_downloads.preload(:most_recent_version, :gem_download).load_async + @gems_count = @organization.rubygems.with_versions.count + end + + private + + def find_organization + @organization = Organization.find_by_handle!(params[:organization_id]) + end +end diff --git a/app/controllers/organizations_controller.rb b/app/controllers/organizations_controller.rb index 8ea9cb0e87b..e573f9ca907 100644 --- a/app/controllers/organizations_controller.rb +++ b/app/controllers/organizations_controller.rb @@ -1,10 +1,55 @@ class OrganizationsController < ApplicationController + before_action :redirect_to_signin, only: :index, unless: :signed_in? + before_action :redirect_to_new_mfa, only: :index, if: :mfa_required_not_yet_enabled? + before_action :redirect_to_settings_strong_mfa_required, only: :index, if: :mfa_required_weak_level_enabled? + + before_action :find_organization, only: %i[show edit update] + + layout "subject" + + # GET /organizations + def index + @memberships = current_user.memberships.includes(:organization) + end + + # GET /organizations/1 def show - render plain: flash[:notice] # HACK: for tests until this view is ready + @latest_events = [] # @organization.latest_events + @gems = @organization + .rubygems + .with_versions + .by_downloads + .preload(:most_recent_version, :gem_download) + .load_async + @gems_count = @organization.rubygems.with_versions.count + @memberships = @organization.memberships + @memberships_count = @organization.memberships.count + end + + def edit + add_breadcrumb t("breadcrumbs.org_name", name: @organization.handle), organization_path(@organization) + add_breadcrumb t("breadcrumbs.settings") + + authorize @organization + end + + def update + authorize @organization + + if @organization.update(organization_params) + redirect_to organization_path(@organization) + else + render :edit + end end private + def find_organization + @organization = Organization.find_by_handle!(params.permit(:id).require(:id)) + end + def organization_params + params.permit(organization: [:name]).require(:organization) end end diff --git a/app/models/organization.rb b/app/models/organization.rb index 1e6560d26a9..a9836df0c43 100644 --- a/app/models/organization.rb +++ b/app/models/organization.rb @@ -20,4 +20,16 @@ class Organization < ApplicationRecord after_create do record_event!(Events::OrganizationEvent::CREATED, actor_gid: memberships.first&.to_gid) end + + def self.find_by_handle(handle) + find_by("lower(handle) = lower(?)", handle) + end + + def self.find_by_handle!(handle) + find_by_handle(handle) || raise(ActiveRecord::RecordNotFound) + end + + def to_param + handle + end end diff --git a/app/policies/organization_policy.rb b/app/policies/organization_policy.rb index 2dc35c3e1c6..8e2ac10e100 100644 --- a/app/policies/organization_policy.rb +++ b/app/policies/organization_policy.rb @@ -12,6 +12,8 @@ def update? organization_member_with_role?(user, :owner) || deny(t(:forbidden)) end + alias edit? update? + def create? true end diff --git a/app/views/components/card/timeline_component.rb b/app/views/components/card/timeline_component.rb index 7f7ec86885e..47dcea1bdd8 100644 --- a/app/views/components/card/timeline_component.rb +++ b/app/views/components/card/timeline_component.rb @@ -2,10 +2,11 @@ class Card::TimelineComponent < ApplicationComponent include Phlex::Rails::Helpers::LinkTo + include Phlex::Rails::Helpers::ImageTag include Phlex::Rails::Helpers::TimeAgoInWords def view_template(&) - div(class: "flex grow ml-2 md:-ml-2 border-l-2 border-neutral-300") do + div(class: "flex grow ml-2 border-l-2 border-neutral-300") do div(class: "flex flex-col grow -mt-2", &) end end @@ -19,12 +20,43 @@ def timeline_item(datetime, user_link = nil, &) # Content div(class: "flex-1 flex-col ml-5 md:ml-7 pb-4 border-b border-neutral-300 dark:border-neutral-700") do div(class: "flex items-center justify-between") do - span(class: "text-b3 text-neutral-600") { t("time_ago", duration: time_ago_in_words(datetime)) } - span(class: "text-b3 text-neutral-800") { user_link } if user_link + span(class: "text-b3 text-neutral-600") do + helpers.local_time_ago(datetime, class: "text-b3 text-neutral-600") + end + span(class: "text-b3 text-neutral-800 dark:text-white max-h-6") { user_link } if user_link end div(class: "flex flex-wrap w-full items-center justify-between", &) end end end + + def link_to_user(user) + link_to(profile_path(user.display_id), alt: user.display_handle, title: user.display_handle, class: "flex items-center") do + span(class: "w-6 h-6 inline-block mr-2 rounded") { helpers.avatar(48, "gravatar-#{user.id}", user) } + span { user.display_handle } + end + end + + def link_to_api_key(api_key_owner) + case api_key_owner + when OIDC::TrustedPublisher::GitHubAction + div(class: "flex items-center") do + span(class: "w-6 h-6 inline-block mr-2 rounded") do + image_tag "github_icon.png", width: 48, height: 48, theme: :light, alt: "GitHub", title: api_key_owner.name + end + span { "GitHub Actions" } + end + else + raise ArgumentError, "unknown api_key_owner type #{api_key_owner.class}" + end + end + + def link_to_pusher(version) + if version.pusher.present? + link_to_user(version.pusher) + elsif version.pusher_api_key&.owner.present? + link_to_api_key(version.pusher_api_key.owner) + end + end end diff --git a/app/views/components/card_component.rb b/app/views/components/card_component.rb index fec79c3f747..7858d1664bc 100644 --- a/app/views/components/card_component.rb +++ b/app/views/components/card_component.rb @@ -27,16 +27,6 @@ def title(title, icon: nil, count: nil) end end - def with_list(items, &) - list do - items.each do |item| - list_item do - yield(item) - end - end - end - end - def list(**options, &) options[:class] = "#{options[:class]} -mx-4" ul(**options, &) @@ -49,7 +39,9 @@ def divided_list(**options, &) def list_item(**options, &) options[:class] = "#{options[:class]} #{LIST_ITEM_CLASSES}" - li(**options, &) + li do + div(**options, &) + end end def list_item_to(url = nil, **options, &) @@ -65,9 +57,9 @@ def list_item_to(url = nil, **options, &) # removes padding inside the "content" area of the card so scroll bar and overflaw appear correctly # adds a border to the top of the scrollable area to explain the content being hidden on scroll def scrollable(**options, &) - options[:class] = "#{options[:class]} lg:max-h-96 lg:overflow-y-auto" - options[:class] << " -mx-4 -mb-6 md:-mx-10 md:-mb-10" - options[:class] << " border-t border-neutral-200 dark:border-neutral-800" + options[:class] = "#{options[:class]} lg:max-h-96 lg:overflow-y-auto " \ + "-mx-4 -mb-6 md:-mx-10 md:-mb-10 " \ + "border-t border-neutral-200 dark:border-neutral-800" div(**options) do div(class: "px-4 pt-6 md:px-10 md:pt-10", &) end diff --git a/app/views/dashboards/_subject.html.erb b/app/views/dashboards/_subject.html.erb index 64981449be9..b7efadc3565 100644 --- a/app/views/dashboards/_subject.html.erb +++ b/app/views/dashboards/_subject.html.erb @@ -1,42 +1,46 @@ -<% - user ||= @user || current_user - current ||= :dashboard -%> +<%# locals: (user:, current:) -%> -

- <%= avatar 328, "user_gravatar", theme: :dark, class: "h-24 w-24 lg:h-40 lg:w-40 rounded-lg object-cover mr-4" %> +
+
+ <%= avatar 328, "user_gravatar", theme: :dark, class: "h-24 w-24 lg:h-40 lg:w-40 rounded-lg object-cover mr-4" %> -
-

<%= user.display_handle %>

- <% if user.full_name.present? %> -

<%= user.full_name %>

- <% end %> +
+

<%= user.display_handle %>

+ <% if user.full_name.present? %> +

<%= user.full_name %>

+ <% end %> +
-
-<% if user.public_email? || user == current_user %> -
- <%= icon_tag("mail", color: :primary, class: "h-6 w-6 text-orange mr-3") %> -

<%= - mail_to(user.email, encode: "hex") - %>

-
-<% end %> + <% if user.public_email? || user == current_user %> +
+ <%= icon_tag("mail", color: :primary, class: "h-6 w-6 text-orange mr-3") %> +

<%= + mail_to(user.email, encode: "hex") + %>

+
+ <% end %> -<% if user.twitter_username.present? %> -
- <%= icon_tag("x-twitter", color: :primary, class: "w-6 text-orange mr-3") %> -

<%= - link_to( - twitter_username(user), - twitter_url(user) - ) - %>

-
-<% end %> + <% if user.twitter_username.present? %> +
+ <%= icon_tag("x-twitter", color: :primary, class: "w-6 text-orange mr-3") %> +

<%= + link_to( + twitter_username(user), + twitter_url(user) + ) + %>

+
+ <% end %> +
+ + <%= render Subject::NavComponent.new(current:) do |nav| %> <%= nav.link t("layouts.application.header.dashboard"), dashboard_path, name: :dashboard, icon: "space-dashboard" %> <%= nav.link t("dashboards.show.my_subscriptions"), subscriptions_path, name: :subscriptions, icon: "notifications" %> + <% if current_user.memberships.any? %> + <%= nav.link t("dashboards.show.organizations"), organizations_path, name: :organizations, icon: "organizations" %> + <% end %> <%= nav.link t("layouts.application.header.settings"), edit_settings_path, name: :settings, icon: "settings" %> <% end %> diff --git a/app/views/dashboards/show.html.erb b/app/views/dashboards/show.html.erb index 5cfb8105f25..4037c8537e0 100644 --- a/app/views/dashboards/show.html.erb +++ b/app/views/dashboards/show.html.erb @@ -1,7 +1,7 @@ <% @title = t('.title') %> <% content_for :subject do %> - <% render "dashboards/subject", user: current_user %> + <%= render "dashboards/subject", user: current_user, current: :dashboard %> <% end %> @@ -27,14 +27,7 @@ <%= c.scrollable do %> <%= render Card::TimelineComponent.new do |t| %> <% @latest_updates.each do |version| %> - <% - pusher_link = if version.pusher.present? - link_to_user(version.pusher) - elsif version.pusher_api_key&.owner.present? - link_to_pusher(version.pusher_api_key.owner) - end - %> - <%= t.timeline_item(version.authored_at, pusher_link) do %> + <%= t.timeline_item(version.authored_at, t.link_to_pusher(version)) do %>
<%= link_to version.rubygem.name, rubygem_path(version.rubygem.slug) %>
<%= version_number(version) %> <% end %> @@ -101,9 +94,12 @@ <% end %> <%= c.divided_list do %> <% current_user.memberships.preload(:organization).each do |membership| %> - <%= c.list_item_to("#") do %> -
-

<%= membership.organization.name %>

+ <%= c.list_item_to(organization_path(membership.organization)) do %> +
+
+

<%= membership.organization.name %>

+

<%= membership.organization.handle %>

+

<%= membership.role %>

<% end %> diff --git a/app/views/layouts/hammy_component_preview.html.erb b/app/views/layouts/hammy_component_preview.html.erb new file mode 100644 index 00000000000..7fe2905389b --- /dev/null +++ b/app/views/layouts/hammy_component_preview.html.erb @@ -0,0 +1,34 @@ + + + + <%= page_title %> + + + <%= stylesheet_link_tag("hammy") %> + <%= stylesheet_link_tag("tailwind", "data-turbo-track": "reload") %> + + + <%= yield :head %> + <%= javascript_importmap_tags %> + + +
+ + <% if content_for?(:main) %> + <%= yield :main %> + <% else %> +
+
+ <% flash.each do |name, msg| %> + <%= render AlertComponent.new(style: name, closeable: true) do %> + <%= flash_message(name, msg) %> + <% end %> + <% end %> + + <%= yield %> +
+
+ <% end %> +
+ + diff --git a/app/views/organizations/_subject.html.erb b/app/views/organizations/_subject.html.erb new file mode 100644 index 00000000000..78ed96b9266 --- /dev/null +++ b/app/views/organizations/_subject.html.erb @@ -0,0 +1,25 @@ +<% current ||= :dashboard %> + +
+
+

<%= organization.name %>

+

<%= organization.handle %>

+

+ + <%= icon_tag("organizations", size: 6, class: "-mt-1 -ml-1 mr-1 inline-block") -%><%= t("organizations.show.organization") %> + +

+
+
+ + + +<%= render Subject::NavComponent.new(current:) do |nav| %> + <%= nav.link t("layouts.application.header.dashboard"), organization_path(@organization), name: :dashboard, icon: "space-dashboard" %> + <%= nav.link t("organizations.show.history"), organization_path(@organization), name: :subscriptions, icon: "notifications" %> + <%= nav.link t("organizations.show.gems"), organization_gems_path(@organization), name: :gems, icon: "gems" %> + <%= nav.link t("organizations.show.members"), organization_path(@organization), name: :organizations, icon: "organizations" %> + <% if policy(@organization).edit? %> + <%= nav.link t("layouts.application.header.settings"), edit_organization_path(@organization), name: :settings, icon: "settings" %> + <% end %> +<% end %> diff --git a/app/views/organizations/edit.html.erb b/app/views/organizations/edit.html.erb new file mode 100644 index 00000000000..e8467b4d86a --- /dev/null +++ b/app/views/organizations/edit.html.erb @@ -0,0 +1,26 @@ +<% content_for :subject do %> + <%= render "organizations/subject", organization: @organization, current: :settings %> +<% end %> + +

<%= t("layouts.application.header.settings") %>

+ +<%= render CardComponent.new do |c| %> + <%= c.head do %> + <%= c.title t("layouts.application.header.settings"), icon: "settings" %> + <% end %> + <%= form_with model: @organization, url: organization_path(@organization), method: :patch do |form| %> +
+ <%= form.label :name, "Display Name", class: "block text-b2 font-semibold mb-2" %> + <%= form.text_field( + :name, + class: "w-full text-b2 rounded-lg dark:bg-neutral-950 focus:ring-inset focus:ring-1 focus:ring-orange-500", + required: true, + autocomplete: "organization", + ) %> +
+ +
+ <%= render ButtonComponent.new("Update", type: :submit, style: :outline) %> +
+ <% end %> +<% end %> diff --git a/app/views/organizations/gems/index.html.erb b/app/views/organizations/gems/index.html.erb new file mode 100644 index 00000000000..9b08267a365 --- /dev/null +++ b/app/views/organizations/gems/index.html.erb @@ -0,0 +1,41 @@ +<% + add_breadcrumb t("breadcrumbs.org_name", name: @organization.handle), organization_path(@organization) + add_breadcrumb t("breadcrumbs.gems") +%> + +<% content_for :subject do %> + <%= render "organizations/subject", organization: @organization, current: :gems %> +<% end %> + +

<%= t("organizations.show.gems") %>

+ +<%= render CardComponent.new do |c| %> + <%= c.head do %> + <%= c.title t("organizations.show.gems"), icon: "gems", count: @gems_count %> + <% end %> + <% if @gems.empty? %> + <%= prose do %> + <%= t('organizations.show.no_gems') %> + <% end %> + <% else %> + <%= c.divided_list do %> + <% @gems.each do |rubygem| %> + <%= c.list_item_to( + rubygem_path(rubygem.slug), + title: short_info(rubygem.most_recent_version), + ) do %> +
+
+

<%= rubygem.name %>

+ <%= version_number(rubygem.most_recent_version) %> +
+
+ <%= download_count_component(rubygem, class: "flex") %> +
<%= version_date_component(rubygem.most_recent_version) %>
+
+
+ <% end %> + <% end %> + <% end %> + <% end %> +<% end %> diff --git a/app/views/organizations/index.html.erb b/app/views/organizations/index.html.erb new file mode 100644 index 00000000000..8621c7d0e84 --- /dev/null +++ b/app/views/organizations/index.html.erb @@ -0,0 +1,34 @@ +<% + @title = t('.title') + add_breadcrumb "Dashboard", dashboard_path + add_breadcrumb "Organizations" +%> + +<% content_for :subject do %> + <%= render "dashboards/subject", user: current_user, current: :organizations %> +<% end %> + + +

+ <%= t("dashboards.show.organizations") %> + <% unless @memberships.size.zero? %> + <%= @memberships.size %> + <% end %> +

+ + +<%= render CardComponent.new do |c| %> + <%= c.divided_list do %> + <% @memberships.each do |membership| %> + <%= c.list_item_to(organization_path(membership.organization.handle)) do %> +
+
+

<%= membership.organization.name %>

+

<%= membership.organization.handle %>

+
+

<%= membership.role %>

+
+ <% end %> + <% end %> + <% end %> +<% end %> diff --git a/app/views/organizations/show.html.erb b/app/views/organizations/show.html.erb new file mode 100644 index 00000000000..28ccb45a4e5 --- /dev/null +++ b/app/views/organizations/show.html.erb @@ -0,0 +1,90 @@ +<% add_breadcrumb t("breadcrumbs.org_name", name: @organization.handle) %> + +<% content_for :subject do %> + <%= render "organizations/subject", organization: @organization, current: :dashboard %> +<% end %> + +

<%= t("dashboards.show.title") %>

+ +<%= render CardComponent.new do |c| %> + <%= c.head(divide: true) do %> + <%= c.title t(".history"), icon: :history %> + <% end %> + + <% if @latest_events.empty? %> + <%= prose do %> + <%= t('.no_history') %> + <% end %> + <% else %> + <%= c.scrollable do %> + <%= render Card::TimelineComponent.new do |t| %> + <% @latest_events.each do |version| %> + <% + pusher_link = if version.pusher.present? + link_to_user(version.pusher) + elsif version.pusher_api_key&.owner.present? + link_to_pusher(version.pusher_api_key.owner) + end + %> + <%= t.timeline_item(version.authored_at, pusher_link) do %> +
<%= link_to version.rubygem.name, rubygem_path(version.rubygem.slug) %>
+ <%= version_number(version) %> + <% end %> + <% end %> + <% end %> + <% end %> + <% end %> +<% end %> + +<%= render CardComponent.new do |c| %> + <%= c.head do %> + <%= c.title t(".gems"), icon: "gems", count: @gems_count %> + <% end %> + <% if @gems.empty? %> + <%= prose do %> + <%= t('.no_gems') %> + <% end %> + <% else %> + <%= c.divided_list do %> + <% @gems.each do |rubygem| %> + <%= c.list_item_to( + rubygem_path(rubygem.slug), + title: short_info(rubygem.most_recent_version), + ) do %> +
+
+

<%= rubygem.name %>

+ <%= version_number(rubygem.most_recent_version) %> +
+
+ <%= download_count_component(rubygem, class: "flex") %> +
<%= version_date_component(rubygem.most_recent_version) %>
+
+
+ <% end %> + <% end %> + <% end %> + <% end %> +<% end %> + +<%= render CardComponent.new do |c| %> + <%= c.head do %> + <%= c.title t(".members"), icon: "organizations", count: @memberships_count %> + <% end %> + <% if @memberships.empty? %> + <%= prose do %> + <%= t('.no_members') %> + <% end %> + <% else %> + <%= c.divided_list do %> + <% @memberships.each do |membership| %> + <%= c.list_item_to(profile_path(membership.user.handle)) do %> +
+

<%= membership.user.name %>

+

<%= membership.role %>

+
+ <% end %> + <% end %> + <% end %> + <% end %> +<% end %> diff --git a/app/views/subscriptions/index.html.erb b/app/views/subscriptions/index.html.erb index 77ddebf2171..409d650b171 100644 --- a/app/views/subscriptions/index.html.erb +++ b/app/views/subscriptions/index.html.erb @@ -17,22 +17,26 @@ <%= t("dashboards.show.no_subscriptions_html", :gem_link => link_to(t('dashboards.show.gem_link_text'), rubygem_path("rake"))) %> <% end %> <% else %> - <%= c.with_list(@subscribed_gems) do |gem| %> -
- <%= link_to rubygem_path(gem.slug) do %> -

<%= gem.name %>

-

<%= short_info(gem.most_recent_version) %>

+ <%= c.list do %> + <% @subscribed_gems.each do |gem| %> + <%= c.list_item do %> +
+ <%= link_to rubygem_path(gem.slug) do %> +

<%= gem.name %>

+

<%= short_info(gem.most_recent_version) %>

+ <% end %> + <%= button_to( + rubygem_subscription_path(gem.slug), + method: :delete, + title: t("rubygems.aside.links.unsubscribe"), + class: "h-8 w-8 ml-6 items-center justify-center outline-none -mr-2", + aria: { label: t("rubygems.aside.links.unsubscribe") } + ) do %> + <%= icon_tag "close", class: "w-6 h-6" %> + <% end %> +
<% end %> - <%= button_to( - rubygem_subscription_path(gem.slug), - method: :delete, - title: t("rubygems.aside.links.unsubscribe"), - class: "h-8 w-8 ml-6 items-center justify-center outline-none -mr-2", - aria: { label: t("rubygems.aside.links.unsubscribe") } - ) do %> - <%= icon_tag "close", class: "w-6 h-6" %> - <% end %> -
+ <% end %> <% end %> <% end %> <% end %> diff --git a/config/initializers/better_html.rb b/config/initializers/better_html.rb index 3eb5dc80cfe..37363b02b71 100644 --- a/config/initializers/better_html.rb +++ b/config/initializers/better_html.rb @@ -1,5 +1,7 @@ BetterHtml.configure do |config| config.template_exclusion_filter = proc { |filename| - filename.include?("avo") || filename.include?("/railties-") + filename.include?("avo") || + filename.include?("/railties-") || + filename.include?("lookbook-") } end diff --git a/config/initializers/lookbook.rb b/config/initializers/lookbook.rb index 47f5fba85cf..83e88a99f8f 100644 --- a/config/initializers/lookbook.rb +++ b/config/initializers/lookbook.rb @@ -1 +1,16 @@ Rails.application.config.lookbook.preview_layout = "component_preview" if Rails.env.local? + +if Rails.env.development? + module Lookbook::PreviewOverrides + # see https://github.com/ViewComponent/lookbook/issues/584 + def render(component = nil, **args, &block) + if block + super { component.instance_exec component, &block } + else + super + end + end + end + + Rails.application.configure { Lookbook::Preview.prepend Lookbook::PreviewOverrides } +end diff --git a/config/locales/de.yml b/config/locales/de.yml index 66e603971e6..b4f178cef70 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -296,6 +296,8 @@ de: settings: Einstellungen org_name: 'Organisation: %{name}' subscriptions: Abonnements + gems: + members: mailer: confirm_your_email: Bitte bestätigen Sie Ihre E-Mail-Adresse mit dem Link, der an Ihre E-Mail gesendet wurde. @@ -466,6 +468,16 @@ de: popular_gems: Beliebte Gems popular: title: Neue Veröffentlichungen — Beliebte Gems + organizations: + index: + title: + show: + organization: + gems: + history: + members: + no_history: + no_gems: pages: about: contributors_amount: "%{count} Rubyists" diff --git a/config/locales/en.yml b/config/locales/en.yml index ae765c2669b..0a7860a919c 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -282,6 +282,8 @@ en: settings: Settings org_name: "Org: %{name}" subscriptions: Subscriptions + gems: Gems + members: Members mailer: confirm_your_email: Please confirm your email address with the link sent to your email. confirmation_subject: Please confirm your email address with %{host} @@ -416,6 +418,16 @@ en: popular_gems: Popular Gems popular: title: New Releases — Popular Gems + organizations: + index: + title: Organizations + show: + organization: Organization + gems: Gems + history: History + members: Members + no_history: No events yet + no_gems: No gems yet pages: about: contributors_amount: "%{count} Rubyists" diff --git a/config/locales/es.yml b/config/locales/es.yml index ee7e6a0d528..db31e6a96e9 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -295,6 +295,8 @@ es: settings: Configuración org_name: 'Org: %{name}' subscriptions: Suscripciones + gems: + members: mailer: confirm_your_email: Por favor confirma tu dirección de correo con el enlace enviado. confirmation_subject: Por favor confirma tu dirección de correo con %{host} @@ -457,6 +459,16 @@ es: popular_gems: Gemas más populares popular: title: Nuevos lanzamientos — Gemas más populares + organizations: + index: + title: + show: + organization: + gems: + history: + members: + no_history: + no_gems: pages: about: contributors_amount: "%{count} Rubystas" diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 612d974d890..b5a87ed326f 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -287,6 +287,8 @@ fr: settings: Paramètres org_name: 'Org: %{name}' subscriptions: Abonnements + gems: + members: mailer: confirm_your_email: Veuillez confirmer votre adresse email avec le lien qui vous a été envoyé par email. @@ -422,6 +424,16 @@ fr: popular_gems: Gems populaires popular: title: Nouvelles Versions - Gems populaires + organizations: + index: + title: + show: + organization: + gems: + history: + members: + no_history: + no_gems: pages: about: contributors_amount: diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 017c949cf28..cc43432f515 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -277,6 +277,8 @@ ja: settings: 設定 org_name: 組織:%{name} subscriptions: 購読 + gems: + members: mailer: confirm_your_email: Eメールに送信されたリンクからEメールアドレスを確認してください。 confirmation_subject: "%{host}に登録されたメールアドレスを確認してください" @@ -416,6 +418,16 @@ ja: popular_gems: 人気のgem popular: title: 新しいリリース - 人気のgem + organizations: + index: + title: + show: + organization: + gems: + history: + members: + no_history: + no_gems: pages: about: contributors_amount: "%{count}人以上のRubyist" diff --git a/config/locales/nl.yml b/config/locales/nl.yml index e290c8869b8..4d12bdc8de0 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -278,6 +278,8 @@ nl: settings: Instellingen org_name: 'Organisatie: %{name}' subscriptions: Abonnementen + gems: + members: mailer: confirm_your_email: confirmation_subject: @@ -406,6 +408,16 @@ nl: popular_gems: popular: title: + organizations: + index: + title: + show: + organization: + gems: + history: + members: + no_history: + no_gems: pages: about: contributors_amount: diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index ce8a03c68ae..5aa7ccc65c5 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -284,6 +284,8 @@ pt-BR: settings: Configurações da Conta org_name: 'Org: %{name}' subscriptions: Observando + gems: + members: mailer: confirm_your_email: Por favor, confirme seu endereço de email através do link que enviamos para o seu endereço de email. @@ -419,6 +421,16 @@ pt-BR: popular_gems: Gems Populares popular: title: Novos Releases - Gems Populares + organizations: + index: + title: + show: + organization: + gems: + history: + members: + no_history: + no_gems: pages: about: contributors_amount: diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 0e707dafd0c..b8de0c284b4 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -277,6 +277,8 @@ zh-CN: settings: 设置 org_name: 组织:%{name} subscriptions: 订阅 + gems: + members: mailer: confirm_your_email: 请在发送到您的邮件中点击链接,确认您的邮箱地址。 confirmation_subject: 请确认您的邮箱地址 @@ -420,6 +422,16 @@ zh-CN: popular_gems: 热门 Gem popular: title: 新的发布 — 热门 Gem + organizations: + index: + title: + show: + organization: + gems: + history: + members: + no_history: + no_gems: pages: about: contributors_amount: diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index c0962e266f1..e5153572d9b 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -276,6 +276,8 @@ zh-TW: settings: 設定 org_name: 組織:%{name} subscriptions: 訂閱 + gems: + members: mailer: confirm_your_email: 已寄送連結,請點擊連結來確認您的電子郵件地址。 confirmation_subject: "%{host} 電子郵件地址確認" @@ -412,6 +414,16 @@ zh-TW: popular_gems: 熱門 popular: title: 熱門新發佈 + organizations: + index: + title: + show: + organization: + gems: + history: + members: + no_history: + no_gems: pages: about: contributors_amount: "%{count} 位 Ruby 愛好者" diff --git a/config/routes.rb b/config/routes.rb index e99f9cd795c..7207d02133b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -288,7 +288,9 @@ patch "confirm", to: "confirm#update" end end - resources :organizations, only: %i[show], constraints: { id: Patterns::ROUTE_PATTERN } + resources :organizations, only: %i[index show edit update], constraints: { id: Patterns::ROUTE_PATTERN } do + resources :gems, only: :index, controller: 'organizations/gems' + end end ################################################################################ diff --git a/test/components/previews/alert_component_preview.rb b/test/components/previews/alert_component_preview.rb new file mode 100644 index 00000000000..f95aa5bf072 --- /dev/null +++ b/test/components/previews/alert_component_preview.rb @@ -0,0 +1,12 @@ +class AlertComponentPreview < Lookbook::Preview + layout "hammy_component_preview" + + # @param content text "content" + # @param style select "style", { choices: [notice, alert, error, success, primary, neutral] } + # @param closeable toggle "closeable" + def default(content = "Example content", style: :notice, closeable: false) + render AlertComponent.new(style:, closeable:) do + content + end + end +end diff --git a/test/components/previews/button_component_preview.rb b/test/components/previews/button_component_preview.rb new file mode 100644 index 00000000000..2c48968e2e1 --- /dev/null +++ b/test/components/previews/button_component_preview.rb @@ -0,0 +1,60 @@ +class ButtonComponentPreview < Lookbook::Preview + layout "hammy_component_preview" + + # @param text text "text" + # @param url url "link" + # @param type select "type", { choices: [button, link, submit] } + # @param color select "color", { choices: [primary, secondary, red, orange, hammy, yellow, green, blue, neutral] } + # @param size select "size", { choices: [small, large] } + # @param style select "style", { choices: [fill, outline, plain] } + # @param disabled toggle "disabled" + def default(text: "Button", url: "", type: :button, color: :primary, size: :large, style: :fill, disabled: false) # rubocop:disable Metrics/ParameterLists + args = [text, url].compact_blank + render ButtonComponent.new( + *args, + type: type, + color: color, + size: size, + style: style, + disabled: disabled + ) + end + + # @param text text "text" + # @param url url "link" + # @param type select "type", { choices: [button, link, submit] } + # @param color select "color", { choices: [primary, secondary, red, orange, hammy, yellow, green, blue, neutral] } + # @param size select "size", { choices: [small, large] } + # @param style select "style", { choices: [fill, outline, plain] } + # @param disabled toggle "disabled" + def outline(text: "Button", url: "", type: :button, color: :primary, size: :large, style: :outline, disabled: false) # rubocop:disable Metrics/ParameterLists + args = [text, url].compact_blank + render ButtonComponent.new( + *args, + type: type, + color: color, + size: size, + style: style, + disabled: disabled + ) + end + + # @param text text "text" + # @param url url "link" + # @param type select "type", { choices: [button, link, submit] } + # @param color select "color", { choices: [primary, secondary, red, orange, hammy, yellow, green, blue, neutral] } + # @param size select "size", { choices: [small, large] } + # @param style select "style", { choices: [fill, outline, plain] } + # @param disabled toggle "disabled" + def plain(text: "Button", url: "", type: :button, color: :primary, size: :large, style: :plain, disabled: false) # rubocop:disable Metrics/ParameterLists + args = [text, url].compact_blank + render ButtonComponent.new( + *args, + type: type, + color: color, + size: size, + style: style, + disabled: disabled + ) + end +end diff --git a/test/components/previews/card/timeline_component_preview.rb b/test/components/previews/card/timeline_component_preview.rb new file mode 100644 index 00000000000..117fd4af9e0 --- /dev/null +++ b/test/components/previews/card/timeline_component_preview.rb @@ -0,0 +1,35 @@ +class Card::TimelineComponentPreview < Lookbook::Preview + layout "hammy_component_preview" + + # @param datetime datetime-local "datetime" + # @param user_link url "user link" + # @param content text "content" + def default(datetime: 1.day.ago, user_link: nil, content: nil) + block = proc { content } if content + + render CardComponent.new do |c| + c.head("Timeline", icon: "history") + c.scrollable do + render Card::TimelineComponent.new do |t| + t.timeline_item(datetime, user_link, &block) + end + end + end + end + + def with_content(datetime: 1.day.ago, user_link: nil) + render CardComponent.new do |c| + c.head("Timeline", icon: "history") + c.scrollable do + render Card::TimelineComponent.new do |t| + t.timeline_item(datetime, user_link) do + <<~HTML.html_safe # rubocop:disable Rails/OutputSafety +
+ 1.63.1 + HTML + end + end + end + end + end +end diff --git a/test/components/previews/card_component_preview.rb b/test/components/previews/card_component_preview.rb new file mode 100644 index 00000000000..417febf5c74 --- /dev/null +++ b/test/components/previews/card_component_preview.rb @@ -0,0 +1,56 @@ +class CardComponentPreview < Lookbook::Preview + layout "hammy_component_preview" + + # @param title text "Card title" + # @param icon text "icon name" + # @param count number "count (blank for no count)" + # @param url url "view all link (blank for no link)" + def default(title: "Gems", icon: "gems", count: nil, url: nil) + render CardComponent.new do |c| + c.head(title, icon: icon, count: count, url: url) + c.list do + c.list_item { "list > list_item" } + end + end + end + + def divided_list(title: "Gems", icon: "gems", count: nil, url: nil) + render CardComponent.new do |c| + c.head(title, icon: icon, count: count) + c.divided_list do + c.list_item { "divided_list > list_item" } + c.list_item_to("#") { "divided_list > list_item_to" } + c.list_item { "divided_list > list_item" } + end + c.list_item_to(url) { "View all" } if url + end + end + + def scrollable(title: "History") + render CardComponent.new do |c| + c.head do + c.title(title, icon: :history) + end + c.scrollable do + render Card::TimelineComponent.new do |t| + t.timeline_item(Time.current) { "timeline_item > content" } + end + render Card::TimelineComponent.new do |t| + t.timeline_item(1.day.ago) { "timeline_item > content" } + end + render Card::TimelineComponent.new do |t| + t.timeline_item(2.days.ago) { "timeline_item > content" } + end + render Card::TimelineComponent.new do |t| + t.timeline_item(1.week.ago) { "timeline_item > content" } + end + render Card::TimelineComponent.new do |t| + t.timeline_item(1.month.ago) { "timeline_item > content" } + end + render Card::TimelineComponent.new do |t| + t.timeline_item(1.year.ago) { "timeline_item > content" } + end + end + end + end +end diff --git a/test/integration/i18n_test.rb b/test/integration/i18n_test.rb index 1212f677ccd..f7a1e80fe4a 100644 --- a/test/integration/i18n_test.rb +++ b/test/integration/i18n_test.rb @@ -30,10 +30,12 @@ def collect_combined_keys(hash, namespace = nil) assert_predicate reference, :present? + suggestion = "\nRun bin/fill-locales to add missing keys." + locale_keys.each do |locale, keys| missing = reference - keys - assert_predicate missing, :blank?, "#{locale} locale is missing: #{missing.join(', ')}" + assert_predicate missing, :blank?, "#{locale} locale is missing: #{missing.join(', ')}#{suggestion}" extra = keys - reference assert_predicate extra, :blank?, "#{locale} locale has extra: #{extra.join(', ')}" diff --git a/test/integration/organizations/gems_test.rb b/test/integration/organizations/gems_test.rb new file mode 100644 index 00000000000..03dbf5857cc --- /dev/null +++ b/test/integration/organizations/gems_test.rb @@ -0,0 +1,25 @@ +require "test_helper" + +class Organizations::GemsTest < ActionDispatch::IntegrationTest + setup do + @user = create(:user, remember_token_expires_at: Gemcutter::REMEMBER_FOR.from_now) + post session_path(session: { who: @user.handle, password: PasswordHelpers::SECURE_TEST_PASSWORD }) + end + + test "should get index" do + @organization = create(:organization, owners: [@user]) + @organization.rubygems << create(:rubygem, name: "arrakis", number: "1.0.0") + + get "/organizations/#{@organization.to_param}/gems" + + assert page.has_content? "arrakis" + end + + test "should get index with no gems" do + @organization = create(:organization, owners: [@user]) + + get "/organizations/#{@organization.to_param}/gems" + + assert page.has_content? "No gems yet" + end +end diff --git a/test/integration/organizations_test.rb b/test/integration/organizations_test.rb new file mode 100644 index 00000000000..b4b3e95faf6 --- /dev/null +++ b/test/integration/organizations_test.rb @@ -0,0 +1,62 @@ +require "test_helper" + +class OrganizationsTest < ActionDispatch::IntegrationTest + setup do + @user = create(:user, remember_token_expires_at: Gemcutter::REMEMBER_FOR.from_now) + post session_path(session: { who: @user.handle, password: PasswordHelpers::SECURE_TEST_PASSWORD }) + end + + test "should show an organization" do + organization = create(:organization, owners: [@user], handle: "arrakis", name: "Arrakis") + organization.rubygems << create(:rubygem, name: "arrakis", number: "1.0.0") + + get "/organizations/#{organization.to_param}" + + assert_response :success + assert page.has_content? "arrakis" + end + + test "should render not found when an organization doesn't exist" do + get "/organizations/notfound" + + assert_response :not_found + end + + test "should list no organization for a user with none" do + get "/organizations" + + assert_response :success + end + + test "should list organizations for a user" do + organization = create(:organization, owners: [@user]) + + get "/organizations" + + assert_response :success + assert page.has_content? organization.name + end + + test "should render organization edit form" do + organization = create(:organization, owners: [@user]) + + get "/organizations/#{organization.to_param}/edit" + + assert_response :success + assert_select "form[action=?]", organization_path(organization) + assert_select "input[name=?]", "organization[name]" + end + + test "should update an organization display name" do + organization = create(:organization, owners: [@user]) + + patch "/organizations/#{organization.to_param}", params: { + organization: { name: "New Name" } + } + + assert_redirected_to organization_path(organization) + follow_redirect! + + assert page.has_content? "New Name" + end +end diff --git a/test/views/card/timeline_component_test.rb b/test/views/card/timeline_component_test.rb new file mode 100644 index 00000000000..8357c0be118 --- /dev/null +++ b/test/views/card/timeline_component_test.rb @@ -0,0 +1,16 @@ +require "test_helper" + +class Card::TimelineComponentTest < ComponentTest + should "render timeline item without link to user" do + datetime = 1.2.days.ago + + render Card::TimelineComponent.new do |c| + c.timeline_item(datetime) do + "additional content" + end + end + + assert_selector "time[datetime='#{datetime.iso8601}']" + assert_text "additional content" + end +end diff --git a/test/views/card_component_test.rb b/test/views/card_component_test.rb new file mode 100644 index 00000000000..a36daccf46f --- /dev/null +++ b/test/views/card_component_test.rb @@ -0,0 +1,44 @@ +require "test_helper" + +class CardComponentTest < ComponentTest + def render(...) + response = super + Capybara.string(response) + end + + should "render a card with title, icon, and list content" do + render CardComponent.new do |c| + c.head("Gems", icon: "gems", count: 3) + c.list do + c.list_item_to("rubygem_version_path(1)") { "RubyGem1 (0.0.1)" } + c.list_item_to("rubygem_version_path(2)") { "RubyGem2 (0.0.2)" } + c.list_item_to("rubygem_version_path(3)") { "RubyGem3 (0.0.3)" } + end + end + + assert_selector "article" + assert_selector "h3", text: "Gems" + assert_selector "svg.fill-orange" + assert_selector "span", text: "3" + assert_link "RubyGem1 (0.0.1)", href: "rubygem_version_path(1)" + assert_link "RubyGem2 (0.0.2)", href: "rubygem_version_path(2)" + assert_link "RubyGem3 (0.0.3)", href: "rubygem_version_path(3)" + refute_text "View all" + end + + should "render a card with custom title and scrollable content" do + render CardComponent.new do |c| + c.head do + c.title("History") + end + c.scrollable do + "content" + end + end + + assert_selector "article" + assert_selector "h3", text: "History" + assert_text "content" + refute_text "View all" + end +end From aaaebf531dabecd01e3b15b6da316d92041d66a1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 Nov 2024 09:24:52 -0800 Subject: [PATCH 19/28] Bump minitest from 5.25.1 to 5.25.2 (#5269) Bumps [minitest](https://github.com/minitest/minitest) from 5.25.1 to 5.25.2. - [Changelog](https://github.com/minitest/minitest/blob/master/History.rdoc) - [Commits](https://github.com/minitest/minitest/compare/v5.25.1...v5.25.2) --- updated-dependencies: - dependency-name: minitest dependency-type: direct:development 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 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index a8806df9a82..8d1424b953d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -457,7 +457,7 @@ GEM mini_histogram (0.3.1) mini_mime (1.1.5) mini_portile2 (2.8.8) - minitest (5.25.1) + minitest (5.25.2) minitest-gcstats (1.3.1) minitest (~> 5.0) minitest-reporters (1.7.1) @@ -1155,7 +1155,7 @@ CHECKSUMS mini_histogram (0.3.1) sha256=6a114b504e4618b0e076cc672996036870f7cc6f16b8e5c25c0c637726d2dd94 mini_mime (1.1.5) sha256=8681b7e2e4215f2a159f9400b5816d85e9d8c6c6b491e96a12797e798f8bccef mini_portile2 (2.8.8) sha256=8e47136cdac04ce81750bb6c09733b37895bf06962554e4b4056d78168d70a75 - minitest (5.25.1) sha256=3db6795a80634def1cf86fda79d2d83b59b25ce5e186fa675f73c565589d2ad8 + minitest (5.25.2) sha256=59b379d63e0058159127b545c4725d3106624c9be2b3e030ddaee825d59e83eb minitest-gcstats (1.3.1) sha256=cb25490f93aac02e3a5ff307e560d41afcdcafa7952c1c32efdeb9886b1f4711 minitest-reporters (1.7.1) sha256=5060413a0c95b8c32fe73e0606f3631c173a884d7900e50013e15094eb50562c minitest-retry (0.2.3) sha256=7b7f4896efb9b931a1acb442a40e5273c441f44946cf4c6a8eb8895838e7bf29 From f477d26a87de74132c51e3ac95d53b549fd0a914 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 Nov 2024 09:25:32 -0800 Subject: [PATCH 20/28] Bump aws-sdk-s3 from 1.172.0 to 1.173.0 (#5267) Bumps [aws-sdk-s3](https://github.com/aws/aws-sdk-ruby) from 1.172.0 to 1.173.0. - [Release notes](https://github.com/aws/aws-sdk-ruby/releases) - [Changelog](https://github.com/aws/aws-sdk-ruby/blob/version-3/gems/aws-sdk-s3/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-ruby/commits) --- updated-dependencies: - dependency-name: aws-sdk-s3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile | 2 +- Gemfile.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Gemfile b/Gemfile index 5f193b3d65f..642497cd1d7 100644 --- a/Gemfile +++ b/Gemfile @@ -5,7 +5,7 @@ ruby file: ".ruby-version" gem "rails", "~> 7.2.1" gem "rails-i18n", "~> 7.0" -gem "aws-sdk-s3", "~> 1.172" +gem "aws-sdk-s3", "~> 1.173" gem "aws-sdk-sqs", "~> 1.89" gem "bootsnap", "~> 1.18" gem "clearance", "~> 2.9" diff --git a/Gemfile.lock b/Gemfile.lock index 8d1424b953d..7d608a47b0b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -134,7 +134,7 @@ GEM rails (>= 6.0.0) zeitwerk aws-eventstream (1.3.0) - aws-partitions (1.1010.0) + aws-partitions (1.1012.0) aws-sdk-core (3.213.0) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.992.0) @@ -143,7 +143,7 @@ GEM aws-sdk-kms (1.96.0) aws-sdk-core (~> 3, >= 3.210.0) aws-sigv4 (~> 1.5) - aws-sdk-s3 (1.172.0) + aws-sdk-s3 (1.173.0) aws-sdk-core (~> 3, >= 3.210.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.5) @@ -879,7 +879,7 @@ DEPENDENCIES avo (~> 3.13) avo-advanced (~> 3.14)! avo_upgrade (~> 0.1.1) - aws-sdk-s3 (~> 1.172) + aws-sdk-s3 (~> 1.173) aws-sdk-sqs (~> 1.89) bcrypt (~> 3.1) better_html (~> 2.1) @@ -1021,10 +1021,10 @@ CHECKSUMS avo-pro (3.14.1) sha256=84e5474f9f311dc846a85ac3cfec02e04f187a54e91574686310eafaa21c503f avo_upgrade (0.1.1) sha256=8d841083b9956392f5c8fe195f25bec0d139e3646d276f8a59e66b7d2e9ebf30 aws-eventstream (1.3.0) sha256=f1434cc03ab2248756eb02cfa45e900e59a061d7fbdc4a9fd82a5dd23d796d3f - aws-partitions (1.1010.0) sha256=68bb673ab3275f0a41cd62d4550d2238053841f3f99498aa809bae66bcf3a6a0 + aws-partitions (1.1012.0) sha256=6cb19536a0aeb47543b734c4b30e19a8bebdf4039b9662ed053c207856ed0293 aws-sdk-core (3.213.0) sha256=6ca685be1d72d61776fdaaddf3c293e45a472ff0dd0b624880e7813d0c82db19 aws-sdk-kms (1.96.0) sha256=b1818e140b4d1b3cbe154e6b2df1d157f8c65aa297d488f69b5745995a6ba375 - aws-sdk-s3 (1.172.0) sha256=a2ac83d570c573b240b694d72c9e83e2c233a75fcd5f1a73e1d6d348b8219243 + aws-sdk-s3 (1.173.0) sha256=892b3fed635f8f7c8d0954288ba7d2594d780cf6f4caebd03f9ad82d37e6cdb3 aws-sdk-sqs (1.89.0) sha256=1db1e8a1dcf1a83a6328fe12a034fe89e1c7a73c6305b8cad089656e3a5389ba aws-sigv4 (1.10.1) sha256=8a140753f34de18125686b11e7adaed4ca3db06dfb50a478993bd437f7a203bb base64 (0.2.0) sha256=0f25e9b21a02a0cc0cea8ef92b2041035d39350946e8789c562b2d1a3da01507 From 31751bdbb1ad4279f270e6b9205d02a204f98c7f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 Nov 2024 17:36:07 +0000 Subject: [PATCH 21/28] Bump avo-advanced from 3.14.1 to 3.14.2 (#5268) Bumps avo-advanced from 3.14.1 to 3.14.2. --- updated-dependencies: - dependency-name: avo-advanced dependency-type: direct:development 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 | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 7d608a47b0b..24d65efa6b1 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,29 +1,29 @@ GEM remote: https://packager.dev/avo-hq/ specs: - avo-advanced (3.14.1) - avo (= 3.14.1) - avo-dynamic_filters (= 3.14.1) - avo-pro (= 3.14.1) + avo-advanced (3.14.2) + avo (= 3.14.2) + avo-dynamic_filters (= 3.14.2) + avo-pro (= 3.14.2) zeitwerk (>= 2.6.12) - avo-dashboards (3.14.1) - avo (= 3.14.1) + avo-dashboards (3.14.2) + avo (= 3.14.2) turbo-rails view_component (>= 3.7.0) zeitwerk (>= 2.6.12) - avo-dynamic_filters (3.14.1) - avo (= 3.14.1) + avo-dynamic_filters (3.14.2) + avo (= 3.14.2) ransack (>= 4.2.0) view_component (>= 3.7.0) zeitwerk (>= 2.6.12) - avo-menu (3.14.1) - avo (= 3.14.1) + avo-menu (3.14.2) + avo (= 3.14.2) docile zeitwerk (>= 2.6.12) - avo-pro (3.14.1) - avo (= 3.14.1) - avo-dashboards (= 3.14.1) - avo-menu (= 3.14.1) + avo-pro (3.14.2) + avo (= 3.14.2) + avo-dashboards (= 3.14.2) + avo-menu (= 3.14.2) zeitwerk (>= 2.6.12) GEM @@ -115,7 +115,7 @@ GEM ffi-compiler (~> 1.0) ast (2.4.2) attr_required (1.0.2) - avo (3.14.1) + avo (3.14.2) actionview (>= 6.1) active_link_to activerecord (>= 6.1) @@ -1013,12 +1013,12 @@ CHECKSUMS argon2 (2.3.0) sha256=980ef65172bf512ad37b6cbb0d61eef40b6dccab6a7db4e70557527e1dce9557 ast (2.4.2) sha256=1e280232e6a33754cde542bc5ef85520b74db2aac73ec14acef453784447cc12 attr_required (1.0.2) sha256=f0ebfc56b35e874f4d0ae799066dbc1f81efefe2364ca3803dc9ea6a4de6cb99 - avo (3.14.1) sha256=7fbf904afe5409064b8f03c7a14befe83184116e1ed789fb74a750090c39b15a - avo-advanced (3.14.1) sha256=5f9b18d20e7076731b736afe52bf04da2852c972f0aedeeb9b8323d9bf385ca3 - avo-dashboards (3.14.1) sha256=7c880e028138bc72082e0fec543a7af13d0ccf4580c8b58ce49b093379eef846 - avo-dynamic_filters (3.14.1) sha256=3fa32a404e99c9a0e97c973a6ddfd298bcb33dc2accb4d897064285043f5a84c - avo-menu (3.14.1) sha256=5b1ac111feabff7d0b3c718a8d67bd92bf3a822ef8e9af54014a91b6fa2bf4be - avo-pro (3.14.1) sha256=84e5474f9f311dc846a85ac3cfec02e04f187a54e91574686310eafaa21c503f + avo (3.14.2) sha256=90380412bb29f91b8f78db48c21a32e4d86e0248431e1a7c21bb633e46874b77 + avo-advanced (3.14.2) sha256=7f010ed6a10287ca0f80ff4494e07dffcc45a11e81d546fd0f8a6950d753d14b + avo-dashboards (3.14.2) sha256=da628376ffba23f4100f9dba82d8bb360b2fe5e67a5bd8f9e5f22518cdef465f + avo-dynamic_filters (3.14.2) sha256=bae546e4847d7329e628024717edc9b01e4d3f56b213a9eba1c8774c51108004 + avo-menu (3.14.2) sha256=64ae9d4161ac720eb32a52b32119472002c8f7998d599a303786290c82586011 + avo-pro (3.14.2) sha256=02b88f3c567ee4afd8a09e03a8739343ba50d65a9779e1572a6d71478fdc4589 avo_upgrade (0.1.1) sha256=8d841083b9956392f5c8fe195f25bec0d139e3646d276f8a59e66b7d2e9ebf30 aws-eventstream (1.3.0) sha256=f1434cc03ab2248756eb02cfa45e900e59a061d7fbdc4a9fd82a5dd23d796d3f aws-partitions (1.1012.0) sha256=6cb19536a0aeb47543b734c4b30e19a8bebdf4039b9662ed053c207856ed0293 From e5b0e6e2a54de1f86ad532a2e86d4c2524d09794 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 Nov 2024 09:53:23 -0800 Subject: [PATCH 22/28] Bump view_component from 3.14.0 to 3.20.0 (#5188) Bumps [view_component](https://github.com/viewcomponent/view_component) from 3.14.0 to 3.20.0. - [Release notes](https://github.com/viewcomponent/view_component/releases) - [Changelog](https://github.com/ViewComponent/view_component/blob/main/docs/CHANGELOG.md) - [Commits](https://github.com/viewcomponent/view_component/compare/v3.14.0...v3.20.0) --- updated-dependencies: - dependency-name: view_component dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile | 2 +- Gemfile.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Gemfile b/Gemfile index 642497cd1d7..761084b0c65 100644 --- a/Gemfile +++ b/Gemfile @@ -65,7 +65,7 @@ gem "sigstore", "~> 0.2.1" # Admin dashboard gem "avo", "~> 3.13" gem "pagy", "~> 8.4" -gem "view_component", "~> 3.14.0" +gem "view_component", "~> 3.20.0" gem "pundit", "~> 2.4" gem "chartkick", "~> 5.1" gem "groupdate", "~> 6.5" diff --git a/Gemfile.lock b/Gemfile.lock index 24d65efa6b1..33cee0795a9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -832,8 +832,8 @@ GEM validates_formatting_of (0.9.0) activemodel version_gem (1.1.1) - view_component (3.14.0) - activesupport (>= 5.2.0, < 8.0) + view_component (3.20.0) + activesupport (>= 5.2.0, < 8.1) concurrent-ruby (~> 1.0) method_source (~> 1.0) webauthn (3.2.2) @@ -986,7 +986,7 @@ DEPENDENCIES unpwn (~> 1.0) user_agent_parser (~> 2.18) validates_formatting_of (~> 0.9) - view_component (~> 3.14.0) + view_component (~> 3.20.0) webauthn (~> 3.2) webmock (~> 3.24) xml-simple (~> 1.1) @@ -1310,7 +1310,7 @@ CHECKSUMS validate_url (1.0.15) sha256=72fe164c0713d63a9970bd6700bea948babbfbdcec392f2342b6704042f57451 validates_formatting_of (0.9.0) sha256=139590a4b87596dbfb04d93e897bd2e6d30fb849d04fab0343e71ed2ca856e7e version_gem (1.1.1) sha256=3c2da6ded29045ddcc0387e152dc634e1f0c490b7128dce0697ccc1cf0915b6c - view_component (3.14.0) sha256=96816de1c40d276d9fac49316ee4d196de90b1ce6eb39373b887c639749e630c + view_component (3.20.0) sha256=ac3192b80c2936521e5e60e585960942f40f745cf0a78d037bf6d36e703e228b webauthn (3.2.2) sha256=46e70b234963c85bbf8ea8febc9a3cbf04569e34a73a570d86f68556f3f36a38 webfinger (2.1.3) sha256=567a52bde77fb38ca6b67e55db755f988766ec4651c1d24916a65aa70540695c webmock (3.24.0) sha256=be01357f6fc773606337ca79f3ba332b7d52cbe5c27587671abc0572dbec7122 From 5fda1d3bf0f112012094a708cf222ab418882a7d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Nov 2024 10:11:39 -0800 Subject: [PATCH 23/28] Bump selenium-webdriver from 4.26.0 to 4.27.0 (#5274) Bumps [selenium-webdriver](https://github.com/SeleniumHQ/selenium) from 4.26.0 to 4.27.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.26.0...selenium-4.27.0) --- updated-dependencies: - dependency-name: selenium-webdriver dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile | 2 +- Gemfile.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index 761084b0c65..2bc9240fef4 100644 --- a/Gemfile +++ b/Gemfile @@ -139,7 +139,7 @@ group :test do gem "mocha", "~> 2.5", require: false gem "shoulda-context", "~> 3.0.0.rc1" gem "shoulda-matchers", "~> 6.4" - gem "selenium-webdriver", "~> 4.26" + gem "selenium-webdriver", "~> 4.27" gem "webmock", "~> 3.24" gem "simplecov", "~> 0.22", require: false gem "simplecov-cobertura", "~> 2.1", require: false diff --git a/Gemfile.lock b/Gemfile.lock index 33cee0795a9..02f54420d02 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -749,7 +749,7 @@ GEM activemodel (>= 6.1) hashie securerandom (0.3.2) - selenium-webdriver (4.26.0) + selenium-webdriver (4.27.0) base64 (~> 0.2) logger (~> 1.4) rexml (~> 3.2, >= 3.2.5) @@ -970,7 +970,7 @@ DEPENDENCIES rubocop-rails (~> 2.25) ruby-magic (~> 0.6) searchkick (~> 5.4) - selenium-webdriver (~> 4.26) + selenium-webdriver (~> 4.27) shoryuken (~> 6.2) shoulda-context (~> 3.0.0.rc1) shoulda-matchers (~> 6.4) @@ -1270,7 +1270,7 @@ CHECKSUMS sawyer (0.9.2) sha256=fa3a72d62a4525517b18857ddb78926aab3424de0129be6772a8e2ba240e7aca searchkick (5.4.0) sha256=75d7256d3ec2af2dc11c2ba8160c86d80451f3f86447aae2ace1f79553de0bf3 securerandom (0.3.2) sha256=e8b2ffa651dfbbb26eb4bfb8ddcfff94221a93e3f118f39e0f7f94c14fea9dc0 - selenium-webdriver (4.26.0) sha256=bb0426ffe50e5940a6a5ed2978b4dfb1cb29e0e1c4d0a420d6aabf0f6c8e0690 + selenium-webdriver (4.27.0) sha256=8821f4ad60b935cfcdc5954c0a6642d894e936250aece8bf37a6fcbebe5eb6e0 semantic (1.6.1) sha256=3cdbb48f59198ebb782a3fdfb87b559e0822a311610db153bae22777a7d0c163 semantic_logger (4.16.0) sha256=ffba0bd0e008ceaf6be26da588f610a61208b9a9f55676b32729e962904023d9 shoryuken (6.2.1) sha256=95ddc0a717624a54e799d25a0a05100cb5a0c3728a96211935c214faaf16b3b6 From bd21f51869eb498c6c4baebf32b9c97c3aeba4c7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Nov 2024 10:11:56 -0800 Subject: [PATCH 24/28] Bump avo-advanced from 3.14.2 to 3.14.3 (#5275) Bumps avo-advanced from 3.14.2 to 3.14.3. --- updated-dependencies: - dependency-name: avo-advanced dependency-type: direct:development 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 | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 02f54420d02..e01c4051655 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,29 +1,29 @@ GEM remote: https://packager.dev/avo-hq/ specs: - avo-advanced (3.14.2) - avo (= 3.14.2) - avo-dynamic_filters (= 3.14.2) - avo-pro (= 3.14.2) + avo-advanced (3.14.3) + avo (= 3.14.3) + avo-dynamic_filters (= 3.14.3) + avo-pro (= 3.14.3) zeitwerk (>= 2.6.12) - avo-dashboards (3.14.2) - avo (= 3.14.2) + avo-dashboards (3.14.3) + avo (= 3.14.3) turbo-rails view_component (>= 3.7.0) zeitwerk (>= 2.6.12) - avo-dynamic_filters (3.14.2) - avo (= 3.14.2) + avo-dynamic_filters (3.14.3) + avo (= 3.14.3) ransack (>= 4.2.0) view_component (>= 3.7.0) zeitwerk (>= 2.6.12) - avo-menu (3.14.2) - avo (= 3.14.2) + avo-menu (3.14.3) + avo (= 3.14.3) docile zeitwerk (>= 2.6.12) - avo-pro (3.14.2) - avo (= 3.14.2) - avo-dashboards (= 3.14.2) - avo-menu (= 3.14.2) + avo-pro (3.14.3) + avo (= 3.14.3) + avo-dashboards (= 3.14.3) + avo-menu (= 3.14.3) zeitwerk (>= 2.6.12) GEM @@ -115,7 +115,7 @@ GEM ffi-compiler (~> 1.0) ast (2.4.2) attr_required (1.0.2) - avo (3.14.2) + avo (3.14.3) actionview (>= 6.1) active_link_to activerecord (>= 6.1) @@ -1013,12 +1013,12 @@ CHECKSUMS argon2 (2.3.0) sha256=980ef65172bf512ad37b6cbb0d61eef40b6dccab6a7db4e70557527e1dce9557 ast (2.4.2) sha256=1e280232e6a33754cde542bc5ef85520b74db2aac73ec14acef453784447cc12 attr_required (1.0.2) sha256=f0ebfc56b35e874f4d0ae799066dbc1f81efefe2364ca3803dc9ea6a4de6cb99 - avo (3.14.2) sha256=90380412bb29f91b8f78db48c21a32e4d86e0248431e1a7c21bb633e46874b77 - avo-advanced (3.14.2) sha256=7f010ed6a10287ca0f80ff4494e07dffcc45a11e81d546fd0f8a6950d753d14b - avo-dashboards (3.14.2) sha256=da628376ffba23f4100f9dba82d8bb360b2fe5e67a5bd8f9e5f22518cdef465f - avo-dynamic_filters (3.14.2) sha256=bae546e4847d7329e628024717edc9b01e4d3f56b213a9eba1c8774c51108004 - avo-menu (3.14.2) sha256=64ae9d4161ac720eb32a52b32119472002c8f7998d599a303786290c82586011 - avo-pro (3.14.2) sha256=02b88f3c567ee4afd8a09e03a8739343ba50d65a9779e1572a6d71478fdc4589 + avo (3.14.3) sha256=14cc7e5ab58f77b78cfdfefb7f267a5728633c465439ac6baf963fe6ab959b09 + avo-advanced (3.14.3) sha256=39f5c88b8a135c54839b9d1572b68b42a38b19f76cf0b12f43e25bf844d56cab + avo-dashboards (3.14.3) sha256=7caec15df4511d8ed6a4a605172d7ab929cfa68d8efb202773beee8fa419f94e + avo-dynamic_filters (3.14.3) sha256=aa61534e51c5c8ee75775fcb6b3cacdbb04e12bdc9b425dd642ca9d325b6e1ef + avo-menu (3.14.3) sha256=0f86612687bead97b382fc21eba82af5590ec890cb4d340fc150cf82166e4bf5 + avo-pro (3.14.3) sha256=3c2bb725e9396c44ed8934cb035d19f267a7d76967666d27a78d885be2d97e6e avo_upgrade (0.1.1) sha256=8d841083b9956392f5c8fe195f25bec0d139e3646d276f8a59e66b7d2e9ebf30 aws-eventstream (1.3.0) sha256=f1434cc03ab2248756eb02cfa45e900e59a061d7fbdc4a9fd82a5dd23d796d3f aws-partitions (1.1012.0) sha256=6cb19536a0aeb47543b734c4b30e19a8bebdf4039b9662ed053c207856ed0293 From ce1313140d880e21cd7919bf3c42942136568e05 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Nov 2024 10:12:04 -0800 Subject: [PATCH 25/28] Bump puma from 6.4.3 to 6.5.0 (#5276) Bumps [puma](https://github.com/puma/puma) from 6.4.3 to 6.5.0. - [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.4.3...v6.5.0) --- updated-dependencies: - dependency-name: puma dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile | 2 +- Gemfile.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Gemfile b/Gemfile index 2bc9240fef4..6bab5497f2d 100644 --- a/Gemfile +++ b/Gemfile @@ -29,7 +29,7 @@ gem "omniauth", "~> 2.1" gem "omniauth-rails_csrf_protection", "~> 1.0" gem "openid_connect", "~> 2.3" gem "pg", "~> 1.5" -gem "puma", "~> 6.4" +gem "puma", "~> 6.5" gem "rack", "~> 3.1" gem "rackup", "~> 2.2" gem "rack-sanitizer", "~> 2.0" diff --git a/Gemfile.lock b/Gemfile.lock index e01c4051655..4d5136529ce 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -486,7 +486,7 @@ GEM timeout net-smtp (0.5.0) net-protocol - nio4r (2.7.3) + nio4r (2.7.4) nokogiri (1.16.7) mini_portile2 (~> 2.8.2) racc (~> 1.4) @@ -587,7 +587,7 @@ GEM psych (5.2.0) stringio public_suffix (6.0.1) - puma (6.4.3) + puma (6.5.0) nio4r (~> 2.0) pundit (2.4.0) activesupport (>= 3.0.0) @@ -945,7 +945,7 @@ DEPENDENCIES propshaft (~> 1.1.0) prosopite (~> 1.4) pry-byebug (~> 3.10) - puma (~> 6.4) + puma (~> 6.5) pundit (~> 2.4) rack (~> 3.1) rack-attack (~> 6.6) @@ -1170,7 +1170,7 @@ CHECKSUMS net-pop (0.1.2) sha256=848b4e982013c15b2f0382792268763b748cce91c9e91e36b0f27ed26420dff3 net-protocol (0.2.2) sha256=aa73e0cba6a125369de9837b8d8ef82a61849360eba0521900e2c3713aa162a8 net-smtp (0.5.0) sha256=5fc0415e6ea1cc0b3dfea7270438ec22b278ca8d524986a3ae4e5ae8d087b42a - nio4r (2.7.3) sha256=54b94cdd4b8f9dc39aaad5f699e97afae13efb44f2b180a6e724df76105ff604 + nio4r (2.7.4) sha256=d95dee68e0bb251b8ff90ac3423a511e3b784124e5db7ff5f4813a220ae73ca9 nokogiri (1.16.7) sha256=f819cbfdfb0a7b19c9c52c6f2ca63df0e58a6125f4f139707b586b9511d7fe95 nokogiri (1.16.7-aarch64-linux) sha256=78778d35f165b59513be31c0fe232c63a82cf97626ffba695b5f822e5da1d74b nokogiri (1.16.7-arm64-darwin) sha256=276dcea1b988a5b22b5acc1ba901d24b8e908c40b71dccd5d54a2ae279480dad @@ -1210,7 +1210,7 @@ CHECKSUMS pry-byebug (3.10.1) sha256=c8f975c32255bfdb29e151f5532130be64ff3d0042dc858d0907e849125581f8 psych (5.2.0) sha256=6603fe756bcaf14daa25bc17625f36c90931dcf70452ac1e8da19760dc310573 public_suffix (6.0.1) sha256=61d44e1cab5cbbbe5b31068481cf16976dd0dc1b6b07bd95617ef8c5e3e00c6f - puma (6.4.3) sha256=24a4645c006811d83f2480057d1f54a96e7627b6b90e1c99b260b9dc630eb43e + puma (6.5.0) sha256=94d1b75cab7f356d52e4f1b17b9040a090889b341dbeee6ee3703f441dc189f2 pundit (2.4.0) sha256=43e6d27a9df082c04f0020999ce4dcf6742ecc5775d102ef2bfe9df041417572 pwned (2.3.0) sha256=63f5a9576f109203684e9dd053f815649fd5bc0a0348b7190568272641b22353 raabro (1.4.0) sha256=d4fa9ff5172391edb92b242eed8be802d1934b1464061ae5e70d80962c5da882 From 5c7990cb55da0672806570795a1bb017c25ed772 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Nov 2024 10:12:20 -0800 Subject: [PATCH 26/28] Bump mocha from 2.5.0 to 2.6.0 (#5277) Bumps [mocha](https://github.com/freerange/mocha) from 2.5.0 to 2.6.0. - [Changelog](https://github.com/freerange/mocha/blob/main/RELEASE.md) - [Commits](https://github.com/freerange/mocha/compare/v2.5.0...v2.6.0) --- updated-dependencies: - dependency-name: mocha dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile | 2 +- Gemfile.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index 6bab5497f2d..2162858118b 100644 --- a/Gemfile +++ b/Gemfile @@ -136,7 +136,7 @@ group :test do gem "launchy", "~> 3.0" gem "rack-test", "~> 2.1", require: "rack/test" gem "rails-controller-testing", "~> 1.0" - gem "mocha", "~> 2.5", require: false + gem "mocha", "~> 2.6", require: false gem "shoulda-context", "~> 3.0.0.rc1" gem "shoulda-matchers", "~> 6.4" gem "selenium-webdriver", "~> 4.27" diff --git a/Gemfile.lock b/Gemfile.lock index 4d5136529ce..ac8676d8fa5 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -467,7 +467,7 @@ GEM ruby-progressbar minitest-retry (0.2.3) minitest (>= 5.0) - mocha (2.5.0) + mocha (2.6.0) ruby2_keywords (>= 0.0.5) msgpack (1.7.5) multi_json (1.15.0) @@ -927,7 +927,7 @@ DEPENDENCIES minitest-gcstats (~> 1.3) minitest-reporters (~> 1.7) minitest-retry (~> 0.2.3) - mocha (~> 2.5) + mocha (~> 2.6) observer (~> 0.1.2) octokit (~> 9.2) omniauth (~> 2.1) @@ -1159,7 +1159,7 @@ CHECKSUMS minitest-gcstats (1.3.1) sha256=cb25490f93aac02e3a5ff307e560d41afcdcafa7952c1c32efdeb9886b1f4711 minitest-reporters (1.7.1) sha256=5060413a0c95b8c32fe73e0606f3631c173a884d7900e50013e15094eb50562c minitest-retry (0.2.3) sha256=7b7f4896efb9b931a1acb442a40e5273c441f44946cf4c6a8eb8895838e7bf29 - mocha (2.5.0) sha256=7852595064e8ef4c6a3f6d8a5a5ab8c705168f913bb17929ab1c35f4dd4c7717 + mocha (2.6.0) sha256=76ac4f4702d7c86be602e61a957f719e7e9df48ac3799b1a892655ca416a5638 msgpack (1.7.5) sha256=ffb04979f51e6406823c03abe50e1da2c825c55a37dee138518cdd09d9d3aea8 multi_json (1.15.0) sha256=1fd04138b6e4a90017e8d1b804c039031399866ff3fbabb7822aea367c78615d multi_xml (0.7.1) sha256=4fce100c68af588ff91b8ba90a0bb3f0466f06c909f21a32f4962059140ba61b From 4acb3f584102e03275240b4ae07295c0248854e2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Nov 2024 07:39:11 -0800 Subject: [PATCH 27/28] Bump aws-sdk-s3 from 1.173.0 to 1.174.0 (#5278) --- Gemfile | 2 +- Gemfile.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Gemfile b/Gemfile index 2162858118b..659c83d35d4 100644 --- a/Gemfile +++ b/Gemfile @@ -5,7 +5,7 @@ ruby file: ".ruby-version" gem "rails", "~> 7.2.1" gem "rails-i18n", "~> 7.0" -gem "aws-sdk-s3", "~> 1.173" +gem "aws-sdk-s3", "~> 1.174" gem "aws-sdk-sqs", "~> 1.89" gem "bootsnap", "~> 1.18" gem "clearance", "~> 2.9" diff --git a/Gemfile.lock b/Gemfile.lock index ac8676d8fa5..98be427e728 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -134,8 +134,8 @@ GEM rails (>= 6.0.0) zeitwerk aws-eventstream (1.3.0) - aws-partitions (1.1012.0) - aws-sdk-core (3.213.0) + aws-partitions (1.1013.0) + aws-sdk-core (3.214.0) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.992.0) aws-sigv4 (~> 1.9) @@ -143,7 +143,7 @@ GEM aws-sdk-kms (1.96.0) aws-sdk-core (~> 3, >= 3.210.0) aws-sigv4 (~> 1.5) - aws-sdk-s3 (1.173.0) + aws-sdk-s3 (1.174.0) aws-sdk-core (~> 3, >= 3.210.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.5) @@ -879,7 +879,7 @@ DEPENDENCIES avo (~> 3.13) avo-advanced (~> 3.14)! avo_upgrade (~> 0.1.1) - aws-sdk-s3 (~> 1.173) + aws-sdk-s3 (~> 1.174) aws-sdk-sqs (~> 1.89) bcrypt (~> 3.1) better_html (~> 2.1) @@ -1021,10 +1021,10 @@ CHECKSUMS avo-pro (3.14.3) sha256=3c2bb725e9396c44ed8934cb035d19f267a7d76967666d27a78d885be2d97e6e avo_upgrade (0.1.1) sha256=8d841083b9956392f5c8fe195f25bec0d139e3646d276f8a59e66b7d2e9ebf30 aws-eventstream (1.3.0) sha256=f1434cc03ab2248756eb02cfa45e900e59a061d7fbdc4a9fd82a5dd23d796d3f - aws-partitions (1.1012.0) sha256=6cb19536a0aeb47543b734c4b30e19a8bebdf4039b9662ed053c207856ed0293 - aws-sdk-core (3.213.0) sha256=6ca685be1d72d61776fdaaddf3c293e45a472ff0dd0b624880e7813d0c82db19 + aws-partitions (1.1013.0) sha256=60e72ff88ae49a114bea693f4479ef7d3c0cdc4795009c1d9761db79ffc1d1fe + aws-sdk-core (3.214.0) sha256=24f2a0f29dc3b5d9ee38d6ff8341a66fba48a4ebca2424688f7bac9952d8488b aws-sdk-kms (1.96.0) sha256=b1818e140b4d1b3cbe154e6b2df1d157f8c65aa297d488f69b5745995a6ba375 - aws-sdk-s3 (1.173.0) sha256=892b3fed635f8f7c8d0954288ba7d2594d780cf6f4caebd03f9ad82d37e6cdb3 + aws-sdk-s3 (1.174.0) sha256=9a80d43a7816abd49dc8becc6bf6675d8dbc8bc01ad49dcc252899fc4c021f3f aws-sdk-sqs (1.89.0) sha256=1db1e8a1dcf1a83a6328fe12a034fe89e1c7a73c6305b8cad089656e3a5389ba aws-sigv4 (1.10.1) sha256=8a140753f34de18125686b11e7adaed4ca3db06dfb50a478993bd437f7a203bb base64 (0.2.0) sha256=0f25e9b21a02a0cc0cea8ef92b2041035d39350946e8789c562b2d1a3da01507 From f38c3e04202b2b3696b971854e6ab2ef209e3559 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 27 Nov 2024 01:40:49 +0000 Subject: [PATCH 28/28] Bump datadog-ci from 1.8.1 to 1.9.0 (#5280) --- Gemfile | 2 +- Gemfile.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index 659c83d35d4..7cb3848187d 100644 --- a/Gemfile +++ b/Gemfile @@ -129,7 +129,7 @@ group :development do end group :test do - gem "datadog-ci", "~> 1.8" + gem "datadog-ci", "~> 1.9" gem "minitest", "~> 5.25", require: false gem "minitest-retry", "~> 0.2.3" gem "capybara", "~> 3.40" diff --git a/Gemfile.lock b/Gemfile.lock index 98be427e728..7f47a17a56a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -217,7 +217,7 @@ GEM libdatadog (~> 14.1.0.1.0) libddwaf (~> 1.15.0.0.0) msgpack - datadog-ci (1.8.1) + datadog-ci (1.9.0) datadog (~> 2.4) msgpack datadog-ruby_core_source (3.3.6) @@ -893,7 +893,7 @@ DEPENDENCIES csv (~> 3.3) dalli (~> 3.2) datadog (~> 2.7) - datadog-ci (~> 1.8) + datadog-ci (~> 1.9) derailed_benchmarks (~> 2.2) discard (~> 1.4) dogstatsd-ruby (~> 5.6) @@ -1058,7 +1058,7 @@ CHECKSUMS csv (3.3.0) sha256=0bbd1defdc31134abefed027a639b3723c2753862150f4c3ee61cab71b20d67d dalli (3.2.8) sha256=2e63595084d91fae2655514a02c5d4fc0f16c0799893794abe23bf628bebaaa5 datadog (2.7.0) sha256=cea0c125acff6630966a2ad0bc01863ba1e1ff2886b4d38dc29f254f89ad02a2 - datadog-ci (1.8.1) sha256=c461acd83d36b5894716ea7b1c207fd4b7fa103994c0773e3936a68da4dfa594 + datadog-ci (1.9.0) sha256=f48a2ec91961b65ada1e13b964a42ed1e3ae6ee586736e3ee5690d0ceb302069 datadog-ruby_core_source (3.3.6) sha256=007c72450d3f5838c6d0ae4a6a77e5008bb29dd97d10ea3bf367f978d7c02f36 date (3.4.0) sha256=2e7fadaded625c9b3e35e254e42068d4bd8b8646ceab0744cbcbcfdafaa0a711 derailed_benchmarks (2.2.1) sha256=654280664fded41c9cd8fc27fc0fcfaf096023afab90eb4ac1185ba70c5d4439