From 1875e2137ffeb99c55302300eaa24de237ab9b44 Mon Sep 17 00:00:00 2001 From: "Peter H. Boling" Date: Fri, 29 Aug 2025 19:35:17 -0600 Subject: [PATCH 01/22] =?UTF-8?q?=E2=9E=95=20kettle-dev=20v1.0.18?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/oauth2.iml | 11 +++++++-- Gemfile.lock | 60 +++++++++++++++++++++++++++++++++--------------- oauth2.gemspec | 9 +------- 3 files changed, 51 insertions(+), 29 deletions(-) diff --git a/.idea/oauth2.iml b/.idea/oauth2.iml index d98c93e6..c235df2a 100755 --- a/.idea/oauth2.iml +++ b/.idea/oauth2.iml @@ -28,6 +28,7 @@ + @@ -42,12 +43,15 @@ + + + @@ -83,6 +87,7 @@ + @@ -98,7 +103,7 @@ - + @@ -111,10 +116,12 @@ - + + + diff --git a/Gemfile.lock b/Gemfile.lock index 6ce5bba6..6fb2b2d5 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -45,6 +45,7 @@ GEM debug (1.11.0) irb (~> 1.10) reline (>= 0.3.8) + delegate (0.4.0) diff-lcs (1.6.2) diffy (3.4.4) docile (1.4.1) @@ -87,6 +88,8 @@ GEM gem_bench (2.0.5) bundler (>= 1.14) version_gem (~> 1.1, >= 1.1.4) + gitmoji-regex (1.0.3) + version_gem (~> 1.1, >= 1.1.8) hashie (5.0.0) io-console (0.8.1) irb (1.15.2) @@ -96,6 +99,17 @@ GEM json (2.13.2) jwt (3.1.2) base64 + kettle-dev (1.0.18) + appraisal2 (~> 3.0) + bundler-audit (~> 0.9.2) + gitmoji-regex (~> 1.0, >= 1.0.3) + kettle-test (~> 1.0) + rake (~> 13.0) + require_bench (~> 1.0, >= 1.0.4) + rspec-pending_for + ruby-progressbar (~> 1.13) + stone_checksums (~> 1.0, >= 1.0.2) + version_gem (~> 1.1, >= 1.1.8) kettle-soup-cover (1.0.10) simplecov (~> 0.22) simplecov-cobertura (~> 3.0) @@ -105,6 +119,15 @@ GEM simplecov-rcov (~> 0.3, >= 0.3.7) simplecov_json_formatter (~> 0.1, >= 0.1.4) version_gem (~> 1.1, >= 1.1.8) + kettle-test (1.0.3) + appraisal2 (~> 3.0) + rspec (~> 3.0) + rspec-block_is_expected (~> 1.0, >= 1.0.6) + rspec-stubbed_env (~> 1.0, >= 1.0.4) + rspec_junit_formatter (~> 0.6) + silent_stream (~> 1.0, >= 1.0.12) + timecop-rspec (~> 1.0, >= 1.0.3) + version_gem (~> 1.1, >= 1.1.8) kramdown (2.5.1) rexml (>= 3.3.9) kramdown-parser-gfm (1.1.0) @@ -147,12 +170,12 @@ GEM parser (~> 3.3.0) rainbow (>= 2.0, < 4.0) rexml (~> 3.1) - regexp_parser (2.11.0) + regexp_parser (2.11.2) reline (0.6.2) io-console (~> 0.5) require_bench (1.0.4) version_gem (>= 1.1.3, < 4) - rexml (3.4.1) + rexml (3.4.2) rspec (3.13.1) rspec-core (~> 3.13.0) rspec-expectations (~> 3.13.0) @@ -166,13 +189,14 @@ GEM rspec-mocks (3.13.5) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.13.0) - rspec-pending_for (0.1.17) - rake (>= 10) + rspec-pending_for (0.1.18) rspec-core (~> 3.0) ruby_engine (~> 2.0) ruby_version (~> 1.0) rspec-stubbed_env (1.0.4) - rspec-support (3.13.4) + rspec-support (3.13.5) + rspec_junit_formatter (0.6.0) + rspec-core (>= 2, < 4, != 2.12.0) rubocop (1.75.8) json (~> 2.3) language_server-protocol (~> 3.17.0.2) @@ -229,14 +253,14 @@ GEM ruby-progressbar (1.13.0) ruby_engine (2.0.3) ruby_version (1.0.3) - silent_stream (1.0.11) + silent_stream (1.0.12) logger (~> 1.2) version_gem (>= 1.1.8, < 3) simplecov (0.22.0) docile (~> 1.1) simplecov-html (~> 0.11) simplecov_json_formatter (~> 0.1) - simplecov-cobertura (3.0.0) + simplecov-cobertura (3.1.0) rexml simplecov (~> 0.19) simplecov-console (0.9.4) @@ -244,7 +268,7 @@ GEM simplecov terminal-table simplecov-html (0.13.2) - simplecov-lcov (0.8.0) + simplecov-lcov (0.9.0) simplecov-rcov (0.3.7) simplecov (>= 0.4.1) simplecov_json_formatter (0.1.4) @@ -269,13 +293,18 @@ GEM standard-custom (>= 1.0.2, < 2) standard-performance (>= 1.3.1, < 2) version_gem (>= 1.1.4, < 3) - stone_checksums (1.0.0) - version_gem (>= 1.1.5, < 3) + stone_checksums (1.0.2) + version_gem (~> 1.1, >= 1.1.8) stringio (3.1.7) terminal-table (4.0.0) unicode-display_width (>= 1.1.1, < 4) thor (1.4.0) - unicode-display_width (3.1.4) + timecop (0.9.10) + timecop-rspec (1.0.3) + delegate (~> 0.1) + rspec (~> 3.0) + timecop (>= 0.7, < 1) + unicode-display_width (3.1.5) unicode-emoji (~> 4.0, >= 4.0.4) unicode-emoji (4.0.4) uri (1.0.3) @@ -292,34 +321,27 @@ PLATFORMS DEPENDENCIES addressable (~> 2.8, >= 2.8.7) - appraisal2 (~> 3.0) backports (~> 3.25, >= 3.25.1) benchmark (~> 0.4) bundler-audit (~> 0.9.2) debug (>= 1.1) gem_bench (~> 2.0, >= 2.0.5) irb (~> 1.15, >= 1.15.2) + kettle-dev (~> 1.0, >= 1.0.18) kettle-soup-cover (~> 1.0, >= 1.0.6) kramdown (~> 2.5, >= 2.5.1) kramdown-parser-gfm (~> 1.1) nkf (~> 0.2) oauth2! - rake (~> 13.0) rdoc (~> 6.11) reek (~> 6.4) require_bench (~> 1.0, >= 1.0.4) rexml (~> 3.2, >= 3.2.5) - rspec (~> 3.13) - rspec-block_is_expected (~> 1.0, >= 1.0.6) - rspec-pending_for (~> 0.1, >= 0.1.17) - rspec-stubbed_env (~> 1.0, >= 1.0.2) rubocop (~> 1.73, >= 1.73.2) rubocop-lts (~> 8.1, >= 8.1.1) rubocop-packaging (~> 0.5, >= 0.5.2) rubocop-rspec (~> 3.2) - silent_stream (~> 1.0, >= 1.0.11) standard (~> 1.47) - stone_checksums (~> 1.0) yard (~> 0.9, >= 0.9.37) yard-junk (~> 0.0, >= 0.0.10)! yard-relative_markdown_links (~> 0.5.0) diff --git a/oauth2.gemspec b/oauth2.gemspec index 48564e5e..41ab332f 100644 --- a/oauth2.gemspec +++ b/oauth2.gemspec @@ -143,15 +143,8 @@ Thanks, |7eter l-|. l3oling # and preferably a modular one (see gemfiles/modular/*.gemfile). spec.add_development_dependency("addressable", "~> 2.8", ">= 2.8.7") # ruby >= 2.2 - spec.add_development_dependency("appraisal2", "~> 3.0") # ruby >= 1.8.7 spec.add_development_dependency("backports", "~> 3.25", ">= 3.25.1") # ruby >= 0 + spec.add_development_dependency("kettle-dev", "~> 1.0", ">= 1.0.18") # ruby >= 2.3 spec.add_development_dependency("nkf", "~> 0.2") # ruby >= 2.3 - spec.add_development_dependency("rake", "~> 13.0") # ruby >= 2.2 spec.add_development_dependency("rexml", "~> 3.2", ">= 3.2.5") # ruby >= 0 - spec.add_development_dependency("rspec", "~> 3.13") # ruby >= 0 - spec.add_development_dependency("rspec-block_is_expected", "~> 1.0", ">= 1.0.6") # ruby >= 1.8.7 - spec.add_development_dependency("rspec-pending_for", "~> 0.1", ">= 0.1.17") # ruby >= 1.8.7 - spec.add_development_dependency("rspec-stubbed_env", "~> 1.0", ">= 1.0.2") # ruby >= 1.8.7 - spec.add_development_dependency("silent_stream", "~> 1.0", ">= 1.0.11") # ruby >= 2.3 - spec.add_development_dependency("stone_checksums", "~> 1.0") # ruby >= 2.2 end From 4c2b67100cb75c8b78720c8e831a0b678e33480a Mon Sep 17 00:00:00 2001 From: "Peter H. Boling" Date: Fri, 29 Aug 2025 19:40:02 -0600 Subject: [PATCH 02/22] =?UTF-8?q?=F0=9F=94=A8=20kettle-dev=20binstubs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/kettle-changelog | 16 ++++++++++++++++ bin/kettle-commit-msg | 16 ++++++++++++++++ bin/kettle-readme-backers | 16 ++++++++++++++++ bin/kettle-release | 16 ++++++++++++++++ 4 files changed, 64 insertions(+) create mode 100755 bin/kettle-changelog create mode 100755 bin/kettle-commit-msg create mode 100755 bin/kettle-readme-backers create mode 100755 bin/kettle-release diff --git a/bin/kettle-changelog b/bin/kettle-changelog new file mode 100755 index 00000000..0e7fcc4d --- /dev/null +++ b/bin/kettle-changelog @@ -0,0 +1,16 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'kettle-changelog' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("kettle-dev", "kettle-changelog") diff --git a/bin/kettle-commit-msg b/bin/kettle-commit-msg new file mode 100755 index 00000000..b228ad67 --- /dev/null +++ b/bin/kettle-commit-msg @@ -0,0 +1,16 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'kettle-commit-msg' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("kettle-dev", "kettle-commit-msg") diff --git a/bin/kettle-readme-backers b/bin/kettle-readme-backers new file mode 100755 index 00000000..fec80bd5 --- /dev/null +++ b/bin/kettle-readme-backers @@ -0,0 +1,16 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'kettle-readme-backers' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("kettle-dev", "kettle-readme-backers") diff --git a/bin/kettle-release b/bin/kettle-release new file mode 100755 index 00000000..1f5758a8 --- /dev/null +++ b/bin/kettle-release @@ -0,0 +1,16 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'kettle-release' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("kettle-dev", "kettle-release") From 2b60a29a5f4cf05fe316695d3cb30465efa28da6 Mon Sep 17 00:00:00 2001 From: "Peter H. Boling" Date: Fri, 29 Aug 2025 19:43:51 -0600 Subject: [PATCH 03/22] =?UTF-8?q?=F0=9F=94=A8=20kettle-dev=20Rakefile=20v1?= =?UTF-8?q?.0.18?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Rakefile | 161 ++++++++++++++++++------------------------------------- 1 file changed, 53 insertions(+), 108 deletions(-) diff --git a/Rakefile b/Rakefile index 21e9debd..d5901285 100644 --- a/Rakefile +++ b/Rakefile @@ -1,125 +1,70 @@ # frozen_string_literal: true -require "bundler/gem_tasks" - -defaults = [] - -is_ci = ENV.fetch("CI", "false").casecmp("true") == 0 - -### DEVELOPMENT TASKS -# Setup Kettle Soup Cover -begin - require "kettle-soup-cover" - - Kettle::Soup::Cover.install_tasks - # NOTE: Coverage on CI is configured independent of this task. - # This task is for local development, as it opens results in browser - defaults << "coverage" unless Kettle::Soup::Cover::IS_CI -rescue LoadError - desc("(stub) coverage is unavailable") - task("coverage") do - warn("NOTE: kettle-soup-cover isn't installed, or is disabled for #{RUBY_VERSION} in the current environment") - end -end - -# Setup Bundle Audit -begin - require "bundler/audit/task" - - Bundler::Audit::Task.new - defaults.push("bundle:audit:update", "bundle:audit") -rescue LoadError - desc("(stub) bundle:audit is unavailable") - task("bundle:audit") do - warn("NOTE: bundler-audit isn't installed, or is disabled for #{RUBY_VERSION} in the current environment") - end - desc("(stub) bundle:audit:update is unavailable") - task("bundle:audit:update") do - warn("NOTE: bundler-audit isn't installed, or is disabled for #{RUBY_VERSION} in the current environment") - end -end - -begin - require "rspec/core/rake_task" - - RSpec::Core::RakeTask.new(:spec) - # This takes the place of `coverage` task when running as CI=true - defaults << "spec" if !defined?(Kettle::Soup::Cover) || Kettle::Soup::Cover::IS_CI -rescue LoadError - desc("spec task stub") - task(:spec) do - warn("NOTE: rspec isn't installed, or is disabled for #{RUBY_VERSION} in the current environment") - end -end - -desc "run spec task with test task" -task test: :spec +# kettle-dev Rakefile v1.0.18 - 2025-08-29 +# Ruby 2.3 (Safe Navigation) or higher required +# +# MIT License (see License.txt) +# +# Copyright (c) 2025 Peter H. Boling (galtzo.com) +# +# Expected to work in any project that uses Bundler. +# +# Sets up tasks for appraisal, floss_funding, rspec, minitest, rubocop, reek, yard, and stone_checksums. +# +# rake appraisal:update # Update Appraisal gemfiles and run RuboCop... +# rake bench # Run all benchmarks (alias for bench:run) +# rake bench:list # List available benchmark scripts +# rake bench:run # Run all benchmark scripts (skips on CI) +# rake build # Build kettle-dev-1.0.0.gem into the pkg d... +# rake build:checksum # Generate SHA512 checksum of kettle-dev-1.... +# rake build:generate_checksums # Generate both SHA256 & SHA512 checksums i... +# rake bundle:audit:check # Checks the Gemfile.lock for insecure depe... +# rake bundle:audit:update # Updates the bundler-audit vulnerability d... +# rake ci:act[opt] # Run 'act' with a selected workflow +# rake clean # Remove any temporary products +# rake clobber # Remove any generated files +# rake coverage # Run specs w/ coverage and open results in... +# rake default # Default tasks aggregator +# rake install # Build and install kettle-dev-1.0.0.gem in... +# rake install:local # Build and install kettle-dev-1.0.0.gem in... +# rake kettle:dev:install # Install kettle-dev GitHub automation and ... +# rake kettle:dev:template # Template kettle-dev files into the curren... +# rake reek # Check for code smells +# rake reek:update # Run reek and store the output into the RE... +# rake release[remote] # Create tag v1.0.0 and build and push kett... +# rake rubocop_gradual # Run RuboCop Gradual +# rake rubocop_gradual:autocorrect # Run RuboCop Gradual with autocorrect (onl... +# rake rubocop_gradual:autocorrect_all # Run RuboCop Gradual with autocorrect (saf... +# rake rubocop_gradual:check # Run RuboCop Gradual to check the lock file +# rake rubocop_gradual:force_update # Run RuboCop Gradual to force update the l... +# rake rubocop_gradual_debug # Run RuboCop Gradual +# rake rubocop_gradual_debug:autocorrect # Run RuboCop Gradual with autocorrect (onl... +# rake rubocop_gradual_debug:autocorrect_all # Run RuboCop Gradual with autocorrect (saf... +# rake rubocop_gradual_debug:check # Run RuboCop Gradual to check the lock file +# rake rubocop_gradual_debug:force_update # Run RuboCop Gradual to force update the l... +# rake spec # Run RSpec code examples +# rake test # Run tests +# rake yard # Generate YARD Documentation +# -# Setup RuboCop-LTS -begin - require "rubocop/lts" +require "bundler/gem_tasks" - Rubocop::Lts.install_tasks - # Make autocorrect the default rubocop task - defaults << "rubocop_gradual:autocorrect" -rescue LoadError - desc("(stub) rubocop_gradual is unavailable") - task(:rubocop_gradual) do - warn("NOTE: rubocop-lts isn't installed, or is disabled for #{RUBY_VERSION} in the current environment") - end +# Define a base default task early so other files can enhance it. +desc "Default tasks aggregator" +task :default do + puts "Default task complete." end -# Setup Yard -begin - require "yard" - - YARD::Rake::YardocTask.new(:yard) do |t| - t.files = [ - # Source Splats (alphabetical) - "lib/**/*.rb", - "-", # source and extra docs are separated by "-" - # Extra Files (alphabetical) - "*.cff", - "*.md", - "*.txt", - ] - end - defaults << "yard" -rescue LoadError - desc("(stub) yard is unavailable") - task(:yard) do - warn("NOTE: yard isn't installed, or is disabled for #{RUBY_VERSION} in the current environment") - end -end - -# Setup Reek -begin - require "reek/rake/task" - - Reek::Rake::Task.new do |t| - t.fail_on_error = true - t.verbose = false - t.source_files = "{lib,spec}/**/*.rb" - end - defaults << "reek" unless is_ci -rescue LoadError - desc("(stub) reek is unavailable") - task(:reek) do - warn("NOTE: reek isn't installed, or is disabled for #{RUBY_VERSION} in the current environment") - end -end +# External gems that define tasks - add here! +require "kettle/dev" ### RELEASE TASKS # Setup stone_checksums begin require "stone_checksums" - - GemChecksums.install_tasks rescue LoadError desc("(stub) build:generate_checksums is unavailable") task("build:generate_checksums") do warn("NOTE: stone_checksums isn't installed, or is disabled for #{RUBY_VERSION} in the current environment") end end - -task default: defaults From 7cd5372a8da950d894214f741f12a5c36664d936 Mon Sep 17 00:00:00 2001 From: "Peter H. Boling" Date: Sat, 30 Aug 2025 01:03:53 -0600 Subject: [PATCH 04/22] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20kettle-dev=20v1.0.23?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/oauth2.iml | 18 +++++++++--------- Gemfile.lock | 4 ++-- oauth2.gemspec | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.idea/oauth2.iml b/.idea/oauth2.iml index c235df2a..fcb82615 100755 --- a/.idea/oauth2.iml +++ b/.idea/oauth2.iml @@ -49,9 +49,9 @@ - + - + @@ -75,18 +75,18 @@ - + - + - + - + @@ -105,10 +105,10 @@ - + - + @@ -122,7 +122,7 @@ - + diff --git a/Gemfile.lock b/Gemfile.lock index 6fb2b2d5..b9b166fe 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -99,7 +99,7 @@ GEM json (2.13.2) jwt (3.1.2) base64 - kettle-dev (1.0.18) + kettle-dev (1.0.23) appraisal2 (~> 3.0) bundler-audit (~> 0.9.2) gitmoji-regex (~> 1.0, >= 1.0.3) @@ -327,7 +327,7 @@ DEPENDENCIES debug (>= 1.1) gem_bench (~> 2.0, >= 2.0.5) irb (~> 1.15, >= 1.15.2) - kettle-dev (~> 1.0, >= 1.0.18) + kettle-dev (~> 1.0, >= 1.0.23) kettle-soup-cover (~> 1.0, >= 1.0.6) kramdown (~> 2.5, >= 2.5.1) kramdown-parser-gfm (~> 1.1) diff --git a/oauth2.gemspec b/oauth2.gemspec index 41ab332f..f2c2aa4d 100644 --- a/oauth2.gemspec +++ b/oauth2.gemspec @@ -144,7 +144,7 @@ Thanks, |7eter l-|. l3oling spec.add_development_dependency("addressable", "~> 2.8", ">= 2.8.7") # ruby >= 2.2 spec.add_development_dependency("backports", "~> 3.25", ">= 3.25.1") # ruby >= 0 - spec.add_development_dependency("kettle-dev", "~> 1.0", ">= 1.0.18") # ruby >= 2.3 + spec.add_development_dependency("kettle-dev", "~> 1.0", ">= 1.0.23") # ruby >= 2.3 spec.add_development_dependency("nkf", "~> 0.2") # ruby >= 2.3 spec.add_development_dependency("rexml", "~> 3.2", ">= 3.2.5") # ruby >= 0 end From 49b8857f1f5c9a04be5cbd0168d8d4969294401b Mon Sep 17 00:00:00 2001 From: "Peter H. Boling" Date: Sat, 30 Aug 2025 04:58:43 -0600 Subject: [PATCH 05/22] =?UTF-8?q?=F0=9F=8E=A8=20kettle-dev=20v1.0.23=20tem?= =?UTF-8?q?plate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .envrc | 13 +- .git-hooks/commit-msg | 41 ++ .git-hooks/commit-subjects-goalie.txt | 8 + .git-hooks/footer-template.erb.txt | 16 + .git-hooks/prepare-commit-msg | 20 + .github/FUNDING.yml | 4 +- .github/dependabot.yml | 7 +- .github/workflows/ancient.yml | 12 +- .github/workflows/auto-assign.yml | 21 + .github/workflows/codeql-analysis.yml | 4 +- .github/workflows/coverage.yml | 27 +- .github/workflows/current.yml | 2 +- .github/workflows/discord-notifier.yml | 39 ++ .github/workflows/heads.yml | 2 +- .github/workflows/jruby.yml | 18 +- .github/workflows/legacy.yml | 18 +- .github/workflows/locked_deps.yml | 85 ++++ .github/workflows/opencollective.yml | 40 ++ .github/workflows/style.yml | 2 +- .github/workflows/supported.yml | 2 +- .github/workflows/truffle.yml | 2 +- .github/workflows/unlocked_deps.yml | 84 ++++ .github/workflows/unsupported.yml | 2 +- .gitignore | 4 + .idea/oauth2.iml | 6 + .junie/guidelines-rbs.md | 49 +++ .junie/guidelines.md | 135 +++++++ .opencollective.yml | 3 + .qlty/qlty.toml | 1 + .rspec | 9 +- .rubocop.yml | 12 +- .simplecov | 4 + .yardopts | 3 +- Appraisals | 156 +------- CHANGELOG.md | 534 ++----------------------- CITATION.cff | 5 +- CODE_OF_CONDUCT.md | 1 - CONTRIBUTING.md | 94 ++++- FUNDING.md | 77 ++++ Gemfile | 15 +- Gemfile.lock | 42 +- README.md | 417 +++++++++---------- RUBOCOP.md | 71 ++++ Rakefile | 4 +- gemfiles/modular/coverage.gemfile | 2 +- gemfiles/modular/optional.gemfile | 1 + gemfiles/modular/style.gemfile | 16 +- oauth2.gemspec | 72 ++-- 48 files changed, 1187 insertions(+), 1015 deletions(-) create mode 100755 .git-hooks/commit-msg create mode 100644 .git-hooks/commit-subjects-goalie.txt create mode 100644 .git-hooks/footer-template.erb.txt create mode 100755 .git-hooks/prepare-commit-msg create mode 100644 .github/workflows/auto-assign.yml create mode 100644 .github/workflows/discord-notifier.yml create mode 100644 .github/workflows/locked_deps.yml create mode 100644 .github/workflows/opencollective.yml create mode 100644 .github/workflows/unlocked_deps.yml create mode 100644 .junie/guidelines-rbs.md create mode 100644 .junie/guidelines.md create mode 100644 .opencollective.yml create mode 100644 FUNDING.md create mode 100644 RUBOCOP.md create mode 100644 gemfiles/modular/optional.gemfile diff --git a/.envrc b/.envrc index e049643d..6b06e0ae 100644 --- a/.envrc +++ b/.envrc @@ -1,4 +1,6 @@ # Run any command in this library's bin/ without the bin/ prefix! +# Prefer exe version over binstub +PATH_add exe PATH_add bin # Only add things to this file that should be shared with the team. @@ -16,18 +18,21 @@ PATH_add bin ### External Testing Controls export K_SOUP_COV_DO=true # Means you want code coverage +export K_SOUP_COV_COMMAND_NAME="Test Coverage" # Available formats are html, xml, rcov, lcov, json, tty -export K_SOUP_COV_COMMAND_NAME="RSpec Coverage" -export K_SOUP_COV_FORMATTERS="html,tty" -export K_SOUP_COV_MIN_BRANCH=100 # Means you want to enforce X% branch coverage -export K_SOUP_COV_MIN_LINE=100 # Means you want to enforce X% line coverage +export K_SOUP_COV_FORMATTERS="html,xml,rcov,lcov,json,tty" +export K_SOUP_COV_MIN_BRANCH=78 # Means you want to enforce X% branch coverage +export K_SOUP_COV_MIN_LINE=97 # Means you want to enforce X% line coverage export K_SOUP_COV_MIN_HARD=true # Means you want the build to fail if the coverage thresholds are not met export K_SOUP_COV_MULTI_FORMATTERS=true export K_SOUP_COV_OPEN_BIN= # Means don't try to open coverage results in browser export MAX_ROWS=1 # Setting for simplecov-console gem for tty output, limits to the worst N rows of bad coverage +export KETTLE_TEST_SILENT=true # Internal Debugging Controls export DEBUG=false # do not allow byebug statements (override in .env.local) +export FLOSS_CFG_FUND_DEBUG=false # extra logging to help diagnose issues (override in .env.local) +export FLOSS_CFG_FUND_LOGFILE=tmp/log/debug.log # Concurrently developing the rubocop-lts suite? export RUBOCOP_LTS_LOCAL=false diff --git a/.git-hooks/commit-msg b/.git-hooks/commit-msg new file mode 100755 index 00000000..cd918f6b --- /dev/null +++ b/.git-hooks/commit-msg @@ -0,0 +1,41 @@ +#!/usr/bin/env ruby +# vim: set syntax=ruby + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +require "rubygems" +require "bundler/setup" + +# External gems +require "gitmoji/regex" + +full_text = File.read(ARGV[0]) +# Is the first character a GitMoji? +gitmoji_index = full_text =~ Gitmoji::Regex::REGEX +if gitmoji_index == 0 + exit 0 +else + denied = < (& many more) are a full-time endeavor. +- [❤️] Though I adore my work, it lacks financial sustainability. +- [❤️] Please, help me continue enhancing your tools by becoming a sponsor: + - [💲] https://liberapay.com/pboling/donate + - [💲] https://github.com/sponsors/pboling + +<% if ENV["GIT_HOOK_FOOTER_APPEND_DEBUG"] == "true" %> + @pwd = <%= @pwd %> + @gemspecs = <%= @gemspecs %> + @spec = <%= @spec %> + @gemspec_path = <%= @gemspec_path %> + @gem_name <%= @gem_name %> + @spec_name <%= @spec_name %> + @content <%= @content %> +<% end %> diff --git a/.git-hooks/prepare-commit-msg b/.git-hooks/prepare-commit-msg new file mode 100755 index 00000000..48c75470 --- /dev/null +++ b/.git-hooks/prepare-commit-msg @@ -0,0 +1,20 @@ +#!/bin/sh + +# Fail on error and unset variables +set -eu + +# Determine project root as the parent directory of this hook script +PROJECT_ROOT="$(CDPATH= cd -- "$(dirname -- "$0")"/.. && pwd)" + +# Run the Ruby hook within the direnv context (if available), +# so ENV from .envrc/.env.local at project root is loaded. +# One of the things .envrc needs to do is add $PROJECT_ROOT/bin/ to the path. +# You should have this line at the top of .envrc +# PATH_add bin +# NOTE: this project needs to also add exe as well, +# but other libraries won't generally need to do that. +if command -v direnv >/dev/null 2>&1; then + exec direnv exec "$PROJECT_ROOT" "kettle-commit-msg" "$@" +else + raise "direnv not found. Local development of this project ($PROJECT_ROOT) with tools from the kettle-dev gem may not work properly. Please run 'brew install direnv'." +fi diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 056a9722..5ee55773 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -6,8 +6,8 @@ github: [pboling] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., issuehunt: pboling # Replace with a single IssueHunt username ko_fi: pboling # Replace with a single Ko-fi username liberapay: pboling # Replace with a single Liberapay username -open_collective: ruby-oauth # Replace with a single Open Collective username +open_collective: ruby-oauth patreon: galtzo # Replace with a single Patreon username polar: pboling thanks_dev: u/gh/pboling -tidelift: rubygems/oauth2 # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +tidelift: rubygems/oauth2 diff --git a/.github/dependabot.yml b/.github/dependabot.yml index dc043b45..956aa5a3 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -3,12 +3,11 @@ updates: - package-ecosystem: bundler directory: "/" schedule: - interval: daily - time: "04:28" - open-pull-requests-limit: 10 + interval: "weekly" + open-pull-requests-limit: 5 ignore: - dependency-name: "rubocop-lts" - package-ecosystem: "github-actions" directory: "/" schedule: - interval: "daily" + interval: "weekly" diff --git a/.github/workflows/ancient.yml b/.github/workflows/ancient.yml index 2055a73e..3cc6e37e 100644 --- a/.github/workflows/ancient.yml +++ b/.github/workflows/ancient.yml @@ -1,4 +1,4 @@ -name: MRI 2.4, 2.5 (EOL) +name: MRI 2.3, 2.4, 2.5 (EOL) permissions: contents: read @@ -24,8 +24,8 @@ concurrency: jobs: test: - name: Specs ${{ matrix.ruby }} ${{ matrix.appraisal }}${{ matrix.name_extra || '' }} if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')" + name: Specs ${{ matrix.ruby }} ${{ matrix.appraisal }}${{ matrix.name_extra || '' }} runs-on: ubuntu-22.04 continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }} env: # $BUNDLE_GEMFILE must be set at job level, so it is set for all steps @@ -34,6 +34,14 @@ jobs: fail-fast: false matrix: include: + # Ruby 2.3 + - ruby: "ruby-2.3" + appraisal: "ruby-2-3" + exec_cmd: "rake test" + gemfile: "Appraisal.root" + rubygems: "3.3.27" + bundler: "2.3.27" + # Ruby 2.4 - ruby: "ruby-2.4" appraisal: "ruby-2-4" diff --git a/.github/workflows/auto-assign.yml b/.github/workflows/auto-assign.yml new file mode 100644 index 00000000..96975f22 --- /dev/null +++ b/.github/workflows/auto-assign.yml @@ -0,0 +1,21 @@ +name: Auto Assign +on: + issues: + types: [opened] + pull_request: + types: [opened] +jobs: + run: + runs-on: ubuntu-latest + permissions: + issues: write + pull-requests: write + steps: + - name: 'Auto-assign issue' + uses: pozil/auto-assign-issue@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + assignees: pboling + abortIfPreviousAssignees: true + allowSelfAssign: true + numOfAssignee: 1 \ No newline at end of file diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index a03c20f2..45a8ec2c 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -13,10 +13,10 @@ name: "CodeQL" on: push: - branches: [ main, "*-stable" ] + branches: [ main, '*-stable' ] pull_request: # The branches below must be a subset of the branches above - branches: [ main, "*-stable" ] + branches: [ main, '*-stable' ] schedule: - cron: '35 1 * * 5' diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 40e7f9ab..c9d6a2e1 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -9,7 +9,7 @@ env: K_SOUP_COV_MIN_BRANCH: 100 K_SOUP_COV_MIN_LINE: 100 K_SOUP_COV_MIN_HARD: true - K_SOUP_COV_FORMATTERS: "html,xml,rcov,lcov,tty" + K_SOUP_COV_FORMATTERS: "xml,rcov,lcov,tty" K_SOUP_COV_DO: true K_SOUP_COV_MULTI_FORMATTERS: true K_SOUP_COV_COMMAND_NAME: "Test Coverage" @@ -35,8 +35,8 @@ concurrency: jobs: coverage: - name: Code Coverage on ${{ matrix.ruby }}@current if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')" + name: Code Coverage on ${{ matrix.ruby }}@current runs-on: ubuntu-latest continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }} env: # $BUNDLE_GEMFILE must be set at job level, so it is set for all steps @@ -67,7 +67,7 @@ jobs: # Raw `bundle` will use the BUNDLE_GEMFILE set to matrix.gemfile (i.e. Appraisal.root) # We need to do this first to get appraisal installed. - # NOTE: This does not use the main Gemfile at all. + # NOTE: This does not use the primary Gemfile at all. - name: Install Root Appraisal run: bundle - name: Appraisal for ${{ matrix.appraisal }} @@ -85,21 +85,22 @@ jobs: - name: Upload coverage to QLTY if: ${{ !env.ACT }} - uses: qltysh/qlty-action/coverage@v2 + uses: qltysh/qlty-action/coverage@main with: token: ${{secrets.QLTY_COVERAGE_TOKEN}} files: coverage/.resultset.json continue-on-error: ${{ matrix.experimental != 'false' }} -# # Build will fail here if coverage upload fails -# # which will hopefully be noticed for the lack of code coverage comments -# - name: Upload coverage to CodeCov -# uses: codecov/codecov-action@v5 -# with: -# use_oidc: true -# fail_ci_if_error: true # optional (default = false) -# files: coverage/lcov.info,coverage/coverage.xml -# verbose: true # optional (default = false) + # Build will fail here if coverage upload fails + # which will hopefully be noticed for the lack of code coverage comments + - name: Upload coverage to CodeCov + if: ${{ !env.ACT }} + uses: codecov/codecov-action@v5 + with: + use_oidc: true + fail_ci_if_error: false # optional (default = false) + files: coverage/lcov.info,coverage/coverage.xml + verbose: true # optional (default = false) # Then PR comments - name: Code Coverage Summary Report diff --git a/.github/workflows/current.yml b/.github/workflows/current.yml index 1096ce9b..aca52ba3 100644 --- a/.github/workflows/current.yml +++ b/.github/workflows/current.yml @@ -28,8 +28,8 @@ concurrency: jobs: test: - name: Specs ${{ matrix.ruby }}@${{ matrix.appraisal }} if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')" + name: Specs ${{ matrix.ruby }}@${{ matrix.appraisal }} runs-on: ubuntu-latest continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }} env: # $BUNDLE_GEMFILE must be set at job level, so it is set for all steps diff --git a/.github/workflows/discord-notifier.yml b/.github/workflows/discord-notifier.yml new file mode 100644 index 00000000..ad98367a --- /dev/null +++ b/.github/workflows/discord-notifier.yml @@ -0,0 +1,39 @@ +name: Discord Notify + +on: + check_run: + types: [completed] + discussion: + types: [ created ] + discussion_comment: + types: [ created ] + fork: + gollum: + issues: + types: [ opened ] + issue_comment: + types: [ created ] + pull_request: + types: [ opened, reopened, closed ] + release: + types: [ published ] + watch: + types: [ started ] + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + # This workflow contains a single job called "build" + notify: + if: false + # The type of runner that the job will run on + runs-on: ubuntu-latest + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + - name: Actions Status Discord + uses: sarisia/actions-status-discord@v1 + if: always() + with: + webhook: ${{ secrets.DISCORD_WEBHOOK }} + status: ${{ job.status }} + username: GitHub Actions diff --git a/.github/workflows/heads.yml b/.github/workflows/heads.yml index a1f1f0a7..e2046e66 100644 --- a/.github/workflows/heads.yml +++ b/.github/workflows/heads.yml @@ -27,8 +27,8 @@ concurrency: jobs: test: - name: Specs ${{ matrix.ruby }}@${{ matrix.appraisal }}${{ matrix.name_extra || '' }} if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')" + name: Specs ${{ matrix.ruby }}@${{ matrix.appraisal }}${{ matrix.name_extra || '' }} runs-on: ubuntu-latest continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }} env: # $BUNDLE_GEMFILE must be set at job level, so it is set for all steps diff --git a/.github/workflows/jruby.yml b/.github/workflows/jruby.yml index 06f1eb99..99ea13d9 100644 --- a/.github/workflows/jruby.yml +++ b/.github/workflows/jruby.yml @@ -27,8 +27,8 @@ concurrency: jobs: test: - name: Specs ${{ matrix.ruby }} ${{ matrix.appraisal }}${{ matrix.name_extra || '' }} if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')" + name: Specs ${{ matrix.ruby }} ${{ matrix.appraisal }}${{ matrix.name_extra || '' }} runs-on: ubuntu-22.04 continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }} env: # $BUNDLE_GEMFILE must be set at job level, so it is set for all steps @@ -36,22 +36,6 @@ jobs: strategy: matrix: include: - # jruby-9.2 (targets Ruby 2.5 compatibility) - - ruby: "jruby-9.2" - appraisal: "ruby-2-5" - exec_cmd: "rake test" - gemfile: "Appraisal.root" - rubygems: default - bundler: default - - # jruby-9.3 (targets Ruby 2.6 compatibility) - - ruby: "jruby-9.3" - appraisal: "ruby-2-6" - exec_cmd: "rake test" - gemfile: "Appraisal.root" - rubygems: default - bundler: default - # jruby-9.4 (targets Ruby 3.1 compatibility) - ruby: "jruby-9.4" appraisal: "ruby-3-1" diff --git a/.github/workflows/legacy.yml b/.github/workflows/legacy.yml index dc59e4ac..7f1fc299 100644 --- a/.github/workflows/legacy.yml +++ b/.github/workflows/legacy.yml @@ -27,8 +27,8 @@ concurrency: jobs: test: - name: Specs ${{ matrix.ruby }} ${{ matrix.appraisal }}${{ matrix.name_extra || '' }} if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')" + name: Specs ${{ matrix.ruby }} ${{ matrix.appraisal }}${{ matrix.name_extra || '' }} runs-on: ubuntu-22.04 continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }} env: # $BUNDLE_GEMFILE must be set at job level, so it is set for all steps @@ -37,14 +37,6 @@ jobs: fail-fast: false matrix: include: - # Ruby 3.1 - - ruby: "ruby-3.1" - appraisal: "ruby-3-1" - exec_cmd: "rake test" - gemfile: "Appraisal.root" - rubygems: latest - bundler: latest - # Ruby 3.0 - ruby: "ruby-3.0" appraisal: "ruby-3-0" @@ -53,6 +45,14 @@ jobs: rubygems: '3.5.23' bundler: '2.5.23' + # Ruby 3.1 + - ruby: "ruby-3.1" + appraisal: "ruby-3-1" + exec_cmd: "rake test" + gemfile: "Appraisal.root" + rubygems: latest + bundler: latest + steps: - name: Checkout uses: actions/checkout@v5 diff --git a/.github/workflows/locked_deps.yml b/.github/workflows/locked_deps.yml new file mode 100644 index 00000000..7d946ad6 --- /dev/null +++ b/.github/workflows/locked_deps.yml @@ -0,0 +1,85 @@ +--- +# Lock/Unlock Deps Pattern +# +# Two often conflicting goals resolved! +# +# - unlocked_deps.yml +# - All runtime & dev dependencies, but does not have a `gemfiles/*.gemfile.lock` committed +# - Uses an Appraisal2 "unlocked_deps" gemfile, and the current MRI Ruby release +# - Know when new dependency releases will break local dev with unlocked dependencies +# - Broken workflow indicates that new releases of dependencies may not work +# +# - locked_deps.yml +# - All runtime & dev dependencies, and has a `Gemfile.lock` committed +# - Uses the project's main Gemfile, and the current MRI Ruby release +# - Matches what contributors and maintainers use locally for development +# - Broken workflow indicates that a new contributor will have a bad time +# +name: Deps Locked + +permissions: + contents: read + +env: + # Running coverage, but not validating minimum coverage, + # because it would be redundant with the coverage workflow. + # Also we can validate all output formats without breaking CodeCov, + # since we aren't submitting these reports anywhere. + K_SOUP_COV_MIN_BRANCH: 71 + K_SOUP_COV_MIN_LINE: 86 + K_SOUP_COV_MIN_HARD: false + K_SOUP_COV_FORMATTERS: "html,xml,rcov,lcov,json,tty" + K_SOUP_COV_DO: true + K_SOUP_COV_MULTI_FORMATTERS: true + K_SOUP_COV_COMMAND_NAME: "Test Coverage" + +on: + push: + branches: + - 'main' + - '*-stable' + tags: + - '!*' # Do not execute on tags + pull_request: + branches: + - '*' + # Allow manually triggering the workflow. + workflow_dispatch: + +# Cancels all previous workflow runs for the same branch that have not yet completed. +concurrency: + # The concurrency group contains the workflow name and the branch name. + group: "${{ github.workflow }}-${{ github.ref }}" + cancel-in-progress: true + +jobs: + test: + if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')" + name: Default rake task w/ main Gemfile.lock ${{ matrix.name_extra || '' }} + runs-on: ubuntu-latest + continue-on-error: ${{ matrix.experimental }} + strategy: + fail-fast: false + matrix: + include: + # Ruby + - ruby: "ruby" + exec_cmd: "rake" + rubygems: latest + bundler: latest + experimental: false + + steps: + - name: Checkout + uses: actions/checkout@v5 + + - name: Setup Ruby & RubyGems + uses: ruby/setup-ruby@v1 + with: + ruby-version: ${{ matrix.ruby }} + rubygems: ${{ matrix.rubygems }} + bundler: ${{ matrix.bundler }} + bundler-cache: true + + - name: Checks the kitchen sink via ${{ matrix.exec_cmd }} + run: bundle exec ${{ matrix.exec_cmd }} diff --git a/.github/workflows/opencollective.yml b/.github/workflows/opencollective.yml new file mode 100644 index 00000000..6122df47 --- /dev/null +++ b/.github/workflows/opencollective.yml @@ -0,0 +1,40 @@ +name: Open Collective Backers + +on: + schedule: + # Run once a week on Sunday at 12:00 AM UTC + - cron: '0 0 * * 0' + workflow_dispatch: + +permissions: + contents: write + +jobs: + update-backers: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + with: + persist-credentials: false + - name: Setup Ruby & RubyGems + uses: ruby/setup-ruby@v1 + with: + ruby-version: ruby + rubygems: default + bundler: default + bundler-cache: true + + - name: README Update + env: + # Keep GITHUB_TOKEN for any tools/scripts expecting it, mapped to the same secret + GITHUB_TOKEN: ${{ secrets.README_UPDATER_TOKEN }} + README_UPDATER_TOKEN: ${{ secrets.README_UPDATER_TOKEN }} + REPO: ${{ github.repository }} + run: | + git config user.name 'autobolt' + git config user.email 'autobots@9thbit.net' + # Use the configured token for authenticated pushes + git remote set-url origin "https://x-access-token:${README_UPDATER_TOKEN}@github.com/${REPO}.git" + bin/kettle-readme-backers + # Push back to the same branch/ref that triggered the workflow (default branch for schedule) + git push origin HEAD diff --git a/.github/workflows/style.yml b/.github/workflows/style.yml index dfee1fac..2fe1e03c 100644 --- a/.github/workflows/style.yml +++ b/.github/workflows/style.yml @@ -24,8 +24,8 @@ concurrency: jobs: rubocop: - name: Style on ${{ matrix.ruby }}@current if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')" + name: Style on ${{ matrix.ruby }}@current runs-on: ubuntu-latest continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }} env: # $BUNDLE_GEMFILE must be set at job level, so it is set for all steps diff --git a/.github/workflows/supported.yml b/.github/workflows/supported.yml index d20a3e84..887034b0 100644 --- a/.github/workflows/supported.yml +++ b/.github/workflows/supported.yml @@ -27,8 +27,8 @@ concurrency: jobs: test: - name: Specs ${{ matrix.ruby }} ${{ matrix.appraisal }}${{ matrix.name_extra || '' }} if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')" + name: Specs ${{ matrix.ruby }} ${{ matrix.appraisal }}${{ matrix.name_extra || '' }} runs-on: ubuntu-latest continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }} env: # $BUNDLE_GEMFILE must be set at job level, so it is set for all steps diff --git a/.github/workflows/truffle.yml b/.github/workflows/truffle.yml index bf51aaca..db651885 100644 --- a/.github/workflows/truffle.yml +++ b/.github/workflows/truffle.yml @@ -27,8 +27,8 @@ concurrency: jobs: test: - name: Specs ${{ matrix.ruby }} ${{ matrix.appraisal }}${{ matrix.name_extra || '' }} if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')" + name: Specs ${{ matrix.ruby }} ${{ matrix.appraisal }}${{ matrix.name_extra || '' }} runs-on: ubuntu-22.04 continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }} env: # $BUNDLE_GEMFILE must be set at job level, so it is set for all steps diff --git a/.github/workflows/unlocked_deps.yml b/.github/workflows/unlocked_deps.yml new file mode 100644 index 00000000..7faffa13 --- /dev/null +++ b/.github/workflows/unlocked_deps.yml @@ -0,0 +1,84 @@ +--- +# Lock/Unlock Deps Pattern +# +# Two often conflicting goals resolved! +# +# - unlocked_deps.yml +# - All runtime & dev dependencies, but does not have a `gemfiles/*.gemfile.lock` committed +# - Uses an Appraisal2 "unlocked_deps" gemfile, and the current MRI Ruby release +# - Know when new dependency releases will break local dev with unlocked dependencies +# - Broken workflow indicates that new releases of dependencies may not work +# +# - locked_deps.yml +# - All runtime & dev dependencies, and has a `Gemfile.lock` committed +# - Uses the project's main Gemfile, and the current MRI Ruby release +# - Matches what contributors and maintainers use locally for development +# - Broken workflow indicates that a new contributor will have a bad time +# +name: Deps Unlocked + +permissions: + contents: read + +env: + K_SOUP_COV_DO: false + +on: + push: + branches: + - 'main' + - '*-stable' + tags: + - '!*' # Do not execute on tags + pull_request: + branches: + - '*' + # Allow manually triggering the workflow. + workflow_dispatch: + +# Cancels all previous workflow runs for the same branch that have not yet completed. +concurrency: + # The concurrency group contains the workflow name and the branch name. + group: "${{ github.workflow }}-${{ github.ref }}" + cancel-in-progress: true + +jobs: + test: + if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')" + name: Default rake task w/ unlocked deps ${{ matrix.name_extra || '' }} + runs-on: ubuntu-latest + continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }} + env: # $BUNDLE_GEMFILE must be set at job level, so it is set for all steps + BUNDLE_GEMFILE: ${{ github.workspace }}/${{ matrix.gemfile }}.gemfile + strategy: + matrix: + include: + # Ruby + - ruby: "ruby" + appraisal_name: "unlocked_deps" + exec_cmd: "rake" + gemfile: "Appraisal.root" + rubygems: latest + bundler: latest + + steps: + - name: Checkout + uses: actions/checkout@v5 + + - name: Setup Ruby & RubyGems + uses: ruby/setup-ruby@v1 + with: + ruby-version: ${{ matrix.ruby }} + rubygems: ${{ matrix.rubygems }} + bundler: ${{ matrix.bundler }} + bundler-cache: false + + # Raw `bundle` will use the BUNDLE_GEMFILE set to matrix.gemfile (i.e. Appraisal.root) + # We need to do this first to get appraisal installed. + # NOTE: This does not use the primary Gemfile at all. + - name: Install Root Appraisal + run: bundle + - name: Appraisal for ${{ matrix.ruby }}@${{ matrix.appraisal_name }} + run: bundle exec appraisal ${{ matrix.appraisal_name }} bundle + - name: Run ${{ matrix.exec_cmd }} on ${{ matrix.ruby }}@${{ matrix.appraisal_name }} + run: bundle exec appraisal ${{ matrix.appraisal_name }} bundle exec ${{ matrix.exec_cmd }} diff --git a/.github/workflows/unsupported.yml b/.github/workflows/unsupported.yml index 0bfc0d3b..98336994 100644 --- a/.github/workflows/unsupported.yml +++ b/.github/workflows/unsupported.yml @@ -27,8 +27,8 @@ concurrency: jobs: test: - name: Specs ${{ matrix.ruby }} ${{ matrix.appraisal }}${{ matrix.name_extra || '' }} if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')" + name: Specs ${{ matrix.ruby }} ${{ matrix.appraisal }}${{ matrix.name_extra || '' }} runs-on: ubuntu-22.04 continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }} env: # $BUNDLE_GEMFILE must be set at job level, so it is set for all steps diff --git a/.gitignore b/.gitignore index 159a4bd6..83000f2c 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,7 @@ Appraisal.*.gemfile.lock .rspec_status /coverage/ /spec/reports/ +/results/ # Documentation /.yardoc/ @@ -42,3 +43,6 @@ Appraisal.*.gemfile.lock # Editors *~ + +# Sentinels +.floss_funding.*.lock diff --git a/.idea/oauth2.iml b/.idea/oauth2.iml index fcb82615..47346b34 100755 --- a/.idea/oauth2.iml +++ b/.idea/oauth2.iml @@ -25,6 +25,7 @@ + @@ -57,6 +58,7 @@ + @@ -67,12 +69,14 @@ + + @@ -93,6 +97,7 @@ + @@ -130,6 +135,7 @@ +