kettle-dev 1.2.3 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +176 -3
- data/CITATION.cff +2 -2
- data/CONTRIBUTING.md +11 -17
- data/README.md +390 -319
- data/exe/kettle-dev-setup +12 -63
- data/exe/kettle-gh-release +82 -0
- data/lib/kettle/dev/gem_spec_reader.rb +2 -2
- data/lib/kettle/dev/open_collective_config.rb +12 -0
- data/lib/kettle/dev/rakelib/yard.rake +15 -0
- data/lib/kettle/dev/tasks/ci_task.rb +4 -4
- data/lib/kettle/dev/version.rb +1 -1
- data/lib/kettle/dev.rb +4 -12
- data/sig/kettle/dev/source_merger.rbs +40 -56
- data.tar.gz.sig +0 -0
- metadata +15 -144
- metadata.gz.sig +0 -0
- data/.aiignore.example +0 -19
- data/.devcontainer/apt-install/devcontainer-feature.json +0 -9
- data/.devcontainer/apt-install/install.sh +0 -11
- data/.devcontainer/devcontainer.json +0 -28
- data/.env.local.example +0 -31
- data/.envrc +0 -47
- data/.envrc.example +0 -51
- data/.envrc.no-osc.example +0 -51
- data/.git-hooks/commit-msg +0 -54
- data/.git-hooks/commit-subjects-goalie.txt +0 -8
- data/.git-hooks/footer-template.erb.txt +0 -16
- data/.git-hooks/prepare-commit-msg +0 -8
- data/.github/.codecov.yml.example +0 -14
- data/.github/FUNDING.yml +0 -13
- data/.github/FUNDING.yml.no-osc.example +0 -13
- data/.github/dependabot.yml +0 -13
- data/.github/workflows/ancient.yml +0 -83
- data/.github/workflows/ancient.yml.example +0 -81
- data/.github/workflows/auto-assign.yml +0 -21
- data/.github/workflows/codeql-analysis.yml +0 -70
- data/.github/workflows/coverage.yml +0 -127
- data/.github/workflows/coverage.yml.example +0 -127
- data/.github/workflows/current.yml +0 -116
- data/.github/workflows/current.yml.example +0 -115
- data/.github/workflows/dep-heads.yml +0 -117
- data/.github/workflows/dependency-review.yml +0 -20
- data/.github/workflows/discord-notifier.yml.example +0 -39
- data/.github/workflows/heads.yml +0 -117
- data/.github/workflows/heads.yml.example +0 -116
- data/.github/workflows/jruby.yml +0 -82
- data/.github/workflows/jruby.yml.example +0 -72
- data/.github/workflows/legacy.yml +0 -76
- data/.github/workflows/license-eye.yml +0 -40
- data/.github/workflows/locked_deps.yml +0 -85
- data/.github/workflows/opencollective.yml +0 -40
- data/.github/workflows/style.yml +0 -67
- data/.github/workflows/supported.yml +0 -75
- data/.github/workflows/truffle.yml +0 -99
- data/.github/workflows/unlocked_deps.yml +0 -84
- data/.github/workflows/unsupported.yml +0 -76
- data/.gitignore +0 -50
- data/.gitlab-ci.yml.example +0 -134
- data/.idea/.gitignore +0 -45
- data/.junie/guidelines-rbs.md +0 -49
- data/.junie/guidelines.md +0 -141
- data/.junie/guidelines.md.example +0 -140
- data/.licenserc.yaml +0 -7
- data/.opencollective.yml +0 -3
- data/.opencollective.yml.example +0 -3
- data/.qlty/qlty.toml +0 -79
- data/.rspec +0 -9
- data/.rubocop.yml +0 -13
- data/.rubocop_rspec.yml +0 -33
- data/.simplecov +0 -16
- data/.simplecov.example +0 -11
- data/.tool-versions +0 -1
- data/.yardignore +0 -13
- data/.yardopts +0 -14
- data/Appraisal.root.gemfile +0 -10
- data/Appraisals +0 -151
- data/Appraisals.example +0 -102
- data/CHANGELOG.md.example +0 -47
- data/CONTRIBUTING.md.example +0 -227
- data/FUNDING.md.no-osc.example +0 -63
- data/Gemfile +0 -40
- data/Gemfile.example +0 -34
- data/README.md.example +0 -570
- data/README.md.no-osc.example +0 -536
- data/Rakefile.example +0 -68
- data/gemfiles/modular/coverage.gemfile +0 -6
- data/gemfiles/modular/debug.gemfile +0 -13
- data/gemfiles/modular/documentation.gemfile +0 -14
- data/gemfiles/modular/erb/r2/v3.0.gemfile +0 -1
- data/gemfiles/modular/erb/r2.3/default.gemfile +0 -6
- data/gemfiles/modular/erb/r2.6/v2.2.gemfile +0 -3
- data/gemfiles/modular/erb/r3/v5.0.gemfile +0 -1
- data/gemfiles/modular/erb/r3.1/v4.0.gemfile +0 -2
- data/gemfiles/modular/erb/vHEAD.gemfile +0 -2
- data/gemfiles/modular/injected.gemfile +0 -60
- data/gemfiles/modular/mutex_m/r2/v0.3.gemfile +0 -2
- data/gemfiles/modular/mutex_m/r2.4/v0.1.gemfile +0 -3
- data/gemfiles/modular/mutex_m/r3/v0.3.gemfile +0 -2
- data/gemfiles/modular/mutex_m/vHEAD.gemfile +0 -2
- data/gemfiles/modular/optional.gemfile +0 -8
- data/gemfiles/modular/optional.gemfile.example +0 -5
- data/gemfiles/modular/runtime_heads.gemfile +0 -10
- data/gemfiles/modular/runtime_heads.gemfile.example +0 -8
- data/gemfiles/modular/stringio/r2/v3.0.gemfile +0 -5
- data/gemfiles/modular/stringio/r2.4/v0.0.2.gemfile +0 -4
- data/gemfiles/modular/stringio/r3/v3.0.gemfile +0 -5
- data/gemfiles/modular/stringio/vHEAD.gemfile +0 -2
- data/gemfiles/modular/style.gemfile +0 -25
- data/gemfiles/modular/style.gemfile.example +0 -25
- data/gemfiles/modular/templating.gemfile +0 -3
- data/gemfiles/modular/x_std_libs/r2/libs.gemfile +0 -3
- data/gemfiles/modular/x_std_libs/r2.3/libs.gemfile +0 -3
- data/gemfiles/modular/x_std_libs/r2.4/libs.gemfile +0 -3
- data/gemfiles/modular/x_std_libs/r2.6/libs.gemfile +0 -3
- data/gemfiles/modular/x_std_libs/r3/libs.gemfile +0 -3
- data/gemfiles/modular/x_std_libs/r3.1/libs.gemfile +0 -3
- data/gemfiles/modular/x_std_libs/vHEAD.gemfile +0 -3
- data/gemfiles/modular/x_std_libs.gemfile +0 -2
- data/kettle-dev.gemspec.example +0 -154
- data/lib/kettle/dev/modular_gemfiles.rb +0 -119
- data/lib/kettle/dev/prism_appraisals.rb +0 -351
- data/lib/kettle/dev/prism_gemfile.rb +0 -177
- data/lib/kettle/dev/prism_gemspec.rb +0 -284
- data/lib/kettle/dev/prism_utils.rb +0 -201
- data/lib/kettle/dev/rakelib/install.rake +0 -10
- data/lib/kettle/dev/rakelib/template.rake +0 -10
- data/lib/kettle/dev/setup_cli.rb +0 -403
- data/lib/kettle/dev/source_merger.rb +0 -622
- data/lib/kettle/dev/tasks/install_task.rb +0 -553
- data/lib/kettle/dev/tasks/template_task.rb +0 -975
- data/lib/kettle/dev/template_helpers.rb +0 -685
data/exe/kettle-dev-setup
CHANGED
|
@@ -3,66 +3,15 @@
|
|
|
3
3
|
|
|
4
4
|
# vim: set syntax=ruby
|
|
5
5
|
|
|
6
|
-
# kettle-dev-setup
|
|
7
|
-
#
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
$stdout.sync = true
|
|
19
|
-
$stderr.sync = true
|
|
20
|
-
|
|
21
|
-
script_basename = File.basename(__FILE__)
|
|
22
|
-
File.basename($PROGRAM_NAME)
|
|
23
|
-
|
|
24
|
-
begin
|
|
25
|
-
require "kettle/dev"
|
|
26
|
-
puts "== #{script_basename} v#{Kettle::Dev::Version::VERSION} begin =="
|
|
27
|
-
rescue StandardError => e
|
|
28
|
-
# Requiring kettle/dev should generally work since this script ships with the gem.
|
|
29
|
-
# But if autoloads try to pull optional deps, we should still proceed as most
|
|
30
|
-
# of this script does not rely on those parts.
|
|
31
|
-
warn("[kettle-dev-setup] Warning: could not fully load kettle/dev (#{e.class}: #{e.message}). Proceeding with limited features.")
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
# Always execute when this file is loaded (e.g., via a Bundler binstub).
|
|
35
|
-
# Do not guard with __FILE__ == $PROGRAM_NAME because binstubs use Kernel.load.
|
|
36
|
-
if ARGV.include?("-h") || ARGV.include?("--help")
|
|
37
|
-
puts <<~USAGE
|
|
38
|
-
Usage: kettle-dev-setup [options]
|
|
39
|
-
|
|
40
|
-
Bootstraps a host gem repository to use kettle-dev tooling.
|
|
41
|
-
|
|
42
|
-
Options (passed through to rake kettle:dev:install):
|
|
43
|
-
--allowed=VAL
|
|
44
|
-
--force
|
|
45
|
-
--hook_templates=VAL
|
|
46
|
-
--only=VAL
|
|
47
|
-
--include=VAL
|
|
48
|
-
|
|
49
|
-
Environment:
|
|
50
|
-
DEBUG=true # print backtraces on errors
|
|
51
|
-
USAGE
|
|
52
|
-
exit 0
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
begin
|
|
56
|
-
Kettle::Dev::SetupCLI.new(ARGV).run!
|
|
57
|
-
rescue LoadError => e
|
|
58
|
-
warn("#{script_basename}: could not load dependency: #{e.class}: #{e.message}")
|
|
59
|
-
warn(e.backtrace.join("\n")) if ENV["DEBUG"]
|
|
60
|
-
exit(1)
|
|
61
|
-
rescue SystemExit => e
|
|
62
|
-
warn("#{script_basename}: exited (status=#{e.status}, msg=#{e.message})") if e.status != 0
|
|
63
|
-
raise
|
|
64
|
-
rescue StandardError => e
|
|
65
|
-
warn("#{script_basename}: unexpected error: #{e.class}: #{e.message}")
|
|
66
|
-
warn(e.backtrace.join("\n")) if ENV["DEBUG"]
|
|
67
|
-
exit(1)
|
|
68
|
-
end
|
|
6
|
+
# kettle-dev-setup has been replaced by kettle-jem-setup.
|
|
7
|
+
# All setup and templating functionality has moved to the kettle-jem gem.
|
|
8
|
+
|
|
9
|
+
$stderr.puts <<~MSG
|
|
10
|
+
kettle-dev-setup has been removed.
|
|
11
|
+
Setup and templating functionality has moved to the kettle-jem gem.
|
|
12
|
+
|
|
13
|
+
Please install kettle-jem and use kettle-jem-setup instead:
|
|
14
|
+
gem install kettle-jem
|
|
15
|
+
kettle-jem-setup
|
|
16
|
+
MSG
|
|
17
|
+
exit 1
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
# vim: set syntax=ruby
|
|
5
|
+
|
|
6
|
+
# kettle-gh-release: Create a GitHub release for a gem version
|
|
7
|
+
# - Extracted from kettle-release step 18
|
|
8
|
+
# - Useful when the main release succeeded but GitHub release creation failed
|
|
9
|
+
# - Requires GITHUB_TOKEN with repo:public_repo (classic) or contents:write scope
|
|
10
|
+
|
|
11
|
+
# Immediate, unbuffered output
|
|
12
|
+
$stdout.sync = true
|
|
13
|
+
$stderr.sync = true
|
|
14
|
+
|
|
15
|
+
# Do not rely on Bundler; allow running in repos that do not depend on kettle-dev
|
|
16
|
+
# Ensure RubyGems is available for 'require' lookups
|
|
17
|
+
begin
|
|
18
|
+
require "rubygems"
|
|
19
|
+
rescue LoadError
|
|
20
|
+
# Older Rubies always have rubygems; continue anyway
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
script_basename = File.basename(__FILE__)
|
|
24
|
+
|
|
25
|
+
begin
|
|
26
|
+
require "kettle/dev"
|
|
27
|
+
puts "== #{script_basename} v#{Kettle::Dev::Version::VERSION} =="
|
|
28
|
+
rescue LoadError => e
|
|
29
|
+
warn("#{script_basename}: could not load dependency: #{e.class}: #{e.message}")
|
|
30
|
+
warn("Hint: Ensure the host project has kettle-dev as a dependency and run bundle install.")
|
|
31
|
+
exit(1)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Always execute when this file is loaded (e.g., via a Bundler binstub).
|
|
35
|
+
# Do not guard with __FILE__ == $PROGRAM_NAME because binstubs use Kernel.load.
|
|
36
|
+
if ARGV.include?("-h") || ARGV.include?("--help")
|
|
37
|
+
puts <<~USAGE
|
|
38
|
+
Usage: #{script_basename} [version=<VERSION>]
|
|
39
|
+
|
|
40
|
+
Creates a GitHub release for a gem version.
|
|
41
|
+
|
|
42
|
+
This is step 18 of the kettle-release flow, extracted as a standalone script.
|
|
43
|
+
Useful when the main release to RubyGems succeeded but GitHub release creation
|
|
44
|
+
failed (e.g., due to token issues or network problems).
|
|
45
|
+
|
|
46
|
+
Arguments:
|
|
47
|
+
version=<VERSION> # Explicit version (e.g., version=1.2.3)
|
|
48
|
+
# If omitted, auto-detects from lib/**/version.rb
|
|
49
|
+
|
|
50
|
+
Environment:
|
|
51
|
+
GITHUB_TOKEN / GH_TOKEN # Required; needs repo:public_repo (classic) or contents:write scope
|
|
52
|
+
DEBUG=true # Print backtraces on errors
|
|
53
|
+
|
|
54
|
+
Examples:
|
|
55
|
+
#{script_basename} # auto-detect version, create release
|
|
56
|
+
#{script_basename} version=2.0.0 # create release for specific version
|
|
57
|
+
GITHUB_TOKEN=ghp_xxx #{script_basename} # explicit token
|
|
58
|
+
USAGE
|
|
59
|
+
exit 0
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Parse version=<v> from ARGV
|
|
63
|
+
version_arg = ARGV.find { |a| a.start_with?("version=") }
|
|
64
|
+
explicit_version = version_arg ? version_arg.split("=", 2)[1].strip : nil
|
|
65
|
+
|
|
66
|
+
begin
|
|
67
|
+
cli = Kettle::Dev::ReleaseCLI.new(start_step: 18)
|
|
68
|
+
version = explicit_version || cli.send(:detect_version)
|
|
69
|
+
cli.send(:maybe_create_github_release!, version)
|
|
70
|
+
rescue LoadError => e
|
|
71
|
+
warn("#{script_basename}: could not load dependency: #{e.class}: #{e.message}")
|
|
72
|
+
warn(Array(e.backtrace).join("\n")) if ENV["DEBUG"]
|
|
73
|
+
exit(1)
|
|
74
|
+
rescue SystemExit => e
|
|
75
|
+
# Preserve exit status, but ensure at least a newline so shells don't show an empty line only.
|
|
76
|
+
warn("#{script_basename}: exited (status=#{e.status}, msg=#{e.message})") if e.status != 0
|
|
77
|
+
raise
|
|
78
|
+
rescue StandardError => e
|
|
79
|
+
warn("#{script_basename}: unexpected error: #{e.class}: #{e.message}")
|
|
80
|
+
warn(Array(e.backtrace).join("\n"))
|
|
81
|
+
exit(1)
|
|
82
|
+
end
|
|
@@ -99,13 +99,13 @@ module Kettle
|
|
|
99
99
|
|
|
100
100
|
# Funding org (Open Collective handle) detection.
|
|
101
101
|
# Precedence:
|
|
102
|
-
# 1)
|
|
102
|
+
# 1) OpenCollectiveConfig.disabled? - when true, funding_org is nil
|
|
103
103
|
# 2) ENV["FUNDING_ORG"] when set and non-empty (unless already disabled above)
|
|
104
104
|
# 3) OpenCollectiveConfig.handle(required: false)
|
|
105
105
|
# Be lenient: allow nil when not discoverable, with a concise warning.
|
|
106
106
|
begin
|
|
107
107
|
# Check if Open Collective is explicitly disabled via environment variables
|
|
108
|
-
if
|
|
108
|
+
if OpenCollectiveConfig.disabled?
|
|
109
109
|
funding_org = nil
|
|
110
110
|
else
|
|
111
111
|
env_funding = ENV["FUNDING_ORG"]
|
|
@@ -10,6 +10,18 @@ module Kettle
|
|
|
10
10
|
module OpenCollectiveConfig
|
|
11
11
|
module_function
|
|
12
12
|
|
|
13
|
+
# Check if Open Collective is disabled via environment variable.
|
|
14
|
+
# Returns true when OPENCOLLECTIVE_HANDLE or FUNDING_ORG is explicitly set to a falsey value.
|
|
15
|
+
# @return [Boolean]
|
|
16
|
+
def disabled?
|
|
17
|
+
oc_handle = ENV["OPENCOLLECTIVE_HANDLE"]
|
|
18
|
+
funding_org = ENV["FUNDING_ORG"]
|
|
19
|
+
|
|
20
|
+
[oc_handle, funding_org].any? do |val|
|
|
21
|
+
val && val.to_s.strip.match(Kettle::Dev::ENV_FALSE_RE)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
13
25
|
# Absolute path to a .opencollective.yml
|
|
14
26
|
# @param root [String, nil] optional project root to resolve against; when nil, uses this repo root
|
|
15
27
|
# @return [String]
|
|
@@ -4,6 +4,21 @@
|
|
|
4
4
|
begin
|
|
5
5
|
require "yard"
|
|
6
6
|
|
|
7
|
+
# Load yard-fence rake task if available (provides yard:fence:prepare)
|
|
8
|
+
# NOTE: yard-fence >= 0.9 auto-registers its rake task when Rake is available,
|
|
9
|
+
# so this explicit require may be redundant. We keep it for backward compatibility
|
|
10
|
+
# with older yard-fence versions that don't auto-register.
|
|
11
|
+
# The yard:fence:prepare task handles:
|
|
12
|
+
# - Cleaning docs/ directory (if YARD_FENCE_CLEAN_DOCS=true)
|
|
13
|
+
# - Preparing tmp/yard-fence/ with sanitized markdown files
|
|
14
|
+
begin
|
|
15
|
+
require "yard/fence/rake_task"
|
|
16
|
+
# Only create if not already defined (yard-fence may have auto-registered)
|
|
17
|
+
Yard::Fence::RakeTask.new unless Rake::Task.task_defined?("yard:fence:prepare")
|
|
18
|
+
rescue LoadError
|
|
19
|
+
# yard-fence not available or doesn't have rake_task - that's fine
|
|
20
|
+
end
|
|
21
|
+
|
|
7
22
|
YARD::Rake::YardocTask.new(:yard) do |t|
|
|
8
23
|
t.files = [
|
|
9
24
|
# Source Splats (alphabetical)
|
|
@@ -265,11 +265,11 @@ module Kettle
|
|
|
265
265
|
selected = nil
|
|
266
266
|
# Create input thread always so specs that assert its cleanup/exception behavior can exercise it,
|
|
267
267
|
# but guard against non-interactive stdin by rescuing 'bad tty' and similar errors immediately.
|
|
268
|
-
input_thread = Thread.new do
|
|
268
|
+
input_thread = Thread.new do # rubocop:disable ThreadSafety/NewThread
|
|
269
269
|
begin
|
|
270
270
|
selected = Kettle::Dev::InputAdapter.gets&.strip
|
|
271
|
-
rescue
|
|
272
|
-
# Catch
|
|
271
|
+
rescue StandardError, SystemExit, Interrupt => error
|
|
272
|
+
# Catch exceptions in background thread, including SystemExit
|
|
273
273
|
# NOTE: look into refactoring to minimize potential SystemExit.
|
|
274
274
|
puts "Error in background thread: #{error.class}: #{error.message}" if Kettle::Dev::DEBUGGING
|
|
275
275
|
selected = :input_error
|
|
@@ -281,7 +281,7 @@ module Kettle
|
|
|
281
281
|
start_at = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
282
282
|
|
|
283
283
|
options.each do |code, file|
|
|
284
|
-
workers << Thread.new(code, file, owner, repo, branch, token, start_at) do |c, f, ow, rp, br, tk, st_at|
|
|
284
|
+
workers << Thread.new(code, file, owner, repo, branch, token, start_at) do |c, f, ow, rp, br, tk, st_at| # rubocop:disable ThreadSafety/NewThread
|
|
285
285
|
begin
|
|
286
286
|
now = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
287
287
|
delay = 0.12 - (now - st_at)
|
data/lib/kettle/dev/version.rb
CHANGED
data/lib/kettle/dev.rb
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
# External gems
|
|
4
|
+
|
|
4
5
|
# It's not reasonable to test this ENV variable
|
|
5
6
|
# :nocov:
|
|
6
7
|
require "require_bench" if ENV.fetch("REQUIRE_BENCH", "false").casecmp("true").zero?
|
|
@@ -21,26 +22,16 @@ module Kettle
|
|
|
21
22
|
autoload :GitAdapter, "kettle/dev/git_adapter"
|
|
22
23
|
autoload :GitCommitFooter, "kettle/dev/git_commit_footer"
|
|
23
24
|
autoload :InputAdapter, "kettle/dev/input_adapter"
|
|
24
|
-
autoload :PrismUtils, "kettle/dev/prism_utils"
|
|
25
|
-
autoload :PrismGemspec, "kettle/dev/prism_gemspec"
|
|
26
|
-
autoload :PrismGemfile, "kettle/dev/prism_gemfile"
|
|
27
|
-
autoload :PrismAppraisals, "kettle/dev/prism_appraisals"
|
|
28
25
|
autoload :ReadmeBackers, "kettle/dev/readme_backers"
|
|
29
26
|
autoload :OpenCollectiveConfig, "kettle/dev/open_collective_config"
|
|
30
|
-
autoload :SourceMerger, "kettle/dev/source_merger"
|
|
31
27
|
autoload :ReleaseCLI, "kettle/dev/release_cli"
|
|
32
28
|
autoload :PreReleaseCLI, "kettle/dev/pre_release_cli"
|
|
33
|
-
autoload :SetupCLI, "kettle/dev/setup_cli"
|
|
34
|
-
autoload :TemplateHelpers, "kettle/dev/template_helpers"
|
|
35
|
-
autoload :ModularGemfiles, "kettle/dev/modular_gemfiles"
|
|
36
29
|
autoload :Version, "kettle/dev/version"
|
|
37
30
|
autoload :Versioning, "kettle/dev/versioning"
|
|
38
31
|
|
|
39
32
|
# Nested tasks namespace with autoloaded task modules
|
|
40
33
|
module Tasks
|
|
41
34
|
autoload :CITask, "kettle/dev/tasks/ci_task"
|
|
42
|
-
autoload :InstallTask, "kettle/dev/tasks/install_task"
|
|
43
|
-
autoload :TemplateTask, "kettle/dev/tasks/template_task"
|
|
44
35
|
end
|
|
45
36
|
|
|
46
37
|
# Base error type for kettle-dev.
|
|
@@ -76,7 +67,7 @@ module Kettle
|
|
|
76
67
|
# @return [String]
|
|
77
68
|
GEM_ROOT = File.expand_path("../..", __dir__)
|
|
78
69
|
|
|
79
|
-
@defaults = []
|
|
70
|
+
@defaults = [].freeze
|
|
80
71
|
|
|
81
72
|
class << self
|
|
82
73
|
# Emit a debug warning for rescued errors when kettle-dev debugging is enabled.
|
|
@@ -89,6 +80,7 @@ module Kettle
|
|
|
89
80
|
|
|
90
81
|
ctx = context ? context.to_s : "KETTLE-DEV-RESCUE"
|
|
91
82
|
Kernel.warn("[#{ctx}] #{error.class}: #{error.message}")
|
|
83
|
+
Kernel.warn(error.backtrace.first(5).join("\n")) if error.respond_to?(:backtrace) && error.backtrace
|
|
92
84
|
rescue StandardError
|
|
93
85
|
# never raise from debug logging
|
|
94
86
|
end
|
|
@@ -128,7 +120,7 @@ module Kettle
|
|
|
128
120
|
def register_default(task_name)
|
|
129
121
|
task_name = task_name.to_s
|
|
130
122
|
unless defaults.include?(task_name)
|
|
131
|
-
defaults
|
|
123
|
+
@defaults = (defaults + [task_name]).freeze # rubocop:disable ThreadSafety/ClassInstanceVariable
|
|
132
124
|
if defined?(Rake) && Rake::Task.task_defined?(:default)
|
|
133
125
|
begin
|
|
134
126
|
Rake::Task[:default].enhance([task_name])
|
|
@@ -2,15 +2,24 @@
|
|
|
2
2
|
|
|
3
3
|
module Kettle
|
|
4
4
|
module Dev
|
|
5
|
-
# Prism-based AST merging for templated Ruby files
|
|
5
|
+
# Prism-based AST merging for templated Ruby files.
|
|
6
|
+
# Handles strategy dispatch (skip/replace/append/merge).
|
|
7
|
+
#
|
|
8
|
+
# Uses prism-merge for AST-aware merging with support for:
|
|
9
|
+
# - Freeze blocks (kettle-dev:freeze / kettle-dev:unfreeze)
|
|
10
|
+
# - Comment preservation
|
|
11
|
+
# - Signature-based node matching
|
|
6
12
|
module SourceMerger
|
|
7
|
-
FREEZE_START: Regexp
|
|
8
|
-
FREEZE_END: Regexp
|
|
9
|
-
FREEZE_BLOCK: Regexp
|
|
10
|
-
FREEZE_REMINDER: String
|
|
11
13
|
BUG_URL: String
|
|
12
14
|
|
|
13
15
|
# Apply a templating strategy to merge source and destination Ruby files
|
|
16
|
+
#
|
|
17
|
+
# @param strategy [Symbol] Merge strategy - :skip, :replace, :append, or :merge
|
|
18
|
+
# @param src [String] Template source content
|
|
19
|
+
# @param dest [String] Destination file content
|
|
20
|
+
# @param path [String] File path (for error messages)
|
|
21
|
+
# @return [String] Merged content with comments preserved
|
|
22
|
+
# @raise [Kettle::Dev::Error] If strategy is unknown or merge fails
|
|
14
23
|
def self.apply: (
|
|
15
24
|
strategy: Symbol,
|
|
16
25
|
src: String,
|
|
@@ -18,69 +27,44 @@ module Kettle
|
|
|
18
27
|
path: String
|
|
19
28
|
) -> String
|
|
20
29
|
|
|
21
|
-
# Ensure freeze reminder comment is present at the top of content
|
|
22
|
-
def self.ensure_reminder: (String content) -> String
|
|
23
|
-
|
|
24
|
-
# Normalize source code while preserving formatting
|
|
25
|
-
def self.normalize_source: (String source) -> String
|
|
26
|
-
|
|
27
|
-
# Check if freeze reminder is present in content
|
|
28
|
-
def self.reminder_present?: (String content) -> bool
|
|
29
|
-
|
|
30
|
-
# Find index where freeze reminder should be inserted
|
|
31
|
-
def self.reminder_insertion_index: (String content) -> Integer
|
|
32
|
-
|
|
33
|
-
# Check if line is a shebang
|
|
34
|
-
def self.shebang?: (String line) -> bool
|
|
35
|
-
|
|
36
|
-
# Check if line is a frozen_string_literal comment
|
|
37
|
-
def self.frozen_comment?: (String line) -> bool
|
|
38
|
-
|
|
39
|
-
# Merge kettle-dev:freeze blocks from destination into source content
|
|
40
|
-
def self.merge_freeze_blocks: (String src_content, String dest_content) -> String
|
|
41
|
-
|
|
42
|
-
# Extract freeze blocks from text
|
|
43
|
-
def self.freeze_blocks: (String? text) -> Array[Hash[Symbol, untyped]]
|
|
44
|
-
|
|
45
30
|
# Normalize strategy symbol
|
|
31
|
+
#
|
|
32
|
+
# @param strategy [Symbol, nil] Strategy to normalize
|
|
33
|
+
# @return [Symbol] Normalized strategy (:skip if nil)
|
|
46
34
|
def self.normalize_strategy: (Symbol? strategy) -> Symbol
|
|
47
35
|
|
|
48
36
|
# Warn about bugs and print error information
|
|
37
|
+
#
|
|
38
|
+
# @param path [String] File path that caused the error
|
|
39
|
+
# @param error [StandardError] The error that occurred
|
|
40
|
+
# @return [void]
|
|
49
41
|
def self.warn_bug: (String path, StandardError error) -> void
|
|
50
42
|
|
|
51
43
|
# Ensure text ends with newline
|
|
44
|
+
#
|
|
45
|
+
# @param text [String, nil] Text to process
|
|
46
|
+
# @return [String] Text with trailing newline
|
|
52
47
|
def self.ensure_trailing_newline: (String? text) -> String
|
|
53
48
|
|
|
54
|
-
# Apply append strategy
|
|
49
|
+
# Apply append strategy using prism-merge
|
|
50
|
+
#
|
|
51
|
+
# @param src_content [String] Template source content
|
|
52
|
+
# @param dest_content [String] Destination content
|
|
53
|
+
# @return [String] Merged content with destination preference
|
|
55
54
|
def self.apply_append: (String src_content, String dest_content) -> String
|
|
56
55
|
|
|
57
|
-
# Apply merge strategy
|
|
56
|
+
# Apply merge strategy using prism-merge
|
|
57
|
+
#
|
|
58
|
+
# @param src_content [String] Template source content
|
|
59
|
+
# @param dest_content [String] Destination content
|
|
60
|
+
# @return [String] Merged content with template preference
|
|
58
61
|
def self.apply_merge: (String src_content, String dest_content) -> String
|
|
59
62
|
|
|
60
|
-
#
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
#
|
|
64
|
-
def self.
|
|
65
|
-
|
|
66
|
-
# Perform Prism-based merge with block
|
|
67
|
-
def self.prism_merge: (String src_content, String dest_content) { (Array[Hash[Symbol, untyped]], Array[Hash[Symbol, untyped]], Prism::ParseResult, Prism::ParseResult) -> Array[Hash[Symbol, untyped]] } -> String
|
|
68
|
-
|
|
69
|
-
# Extract nodes with comments from parse result
|
|
70
|
-
def self.extract_nodes_with_comments: (Prism::ParseResult parse_result) -> Array[Hash[Symbol, untyped]]
|
|
71
|
-
|
|
72
|
-
# Build source from node information array
|
|
73
|
-
def self.build_source_from_nodes: (Array[Hash[Symbol, untyped]] node_infos) -> String
|
|
74
|
-
|
|
75
|
-
# Generate signature for node
|
|
76
|
-
def self.node_signature: (Prism::Node? node) -> Array[untyped]
|
|
77
|
-
|
|
78
|
-
# Restore custom leading comments from destination
|
|
79
|
-
def self.restore_custom_leading_comments: (String dest_content, String merged_content) -> String
|
|
80
|
-
|
|
81
|
-
# Extract leading comment block from content
|
|
82
|
-
def self.leading_comment_block: (String content) -> String
|
|
63
|
+
# Create a signature generator for prism-merge
|
|
64
|
+
# Handles various Ruby node types for proper matching during merge operations
|
|
65
|
+
#
|
|
66
|
+
# @return [Proc] Signature generator lambda
|
|
67
|
+
def self.create_signature_generator: () -> ^(Prism::Node) -> (Array[untyped] | Prism::Node)
|
|
83
68
|
end
|
|
84
69
|
end
|
|
85
|
-
end
|
|
86
|
-
|
|
70
|
+
end
|
data.tar.gz.sig
CHANGED
|
Binary file
|