kettle-dev 1.1.3 → 1.1.5

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 (46) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/.env.local.example +14 -1
  4. data/.envrc +2 -2
  5. data/.git-hooks/commit-msg +22 -16
  6. data/.git-hooks/prepare-commit-msg.example +19 -0
  7. data/.github/workflows/coverage.yml +2 -2
  8. data/.junie/guidelines.md +4 -0
  9. data/.opencollective.yml.example +3 -0
  10. data/CHANGELOG.md +43 -1
  11. data/CONTRIBUTING.md +29 -0
  12. data/FUNDING.md +2 -2
  13. data/README.md +148 -38
  14. data/README.md.example +7 -7
  15. data/Rakefile.example +1 -5
  16. data/bin/setup +8 -0
  17. data/exe/kettle-changelog +7 -2
  18. data/exe/kettle-commit-msg +20 -5
  19. data/exe/kettle-dev-setup +2 -1
  20. data/exe/kettle-dvcs +7 -2
  21. data/exe/kettle-pre-release +66 -0
  22. data/exe/kettle-readme-backers +7 -2
  23. data/exe/kettle-release +9 -2
  24. data/lib/kettle/dev/changelog_cli.rb +4 -5
  25. data/lib/kettle/dev/ci_helpers.rb +9 -5
  26. data/lib/kettle/dev/ci_monitor.rb +229 -8
  27. data/lib/kettle/dev/gem_spec_reader.rb +105 -39
  28. data/lib/kettle/dev/git_adapter.rb +6 -3
  29. data/lib/kettle/dev/git_commit_footer.rb +5 -2
  30. data/lib/kettle/dev/pre_release_cli.rb +248 -0
  31. data/lib/kettle/dev/readme_backers.rb +4 -2
  32. data/lib/kettle/dev/release_cli.rb +27 -17
  33. data/lib/kettle/dev/tasks/ci_task.rb +112 -22
  34. data/lib/kettle/dev/tasks/install_task.rb +23 -17
  35. data/lib/kettle/dev/tasks/template_task.rb +64 -23
  36. data/lib/kettle/dev/template_helpers.rb +64 -25
  37. data/lib/kettle/dev/version.rb +1 -1
  38. data/lib/kettle/dev.rb +5 -0
  39. data/sig/kettle/dev/ci_monitor.rbs +6 -0
  40. data/sig/kettle/dev/gem_spec_reader.rbs +8 -5
  41. data/sig/kettle/dev/pre_release_cli.rbs +20 -0
  42. data/sig/kettle/dev/template_helpers.rbs +2 -0
  43. data/sig/kettle/dev.rbs +1 -0
  44. data.tar.gz.sig +0 -0
  45. metadata +31 -4
  46. metadata.gz.sig +0 -0
@@ -12,6 +12,8 @@ module Kettle
12
12
  # Values: Hash with keys: :action (Symbol, one of :create, :replace, :skip, :dir_create, :dir_replace), :timestamp (Time)
13
13
  @@template_results = {}
14
14
 
15
+ EXECUTABLE_GIT_HOOKS_RE = %r{[\\/]\.git-hooks[\\/](commit-msg|prepare-commit-msg)\z}
16
+
15
17
  module_function
16
18
 
17
19
  # Root of the host project where Rake was invoked
@@ -119,9 +121,11 @@ module Kettle
119
121
  end
120
122
 
121
123
  if clean.nil?
122
- # Fallback to shelling out to get both status and preview
124
+ # Fallback to using the GitAdapter to get both status and preview
123
125
  status_output = begin
124
- IO.popen(["git", "-C", root.to_s, "status", "--porcelain"], &:read).to_s
126
+ ga = Kettle::Dev::GitAdapter.new
127
+ out, ok = ga.capture(["-C", root.to_s, "status", "--porcelain"]) # adapter can use CLI safely
128
+ ok ? out.to_s : ""
125
129
  rescue StandardError => e
126
130
  Kettle::Dev.debug_error(e, __method__)
127
131
  ""
