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.
Files changed (133) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +176 -3
  4. data/CITATION.cff +2 -2
  5. data/CONTRIBUTING.md +11 -17
  6. data/README.md +390 -319
  7. data/exe/kettle-dev-setup +12 -63
  8. data/exe/kettle-gh-release +82 -0
  9. data/lib/kettle/dev/gem_spec_reader.rb +2 -2
  10. data/lib/kettle/dev/open_collective_config.rb +12 -0
  11. data/lib/kettle/dev/rakelib/yard.rake +15 -0
  12. data/lib/kettle/dev/tasks/ci_task.rb +4 -4
  13. data/lib/kettle/dev/version.rb +1 -1
  14. data/lib/kettle/dev.rb +4 -12
  15. data/sig/kettle/dev/source_merger.rbs +40 -56
  16. data.tar.gz.sig +0 -0
  17. metadata +15 -144
  18. metadata.gz.sig +0 -0
  19. data/.aiignore.example +0 -19
  20. data/.devcontainer/apt-install/devcontainer-feature.json +0 -9
  21. data/.devcontainer/apt-install/install.sh +0 -11
  22. data/.devcontainer/devcontainer.json +0 -28
  23. data/.env.local.example +0 -31
  24. data/.envrc +0 -47
  25. data/.envrc.example +0 -51
  26. data/.envrc.no-osc.example +0 -51
  27. data/.git-hooks/commit-msg +0 -54
  28. data/.git-hooks/commit-subjects-goalie.txt +0 -8
  29. data/.git-hooks/footer-template.erb.txt +0 -16
  30. data/.git-hooks/prepare-commit-msg +0 -8
  31. data/.github/.codecov.yml.example +0 -14
  32. data/.github/FUNDING.yml +0 -13
  33. data/.github/FUNDING.yml.no-osc.example +0 -13
  34. data/.github/dependabot.yml +0 -13
  35. data/.github/workflows/ancient.yml +0 -83
  36. data/.github/workflows/ancient.yml.example +0 -81
  37. data/.github/workflows/auto-assign.yml +0 -21
  38. data/.github/workflows/codeql-analysis.yml +0 -70
  39. data/.github/workflows/coverage.yml +0 -127
  40. data/.github/workflows/coverage.yml.example +0 -127
  41. data/.github/workflows/current.yml +0 -116
  42. data/.github/workflows/current.yml.example +0 -115
  43. data/.github/workflows/dep-heads.yml +0 -117
  44. data/.github/workflows/dependency-review.yml +0 -20
  45. data/.github/workflows/discord-notifier.yml.example +0 -39
  46. data/.github/workflows/heads.yml +0 -117
  47. data/.github/workflows/heads.yml.example +0 -116
  48. data/.github/workflows/jruby.yml +0 -82
  49. data/.github/workflows/jruby.yml.example +0 -72
  50. data/.github/workflows/legacy.yml +0 -76
  51. data/.github/workflows/license-eye.yml +0 -40
  52. data/.github/workflows/locked_deps.yml +0 -85
  53. data/.github/workflows/opencollective.yml +0 -40
  54. data/.github/workflows/style.yml +0 -67
  55. data/.github/workflows/supported.yml +0 -75
  56. data/.github/workflows/truffle.yml +0 -99
  57. data/.github/workflows/unlocked_deps.yml +0 -84
  58. data/.github/workflows/unsupported.yml +0 -76
  59. data/.gitignore +0 -50
  60. data/.gitlab-ci.yml.example +0 -134
  61. data/.idea/.gitignore +0 -45
  62. data/.junie/guidelines-rbs.md +0 -49
  63. data/.junie/guidelines.md +0 -141
  64. data/.junie/guidelines.md.example +0 -140
  65. data/.licenserc.yaml +0 -7
  66. data/.opencollective.yml +0 -3
  67. data/.opencollective.yml.example +0 -3
  68. data/.qlty/qlty.toml +0 -79
  69. data/.rspec +0 -9
  70. data/.rubocop.yml +0 -13
  71. data/.rubocop_rspec.yml +0 -33
  72. data/.simplecov +0 -16
  73. data/.simplecov.example +0 -11
  74. data/.tool-versions +0 -1
  75. data/.yardignore +0 -13
  76. data/.yardopts +0 -14
  77. data/Appraisal.root.gemfile +0 -10
  78. data/Appraisals +0 -151
  79. data/Appraisals.example +0 -102
  80. data/CHANGELOG.md.example +0 -47
  81. data/CONTRIBUTING.md.example +0 -227
  82. data/FUNDING.md.no-osc.example +0 -63
  83. data/Gemfile +0 -40
  84. data/Gemfile.example +0 -34
  85. data/README.md.example +0 -570
  86. data/README.md.no-osc.example +0 -536
  87. data/Rakefile.example +0 -68
  88. data/gemfiles/modular/coverage.gemfile +0 -6
  89. data/gemfiles/modular/debug.gemfile +0 -13
  90. data/gemfiles/modular/documentation.gemfile +0 -14
  91. data/gemfiles/modular/erb/r2/v3.0.gemfile +0 -1
  92. data/gemfiles/modular/erb/r2.3/default.gemfile +0 -6
  93. data/gemfiles/modular/erb/r2.6/v2.2.gemfile +0 -3
  94. data/gemfiles/modular/erb/r3/v5.0.gemfile +0 -1
  95. data/gemfiles/modular/erb/r3.1/v4.0.gemfile +0 -2
  96. data/gemfiles/modular/erb/vHEAD.gemfile +0 -2
  97. data/gemfiles/modular/injected.gemfile +0 -60
  98. data/gemfiles/modular/mutex_m/r2/v0.3.gemfile +0 -2
  99. data/gemfiles/modular/mutex_m/r2.4/v0.1.gemfile +0 -3
  100. data/gemfiles/modular/mutex_m/r3/v0.3.gemfile +0 -2
  101. data/gemfiles/modular/mutex_m/vHEAD.gemfile +0 -2
  102. data/gemfiles/modular/optional.gemfile +0 -8
  103. data/gemfiles/modular/optional.gemfile.example +0 -5
  104. data/gemfiles/modular/runtime_heads.gemfile +0 -10
  105. data/gemfiles/modular/runtime_heads.gemfile.example +0 -8
  106. data/gemfiles/modular/stringio/r2/v3.0.gemfile +0 -5
  107. data/gemfiles/modular/stringio/r2.4/v0.0.2.gemfile +0 -4
  108. data/gemfiles/modular/stringio/r3/v3.0.gemfile +0 -5
  109. data/gemfiles/modular/stringio/vHEAD.gemfile +0 -2
  110. data/gemfiles/modular/style.gemfile +0 -25
  111. data/gemfiles/modular/style.gemfile.example +0 -25
  112. data/gemfiles/modular/templating.gemfile +0 -3
  113. data/gemfiles/modular/x_std_libs/r2/libs.gemfile +0 -3
  114. data/gemfiles/modular/x_std_libs/r2.3/libs.gemfile +0 -3
  115. data/gemfiles/modular/x_std_libs/r2.4/libs.gemfile +0 -3
  116. data/gemfiles/modular/x_std_libs/r2.6/libs.gemfile +0 -3
  117. data/gemfiles/modular/x_std_libs/r3/libs.gemfile +0 -3
  118. data/gemfiles/modular/x_std_libs/r3.1/libs.gemfile +0 -3
  119. data/gemfiles/modular/x_std_libs/vHEAD.gemfile +0 -3
  120. data/gemfiles/modular/x_std_libs.gemfile +0 -2
  121. data/kettle-dev.gemspec.example +0 -154
  122. data/lib/kettle/dev/modular_gemfiles.rb +0 -119
  123. data/lib/kettle/dev/prism_appraisals.rb +0 -351
  124. data/lib/kettle/dev/prism_gemfile.rb +0 -177
  125. data/lib/kettle/dev/prism_gemspec.rb +0 -284
  126. data/lib/kettle/dev/prism_utils.rb +0 -201
  127. data/lib/kettle/dev/rakelib/install.rake +0 -10
  128. data/lib/kettle/dev/rakelib/template.rake +0 -10
  129. data/lib/kettle/dev/setup_cli.rb +0 -403
  130. data/lib/kettle/dev/source_merger.rb +0 -622
  131. data/lib/kettle/dev/tasks/install_task.rb +0 -553
  132. data/lib/kettle/dev/tasks/template_task.rb +0 -975
  133. 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: initialize a target gem repo to use kettle-dev tooling.
