kettle-dev 1.1.32 → 1.1.34
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/.github/FUNDING.yml.no-osc.example +13 -0
- data/.github/workflows/codeql-analysis.yml +3 -3
- data/.github/workflows/current.yml +8 -8
- data/.github/workflows/current.yml.example +8 -8
- data/.github/workflows/dep-heads.yml +8 -8
- data/.github/workflows/heads.yml +8 -8
- data/.github/workflows/heads.yml.example +8 -8
- data/.github/workflows/truffle.yml +8 -8
- data/.tool-versions +1 -1
- data/Appraisal.root.gemfile +0 -2
- data/CHANGELOG.md +47 -1
- data/FUNDING.md.no-osc.example +66 -0
- data/Gemfile +1 -1
- data/Gemfile.example +1 -1
- data/README.md +8 -7
- data/README.md.example +8 -7
- data/README.md.no-osc.example +522 -0
- data/REEK +0 -2
- data/Rakefile.example +1 -1
- data/exe/kettle-release +7 -2
- data/gemfiles/modular/optional.gemfile.example +4 -0
- data/lib/kettle/dev/gem_spec_reader.rb +20 -19
- data/lib/kettle/dev/git_adapter.rb +30 -0
- data/lib/kettle/dev/rakelib/appraisal.rake +10 -10
- data/lib/kettle/dev/rakelib/bench.rake +1 -1
- data/lib/kettle/dev/rakelib/reek.rake +1 -1
- data/lib/kettle/dev/release_cli.rb +15 -9
- data/lib/kettle/dev/tasks/template_task.rb +14 -2
- data/lib/kettle/dev/template_helpers.rb +45 -0
- data/lib/kettle/dev/version.rb +1 -1
- data/lib/kettle/dev.rb +5 -0
- data/sig/kettle/dev.rbs +1 -0
- data.tar.gz.sig +0 -0
- metadata +9 -4
- metadata.gz.sig +0 -0
|
@@ -99,29 +99,30 @@ module Kettle
|
|
|
99
99
|
|
|
100
100
|
# Funding org (Open Collective handle) detection.
|
|
101
101
|
# Precedence:
|
|
102
|
-
# 1)
|
|
103
|
-
#
|
|
104
|
-
#
|
|
105
|
-
# 2) OpenCollectiveConfig.handle(required: false)
|
|
102
|
+
# 1) TemplateHelpers.opencollective_disabled? - when true, funding_org is nil
|
|
103
|
+
# 2) ENV["FUNDING_ORG"] when set and non-empty (unless already disabled above)
|
|
104
|
+
# 3) OpenCollectiveConfig.handle(required: false)
|
|
106
105
|
# Be lenient: allow nil when not discoverable, with a concise warning.
|
|
107
106
|
begin
|
|
108
|
-
|
|
109
|
-
if
|
|
110
|
-
funding_org =
|
|
111
|
-
nil
|
|
112
|
-
else
|
|
113
|
-
env_funding.to_s
|
|
114
|
-
end
|
|
107
|
+
# Check if Open Collective is explicitly disabled via environment variables
|
|
108
|
+
if TemplateHelpers.opencollective_disabled?
|
|
109
|
+
funding_org = nil
|
|
115
110
|
else
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
111
|
+
env_funding = ENV["FUNDING_ORG"]
|
|
112
|
+
if env_funding && !env_funding.to_s.strip.empty?
|
|
113
|
+
# FUNDING_ORG is set and non-empty; use it as-is (already filtered by opencollective_disabled?)
|
|
114
|
+
funding_org = env_funding.to_s
|
|
115
|
+
else
|
|
116
|
+
# Preflight: if a YAML exists under the provided root, attempt to read it here so
|
|
117
|
+
# unexpected file IO errors surface within this rescue block (see specs).
|
|
118
|
+
oc_path = OpenCollectiveConfig.yaml_path(root)
|
|
119
|
+
File.read(oc_path) if File.file?(oc_path)
|
|
120
120
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
121
|
+
funding_org = OpenCollectiveConfig.handle(required: false, root: root)
|
|
122
|
+
if funding_org.to_s.strip.empty?
|
|
123
|
+
Kernel.warn("kettle-dev: Could not determine funding org.\n - Options:\n * Set ENV['FUNDING_ORG'] to your funding handle, or 'false' to disable.\n * Or set ENV['OPENCOLLECTIVE_HANDLE'].\n * Or add .opencollective.yml with: collective: <handle> (or org: <handle>).\n * Or proceed without funding if not applicable.")
|
|
124
|
+
funding_org = nil
|
|
125
|
+
end
|
|
125
126
|
end
|
|
126
127
|
end
|
|
127
128
|
rescue StandardError => error
|
|
@@ -104,6 +104,36 @@ module Kettle
|
|
|
104
104
|
end
|
|
105
105
|
end
|
|
106
106
|
|
|
107
|
+
# Push all tags to a remote.
|
|
108
|
+
# Notes:
|
|
109
|
+
# - The ruby-git gem does not provide a stable API for pushing all tags across
|
|
110
|
+
# versions, so we intentionally shell out to `git push --tags` for both
|
|
111
|
+
# backends. Tests should stub this method in higher-level code to avoid
|
|
112
|
+
# mutating any repositories.
|
|
113
|
+
#
|
|
114
|
+
# @param remote [String, nil] The remote name. When nil or empty, uses the
|
|
115
|
+
# repository's default remote (same behavior as running `git push --tags`)
|
|
116
|
+
# which typically uses the current branch's upstream.
|
|
117
|
+
# @return [Boolean] true if the system call reports success; false on failure
|
|
118
|
+
def push_tags(remote)
|
|
119
|
+
if @backend == :gem
|
|
120
|
+
# The ruby-git gem does not expose a dedicated API for "--tags" consistently across versions.
|
|
121
|
+
# Use a shell fallback even when the gem backend is active. Tests should stub this method.
|
|
122
|
+
if remote && !remote.to_s.empty?
|
|
123
|
+
system("git", "push", remote.to_s, "--tags")
|
|
124
|
+
else
|
|
125
|
+
system("git", "push", "--tags")
|
|
126
|
+
end
|
|
127
|
+
elsif remote && !remote.to_s.empty?
|
|
128
|
+
system("git", "push", remote.to_s, "--tags")
|
|
129
|
+
else
|
|
130
|
+
system("git", "push", "--tags")
|
|
131
|
+
end
|
|
132
|
+
rescue StandardError => e
|
|
133
|
+
Kettle::Dev.debug_error(e, __method__)
|
|
134
|
+
false
|
|
135
|
+
end
|
|
136
|
+
|
|
107
137
|
# @return [String, nil] current branch name, or nil on error
|
|
108
138
|
def current_branch
|
|
109
139
|
if @backend == :gem
|
|
@@ -6,14 +6,14 @@ begin
|
|
|
6
6
|
|
|
7
7
|
desc("Install Appraisal gemfiles (initial setup for projects that didn't previously use Appraisal)")
|
|
8
8
|
task("appraisal:install") do
|
|
9
|
-
bundle =
|
|
9
|
+
bundle = "bundle"
|
|
10
10
|
|
|
11
11
|
run_in_unbundled = proc do
|
|
12
12
|
env = {"BUNDLE_GEMFILE" => "Appraisal.root.gemfile"}
|
|
13
13
|
|
|
14
|
-
# 1)
|
|
15
|
-
ok = system(bundle, "install"
|
|
16
|
-
abort("appraisal:install failed:
|
|
14
|
+
# 1) BUNDLE_GEMFILE=Appraisal.root.gemfile bundle install
|
|
15
|
+
ok = system(env, bundle, "install")
|
|
16
|
+
abort("appraisal:install failed: BUNDLE_GEMFILE=Appraisal.root.gemfile bundle install") unless ok
|
|
17
17
|
|
|
18
18
|
# 2) BUNDLE_GEMFILE=Appraisal.root.gemfile bundle exec appraisal install
|
|
19
19
|
ok = system(env, bundle, "exec", "appraisal", "install")
|
|
@@ -33,22 +33,22 @@ begin
|
|
|
33
33
|
|
|
34
34
|
desc("Update Appraisal gemfiles and run RuboCop Gradual autocorrect")
|
|
35
35
|
task("appraisal:update") do
|
|
36
|
-
bundle =
|
|
36
|
+
bundle = "bundle"
|
|
37
37
|
|
|
38
38
|
run_in_unbundled = proc do
|
|
39
39
|
env = {"BUNDLE_GEMFILE" => "Appraisal.root.gemfile"}
|
|
40
40
|
|
|
41
41
|
# 1) BUNDLE_GEMFILE=Appraisal.root.gemfile bundle update --bundler
|
|
42
42
|
ok = system(env, bundle, "update", "--bundler")
|
|
43
|
-
abort("appraisal:update failed: bundle update --bundler
|
|
43
|
+
abort("appraisal:update failed: BUNDLE_GEMFILE=Appraisal.root.gemfile bundle update --bundler") unless ok
|
|
44
44
|
|
|
45
|
-
# 2) BUNDLE_GEMFILE=Appraisal.root.gemfile bundle
|
|
46
|
-
ok = system(env, bundle)
|
|
47
|
-
abort("appraisal:update failed:
|
|
45
|
+
# 2) BUNDLE_GEMFILE=Appraisal.root.gemfile bundle install
|
|
46
|
+
ok = system(env, bundle, "install")
|
|
47
|
+
abort("appraisal:update failed: BUNDLE_GEMFILE=Appraisal.root.gemfile bundle install") unless ok
|
|
48
48
|
|
|
49
49
|
# 3) BUNDLE_GEMFILE=Appraisal.root.gemfile bundle exec appraisal update
|
|
50
50
|
ok = system(env, bundle, "exec", "appraisal", "update")
|
|
51
|
-
abort("appraisal:update failed: bundle exec appraisal update") unless ok
|
|
51
|
+
abort("appraisal:update failed: BUNDLE_GEMFILE=Appraisal.root.gemfile bundle exec appraisal update") unless ok
|
|
52
52
|
|
|
53
53
|
# 4) bundle exec rake rubocop_gradual:autocorrect
|
|
54
54
|
ok = system(bundle, "exec", "rake", "rubocop_gradual:autocorrect")
|
|
@@ -22,7 +22,7 @@ namespace :bench do
|
|
|
22
22
|
end
|
|
23
23
|
|
|
24
24
|
ruby = RbConfig.ruby
|
|
25
|
-
bundle =
|
|
25
|
+
bundle = "bundle"
|
|
26
26
|
bench_files = Dir[File.join(__dir__, "benchmarks", "*.rb")].sort
|
|
27
27
|
if bench_files.empty?
|
|
28
28
|
puts "No benchmark scripts found under benchmarks/."
|
|
@@ -15,7 +15,7 @@ begin
|
|
|
15
15
|
desc("Run reek and store the output into the REEK file")
|
|
16
16
|
task("reek:update") do
|
|
17
17
|
# Run via Bundler if available to ensure the right gem version is used
|
|
18
|
-
cmd = [
|
|
18
|
+
cmd = %w[bundle exec reek]
|
|
19
19
|
|
|
20
20
|
output, status = Open3.capture2e(*cmd)
|
|
21
21
|
|
|
@@ -269,22 +269,25 @@ module Kettle
|
|
|
269
269
|
# 16. generate checksums
|
|
270
270
|
# Checksums are generated after release to avoid including checksums/ in gem package
|
|
271
271
|
# Rationale: Running gem_checksums before release may commit checksums/ and cause Bundler's
|
|
272
|
-
# release build to include them in the gem, altering the artifact.
|
|
272
|
+
# release build to include them in the gem, thus altering the artifact, and invalidating the checksums.
|
|
273
273
|
if @start_step <= 16
|
|
274
|
-
# Generate checksums for the just-built artifact, then validate
|
|
274
|
+
# Generate checksums for the just-built artifact, commit them, then validate
|
|
275
275
|
run_cmd!("bin/gem_checksums")
|
|
276
276
|
version ||= detect_version
|
|
277
277
|
validate_checksums!(version, stage: "after release")
|
|
278
278
|
end
|
|
279
279
|
|
|
280
|
-
# 17.
|
|
281
|
-
if @start_step <= 17
|
|
280
|
+
# 17. push checksum commit (gem_checksums already commits)
|
|
281
|
+
push! if @start_step <= 17
|
|
282
|
+
|
|
283
|
+
# 18. create GitHub release (optional)
|
|
284
|
+
if @start_step <= 18
|
|
282
285
|
version ||= detect_version
|
|
283
286
|
maybe_create_github_release!(version)
|
|
284
287
|
end
|
|
285
288
|
|
|
286
|
-
#
|
|
287
|
-
push_tags! if @start_step <=
|
|
289
|
+
# 19. push tags to remotes (final step)
|
|
290
|
+
push_tags! if @start_step <= 19
|
|
288
291
|
|
|
289
292
|
# Final success message
|
|
290
293
|
begin
|
|
@@ -708,17 +711,20 @@ module Kettle
|
|
|
708
711
|
# 2) Otherwise, if other remotes exist, push tags to each of them.
|
|
709
712
|
# 3) If no remotes are configured, push tags using default remote.
|
|
710
713
|
if has_remote?("all")
|
|
711
|
-
|
|
714
|
+
ok = @git.push_tags("all")
|
|
715
|
+
warn("Push tags to 'all' reported failure.") unless ok
|
|
712
716
|
return
|
|
713
717
|
end
|
|
714
718
|
|
|
715
719
|
remotes = list_remotes
|
|
716
720
|
remotes -= ["all"] if remotes
|
|
717
721
|
if remotes.nil? || remotes.empty?
|
|
718
|
-
|
|
722
|
+
ok = @git.push_tags(nil)
|
|
723
|
+
warn("Push tags (default remote) reported failure.") unless ok
|
|
719
724
|
else
|
|
720
725
|
remotes.each do |remote|
|
|
721
|
-
|
|
726
|
+
ok = @git.push_tags(remote)
|
|
727
|
+
warn("Push tags to #{remote} reported failure.") unless ok
|
|
722
728
|
end
|
|
723
729
|
end
|
|
724
730
|
end
|
|
@@ -120,11 +120,17 @@ module Kettle
|
|
|
120
120
|
end
|
|
121
121
|
|
|
122
122
|
selected.values.each do |orig_src|
|
|
123
|
-
src = helpers.
|
|
123
|
+
src = helpers.prefer_example_with_osc_check(orig_src)
|
|
124
124
|
# Destination path should never include the .example suffix.
|
|
125
125
|
rel = orig_src.sub(/^#{Regexp.escape(gem_checkout_root)}\/?/, "").sub(/\.example\z/, "")
|
|
126
126
|
dest = File.join(project_root, rel)
|
|
127
127
|
|
|
128
|
+
# Skip opencollective-specific files when Open Collective is disabled
|
|
129
|
+
if helpers.skip_for_disabled_opencollective?(rel)
|
|
130
|
+
puts "Skipping #{rel} (Open Collective disabled)"
|
|
131
|
+
next
|
|
132
|
+
end
|
|
133
|
+
|
|
128
134
|
# Optional file: .github/workflows/discord-notifier.yml should NOT be copied by default.
|
|
129
135
|
# Only copy when --include matches it.
|
|
130
136
|
if rel == ".github/workflows/discord-notifier.yml"
|
|
@@ -422,7 +428,13 @@ module Kettle
|
|
|
422
428
|
end
|
|
423
429
|
|
|
424
430
|
files_to_copy.each do |rel|
|
|
425
|
-
|
|
431
|
+
# Skip opencollective-specific files when Open Collective is disabled
|
|
432
|
+
if helpers.skip_for_disabled_opencollective?(rel)
|
|
433
|
+
puts "Skipping #{rel} (Open Collective disabled)"
|
|
434
|
+
next
|
|
435
|
+
end
|
|
436
|
+
|
|
437
|
+
src = helpers.prefer_example_with_osc_check(File.join(gem_checkout_root, rel))
|
|
426
438
|
dest = File.join(project_root, rel)
|
|
427
439
|
next unless File.exist?(src)
|
|
428
440
|
|
|
@@ -76,6 +76,51 @@ module Kettle
|
|
|
76
76
|
File.exist?(example) ? example : src_path
|
|
77
77
|
end
|
|
78
78
|
|
|
79
|
+
# Check if Open Collective is disabled via environment variable.
|
|
80
|
+
# Returns true when OPENCOLLECTIVE_HANDLE or FUNDING_ORG is explicitly set to a falsey value.
|
|
81
|
+
# @return [Boolean]
|
|
82
|
+
def opencollective_disabled?
|
|
83
|
+
oc_handle = ENV["OPENCOLLECTIVE_HANDLE"]
|
|
84
|
+
funding_org = ENV["FUNDING_ORG"]
|
|
85
|
+
|
|
86
|
+
# Check if either variable is explicitly set to false
|
|
87
|
+
[oc_handle, funding_org].any? do |val|
|
|
88
|
+
val && val.to_s.strip.match(Kettle::Dev::ENV_FALSE_RE)
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# Prefer a .no-osc.example variant when Open Collective is disabled.
|
|
93
|
+
# Otherwise, falls back to prefer_example behavior.
|
|
94
|
+
# For a given source path, this will return:
|
|
95
|
+
# - "path.no-osc.example" if opencollective_disabled? and it exists
|
|
96
|
+
# - Otherwise delegates to prefer_example
|
|
97
|
+
# @param src_path [String]
|
|
98
|
+
# @return [String]
|
|
99
|
+
def prefer_example_with_osc_check(src_path)
|
|
100
|
+
if opencollective_disabled?
|
|
101
|
+
# Try .no-osc.example first
|
|
102
|
+
base = src_path.sub(/\.example\z/, "")
|
|
103
|
+
no_osc = base + ".no-osc.example"
|
|
104
|
+
return no_osc if File.exist?(no_osc)
|
|
105
|
+
end
|
|
106
|
+
prefer_example(src_path)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# Check if a file should be skipped when Open Collective is disabled.
|
|
110
|
+
# Returns true for opencollective-specific files when opencollective_disabled? is true.
|
|
111
|
+
# @param relative_path [String] relative path from gem checkout root
|
|
112
|
+
# @return [Boolean]
|
|
113
|
+
def skip_for_disabled_opencollective?(relative_path)
|
|
114
|
+
return false unless opencollective_disabled?
|
|
115
|
+
|
|
116
|
+
opencollective_files = [
|
|
117
|
+
".opencollective.yml",
|
|
118
|
+
".github/workflows/opencollective.yml",
|
|
119
|
+
]
|
|
120
|
+
|
|
121
|
+
opencollective_files.include?(relative_path)
|
|
122
|
+
end
|
|
123
|
+
|
|
79
124
|
# Record a template action for a destination path
|
|
80
125
|
# @param dest_path [String]
|
|
81
126
|
# @param action [Symbol] one of :create, :replace, :skip, :dir_create, :dir_replace
|
data/lib/kettle/dev/version.rb
CHANGED
data/lib/kettle/dev.rb
CHANGED
|
@@ -62,6 +62,11 @@ module Kettle
|
|
|
62
62
|
# Accepts 1, true, y, yes (any case).
|
|
63
63
|
# @return [Regexp]
|
|
64
64
|
ENV_TRUE_RE = /\A(1|true|y|yes)\z/i
|
|
65
|
+
|
|
66
|
+
# A case-insensitive regular expression that matches common falsy ENV values.
|
|
67
|
+
# Accepts false, n, no, 0 (any case).
|
|
68
|
+
# @return [Regexp]
|
|
69
|
+
ENV_FALSE_RE = /\A(false|n|no|0)\z/i
|
|
65
70
|
# Absolute path to the root of the kettle-dev gem (repository root when working from source)
|
|
66
71
|
# @return [String]
|
|
67
72
|
GEM_ROOT = File.expand_path("../..", __dir__)
|
data/sig/kettle/dev.rbs
CHANGED
data.tar.gz.sig
CHANGED
|
Binary file
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: kettle-dev
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.1.
|
|
4
|
+
version: 1.1.34
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Peter H. Boling
|
|
@@ -222,8 +222,10 @@ files:
|
|
|
222
222
|
- "./.simplecov.example"
|
|
223
223
|
- "./Appraisals.example"
|
|
224
224
|
- "./CHANGELOG.md.example"
|
|
225
|
+
- "./FUNDING.md.no-osc.example"
|
|
225
226
|
- "./Gemfile.example"
|
|
226
227
|
- "./README.md.example"
|
|
228
|
+
- "./README.md.no-osc.example"
|
|
227
229
|
- "./Rakefile.example"
|
|
228
230
|
- "./kettle-dev.gemspec.example"
|
|
229
231
|
- ".aiignore.example"
|
|
@@ -237,6 +239,7 @@ files:
|
|
|
237
239
|
- ".git-hooks/prepare-commit-msg.example"
|
|
238
240
|
- ".github/.codecov.yml.example"
|
|
239
241
|
- ".github/FUNDING.yml"
|
|
242
|
+
- ".github/FUNDING.yml.no-osc.example"
|
|
240
243
|
- ".github/dependabot.yml"
|
|
241
244
|
- ".github/workflows/ancient.yml"
|
|
242
245
|
- ".github/workflows/ancient.yml.example"
|
|
@@ -288,11 +291,13 @@ files:
|
|
|
288
291
|
- CODE_OF_CONDUCT.md
|
|
289
292
|
- CONTRIBUTING.md
|
|
290
293
|
- FUNDING.md
|
|
294
|
+
- FUNDING.md.no-osc.example
|
|
291
295
|
- Gemfile
|
|
292
296
|
- Gemfile.example
|
|
293
297
|
- LICENSE.txt
|
|
294
298
|
- README.md
|
|
295
299
|
- README.md.example
|
|
300
|
+
- README.md.no-osc.example
|
|
296
301
|
- REEK
|
|
297
302
|
- RUBOCOP.md
|
|
298
303
|
- Rakefile.example
|
|
@@ -404,10 +409,10 @@ licenses:
|
|
|
404
409
|
- MIT
|
|
405
410
|
metadata:
|
|
406
411
|
homepage_uri: https://kettle-dev.galtzo.com/
|
|
407
|
-
source_code_uri: https://github.com/kettle-rb/kettle-dev/tree/v1.1.
|
|
408
|
-
changelog_uri: https://github.com/kettle-rb/kettle-dev/blob/v1.1.
|
|
412
|
+
source_code_uri: https://github.com/kettle-rb/kettle-dev/tree/v1.1.34
|
|
413
|
+
changelog_uri: https://github.com/kettle-rb/kettle-dev/blob/v1.1.34/CHANGELOG.md
|
|
409
414
|
bug_tracker_uri: https://github.com/kettle-rb/kettle-dev/issues
|
|
410
|
-
documentation_uri: https://www.rubydoc.info/gems/kettle-dev/1.1.
|
|
415
|
+
documentation_uri: https://www.rubydoc.info/gems/kettle-dev/1.1.34
|
|
411
416
|
funding_uri: https://github.com/sponsors/pboling
|
|
412
417
|
wiki_uri: https://github.com/kettle-rb/kettle-dev/wiki
|
|
413
418
|
news_uri: https://www.railsbling.com/tags/kettle-dev
|
metadata.gz.sig
CHANGED
|
Binary file
|