@@ -130,9 +134,11 @@ module Kettle
130
134
  preview = status_output.lines.take(10).map(&:rstrip)
131
135
  else
132
136
  return if clean
133
- # For messaging, provide a small preview via porcelain even when using the adapter
137
+ # For messaging, provide a small preview using GitAdapter even when using the adapter
134
138
  status_output = begin
135
- IO.popen(["git", "-C", root.to_s, "status", "--porcelain"], &:read).to_s
139
+ ga = Kettle::Dev::GitAdapter.new
140
+ out, ok = ga.capture(["-C", root.to_s, "status", "--porcelain"]) # read-only query
141
+ ok ? out.to_s : ""
136
142
  rescue StandardError => e
137
143
  Kettle::Dev.debug_error(e, __method__)
138
144
  ""
@@ -221,6 +227,15 @@ module Kettle
221
227
  # If replacement fails unexpectedly, proceed with content as-is
222
228
  end
223
229
  write_file(dest_path, content)
230
+ begin
231
+ # Ensure executable bit for git hook scripts when writing under .git-hooks
232
+ if EXECUTABLE_GIT_HOOKS_RE =~ dest_path.to_s
233
+ File.chmod(0o755, dest_path) if File.exist?(dest_path)
234
+ end
235
+ rescue StandardError => e
236
+ Kettle::Dev.debug_error(e, __method__)
237
+ # ignore permission issues
238
+ end
224
239
  record_template_result(dest_path, dest_exists ? :replace : :create)
225
240
  puts "Wrote #{dest_path}"
226
241
  end
@@ -316,6 +331,16 @@ module Kettle
316
331
  end
317
332
  end
318
333
  FileUtils.cp(path, target)
334
+ begin
335
+ # Ensure executable bit for git hook scripts when copying under .git-hooks
336
+ if target.end_with?("/.git-hooks/commit-msg", "/.git-hooks/prepare-commit-msg") ||
337
+ EXECUTABLE_GIT_HOOKS_RE =~ target
338
+ File.chmod(0o755, target)
339
+ end
340
+ rescue StandardError => e
341
+ Kettle::Dev.debug_error(e, __method__)
342
+ # ignore permission issues
343
+ end
319
344
  end
320
345
  end
321
346
  puts "Updated #{dest_dir}"
@@ -354,6 +379,16 @@ module Kettle
354
379
  end
355
380
  end
356
381
  FileUtils.cp(path, target)
382
+ begin
383
+ # Ensure executable bit for git hook scripts when copying under .git-hooks
384
+ if target.end_with?("/.git-hooks/commit-msg", "/.git-hooks/prepare-commit-msg") ||
385
+ EXECUTABLE_GIT_HOOKS_RE =~ target
386
+ File.chmod(0o755, target)
387
+ end
388
+ rescue StandardError => e
389
+ Kettle::Dev.debug_error(e, __method__)
390
+ # ignore permission issues
391
+ end
357
392
  end
358
393
  end
359
394
  puts "Created #{dest_dir}"
@@ -368,30 +403,34 @@ module Kettle
368
403
  # @param namespace [String]
369
404
  # @param namespace_shield [String]
370
405
  # @param gem_shield [String]
406
+ # @param funding_org [String, nil]
371
407
  # @return [String]
372
- def apply_common_replacements(content, org:, gem_name:, namespace:, namespace_shield:, gem_shield:)
373
- c = content.dup
374
- c = c.gsub("kettle-rb", org.to_s) if org && !org.empty?
375
- if gem_name && !gem_name.empty?
376
- # Special-case: yard-head link uses the gem name as a subdomain and must be dashes-only.
377
- # Apply this BEFORE other generic replacements so it isn't altered incorrectly.
378
- begin
379
- dashed = gem_name.tr("_", "-")
380
- c = c.gsub("[🚎yard-head]: https://kettle-dev.galtzo.com", "[🚎yard-head]: https://#{dashed}.galtzo.com")
381
- rescue StandardError
382
- # ignore
383
- end
408
+ def apply_common_replacements(content, org:, gem_name:, namespace:, namespace_shield:, gem_shield:, funding_org: nil)
409
+ raise Error, "Org could not be derived" unless org && !org.empty?
410
+ raise Error, "Gem name could not be derived" unless gem_name && !gem_name.empty?
384
411
 
