kettle-dev 1.1.19 → 1.1.20
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/.licenserc.yaml +7 -0
- data/CHANGELOG.md +18 -1
- data/README.md +4 -1
- data/README.md.example +1 -1
- data/Rakefile.example +1 -1
- data/exe/kettle-dev-setup +1 -0
- data/lib/kettle/dev/changelog_cli.rb +80 -3
- data/lib/kettle/dev/gem_spec_reader.rb +14 -8
- data/lib/kettle/dev/setup_cli.rb +1 -0
- data/lib/kettle/dev/tasks/template_task.rb +125 -2
- data/lib/kettle/dev/version.rb +1 -1
- data.tar.gz.sig +0 -0
- metadata +6 -5
- metadata.gz.sig +0 -0
- /data/.github/workflows/{discord-notifier.yml → discord-notifier.yml.example} +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 898754550e179a5b5757c58d45a2dd50a61de0334051ab4947769cc4a33c6624
|
4
|
+
data.tar.gz: f2b3cb209b23f9074086cb22e52e674e2b0ba84788241b2222bdca9bf26d5699
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 73108e8b6bc65bd2b11e04b0a0cb20ac2fa0f7c5f3b83533c469ece206af419e1c1033bb61253815e1c98b84f21122176825e16abbb2121478c6154647812d33
|
7
|
+
data.tar.gz: 53cf04abaea992d6a6c4047e7be8292c4eb8d452614755aeb368b37d7d8f950bc42271556a39b873cf683950f49db3325b5a2245cb4687f07776044f4f562a78
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/.licenserc.yaml
ADDED
data/CHANGELOG.md
CHANGED
@@ -24,6 +24,21 @@ Please file a bug if you notice a violation of semantic versioning.
|
|
24
24
|
### Fixed
|
25
25
|
### Security
|
26
26
|
|
27
|
+
## [1.1.20] - 2025-09-15
|
28
|
+
- TAG: [v1.1.20][1.1.20t]
|
29
|
+
- COVERAGE: 96.80% -- 3660/3781 lines in 25 files
|
30
|
+
- BRANCH COVERAGE: 81.65% -- 1504/1842 branches in 25 files
|
31
|
+
- 77.01% documented
|
32
|
+
### Added
|
33
|
+
- Allow reformating of CHANGELOG.md without version bump
|
34
|
+
- `--include=GLOB` includes files not otherwise included in default template
|
35
|
+
- more test coverage
|
36
|
+
### Fixed
|
37
|
+
- Add .licenserc.yaml to gem package
|
38
|
+
- Handling of GFM fenced code blocks in CHANGELOG.md
|
39
|
+
- Handling of nested list items in CHANGELOG.md
|
40
|
+
- Handling of blank lines around all headings in CHANGELOG.md
|
41
|
+
|
27
42
|
## [1.1.19] - 2025-09-14
|
28
43
|
- TAG: [v1.1.19][1.1.19t]
|
29
44
|
- COVERAGE: 96.58% -- 3531/3656 lines in 25 files
|
@@ -660,7 +675,9 @@ Please file a bug if you notice a violation of semantic versioning.
|
|
660
675
|
- Selecting will run the selected workflow via `act`
|
661
676
|
- This may move to its own gem in the future.
|
662
677
|
|
663
|
-
[Unreleased]: https://github.com/kettle-rb/kettle-dev/compare/v1.1.
|
678
|
+
[Unreleased]: https://github.com/kettle-rb/kettle-dev/compare/v1.1.20...HEAD
|
679
|
+
[1.1.20]: https://github.com/kettle-rb/kettle-dev/compare/v1.1.19...v1.1.20
|
680
|
+
[1.1.20t]: https://github.com/kettle-rb/kettle-dev/releases/tag/v1.1.20
|
664
681
|
[1.1.19]: https://github.com/kettle-rb/kettle-dev/compare/v1.1.18...v1.1.19
|
665
682
|
[1.1.19t]: https://github.com/kettle-rb/kettle-dev/releases/tag/v1.1.19
|
666
683
|
[1.1.18]: https://github.com/kettle-rb/kettle-dev/compare/v1.1.17...v1.1.18
|
data/README.md
CHANGED
@@ -241,10 +241,12 @@ That’s it. Once installed, kettle-dev:
|
|
241
241
|
- option: force: When truthy (1, true, y, yes), treat all y/N prompts as Yes. Useful for non-interactive runs or to accept defaults quickly. Example: `bundle exec rake kettle:dev:template force=true`
|
242
242
|
- option: allowed: When truthy (1, true, y, yes), resume task after you have reviewed `.envrc`/`.env.local` and run `direnv allow`. If either file is created or updated, the task will abort with instructions unless `allowed=true` is present. Example: `bundle exec rake kettle:dev:install allowed=true`
|
243
243
|
- option: only: A comma-separated list of glob patterns to include in templating. Any destination file whose path+filename does not match one of the patterns is excluded. Patterns are matched relative to your project root. Examples: `only="README.md,.github/**"`, `only="docs/**,lib/**/*.rb"`.
|
244
|
+
- option: include: A comma-separated list of glob patterns that opt-in additional, non-default files. Currently, `.github/workflows/discord-notifier.yml` is not copied by default and will only be copied when `include` matches it (e.g., `include=".github/workflows/discord-notifier.yml"`).
|
244
245
|
- `kettle:dev:template` — templates files from this gem into your project (e.g., .github workflows, .devcontainer, .qlty, modular Gemfiles, README/CONTRIBUTING stubs). You can run this independently to refresh templates without the extra install prompts.
|
245
246
|
- option: force: When truthy (1, true, y, yes), treat all y/N prompts as Yes. Useful for non-interactive runs or to accept defaults quickly. Example: `bundle exec rake kettle:dev:template force=true`
|
246
247
|
- option: allowed: When truthy (1, true, y, yes), resume task after you have reviewed `.envrc`/`.env.local` and run `direnv allow`. If either file is created or updated, the task will abort with instructions unless `allowed=true` is present. Example: `bundle exec rake kettle:dev:template allowed=true`
|
247
248
|
- option: only: Same as for install; limits which destination files are written based on glob patterns relative to the project root.
|
249
|
+
- option: include: Same as for install; opts into optional files (e.g., `.github/workflows/discord-notifier.yml`).
|
248
250
|
|
249
251
|
Recommended one-time setup in your project:
|
250
252
|
- Install binstubs so kettle-dev executables are available under `./bin`:
|
@@ -506,6 +508,7 @@ What it does:
|
|
506
508
|
- `--force` Pass `force=true` to accept prompts non-interactively.
|
507
509
|
- `--hook_templates=VAL` Pass `hook_templates=VAL` to control git hook templating.
|
508
510
|
- `--only=VAL` Pass `only=VAL` to restrict install scope.
|
511
|
+
- `--include=VAL` Pass `include=VAL` to include optional files by glob (see notes below).
|
509
512
|
- `-h`, `--help` Show help.
|
510
513
|
- Behavior:
|
511
514
|
- Verifies a clean git working tree, presence of a Gemfile and a gemspec.
|
@@ -911,7 +914,7 @@ Thanks for RTFM. ☺️
|
|
911
914
|
[📌gitmoji]:https://gitmoji.dev
|
912
915
|
[📌gitmoji-img]:https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
|
913
916
|
[🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
|
914
|
-
[🧮kloc-img]: https://img.shields.io/badge/KLOC-3.
|
917
|
+
[🧮kloc-img]: https://img.shields.io/badge/KLOC-3.781-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
|
915
918
|
[🔐security]: SECURITY.md
|
916
919
|
[🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
|
917
920
|
[📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
|
data/README.md.example
CHANGED
@@ -511,7 +511,7 @@ Thanks for RTFM. ☺️
|
|
511
511
|
[📌gitmoji]:https://gitmoji.dev
|
512
512
|
[📌gitmoji-img]:https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
|
513
513
|
[🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
|
514
|
-
[🧮kloc-img]: https://img.shields.io/badge/KLOC-3.
|
514
|
+
[🧮kloc-img]: https://img.shields.io/badge/KLOC-3.781-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
|
515
515
|
[🔐security]: SECURITY.md
|
516
516
|
[🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
|
517
517
|
[📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
|
data/Rakefile.example
CHANGED
data/exe/kettle-dev-setup
CHANGED
@@ -24,9 +24,22 @@ module Kettle
|
|
24
24
|
|
25
25
|
changelog = File.read(@changelog_path)
|
26
26
|
|
27
|
-
# If the detected version already exists in the changelog,
|
27
|
+
# If the detected version already exists in the changelog, offer reformat-only mode
|
28
28
|
if changelog =~ /^## \[#{Regexp.escape(version)}\]/
|
29
|
-
|
29
|
+
warn("CHANGELOG.md already has a section for version #{version}.")
|
30
|
+
warn("It appears the version has not been bumped. You can reformat CHANGELOG.md without adding a new release section.")
|
31
|
+
print("Proceed with reformat only? [y/N]: ")
|
32
|
+
ans = Kettle::Dev::InputAdapter.gets&.strip&.downcase
|
33
|
+
if ans == "y" || ans == "yes"
|
34
|
+
updated = normalize_heading_spacing(changelog)
|
35
|
+
updated = ensure_footer_spacing(updated)
|
36
|
+
updated = updated.rstrip + "\n"
|
37
|
+
File.write(@changelog_path, updated)
|
38
|
+
puts "CHANGELOG.md reformatted. No new version section added."
|
39
|
+
return
|
40
|
+
else
|
41
|
+
abort("Aborting: version not bumped. Re-run after bumping version or answer 'y' to reformat-only.")
|
42
|
+
end
|
30
43
|
end
|
31
44
|
|
32
45
|
unreleased_block, before, after = extract_unreleased(changelog)
|
@@ -86,6 +99,9 @@ module Kettle
|
|
86
99
|
|
87
100
|
updated = update_link_refs(updated, owner, repo, prev_version, version)
|
88
101
|
|
102
|
+
# Normalize spacing around headings to aid Markdown renderers
|
103
|
+
updated = normalize_heading_spacing(updated)
|
104
|
+
|
89
105
|
# Ensure exactly one trailing newline at EOF
|
90
106
|
updated = updated.rstrip + "\n"
|
91
107
|
|
@@ -340,10 +356,71 @@ module Kettle
|
|
340
356
|
new_ref_block << tags[v] if tags[v]
|
341
357
|
end
|
342
358
|
# Replace the old block
|
343
|
-
|
359
|
+
head = lines[0...first_ref]
|
360
|
+
# Ensure exactly one blank line separating body content from the reference block
|
361
|
+
if head.any? && head.last.to_s.strip != ""
|
362
|
+
head << "\n"
|
363
|
+
end
|
364
|
+
rebuilt = head + new_ref_block + ["\n"]
|
344
365
|
rebuilt.join
|
345
366
|
end
|
346
367
|
|
368
|
+
# Ensure every Markdown atx-style heading line (e.g., "# ", "## ") has exactly one blank line
|
369
|
+
# before and after it, skipping content inside fenced code blocks.
|
370
|
+
def normalize_heading_spacing(text)
|
371
|
+
lines = text.split("\n", -1)
|
372
|
+
out = []
|
373
|
+
in_fence = false
|
374
|
+
fence_re = /^\s*```/
|
375
|
+
heading_re = /^\s*#+\s+.+/
|
376
|
+
lines.each_with_index do |ln, idx|
|
377
|
+
if ln =~ fence_re
|
378
|
+
in_fence = !in_fence
|
379
|
+
out << ln
|
380
|
+
next
|
381
|
+
end
|
382
|
+
if !in_fence && ln =~ heading_re
|
383
|
+
# Ensure previous line is blank (unless start of file or already blank)
|
384
|
+
prev_blank = out.empty? ? false : out.last.to_s.strip == ""
|
385
|
+
out << "" unless out.empty? || prev_blank
|
386
|
+
out << ln
|
387
|
+
# Peek at next line in source to decide if we need to inject a blank now.
|
388
|
+
nxt = lines[idx + 1]
|
389
|
+
out << "" unless nxt.to_s.strip == ""
|
390
|
+
else
|
391
|
+
out << ln
|
392
|
+
end
|
393
|
+
end
|
394
|
+
# Collapse multiple consecutive blank lines down to a single between regions that our logic might have doubled
|
395
|
+
collapsed = []
|
396
|
+
lines_enum = out
|
397
|
+
lines_enum.each do |l|
|
398
|
+
if l.strip == "" && collapsed.last.to_s.strip == ""
|
399
|
+
next
|
400
|
+
end
|
401
|
+
collapsed << l
|
402
|
+
end
|
403
|
+
collapsed.join("\n")
|
404
|
+
end
|
405
|
+
|
406
|
+
def ensure_footer_spacing(text)
|
407
|
+
lines = text.split("\n", -1)
|
408
|
+
# Find the Unreleased link-ref which denotes start of footer refs
|
409
|
+
idx = lines.index { |l| l.start_with?(UNRELEASED_SECTION_HEADING) }
|
410
|
+
return text unless idx
|
411
|
+
head = lines[0...idx]
|
412
|
+
tail = lines[idx..-1]
|
413
|
+
# Ensure exactly one blank line between body and refs
|
414
|
+
if head.any? && head.last.to_s.strip != ""
|
415
|
+
head << ""
|
416
|
+
elsif head.any? && head.last.to_s.strip == "" && head[-2].to_s.strip == ""
|
417
|
+
# Collapse multiple blanks before footer to a single
|
418
|
+
head.pop while head.any? && head.last.to_s.strip == ""
|
419
|
+
head << ""
|
420
|
+
end
|
421
|
+
(head + tail).join("\n")
|
422
|
+
end
|
423
|
+
|
347
424
|
def detect_initial_compare_base(lines)
|
348
425
|
# Fallback when prev_version is unknown: try to find the first compare base used historically
|
349
426
|
# e.g., for 1.0.0 it may be a commit SHA instead of a tag
|
@@ -106,16 +106,22 @@ module Kettle
|
|
106
106
|
if funding_org_env && funding_org_env.to_s.strip.casecmp("false").zero?
|
107
107
|
funding_org = nil
|
108
108
|
else
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
109
|
+
# Prefer .opencollective.yml when present so that specs forcing the file path are stable
|
110
|
+
oc_path = File.join(root.to_s, ".opencollective.yml")
|
111
|
+
if File.file?(oc_path)
|
112
|
+
txt = File.read(oc_path)
|
113
|
+
funding_org = if (m = txt.match(/\borg:\s*([\w\-]+)/i))
|
114
|
+
m[1].to_s
|
115
|
+
else
|
116
|
+
""
|
117
117
|
end
|
118
118
|
end
|
119
|
+
|
120
|
+
# Fallback to ENV when file not present or did not contain an org
|
121
|
+
if funding_org.to_s.strip.empty?
|
122
|
+
funding_org = ENV["OPENCOLLECTIVE_HANDLE"].to_s.strip if funding_org.empty?
|
123
|
+
end
|
124
|
+
|
119
125
|
# Be lenient: if funding_org cannot be determined, do not raise — leave it nil and warn.
|
120
126
|
if funding_org.to_s.empty?
|
121
127
|
Kernel.warn("kettle-dev: Could not determine funding org.\n - Options:\n * Set ENV['FUNDING_ORG'] to your funding handle (e.g., 'opencollective-handle').\n * Or set ENV['OPENCOLLECTIVE_HANDLE'].\n * Or add .opencollective.yml with: org: <handle>\n * Or bypass by setting ENV['FUNDING_ORG']=false for gems without funding.")
|
data/lib/kettle/dev/setup_cli.rb
CHANGED
@@ -114,6 +114,7 @@ module Kettle
|
|
114
114
|
end
|
115
115
|
opts.on("--hook_templates=VAL", "Pass through to kettle:dev:install") { |v| @passthrough << "hook_templates=#{v}" }
|
116
116
|
opts.on("--only=VAL", "Pass through to kettle:dev:install") { |v| @passthrough << "only=#{v}" }
|
117
|
+
opts.on("--include=VAL", "Pass through to kettle:dev:install") { |v| @passthrough << "include=#{v}" }
|
117
118
|
opts.on("-h", "--help", "Show help") do
|
118
119
|
puts opts
|
119
120
|
Kettle::Dev::ExitAdapter.exit(0)
|
@@ -10,6 +10,41 @@ module Kettle
|
|
10
10
|
|
11
11
|
module_function
|
12
12
|
|
13
|
+
# Ensure every Markdown atx-style heading line has exactly one blank line
|
14
|
+
# before and after, skipping content inside fenced code blocks.
|
15
|
+
def normalize_heading_spacing(text)
|
16
|
+
lines = text.split("\n", -1)
|
17
|
+
out = []
|
18
|
+
in_fence = false
|
19
|
+
fence_re = /^\s*```/
|
20
|
+
heading_re = /^\s*#+\s+.+/
|
21
|
+
lines.each_with_index do |ln, idx|
|
22
|
+
if ln =~ fence_re
|
23
|
+
in_fence = !in_fence
|
24
|
+
out << ln
|
25
|
+
next
|
26
|
+
end
|
27
|
+
if !in_fence && ln =~ heading_re
|
28
|
+
prev_blank = out.empty? ? false : out.last.to_s.strip == ""
|
29
|
+
out << "" unless out.empty? || prev_blank
|
30
|
+
out << ln
|
31
|
+
nxt = lines[idx + 1]
|
32
|
+
out << "" unless nxt.to_s.strip == ""
|
33
|
+
else
|
34
|
+
out << ln
|
35
|
+
end
|
36
|
+
end
|
37
|
+
# Collapse accidental multiple blanks
|
38
|
+
collapsed = []
|
39
|
+
out.each do |l|
|
40
|
+
if l.strip == "" && collapsed.last.to_s.strip == ""
|
41
|
+
next
|
42
|
+
end
|
43
|
+
collapsed << l
|
44
|
+
end
|
45
|
+
collapsed.join("\n")
|
46
|
+
end
|
47
|
+
|
13
48
|
# Abort wrapper that avoids terminating the entire process during specs
|
14
49
|
def task_abort(msg)
|
15
50
|
raise Kettle::Dev::Error, msg
|
@@ -57,11 +92,48 @@ module Kettle
|
|
57
92
|
selected[key] ||= path
|
58
93
|
end
|
59
94
|
end
|
95
|
+
# Parse optional include patterns (comma-separated globs relative to project root)
|
96
|
+
include_raw = ENV["include"].to_s
|
97
|
+
include_patterns = include_raw.split(",").map { |s| s.strip }.reject(&:empty?)
|
98
|
+
matches_include = lambda do |abs_dest|
|
99
|
+
return false if include_patterns.empty?
|
100
|
+
begin
|
101
|
+
rel_dest = abs_dest.to_s
|
102
|
+
proj = project_root.to_s
|
103
|
+
if rel_dest.start_with?(proj + "/")
|
104
|
+
rel_dest = rel_dest[(proj.length + 1)..-1]
|
105
|
+
elsif rel_dest == proj
|
106
|
+
rel_dest = ""
|
107
|
+
end
|
108
|
+
include_patterns.any? do |pat|
|
109
|
+
if pat.end_with?("/**")
|
110
|
+
base = pat[0..-4]
|
111
|
+
rel_dest == base || rel_dest.start_with?(base + "/")
|
112
|
+
else
|
113
|
+
File.fnmatch?(pat, rel_dest, File::FNM_PATHNAME | File::FNM_EXTGLOB | File::FNM_DOTMATCH)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
rescue StandardError => e
|
117
|
+
Kettle::Dev.debug_error(e, __method__)
|
118
|
+
false
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
60
122
|
selected.values.each do |orig_src|
|
61
123
|
src = helpers.prefer_example(orig_src)
|
62
124
|
# Destination path should never include the .example suffix.
|
63
125
|
rel = orig_src.sub(/^#{Regexp.escape(gem_checkout_root)}\/?/, "").sub(/\.example\z/, "")
|
64
126
|
dest = File.join(project_root, rel)
|
127
|
+
|
128
|
+
# Optional file: .github/workflows/discord-notifier.yml should NOT be copied by default.
|
129
|
+
# Only copy when --include matches it.
|
130
|
+
if rel == ".github/workflows/discord-notifier.yml"
|
131
|
+
unless matches_include.call(dest)
|
132
|
+
# Explicitly skip without prompting
|
133
|
+
next
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
65
137
|
if File.basename(rel) == "FUNDING.yml"
|
66
138
|
helpers.copy_file_with_prompt(src, dest, allow_create: true, allow_replace: true) do |content|
|
67
139
|
c = content.dup
|
@@ -599,14 +671,63 @@ module Kettle
|
|
599
671
|
parse_items = lambda do |body_lines|
|
600
672
|
result = {}
|
601
673
|
cur = nil
|
602
|
-
|
674
|
+
i = 0
|
675
|
+
while i < body_lines.length
|
676
|
+
ln = body_lines[i]
|
603
677
|
if ln.start_with?("### ")
|
604
678
|
cur = ln.strip
|
605
679
|
result[cur] ||= []
|
606
|
-
|
680
|
+
i += 1
|
681
|
+
next
|
682
|
+
end
|
683
|
+
|
684
|
+
# Detect a list item bullet (allow optional indentation)
|
685
|
+
if (m = ln.match(/^(\s*)[-*]\s/))
|
607
686
|
result[cur] ||= []
|
687
|
+
base_indent = m[1].length
|
688
|
+
# Start a new item: include the bullet line
|
608
689
|
result[cur] << ln.rstrip
|
690
|
+
i += 1
|
691
|
+
|
692
|
+
# Include subsequent lines that belong to this list item:
|
693
|
+
# - blank lines
|
694
|
+
# - lines with indentation greater than the bullet's indentation
|
695
|
+
# - any lines inside fenced code blocks (```), regardless of indentation until fence closes
|
696
|
+
in_fence = false
|
697
|
+
fence_re = /^\s*```/
|
698
|
+
while i < body_lines.length
|
699
|
+
l2 = body_lines[i]
|
700
|
+
# Stop if next sibling/top-level bullet of same or smaller indent and not inside a fence
|
701
|
+
if !in_fence && l2 =~ /^(\s*)[-*]\s/
|
702
|
+
ind = Regexp.last_match(1).length
|
703
|
+
break if ind <= base_indent
|
704
|
+
end
|
705
|
+
# Break if a new section heading appears and we're not in a fence
|
706
|
+
break if !in_fence && l2.start_with?("### ")
|
707
|
+
|
708
|
+
if l2 =~ fence_re
|
709
|
+
in_fence = !in_fence
|
710
|
+
result[cur] << l2.rstrip
|
711
|
+
i += 1
|
712
|
+
next
|
713
|
+
end
|
714
|
+
|
715
|
+
# Include blanks and lines indented more than base indent, or anything while in fence
|
716
|
+
if in_fence || l2.strip.empty? || (l2[/^\s*/].length > base_indent)
|
717
|
+
result[cur] << l2.rstrip
|
718
|
+
i += 1
|
719
|
+
next
|
720
|
+
end
|
721
|
+
|
722
|
+
# Otherwise, this line does not belong to the current list item
|
723
|
+
break
|
724
|
+
end
|
725
|
+
|
726
|
+
next
|
609
727
|
end
|
728
|
+
|
729
|
+
# Non-bullet, non-heading line: just advance
|
730
|
+
i += 1
|
610
731
|
end
|
611
732
|
result
|
612
733
|
end
|
@@ -664,6 +785,8 @@ module Kettle
|
|
664
785
|
c = lines.join("\n")
|
665
786
|
end
|
666
787
|
end
|
788
|
+
# Normalize spacing around Markdown headings for broad renderer compatibility
|
789
|
+
c = normalize_heading_spacing(c)
|
667
790
|
c
|
668
791
|
end
|
669
792
|
else
|
data/lib/kettle/dev/version.rb
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.20
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter H. Boling
|
@@ -235,7 +235,7 @@ files:
|
|
235
235
|
- ".github/workflows/current.yml"
|
236
236
|
- ".github/workflows/dep-heads.yml"
|
237
237
|
- ".github/workflows/dependency-review.yml"
|
238
|
-
- ".github/workflows/discord-notifier.yml"
|
238
|
+
- ".github/workflows/discord-notifier.yml.example"
|
239
239
|
- ".github/workflows/heads.yml"
|
240
240
|
- ".github/workflows/heads.yml.example"
|
241
241
|
- ".github/workflows/jruby.yml"
|
@@ -253,6 +253,7 @@ files:
|
|
253
253
|
- ".gitlab-ci.yml.example"
|
254
254
|
- ".junie/guidelines-rbs.md"
|
255
255
|
- ".junie/guidelines.md"
|
256
|
+
- ".licenserc.yaml"
|
256
257
|
- ".opencollective.yml"
|
257
258
|
- ".opencollective.yml.example"
|
258
259
|
- ".qlty/qlty.toml"
|
@@ -387,10 +388,10 @@ licenses:
|
|
387
388
|
- MIT
|
388
389
|
metadata:
|
389
390
|
homepage_uri: https://kettle-dev.galtzo.com/
|
390
|
-
source_code_uri: https://github.com/kettle-rb/kettle-dev/tree/v1.1.
|
391
|
-
changelog_uri: https://github.com/kettle-rb/kettle-dev/blob/v1.1.
|
391
|
+
source_code_uri: https://github.com/kettle-rb/kettle-dev/tree/v1.1.20
|
392
|
+
changelog_uri: https://github.com/kettle-rb/kettle-dev/blob/v1.1.20/CHANGELOG.md
|
392
393
|
bug_tracker_uri: https://github.com/kettle-rb/kettle-dev/issues
|
393
|
-
documentation_uri: https://www.rubydoc.info/gems/kettle-dev/1.1.
|
394
|
+
documentation_uri: https://www.rubydoc.info/gems/kettle-dev/1.1.20
|
394
395
|
funding_uri: https://github.com/sponsors/pboling
|
395
396
|
wiki_uri: https://github.com/kettle-rb/kettle-dev/wiki
|
396
397
|
news_uri: https://www.railsbling.com/tags/kettle-dev
|
metadata.gz.sig
CHANGED
Binary file
|
File without changes
|