7
- # This script is installed into PATH when the kettle-dev gem is installed.
8
- # It is designed to be run from inside the target gem's repository working
9
- # directory. It will not assume kettle-dev is already a dependency.
10
-
11
- require "fileutils"
12
- require "shellwords"
13
- require "open3"
14
- require "optparse"
15
- require "rubygems"
16
-
17
- # Ensure output is flushed promptly even if we exit early
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) TemplateHelpers.opencollective_disabled? - when true, funding_org is nil
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 TemplateHelpers.opencollective_disabled?
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 Exception => error
272
- # Catch all exceptions in background thread, including SystemExit
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)
@@ -6,7 +6,7 @@ module Kettle
6
6
  module Version
7
7
  # The gem version.
8
8
  # @return [String]
9
- VERSION = "1.2.3"
9
+ VERSION = "2.0.0"
10
10
 
11
11
  module_function
12
12
 
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 << task_name
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
- # Merge node information
61
- def self.merge_node_info: (Array[untyped] signature, Hash[Symbol, untyped] dest_node_info, Hash[Symbol, untyped] src_node_info) -> Hash[Symbol, untyped]
62
-
63
- # Merge block node information
64
- def self.merge_block_node_info: (Hash[Symbol, untyped] src_node_info) -> Hash[Symbol, untyped]
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