385
- # Replace occurrences of the template gem name in text, including inside
386
- # markdown reference labels like [🖼️kettle-dev] and identifiers like kettle-dev-i
387
- c = c.gsub("kettle-dev", gem_name)
388
- c = c.gsub(/\bKettle::Dev\b/u, namespace) unless namespace.empty?
389
- c = c.gsub("Kettle%3A%3ADev", namespace_shield) unless namespace_shield.empty?
390
- c = c.gsub("kettle--dev", gem_shield)
391
- # Replace require and path structures with gem_name, modifying - to / if needed
392
- c = c.gsub("kettle/dev", gem_name.tr("-", "/"))
412
+ funding_org ||= org
413
+ c = content.dup
414
+ c = c.gsub("kettle-rb", org.to_s)
415
+ c = c.gsub("{OPENCOLLECTIVE|ORG_NAME}", funding_org)
416
+ # Special-case: yard-head link uses the gem name as a subdomain and must be dashes-only.
417
+ # Apply this BEFORE other generic replacements so it isn't altered incorrectly.
418
+ begin
419
+ dashed = gem_name.tr("_", "-")
420
+ c = c.gsub("[🚎yard-head]: https://kettle-dev.galtzo.com", "[🚎yard-head]: https://#{dashed}.galtzo.com")
421
+ rescue StandardError => e
422
+ Kettle::Dev.debug_error(e, __method__)
423
+ # ignore
393
424
  end
394
- c
425
+
426
+ # Replace occurrences of the template gem name in text, including inside
427
+ # markdown reference labels like [🖼️kettle-dev] and identifiers like kettle-dev-i
428
+ c = c.gsub("kettle-dev", gem_name)
429
+ c = c.gsub(/\bKettle::Dev\b/u, namespace) unless namespace.empty?
430
+ c = c.gsub("Kettle%3A%3ADev", namespace_shield) unless namespace_shield.empty?
431
+ c = c.gsub("kettle--dev", gem_shield)
432
+ # Replace require and path structures with gem_name, modifying - to / if needed
433
+ c.gsub("kettle/dev", gem_name.tr("-", "/"))
395
434
  end
396
435
 
397
436
  # Parse gemspec metadata and derive useful strings
@@ -6,7 +6,7 @@ module Kettle
6
6
  module Version
7
7
  # The gem version.
8
8
  # @return [String]
9
- VERSION = "1.1.3"
9
+ VERSION = "1.1.5"
10
10
 
11
11
  module_function
12
12
 
data/lib/kettle/dev.rb CHANGED
@@ -23,6 +23,7 @@ module Kettle
23
23
  autoload :InputAdapter, "kettle/dev/input_adapter"
24
24
  autoload :ReadmeBackers, "kettle/dev/readme_backers"
25
25
  autoload :ReleaseCLI, "kettle/dev/release_cli"
26
+ autoload :PreReleaseCLI, "kettle/dev/pre_release_cli"
26
27
  autoload :TemplateHelpers, "kettle/dev/template_helpers"
27
28
  autoload :Version, "kettle/dev/version"
28
29
  autoload :Versioning, "kettle/dev/versioning"
@@ -54,6 +55,10 @@ module Kettle
54
55
  # auto-install tasks when invoked via the rake executable.
55
56
  # @return [String]
56
57
  RUNNING_AS = File.basename($PROGRAM_NAME)
58
+ # A case-insensitive regular expression that matches common truthy ENV values.
59
+ # Accepts 1, true, y, yes (any case).
60
+ # @return [Regexp]
61
+ ENV_TRUE_RE = /\A(1|true|y|yes)\z/i
57
62
 
58
63
  @defaults = []
59
64
 
@@ -1,8 +1,14 @@
1
1
  module Kettle
2
2
  module Dev
3
3
  module CIMonitor
4
+ def self.status_emoji: (String? status, String? conclusion) -> String
4
5
  def self.monitor_all!: (?restart_hint: String) -> void
5
6
  def self.monitor_gitlab!: (?restart_hint: String) -> bool
7
+ def self.collect_all: () -> { github: Array[untyped], gitlab: untyped? }
8
+ def self.summarize_results: ({ github: Array[untyped], gitlab: untyped? }) -> bool
9
+ def self.monitor_and_prompt_for_release!: (?restart_hint: String) -> void
10
+ def self.collect_github: () -> Array[untyped]?
11
+ def self.collect_gitlab: () -> { status: String, url: String? }?
6
12
  end
7
13
  end
8
14
  end
@@ -1,13 +1,15 @@
1
1
  module Kettle
2
2
  module Dev
3
3
  class GemSpecReader
4
+ DEFAULT_MINIMUM_RUBY: Gem::Version
5
+
4
6
  def self.load: (String root) -> {
5
7
  gemspec_path: String?,
6
8
  gem_name: String,
7
- min_ruby: String,
9
+ min_ruby: Gem::Version,
8
10
  homepage: String,
9
- gh_org: String?,
10
- forge_org: String?,
11
+ gh_org: String,
12
+ forge_org: String,
11
13
  funding_org: String?,
12
14
  gh_repo: String?,
13
15
  namespace: String,
@@ -18,13 +20,14 @@ module Kettle
18
20
  email: Array[String],
19
21
  summary: String,
20
22
  description: String,
21
- license: String,
22
23
  licenses: Array[String],
23
- required_ruby_version: String,
24
+ required_ruby_version: Gem::Requirement?,
24
25
  require_paths: Array[String],
25
26
  bindir: String,
26
27
  executables: Array[String],
27
28
  }
29
+
30
+ def self.derive_forge_and_origin_repo: (String? homepage_val) -> { forge_org: String?, origin_repo: String? }
28
31
  end
29
32
  end
30
33
  end
@@ -0,0 +1,20 @@
1
+ module Kettle
2
+ module Dev
3
+ class PreReleaseCLI
4
+ module HTTP
5
+ def self.parse_http_uri: (String url_str) -> ::URI
6
+ def self.head_ok?: (String url_str, ?limit: Integer, ?timeout: Integer) -> bool
7
+ end
8
+
9
+ module Markdown
10
+ def self.extract_image_urls_from_text: (String text) -> Array[String]
11
+ def self.extract_image_urls_from_files: (?String glob_pattern) -> Array[String]
12
+ end
13
+
14
+ def initialize: (?check_num: Integer) -> void
15
+ def run: () -> void
16
+ def check_markdown_uri_normalization!: () -> void
17
+ def check_markdown_images_http!: () -> void
18
+ end
19
+ end
20
+ end
@@ -77,6 +77,8 @@ module Kettle
77
77
  bindir: String,
78
78
  executables: Array[String],
79
79
  }
80
+
81
+ def apply_common_replacements: () -> untyped
80
82
  end
81
83
  end
82
84
  end
data/sig/kettle/dev.rbs CHANGED
@@ -11,6 +11,7 @@ module Kettle
11
11
  IS_CI: bool
12
12
  REQUIRE_BENCH: bool
13
13
  RUNNING_AS: String
14
+ ENV_TRUE_RE: Regexp
14
15
 
15
16
  # Singleton methods
16
17
  def self.install_tasks: () -> void
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.3
4
+ version: 1.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -51,6 +51,26 @@ dependencies:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
53
  version: '13.0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: addressable
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '2.8'
61
+ - - "<"
62
+ - !ruby/object:Gem::Version
63
+ version: '3'
64
+ type: :runtime
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: '2.8'
71
+ - - "<"
72
+ - !ruby/object:Gem::Version
73
+ version: '3'
54
74
  - !ruby/object:Gem::Dependency
55
75
  name: bundler-audit
56
76
  requirement: !ruby/object:Gem::Requirement
@@ -199,6 +219,7 @@ executables:
199
219
  - kettle-commit-msg
200
220
  - kettle-dev-setup
201
221
  - kettle-dvcs
222
+ - kettle-pre-release
202
223
  - kettle-readme-backers
203
224
  - kettle-release
204
225
  extensions: []
@@ -221,6 +242,7 @@ files:
221
242
  - ".git-hooks/commit-subjects-goalie.txt"
222
243
  - ".git-hooks/footer-template.erb.txt"
223
244
  - ".git-hooks/prepare-commit-msg"
245
+ - ".git-hooks/prepare-commit-msg.example"
224
246
  - ".github/FUNDING.yml"
225
247
  - ".github/dependabot.yml"
226
248
  - ".github/workflows/ancient.yml"
@@ -249,6 +271,7 @@ files:
249
271
  - ".junie/guidelines-rbs.md"
250
272
  - ".junie/guidelines.md"
251
273
  - ".opencollective.yml"
274
+ - ".opencollective.yml.example"
252
275
  - ".qlty/qlty.toml"
253
276
  - ".rspec"
254
277
  - ".rubocop.yml"
@@ -275,10 +298,12 @@ files:
275
298
  - RUBOCOP.md
276
299
  - Rakefile.example
277
300
  - SECURITY.md
301
+ - bin/setup
278
302
  - exe/kettle-changelog
279
303
  - exe/kettle-commit-msg
280
304
  - exe/kettle-dev-setup
281
305
  - exe/kettle-dvcs
306
+ - exe/kettle-pre-release
282
307
  - exe/kettle-readme-backers
283
308
  - exe/kettle-release
284
309
  - gemfiles/modular/coverage.gemfile
@@ -301,6 +326,7 @@ files:
301
326
  - lib/kettle/dev/git_adapter.rb
302
327
  - lib/kettle/dev/git_commit_footer.rb
303
328
  - lib/kettle/dev/input_adapter.rb
329
+ - lib/kettle/dev/pre_release_cli.rb
304
330
  - lib/kettle/dev/rakelib/appraisal.rake
305
331
  - lib/kettle/dev/rakelib/bench.rake
306
332
  - lib/kettle/dev/rakelib/bundle_audit.rake
@@ -333,6 +359,7 @@ files:
333
359
  - sig/kettle/dev/git_adapter.rbs
334
360
  - sig/kettle/dev/git_commit_footer.rbs
335
361
  - sig/kettle/dev/input_adapter.rbs
362
+ - sig/kettle/dev/pre_release_cli.rbs
336
363
  - sig/kettle/dev/readme_backers.rbs
337
364
  - sig/kettle/dev/release_cli.rbs
338
365
  - sig/kettle/dev/tasks.rbs
@@ -347,10 +374,10 @@ licenses:
347
374
  - MIT
348
375
  metadata:
349
376
  homepage_uri: https://kettle-dev.galtzo.com/
350
- source_code_uri: https://github.com/kettle-rb/kettle-dev/tree/v1.1.3
351
- changelog_uri: https://github.com/kettle-rb/kettle-dev/blob/v1.1.3/CHANGELOG.md
377
+ source_code_uri: https://github.com/kettle-rb/kettle-dev/tree/v1.1.5
378
+ changelog_uri: https://github.com/kettle-rb/kettle-dev/blob/v1.1.5/CHANGELOG.md
352
379
  bug_tracker_uri: https://github.com/kettle-rb/kettle-dev/issues
353
- documentation_uri: https://www.rubydoc.info/gems/kettle-dev/1.1.3
380
+ documentation_uri: https://www.rubydoc.info/gems/kettle-dev/1.1.5
354
381
  funding_uri: https://github.com/sponsors/pboling
355
382
  wiki_uri: https://github.com/kettle-rb/kettle-dev/wiki
356
383
  news_uri: https://www.railsbling.com/tags/kettle-dev
metadata.gz.sig CHANGED
Binary file