yaml-converter 0.1.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.
data/README.md ADDED
@@ -0,0 +1,810 @@
1
+ | 📍 NOTE |
2
+ |-------------------------------------------------------------------------------------------------------------------------------------------------------------------|
3
+ | RubyGems (the [GitHub org][rubygems-org], not the website) [suffered][draper-security] a [hostile takeover][ellen-takeover] in September 2025. |
4
+ | Ultimately [4 maintainers][simi-removed] were [hard removed][martin-removed] and a reason has been given for only 1 of those, while 2 others resigned in protest. |
5
+ | It is a [complicated story][draper-takeover] which is difficult to [parse quickly][draper-lies]. |
6
+ | I'm adding notes like this to gems because I [don't condone theft][draper-theft] of repositories or gems from their rightful owners. |
7
+ | If a similar theft happened with my repos/gems, I'd hope some would stand up for me. |
8
+ | Disenfranchised former-maintainers have started [gem.coop][gem-coop]. |
9
+ | Once available I will publish there exclusively; unless RubyCentral makes amends with the community. |
10
+ | The ["Technology for Humans: Joel Draper"][reinteractive-podcast] podcast episode by [reinteractive][reinteractive] is the most cogent summary I'm aware of. |
11
+ | See [here][gem-naming], [here][gem-coop] and [here][martin-ann] for more info on what comes next. |
12
+ | What I'm doing: A (WIP) proposal for [bundler/gem scopes][gem-scopes], and a (WIP) proposal for a federated [gem server][gem-server]. |
13
+
14
+ [rubygems-org]: https://github.com/rubygems/
15
+ [draper-security]: https://joel.drapper.me/p/ruby-central-security-measures/
16
+ [draper-takeover]: https://joel.drapper.me/p/ruby-central-takeover/
17
+ [ellen-takeover]: https://pup-e.com/blog/goodbye-rubygems/
18
+ [simi-removed]: https://www.reddit.com/r/ruby/s/gOk42POCaV
19
+ [martin-removed]: https://bsky.app/profile/martinemde.com/post/3m3occezxxs2q
20
+ [draper-lies]: https://joel.drapper.me/p/ruby-central-fact-check/
21
+ [draper-theft]: https://joel.drapper.me/p/ruby-central/
22
+ [reinteractive]: https://reinteractive.com/ruby-on-rails
23
+ [gem-coop]: https://gem.coop
24
+ [gem-naming]: https://github.com/gem-coop/gem.coop/issues/12
25
+ [martin-ann]: https://martinemde.com/2025/10/05/announcing-gem-coop.html
26
+ [gem-scopes]: https://github.com/galtzo-floss/bundle-namespace
27
+ [gem-server]: https://github.com/galtzo-floss/gem-server
28
+ [reinteractive-podcast]: https://youtu.be/_H4qbtC5qzU?si=BvuBU90R2wAqD2E6
29
+
30
+ [![Galtzo FLOSS Logo by Aboling0, CC BY-SA 4.0][🖼️galtzo-i]][🖼️galtzo-discord] [![ruby-lang Logo, Yukihiro Matsumoto, Ruby Visual Identity Team, CC BY-SA 2.5][🖼️ruby-lang-i]][🖼️ruby-lang] [![yaml-converter Logo by Aboling0, CC BY-SA 4.0][🖼️yaml-converter-i]][🖼️yaml-converter]
31
+
32
+ [🖼️galtzo-i]: https://logos.galtzo.com/assets/images/galtzo-floss/avatar-192px.svg
33
+ [🖼️galtzo-discord]: https://discord.gg/3qme4XHNKN
34
+ [🖼️ruby-lang-i]: https://logos.galtzo.com/assets/images/ruby-lang/avatar-192px.svg
35
+ [🖼️ruby-lang]: https://www.ruby-lang.org/
36
+ [🖼️yaml-converter-i]: https://logos.galtzo.com/assets/images/galtzo-floss/yaml-converter/avatar-192px.svg
37
+ [🖼️yaml-converter]: https://github.com/galtzo-floss/yaml-converter
38
+
39
+ # 🥨 Yaml::Converter
40
+
41
+ [![Version][👽versioni]][👽version] [![GitHub tag (latest SemVer)][⛳️tag-img]][⛳️tag] [![License: MIT][📄license-img]][📄license-ref] [![Downloads Rank][👽dl-ranki]][👽dl-rank] [![Open Source Helpers][👽oss-helpi]][👽oss-help] [![CodeCov Test Coverage][🏀codecovi]][🏀codecov] [![Coveralls Test Coverage][🏀coveralls-img]][🏀coveralls] [![QLTY Test Coverage][🏀qlty-covi]][🏀qlty-cov] [![QLTY Maintainability][🏀qlty-mnti]][🏀qlty-mnt] [![CI Heads][🚎3-hd-wfi]][🚎3-hd-wf] [![CI Runtime Dependencies @ HEAD][🚎12-crh-wfi]][🚎12-crh-wf] [![CI Current][🚎11-c-wfi]][🚎11-c-wf] [![CI Truffle Ruby][🚎9-t-wfi]][🚎9-t-wf] [![Deps Locked][🚎13-🔒️-wfi]][🚎13-🔒️-wf] [![Deps Unlocked][🚎14-🔓️-wfi]][🚎14-🔓️-wf] [![CI Supported][🚎6-s-wfi]][🚎6-s-wf] [![CI Test Coverage][🚎2-cov-wfi]][🚎2-cov-wf] [![CI Style][🚎5-st-wfi]][🚎5-st-wf] [![CodeQL][🖐codeQL-img]][🖐codeQL] [![Apache SkyWalking Eyes License Compatibility Check][🚎15-🪪-wfi]][🚎15-🪪-wf]
42
+
43
+ `if ci_badges.map(&:color).detect { it != "green"}` ☝️ [let me know][🖼️galtzo-discord], as I may have missed the [discord notification][🖼️galtzo-discord].
44
+
45
+ ---
46
+
47
+ `if ci_badges.map(&:color).all? { it == "green"}` 👇️ send money so I can do more of this. FLOSS maintenance is now my full-time job.
48
+
49
+ [![OpenCollective Backers][🖇osc-backers-i]][🖇osc-backers] [![OpenCollective Sponsors][🖇osc-sponsors-i]][🖇osc-sponsors] [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal] [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate on Polar][🖇polar-img]][🖇polar] [![Donate at ko-fi.com][🖇kofi-img]][🖇kofi]
50
+
51
+ ## 🌻 Synopsis
52
+
53
+ Transform annotated YAML blueprints into human-friendly documentation. This gem:
54
+
55
+ - Fences raw YAML content
56
+ - Injects a validation status line with date (deterministic via current_date option)
57
+ - Extracts inline `#note:` annotations into readable blockquotes (or PDF note sections)
58
+ - Truncates overly long YAML lines (configurable)
59
+ - Emits Markdown, HTML, PDF (native Prawn), DOCX/PDF/other via pandoc
60
+
61
+ Ideal for design documents stored as YAML, making them consumable in multiple formats.
62
+
63
+ ---
64
+
65
+ Alternatives (none in Ruby, send a PR if you know of one):
66
+
67
+ - [yaml2rst](https://pypi.org/project/yaml2rst) (Python, GPLv3+)
68
+ - [yaml2doc](https://github.com/ted-dunstone/yaml2doc) (Python, [commercial license](https://github.com/ted-dunstone/yaml2doc/blob/master/licence.txt), not FOSS, but also [accidentally(?) left in](https://github.com/ted-dunstone/yaml2doc/issues/1#issuecomment-3507567579) the GPLv3 LICENSE)
69
+
70
+ ## 💡 Info you can shake a stick at
71
+
72
+ | Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] |
73
+ |-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
74
+ | Works with JRuby | [![JRuby 10.0 Compat][💎jruby-c-i]][🚎11-c-wf] [![JRuby HEAD Compat][💎jruby-headi]][🚎3-hd-wf] |
75
+ | Works with Truffle Ruby | [![Truffle Ruby 23.1 Compat][💎truby-23.1i]][🚎9-t-wf] [![Truffle Ruby 24.1 Compat][💎truby-c-i]][🚎11-c-wf] |
76
+ | Works with MRI Ruby 3 | [![Ruby 3.2 Compat][💎ruby-3.2i]][🚎6-s-wf] [![Ruby 3.3 Compat][💎ruby-3.3i]][🚎6-s-wf] [![Ruby 3.4 Compat][💎ruby-c-i]][🚎11-c-wf] [![Ruby HEAD Compat][💎ruby-headi]][🚎3-hd-wf] |
77
+ | Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] |
78
+ | Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on Github.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] |
79
+ | Documentation | [![Current release on RubyDoc.info][📜docs-cr-rd-img]][🚎yard-current] [![YARD on Galtzo.com][📜docs-head-rd-img]][🚎yard-head] [![Maintainer Blog][🚂maint-blog-img]][🚂maint-blog] [![GitLab Wiki][📜gl-wiki-img]][📜gl-wiki] [![GitHub Wiki][📜gh-wiki-img]][📜gh-wiki] |
80
+ | Compliance | [![License: MIT][📄license-img]][📄license-ref] [![Compatible with Apache Software Projects: Verified by SkyWalking Eyes][📄license-compat-img]][📄license-compat] [![📄ilo-declaration-img]][📄ilo-declaration] [![Security Policy][🔐security-img]][🔐security] [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct] [![SemVer 2.0.0][📌semver-img]][📌semver] |
81
+ | Style | [![Enforced Code Style Linter][💎rlts-img]][💎rlts] [![Keep-A-Changelog 1.0.0][📗keep-changelog-img]][📗keep-changelog] [![Gitmoji Commits][📌gitmoji-img]][📌gitmoji] [![Compatibility appraised by: appraisal2][💎appraisal2-img]][💎appraisal2] |
82
+ | Maintainer 🎖️ | [![Follow Me on LinkedIn][💖🖇linkedin-img]][💖🖇linkedin] [![Follow Me on Ruby.Social][💖🐘ruby-mast-img]][💖🐘ruby-mast] [![Follow Me on Bluesky][💖🦋bluesky-img]][💖🦋bluesky] [![Contact Maintainer][🚂maint-contact-img]][🚂maint-contact] [![My technical writing][💖💁🏼‍♂️devto-img]][💖💁🏼‍♂️devto] |
83
+ | `...` 💖 | [![Find Me on WellFound:][💖✌️wellfound-img]][💖✌️wellfound] [![Find Me on CrunchBase][💖💲crunchbase-img]][💖💲crunchbase] [![My LinkTree][💖🌳linktree-img]][💖🌳linktree] [![More About Me][💖💁🏼‍♂️aboutme-img]][💖💁🏼‍♂️aboutme] [🧊][💖🧊berg] [🐙][💖🐙hub] [🛖][💖🛖hut] [🧪][💖🧪lab] |
84
+
85
+ ### Compatibility
86
+
87
+ Compatible with MRI Ruby 3.2.0+, and concordant releases of JRuby, and TruffleRuby.
88
+
89
+ | 🚚 _Amazing_ test matrix was brought to you by | 🔎 appraisal2 🔎 and the color 💚 green 💚 |
90
+ |------------------------------------------------|--------------------------------------------------------|
91
+ | 👟 Check it out! | ✨ [github.com/appraisal-rb/appraisal2][💎appraisal2] ✨ |
92
+
93
+ ### Federated DVCS
94
+
95
+ <details markdown="1">
96
+ <summary>Find this repo on federated forges</summary>
97
+
98
+ | Federated [DVCS][💎d-in-dvcs] Repository | Status | Issues | PRs | Wiki | CI | Discussions |
99
+ |--------------------------------------------------------|-----------------------------------------------------------------------|---------------------------|--------------------------|---------------------------|--------------------------|------------------------------|
100
+ | 🧪 [galtzo-floss/yaml-converter on GitLab][📜src-gl] | The Truth | [💚][🤝gl-issues] | [💚][🤝gl-pulls] | [💚][📜gl-wiki] | 🐭 Tiny Matrix | ➖ |
101
+ | 🧊 [galtzo-floss/yaml-converter on CodeBerg][📜src-cb] | An Ethical Mirror ([Donate][🤝cb-donate]) | [💚][🤝cb-issues] | [💚][🤝cb-pulls] | ➖ | ⭕️ No Matrix | ➖ |
102
+ | 🐙 [galtzo-floss/yaml-converter on GitHub][📜src-gh] | Another Mirror | [💚][🤝gh-issues] | [💚][🤝gh-pulls] | [💚][📜gh-wiki] | 💯 Full Matrix | [💚][gh-discussions] |
103
+ | 🎮️ [Discord Server][✉️discord-invite] | [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] | [Let's][✉️discord-invite] | [talk][✉️discord-invite] | [about][✉️discord-invite] | [this][✉️discord-invite] | [library!][✉️discord-invite] |
104
+
105
+ </details>
106
+
107
+ [gh-discussions]: https://github.com/galtzo-floss/yaml-converter/discussions
108
+
109
+ ### Enterprise Support [![Tidelift](https://tidelift.com/badges/package/rubygems/yaml-converter)](https://tidelift.com/subscription/pkg/rubygems-yaml-converter?utm_source=rubygems-yaml-converter&utm_medium=referral&utm_campaign=readme)
110
+
111
+ Available as part of the Tidelift Subscription.
112
+
113
+ <details markdown="1">
114
+ <summary>Need enterprise-level guarantees?</summary>
115
+
116
+ The maintainers of this and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source packages you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact packages you use.
117
+
118
+ [![Get help from me on Tidelift][🏙️entsup-tidelift-img]][🏙️entsup-tidelift]
119
+
120
+ - 💡Subscribe for support guarantees covering _all_ your FLOSS dependencies
121
+ - 💡Tidelift is part of [Sonar][🏙️entsup-tidelift-sonar]
122
+ - 💡Tidelift pays maintainers to maintain the software you depend on!<br/>📊`@`Pointy Haired Boss: An [enterprise support][🏙️entsup-tidelift] subscription is "[never gonna let you down][🧮kloc]", and *supports* open source maintainers
123
+
124
+ Alternatively:
125
+
126
+ - [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite]
127
+ - [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork]
128
+ - [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor]
129
+
130
+ </details>
131
+
132
+ ## ✨ Installation
133
+
134
+ Install the gem and add to the application's Gemfile by executing:
135
+
136
+ ```console
137
+ bundle add yaml-converter
138
+ ```
139
+
140
+ If bundler is not being used to manage dependencies, install the gem by executing:
141
+
142
+ ```console
143
+ gem install yaml-converter
144
+ ```
145
+
146
+ ### 🔒 Secure Installation
147
+
148
+ <details markdown="1">
149
+ <summary>For Medium or High Security Installations</summary>
150
+
151
+ This gem is cryptographically signed, and has verifiable [SHA-256 and SHA-512][💎SHA_checksums] checksums by
152
+ [stone_checksums][💎stone_checksums]. Be sure the gem you install hasn’t been tampered with
153
+ by following the instructions below.
154
+
155
+ Add my public key (if you haven’t already, expires 2045-04-29) as a trusted certificate:
156
+
157
+ ```console
158
+ gem cert --add <(curl -Ls https://raw.github.com/galtzo-floss/certs/main/pboling.pem)
159
+ ```
160
+
161
+ You only need to do that once. Then proceed to install with:
162
+
163
+ ```console
164
+ gem install yaml-converter -P HighSecurity
165
+ ```
166
+
167
+ The `HighSecurity` trust profile will verify signed gems, and not allow the installation of unsigned dependencies.
168
+
169
+ If you want to up your security game full-time:
170
+
171
+ ```console
172
+ bundle config set --global trust-policy MediumSecurity
173
+ ```
174
+
175
+ `MediumSecurity` instead of `HighSecurity` is necessary if not all the gems you use are signed.
176
+
177
+ NOTE: Be prepared to track down certs for signed gems and add them the same way you added mine.
178
+
179
+ </details>
180
+
181
+ ## ⚙️ Configuration
182
+
183
+ Pass options via API, CLI flags, or ENV variables.
184
+
185
+ Core Options:
186
+
187
+ - max_line_length (Integer, default 70)
188
+ - truncate (Boolean, default true)
189
+ - margin_notes (:auto | :inline | :ignore)
190
+ - validate (Boolean, default true)
191
+ - use_pandoc (Boolean, default false)
192
+ - pandoc_args (Array<String> default ["-N", "--toc"])
193
+ - current_date (Date, default Date.today) for deterministic validation line
194
+ - pdf_page_size (e.g., LETTER)
195
+ - pdf_two_column_notes (Boolean)
196
+ - emit_footer (Boolean, default true)
197
+
198
+ ENV overrides (examples):
199
+
200
+ ```bash
201
+ export YAML_CONVERTER_MAX_LINE_LEN=120
202
+ export YAML_CONVERTER_TRUNCATE=false
203
+ export YAML_CONVERTER_VALIDATE=false
204
+ ```
205
+
206
+ Overwrite Warning:
207
+ If the output file exists an informational warning is printed: "Overwriting existing file".
208
+ Suppress by setting `KETTLE_TEST_SILENT=true` (used in CI/tests).
209
+
210
+ Deterministic Dates:
211
+ Inject `current_date:` in `options` or stub time for tests; the state machine uses this value.
212
+
213
+ ### Supported Formats (Phase 1)
214
+
215
+ - Markdown (.md)
216
+ - HTML (.html) via kramdown
217
+ - PDF (.pdf) native (Prawn) or via pandoc when `use_pandoc: true`
218
+ - DOCX (.docx) via pandoc (auto-detects pandoc path)
219
+ - Other pandoc-supported formats (set output extension + `--use-pandoc`)
220
+
221
+ ### Notes Handling
222
+
223
+ Inline `#note:` at end of a YAML line:
224
+
225
+ ```yaml
226
+ key: value #note: important detail
227
+ ```
228
+
229
+ Will produce a blockquote note just after the YAML fenced block.
230
+
231
+ ### ENV Configuration
232
+
233
+ Override defaults using ENV (before process start):
234
+
235
+ ```bash
236
+ export YAML_CONVERTER_MAX_LINE_LEN=120
237
+ export YAML_CONVERTER_TRUNCATE=false
238
+ export YAML_CONVERTER_VALIDATE=false
239
+ ```
240
+
241
+ ### Validation Status Line
242
+
243
+ Any comment line that begins with `# YAML validation:` will be replaced with a status and date:
244
+
245
+ ```
246
+ YAML validation:*OK* on dd/mm/YYYY
247
+ ```
248
+
249
+ ### Footer
250
+
251
+ ```text
252
+ ----
253
+ Produced by yaml-converter
254
+ ```
255
+
256
+ The above production footer is appended by default. Disable via ENV:
257
+
258
+ ```bash
259
+ export YAML_CONVERTER_EMIT_FOOTER=false
260
+ ```
261
+
262
+ Or per-call:
263
+
264
+ ```ruby
265
+ Yaml::Converter.to_markdown(yaml_str, options: {emit_footer: false})
266
+ ```
267
+
268
+ ### Streaming (large files)
269
+
270
+ For very large YAML files, enable streaming to keep memory usage low. Streaming processes the input line-by-line and writes Markdown incrementally while preserving identical output to non-streaming mode.
271
+
272
+ How it works:
273
+ - Same parsing and state machine logic as non-streaming
274
+ - Injects validation status if `validate` is enabled
275
+ - Closes YAML fences correctly even at EOF
276
+ - Appends standard footer when enabled
277
+
278
+ When streaming is used:
279
+ - Streaming is applied only to direct `.md` outputs. Other formats still render via an intermediate Markdown string.
280
+ - The output is intended to be byte-for-byte equivalent to the non-streaming path (see tests).
281
+
282
+ Quick start (API):
283
+
284
+ ```ruby
285
+ require "yaml/converter"
286
+
287
+ # Force streaming regardless of file size
288
+ Yaml::Converter.convert(
289
+ input_path: "big.yaml",
290
+ output_path: "big.md",
291
+ options: {streaming: true, validate: true},
292
+ )
293
+
294
+ # Auto-stream based on file size threshold (bytes)
295
+ Yaml::Converter.convert(
296
+ input_path: "maybe_big.yaml",
297
+ output_path: "maybe_big.md",
298
+ options: {streaming_threshold_bytes: 10_000_000}, # 10 MB (default is 5 MB)
299
+ )
300
+ ```
301
+
302
+ Quick start (CLI):
303
+
304
+ ```bash
305
+ # Force streaming for markdown output
306
+ yaml-convert big.yaml big.md --streaming
307
+
308
+ # Auto-stream for inputs >= 10MB
309
+ yaml-convert big.yaml big.md --streaming-threshold 10000000
310
+
311
+ # Batch + streaming to .md
312
+ yaml-convert \
313
+ --glob 'docs/**/*.yaml' \
314
+ --out-ext md \
315
+ --out-dir out/ \
316
+ --streaming
317
+ ```
318
+
319
+ Environment variables:
320
+
321
+ ```bash
322
+ # Enable streaming globally
323
+ export YAML_CONVERTER_STREAMING=1
324
+
325
+ # Default size threshold for auto streaming (bytes)
326
+ export YAML_CONVERTER_STREAMING_THRESHOLD_BYTES=5000000 # 5 MB default
327
+ ```
328
+
329
+ Advanced: custom IO target (pure streaming):
330
+
331
+ If you want to stream directly to any IO (file/socket/StringIO), use the low-level streaming API:
332
+
333
+ ```ruby
334
+ require "yaml/converter"
335
+
336
+ File.open("big.md", "w") do |io|
337
+ Yaml::Converter.to_markdown_streaming(
338
+ "big.yaml",
339
+ io,
340
+ options: {validate: true}, # same options as non-streaming
341
+ )
342
+ end
343
+ ```
344
+
345
+ Notes:
346
+ - For `.html`, `.pdf`, `.docx` (and other pandoc-driven formats), the implementation first produces a full Markdown string, so streaming is not applied to those outputs.
347
+ - If the destination file already exists, you’ll see: "Overwriting existing file" (suppress with `KETTLE_TEST_SILENT=true`).
348
+
349
+ ## 🔧 Basic Usage
350
+
351
+ ### Library API
352
+
353
+ Minimal conversion to Markdown:
354
+
355
+ ```ruby
356
+ require "yaml/converter"
357
+ markdown = Yaml::Converter.to_markdown(File.read("spec/fixtures/example.yaml"))
358
+ puts markdown
359
+ ```
360
+
361
+ Convert directly to a file (extension decides behavior):
362
+
363
+ ```ruby
364
+ Yaml::Converter.convert(
365
+ input_path: "spec/fixtures/example.yaml",
366
+ output_path: "doc/example.html",
367
+ options: {validate: true},
368
+ )
369
+ ```
370
+
371
+ Deterministic date for tests (inject current_date):
372
+
373
+ ```ruby
374
+ Yaml::Converter.to_markdown(yaml_str, options: {current_date: Date.new(2025, 11, 8)})
375
+ ```
376
+
377
+ Native PDF vs pandoc PDF:
378
+
379
+ ```ruby
380
+ # Native PDF using Prawn
381
+ Yaml::Converter.convert(
382
+ input_path: "blueprint.yaml",
383
+ output_path: "blueprint.pdf",
384
+ options: {use_pandoc: false, pdf_two_column_notes: true},
385
+ )
386
+
387
+ # PDF via pandoc (requires pandoc in PATH)
388
+ Yaml::Converter.convert(
389
+ input_path: "blueprint.yaml",
390
+ output_path: "blueprint.pdf",
391
+ options: {use_pandoc: true, pandoc_args: ["-N", "--toc"]},
392
+ )
393
+ ```
394
+
395
+ DOCX via pandoc:
396
+
397
+ ```ruby
398
+ Yaml::Converter.convert(
399
+ input_path: "blueprint.yaml",
400
+ output_path: "blueprint.docx",
401
+ options: {},
402
+ )
403
+ ```
404
+
405
+ ### CLI
406
+
407
+ Install gem (development checkout already has exe script):
408
+
409
+ ```bash
410
+ yaml-convert input.yaml output.md
411
+ yaml-convert input.yaml output.html
412
+ yaml-convert input.yaml output.pdf --use-pandoc
413
+ ```
414
+
415
+ If pandoc is not installed, the command will exit with code 5 and a helpful message.
416
+
417
+ DOCX example (CLI):
418
+
419
+ ```bash
420
+ yaml-convert blueprint.yaml output.docx --use-pandoc
421
+ ```
422
+
423
+ Batch mode with glob:
424
+
425
+ ```bash
426
+ yaml-convert --glob 'docs/**/*.yaml' --out-ext md --out-dir out/
427
+ ```
428
+
429
+ ## 🦷 FLOSS Funding
430
+
431
+ While galtzo-floss tools are free software and will always be, the project would benefit immensely from some funding.
432
+ Raising a monthly budget of... "dollars" would make the project more sustainable.
433
+
434
+ We welcome both individual and corporate sponsors! We also offer a
435
+ wide array of funding channels to account for your preferences
436
+ (although currently [Open Collective][🖇osc] is our preferred funding platform).
437
+
438
+ **If you're working in a company that's making significant use of galtzo-floss tools we'd
439
+ appreciate it if you suggest to your company to become a galtzo-floss sponsor.**
440
+
441
+ You can support the development of galtzo-floss tools via
442
+ [GitHub Sponsors][🖇sponsor],
443
+ [Liberapay][⛳liberapay],
444
+ [PayPal][🖇paypal],
445
+ [Open Collective][🖇osc]
446
+ and [Tidelift][🏙️entsup-tidelift].
447
+
448
+ | 📍 NOTE |
449
+ |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
450
+ | If doing a sponsorship in the form of donation is problematic for your company <br/> from an accounting standpoint, we'd recommend the use of Tidelift, <br/> where you can get a support-like subscription instead. |
451
+
452
+ ### Open Collective for Individuals
453
+
454
+ Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/galtzo-floss#backer)]
455
+
456
+ NOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day, automatically.
457
+
458
+ <!-- OPENCOLLECTIVE-INDIVIDUALS:START -->
459
+ No backers yet. Be the first!
460
+ <!-- OPENCOLLECTIVE-INDIVIDUALS:END -->
461
+
462
+ ### Open Collective for Organizations
463
+
464
+ Become a sponsor and get your logo on our README on GitHub with a link to your site. [[Become a sponsor](https://opencollective.com/galtzo-floss#sponsor)]
465
+
466
+ NOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day, automatically.
467
+
468
+ <!-- OPENCOLLECTIVE-ORGANIZATIONS:START -->
469
+ No sponsors yet. Be the first!
470
+ <!-- OPENCOLLECTIVE-ORGANIZATIONS:END -->
471
+
472
+ [kettle-readme-backers]: https://github.com/galtzo-floss/yaml-converter/blob/main/exe/kettle-readme-backers
473
+
474
+ ### Another way to support open-source
475
+
476
+ I’m driven by a passion to foster a thriving open-source community – a space where people can tackle complex problems, no matter how small. Revitalizing libraries that have fallen into disrepair, and building new libraries focused on solving real-world challenges, are my passions. I was recently affected by layoffs, and the tech jobs market is unwelcoming. I’m reaching out here because your support would significantly aid my efforts to provide for my family, and my farm (11 🐔 chickens, 2 🐶 dogs, 3 🐰 rabbits, 8 🐈‍ cats).
477
+
478
+ If you work at a company that uses my work, please encourage them to support me as a corporate sponsor. My work on gems you use might show up in `bundle fund`.
479
+
480
+ I’m developing a new library, [floss_funding][🖇floss-funding-gem], designed to empower open-source developers like myself to get paid for the work we do, in a sustainable way. Please give it a look.
481
+
482
+ **[Floss-Funding.dev][🖇floss-funding.dev]: 👉️ No network calls. 👉️ No tracking. 👉️ No oversight. 👉️ Minimal crypto hashing. 💡 Easily disabled nags**
483
+
484
+ [![OpenCollective Backers][🖇osc-backers-i]][🖇osc-backers] [![OpenCollective Sponsors][🖇osc-sponsors-i]][🖇osc-sponsors] [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal] [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate on Polar][🖇polar-img]][🖇polar] [![Donate to my FLOSS efforts at ko-fi.com][🖇kofi-img]][🖇kofi] [![Donate to my FLOSS efforts using Patreon][🖇patreon-img]][🖇patreon]
485
+
486
+ ## 🔐 Security
487
+
488
+ See [SECURITY.md][🔐security].
489
+
490
+ ## 🤝 Contributing
491
+
492
+ If you need some ideas of where to help, you could work on adding more code coverage,
493
+ or if it is already 💯 (see [below](#code-coverage)) check [reek](REEK), [issues][🤝gh-issues], or [PRs][🤝gh-pulls],
494
+ or use the gem and think about how it could be better.
495
+
496
+ We [![Keep A Changelog][📗keep-changelog-img]][📗keep-changelog] so if you make changes, remember to update it.
497
+
498
+ See [CONTRIBUTING.md][🤝contributing] for more detailed instructions.
499
+
500
+ ### 🚀 Release Instructions
501
+
502
+ See [CONTRIBUTING.md][🤝contributing].
503
+
504
+ ### Code Coverage
505
+
506
+ [![Coverage Graph][🏀codecov-g]][🏀codecov]
507
+
508
+ [![Coveralls Test Coverage][🏀coveralls-img]][🏀coveralls]
509
+
510
+ [![QLTY Test Coverage][🏀qlty-covi]][🏀qlty-cov]
511
+
512
+ ### 🪇 Code of Conduct
513
+
514
+ Everyone interacting with this project's codebases, issue trackers,
515
+ chat rooms and mailing lists agrees to follow the [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct].
516
+
517
+ ## 🌈 Contributors
518
+
519
+ [![Contributors][🖐contributors-img]][🖐contributors]
520
+
521
+ Made with [contributors-img][🖐contrib-rocks].
522
+
523
+ Also see GitLab Contributors: [https://gitlab.com/galtzo-floss/yaml-converter/-/graphs/main][🚎contributors-gl]
524
+
525
+ <details>
526
+ <summary>⭐️ Star History</summary>
527
+
528
+ <a href="https://star-history.com/#galtzo-floss/yaml-converter&Date">
529
+ <picture>
530
+ <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=galtzo-floss/yaml-converter&type=Date&theme=dark" />
531
+ <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=galtzo-floss/yaml-converter&type=Date" />
532
+ <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=galtzo-floss/yaml-converter&type=Date" />
533
+ </picture>
534
+ </a>
535
+
536
+ </details>
537
+
538
+ ## 📌 Versioning
539
+
540
+ This Library adheres to [![Semantic Versioning 2.0.0][📌semver-img]][📌semver].
541
+ Violations of this scheme should be reported as bugs.
542
+ Specifically, if a minor or patch version is released that breaks backward compatibility,
543
+ a new version should be immediately released that restores compatibility.
544
+ Breaking changes to the public API will only be introduced with new major versions.
545
+
546
+ > dropping support for a platform is both obviously and objectively a breaking change <br/>
547
+ >—Jordan Harband ([@ljharb](https://github.com/ljharb), maintainer of SemVer) [in SemVer issue 716][📌semver-breaking]
548
+
549
+ I understand that policy doesn't work universally ("exceptions to every rule!"),
550
+ but it is the policy here.
551
+ As such, in many cases it is good to specify a dependency on this library using
552
+ the [Pessimistic Version Constraint][📌pvc] with two digits of precision.
553
+
554
+ For example:
555
+
556
+ ```ruby
557
+ spec.add_dependency("yaml-converter", "~> 0.1")
558
+ ```
559
+
560
+ <details markdown="1">
561
+ <summary>📌 Is "Platform Support" part of the public API? More details inside.</summary>
562
+
563
+ SemVer should, IMO, but doesn't explicitly, say that dropping support for specific Platforms
564
+ is a *breaking change* to an API, and for that reason the bike shedding is endless.
565
+
566
+ To get a better understanding of how SemVer is intended to work over a project's lifetime,
567
+ read this article from the creator of SemVer:
568
+
569
+ - ["Major Version Numbers are Not Sacred"][📌major-versions-not-sacred]
570
+
571
+ </details>
572
+
573
+ See [CHANGELOG.md][📌changelog] for a list of releases.
574
+
575
+ ## 📄 License
576
+
577
+ The gem is available as open source under the terms of
578
+ the [MIT License][📄license] [![License: MIT][📄license-img]][📄license-ref].
579
+ See [LICENSE.txt][📄license] for the official [Copyright Notice][📄copyright-notice-explainer].
580
+
581
+ ### © Copyright
582
+
583
+ <ul>
584
+ <li>
585
+ Copyright (c) 2025 Peter H. Boling, of
586
+ <a href="https://discord.gg/3qme4XHNKN">
587
+ Galtzo.com
588
+ <picture>
589
+ <img src="https://logos.galtzo.com/assets/images/galtzo-floss/avatar-128px-blank.svg" alt="Galtzo.com Logo (Wordless) by Aboling0, CC BY-SA 4.0" width="24">
590
+ </picture>
591
+ </a>, and yaml-converter contributors.
592
+ </li>
593
+ </ul>
594
+
595
+ ## 🤑 A request for help
596
+
597
+ Maintainers have teeth and need to pay their dentists.
598
+ After getting laid off in an RIF in March, and encountering difficulty finding a new one,
599
+ I began spending most of my time building open source tools.
600
+ I'm hoping to be able to pay for my kids' health insurance this month,
601
+ so if you value the work I am doing, I need your support.
602
+ Please consider sponsoring me or the project.
603
+
604
+ To join the community or get help 👇️ Join the Discord.
605
+
606
+ [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite]
607
+
608
+ To say "thanks!" ☝️ Join the Discord or 👇️ send money.
609
+
610
+ [![Sponsor galtzo-floss/yaml-converter on Open Source Collective][🖇osc-all-bottom-img]][🖇osc] 💌 [![Sponsor me on GitHub Sponsors][🖇sponsor-bottom-img]][🖇sponsor] 💌 [![Sponsor me on Liberapay][⛳liberapay-bottom-img]][⛳liberapay] 💌 [![Donate on PayPal][🖇paypal-bottom-img]][🖇paypal]
611
+
612
+ ### Please give the project a star ⭐ ♥.
613
+
614
+ Thanks for RTFM. ☺️
615
+
616
+ [⛳liberapay-img]: https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay&color=a51611&style=flat
617
+ [⛳liberapay-bottom-img]: https://img.shields.io/liberapay/goal/pboling.svg?style=for-the-badge&logo=liberapay&color=a51611
618
+ [⛳liberapay]: https://liberapay.com/pboling/donate
619
+ [🖇osc-all-img]: https://img.shields.io/opencollective/all/galtzo-floss
620
+ [🖇osc-sponsors-img]: https://img.shields.io/opencollective/sponsors/galtzo-floss
621
+ [🖇osc-backers-img]: https://img.shields.io/opencollective/backers/galtzo-floss
622
+ [🖇osc-backers]: https://opencollective.com/galtzo-floss#backer
623
+ [🖇osc-backers-i]: https://opencollective.com/galtzo-floss/backers/badge.svg?style=flat
624
+ [🖇osc-sponsors]: https://opencollective.com/galtzo-floss#sponsor
625
+ [🖇osc-sponsors-i]: https://opencollective.com/galtzo-floss/sponsors/badge.svg?style=flat
626
+ [🖇osc-all-bottom-img]: https://img.shields.io/opencollective/all/galtzo-floss?style=for-the-badge
627
+ [🖇osc-sponsors-bottom-img]: https://img.shields.io/opencollective/sponsors/galtzo-floss?style=for-the-badge
628
+ [🖇osc-backers-bottom-img]: https://img.shields.io/opencollective/backers/galtzo-floss?style=for-the-badge
629
+ [🖇osc]: https://opencollective.com/galtzo-floss
630
+ [🖇sponsor-img]: https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social&logo=github
631
+ [🖇sponsor-bottom-img]: https://img.shields.io/badge/Sponsor_Me!-pboling-blue?style=for-the-badge&logo=github
632
+ [🖇sponsor]: https://github.com/sponsors/pboling
633
+ [🖇polar-img]: https://img.shields.io/badge/polar-donate-a51611.svg?style=flat
634
+ [🖇polar]: https://polar.sh/pboling
635
+ [🖇kofi-img]: https://img.shields.io/badge/ko--fi-%E2%9C%93-a51611.svg?style=flat
636
+ [🖇kofi]: https://ko-fi.com/O5O86SNP4
637
+ [🖇patreon-img]: https://img.shields.io/badge/patreon-donate-a51611.svg?style=flat
638
+ [🖇patreon]: https://patreon.com/galtzo
639
+ [🖇buyme-small-img]: https://img.shields.io/badge/buy_me_a_coffee-%E2%9C%93-a51611.svg?style=flat
640
+ [🖇buyme-img]: https://img.buymeacoffee.com/button-api/?text=Buy%20me%20a%20latte&emoji=&slug=pboling&button_colour=FFDD00&font_colour=000000&font_family=Cookie&outline_colour=000000&coffee_colour=ffffff
641
+ [🖇buyme]: https://www.buymeacoffee.com/pboling
642
+ [🖇paypal-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=flat&logo=paypal
643
+ [🖇paypal-bottom-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=for-the-badge&logo=paypal&color=0A0A0A
644
+ [🖇paypal]: https://www.paypal.com/paypalme/peterboling
645
+ [🖇floss-funding.dev]: https://floss-funding.dev
646
+ [🖇floss-funding-gem]: https://github.com/galtzo-floss/floss_funding
647
+ [✉️discord-invite]: https://discord.gg/3qme4XHNKN
648
+ [✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord
649
+ [✉️ruby-friends-img]: https://img.shields.io/badge/daily.dev-%F0%9F%92%8E_Ruby_Friends-0A0A0A?style=for-the-badge&logo=dailydotdev&logoColor=white
650
+ [✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends
651
+
652
+ [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780
653
+ [⛳️gem-namespace]: https://github.com/galtzo-floss/yaml-converter
654
+ [⛳️namespace-img]: https://img.shields.io/badge/namespace-Yaml::Converter-3C2D2D.svg?style=square&logo=ruby&logoColor=white
655
+ [⛳️gem-name]: https://bestgems.org/gems/yaml-converter
656
+ [⛳️name-img]: https://img.shields.io/badge/name-yaml--converter-3C2D2D.svg?style=square&logo=rubygems&logoColor=red
657
+ [⛳️tag-img]: https://img.shields.io/github/tag/galtzo-floss/yaml-converter.svg
658
+ [⛳️tag]: http://github.com/galtzo-floss/yaml-converter/releases
659
+ [🚂maint-blog]: http://www.railsbling.com/tags/yaml-converter
660
+ [🚂maint-blog-img]: https://img.shields.io/badge/blog-railsbling-0093D0.svg?style=for-the-badge&logo=rubyonrails&logoColor=orange
661
+ [🚂maint-contact]: http://www.railsbling.com/contact
662
+ [🚂maint-contact-img]: https://img.shields.io/badge/Contact-Maintainer-0093D0.svg?style=flat&logo=rubyonrails&logoColor=red
663
+ [💖🖇linkedin]: http://www.linkedin.com/in/peterboling
664
+ [💖🖇linkedin-img]: https://img.shields.io/badge/PeterBoling-LinkedIn-0B66C2?style=flat&logo=newjapanprowrestling
665
+ [💖✌️wellfound]: https://wellfound.com/u/peter-boling
666
+ [💖✌️wellfound-img]: https://img.shields.io/badge/peter--boling-orange?style=flat&logo=wellfound
667
+ [💖💲crunchbase]: https://www.crunchbase.com/person/peter-boling
668
+ [💖💲crunchbase-img]: https://img.shields.io/badge/peter--boling-purple?style=flat&logo=crunchbase
669
+ [💖🐘ruby-mast]: https://ruby.social/@galtzo
670
+ [💖🐘ruby-mast-img]: https://img.shields.io/mastodon/follow/109447111526622197?domain=https://ruby.social&style=flat&logo=mastodon&label=Ruby%20@galtzo
671
+ [💖🦋bluesky]: https://bsky.app/profile/galtzo.com
672
+ [💖🦋bluesky-img]: https://img.shields.io/badge/@galtzo.com-0285FF?style=flat&logo=bluesky&logoColor=white
673
+ [💖🌳linktree]: https://linktr.ee/galtzo
674
+ [💖🌳linktree-img]: https://img.shields.io/badge/galtzo-purple?style=flat&logo=linktree
675
+ [💖💁🏼‍♂️devto]: https://dev.to/galtzo
676
+ [💖💁🏼‍♂️devto-img]: https://img.shields.io/badge/dev.to-0A0A0A?style=flat&logo=devdotto&logoColor=white
677
+ [💖💁🏼‍♂️aboutme]: https://about.me/peter.boling
678
+ [💖💁🏼‍♂️aboutme-img]: https://img.shields.io/badge/about.me-0A0A0A?style=flat&logo=aboutme&logoColor=white
679
+ [💖🧊berg]: https://codeberg.org/pboling
680
+ [💖🐙hub]: https://github.org/pboling
681
+ [💖🛖hut]: https://sr.ht/~galtzo/
682
+ [💖🧪lab]: https://gitlab.com/pboling
683
+ [👨🏼‍🏫expsup-upwork]: https://www.upwork.com/freelancers/~014942e9b056abdf86?mp_source=share
684
+ [👨🏼‍🏫expsup-upwork-img]: https://img.shields.io/badge/UpWork-13544E?style=for-the-badge&logo=Upwork&logoColor=white
685
+ [👨🏼‍🏫expsup-codementor]: https://www.codementor.io/peterboling?utm_source=github&utm_medium=button&utm_term=peterboling&utm_campaign=github
686
+ [👨🏼‍🏫expsup-codementor-img]: https://img.shields.io/badge/CodeMentor-Get_Help-1abc9c?style=for-the-badge&logo=CodeMentor&logoColor=white
687
+ [🏙️entsup-tidelift]: https://tidelift.com/subscription/pkg/rubygems-yaml-converter?utm_source=rubygems-yaml-converter&utm_medium=referral&utm_campaign=readme
688
+ [🏙️entsup-tidelift-img]: https://img.shields.io/badge/Tidelift_and_Sonar-Enterprise_Support-FD3456?style=for-the-badge&logo=sonar&logoColor=white
689
+ [🏙️entsup-tidelift-sonar]: https://blog.tidelift.com/tidelift-joins-sonar
690
+ [💁🏼‍♂️peterboling]: http://www.peterboling.com
691
+ [🚂railsbling]: http://www.railsbling.com
692
+ [📜src-gl-img]: https://img.shields.io/badge/GitLab-FBA326?style=for-the-badge&logo=Gitlab&logoColor=orange
693
+ [📜src-gl]: https://gitlab.com/galtzo-floss/yaml-converter/
694
+ [📜src-cb-img]: https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge&logo=CodeBerg&logoColor=blue
695
+ [📜src-cb]: https://codeberg.org/galtzo-floss/yaml-converter
696
+ [📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=Github&logoColor=green
697
+ [📜src-gh]: https://github.com/galtzo-floss/yaml-converter
698
+ [📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
699
+ [📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
700
+ [📜gl-wiki]: https://gitlab.com/galtzo-floss/yaml-converter/-/wikis/home
701
+ [📜gh-wiki]: https://github.com/galtzo-floss/yaml-converter/wiki
702
+ [📜gl-wiki-img]: https://img.shields.io/badge/wiki-examples-943CD2.svg?style=for-the-badge&logo=gitlab&logoColor=white
703
+ [📜gh-wiki-img]: https://img.shields.io/badge/wiki-examples-943CD2.svg?style=for-the-badge&logo=github&logoColor=white
704
+ [👽dl-rank]: https://bestgems.org/gems/yaml-converter
705
+ [👽dl-ranki]: https://img.shields.io/gem/rd/yaml-converter.svg
706
+ [👽oss-help]: https://www.codetriage.com/galtzo-floss/yaml-converter
707
+ [👽oss-helpi]: https://www.codetriage.com/galtzo-floss/yaml-converter/badges/users.svg
708
+ [👽version]: https://bestgems.org/gems/yaml-converter
709
+ [👽versioni]: https://img.shields.io/gem/v/yaml-converter.svg
710
+ [🏀qlty-mnt]: https://qlty.sh/gh/galtzo-floss/projects/yaml-converter
711
+ [🏀qlty-mnti]: https://qlty.sh/gh/galtzo-floss/projects/yaml-converter/maintainability.svg
712
+ [🏀qlty-cov]: https://qlty.sh/gh/galtzo-floss/projects/yaml-converter/metrics/code?sort=coverageRating
713
+ [🏀qlty-covi]: https://qlty.sh/gh/galtzo-floss/projects/yaml-converter/coverage.svg
714
+ [🏀codecov]: https://codecov.io/gh/galtzo-floss/yaml-converter
715
+ [🏀codecovi]: https://codecov.io/gh/galtzo-floss/yaml-converter/graph/badge.svg
716
+ [🏀coveralls]: https://coveralls.io/github/galtzo-floss/yaml-converter?branch=main
717
+ [🏀coveralls-img]: https://coveralls.io/repos/github/galtzo-floss/yaml-converter/badge.svg?branch=main
718
+ [🖐codeQL]: https://github.com/galtzo-floss/yaml-converter/security/code-scanning
719
+ [🖐codeQL-img]: https://github.com/galtzo-floss/yaml-converter/actions/workflows/codeql-analysis.yml/badge.svg
720
+ [🚎1-an-wf]: https://github.com/galtzo-floss/yaml-converter/actions/workflows/ancient.yml
721
+ [🚎1-an-wfi]: https://github.com/galtzo-floss/yaml-converter/actions/workflows/ancient.yml/badge.svg
722
+ [🚎2-cov-wf]: https://github.com/galtzo-floss/yaml-converter/actions/workflows/coverage.yml
723
+ [🚎2-cov-wfi]: https://github.com/galtzo-floss/yaml-converter/actions/workflows/coverage.yml/badge.svg
724
+ [🚎3-hd-wf]: https://github.com/galtzo-floss/yaml-converter/actions/workflows/heads.yml
725
+ [🚎3-hd-wfi]: https://github.com/galtzo-floss/yaml-converter/actions/workflows/heads.yml/badge.svg
726
+ [🚎4-lg-wf]: https://github.com/galtzo-floss/yaml-converter/actions/workflows/legacy.yml
727
+ [🚎4-lg-wfi]: https://github.com/galtzo-floss/yaml-converter/actions/workflows/legacy.yml/badge.svg
728
+ [🚎5-st-wf]: https://github.com/galtzo-floss/yaml-converter/actions/workflows/style.yml
729
+ [🚎5-st-wfi]: https://github.com/galtzo-floss/yaml-converter/actions/workflows/style.yml/badge.svg
730
+ [🚎6-s-wf]: https://github.com/galtzo-floss/yaml-converter/actions/workflows/supported.yml
731
+ [🚎6-s-wfi]: https://github.com/galtzo-floss/yaml-converter/actions/workflows/supported.yml/badge.svg
732
+ [🚎7-us-wf]: https://github.com/galtzo-floss/yaml-converter/actions/workflows/unsupported.yml
733
+ [🚎7-us-wfi]: https://github.com/galtzo-floss/yaml-converter/actions/workflows/unsupported.yml/badge.svg
734
+ [🚎8-ho-wf]: https://github.com/galtzo-floss/yaml-converter/actions/workflows/hoary.yml
735
+ [🚎8-ho-wfi]: https://github.com/galtzo-floss/yaml-converter/actions/workflows/hoary.yml/badge.svg
736
+ [🚎9-t-wf]: https://github.com/galtzo-floss/yaml-converter/actions/workflows/truffle.yml
737
+ [🚎9-t-wfi]: https://github.com/galtzo-floss/yaml-converter/actions/workflows/truffle.yml/badge.svg
738
+ [🚎10-j-wf]: https://github.com/galtzo-floss/yaml-converter/actions/workflows/jruby.yml
739
+ [🚎10-j-wfi]: https://github.com/galtzo-floss/yaml-converter/actions/workflows/jruby.yml/badge.svg
740
+ [🚎11-c-wf]: https://github.com/galtzo-floss/yaml-converter/actions/workflows/current.yml
741
+ [🚎11-c-wfi]: https://github.com/galtzo-floss/yaml-converter/actions/workflows/current.yml/badge.svg
742
+ [🚎12-crh-wf]: https://github.com/galtzo-floss/yaml-converter/actions/workflows/dep-heads.yml
743
+ [🚎12-crh-wfi]: https://github.com/galtzo-floss/yaml-converter/actions/workflows/dep-heads.yml/badge.svg
744
+ [🚎13-🔒️-wf]: https://github.com/galtzo-floss/yaml-converter/actions/workflows/locked_deps.yml
745
+ [🚎13-🔒️-wfi]: https://github.com/galtzo-floss/yaml-converter/actions/workflows/locked_deps.yml/badge.svg
746
+ [🚎14-🔓️-wf]: https://github.com/galtzo-floss/yaml-converter/actions/workflows/unlocked_deps.yml
747
+ [🚎14-🔓️-wfi]: https://github.com/galtzo-floss/yaml-converter/actions/workflows/unlocked_deps.yml/badge.svg
748
+ [🚎15-🪪-wf]: https://github.com/galtzo-floss/yaml-converter/actions/workflows/license-eye.yml
749
+ [🚎15-🪪-wfi]: https://github.com/galtzo-floss/yaml-converter/actions/workflows/license-eye.yml/badge.svg
750
+ [💎ruby-3.2i]: https://img.shields.io/badge/Ruby-3.2-CC342D?style=for-the-badge&logo=ruby&logoColor=white
751
+ [💎ruby-3.3i]: https://img.shields.io/badge/Ruby-3.3-CC342D?style=for-the-badge&logo=ruby&logoColor=white
752
+ [💎ruby-c-i]: https://img.shields.io/badge/Ruby-current-CC342D?style=for-the-badge&logo=ruby&logoColor=green
753
+ [💎ruby-headi]: https://img.shields.io/badge/Ruby-HEAD-CC342D?style=for-the-badge&logo=ruby&logoColor=blue
754
+ [💎truby-22.3i]: https://img.shields.io/badge/Truffle_Ruby-22.3_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=pink
755
+ [💎truby-23.0i]: https://img.shields.io/badge/Truffle_Ruby-23.0_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=pink
756
+ [💎truby-23.1i]: https://img.shields.io/badge/Truffle_Ruby-23.1-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
757
+ [💎truby-c-i]: https://img.shields.io/badge/Truffle_Ruby-current-34BCB1?style=for-the-badge&logo=ruby&logoColor=green
758
+ [💎truby-headi]: https://img.shields.io/badge/Truffle_Ruby-HEAD-34BCB1?style=for-the-badge&logo=ruby&logoColor=blue
759
+ [💎jruby-9.1i]: https://img.shields.io/badge/JRuby-9.1_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=red
760
+ [💎jruby-9.2i]: https://img.shields.io/badge/JRuby-9.2_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=red
761
+ [💎jruby-9.3i]: https://img.shields.io/badge/JRuby-9.3_(%F0%9F%9A%ABCI)-AABBCC?style=for-the-badge&logo=ruby&logoColor=red
762
+ [💎jruby-9.4i]: https://img.shields.io/badge/JRuby-9.4-FBE742?style=for-the-badge&logo=ruby&logoColor=red
763
+ [💎jruby-c-i]: https://img.shields.io/badge/JRuby-current-FBE742?style=for-the-badge&logo=ruby&logoColor=green
764
+ [💎jruby-headi]: https://img.shields.io/badge/JRuby-HEAD-FBE742?style=for-the-badge&logo=ruby&logoColor=blue
765
+ [🤝gh-issues]: https://github.com/galtzo-floss/yaml-converter/issues
766
+ [🤝gh-pulls]: https://github.com/galtzo-floss/yaml-converter/pulls
767
+ [🤝gl-issues]: https://gitlab.com/galtzo-floss/yaml-converter/-/issues
768
+ [🤝gl-pulls]: https://gitlab.com/galtzo-floss/yaml-converter/-/merge_requests
769
+ [🤝cb-issues]: https://codeberg.org/galtzo-floss/yaml-converter/issues
770
+ [🤝cb-pulls]: https://codeberg.org/galtzo-floss/yaml-converter/pulls
771
+ [🤝cb-donate]: https://donate.codeberg.org/
772
+ [🤝contributing]: CONTRIBUTING.md
773
+ [🏀codecov-g]: https://codecov.io/gh/galtzo-floss/yaml-converter/graphs/tree.svg
774
+ [🖐contrib-rocks]: https://contrib.rocks
775
+ [🖐contributors]: https://github.com/galtzo-floss/yaml-converter/graphs/contributors
776
+ [🖐contributors-img]: https://contrib.rocks/image?repo=galtzo-floss/yaml-converter
777
+ [🚎contributors-gl]: https://gitlab.com/galtzo-floss/yaml-converter/-/graphs/main
778
+ [🪇conduct]: CODE_OF_CONDUCT.md
779
+ [🪇conduct-img]: https://img.shields.io/badge/Contributor_Covenant-2.1-259D6C.svg
780
+ [📌pvc]: http://guides.rubygems.org/patterns/#pessimistic-version-constraint
781
+ [📌semver]: https://semver.org/spec/v2.0.0.html
782
+ [📌semver-img]: https://img.shields.io/badge/semver-2.0.0-259D6C.svg?style=flat
783
+ [📌semver-breaking]: https://github.com/semver/semver/issues/716#issuecomment-869336139
784
+ [📌major-versions-not-sacred]: https://tom.preston-werner.com/2022/05/23/major-version-numbers-are-not-sacred.html
785
+ [📌changelog]: CHANGELOG.md
786
+ [📗keep-changelog]: https://keepachangelog.com/en/1.0.0/
787
+ [📗keep-changelog-img]: https://img.shields.io/badge/keep--a--changelog-1.0.0-34495e.svg?style=flat
788
+ [📌gitmoji]: https://gitmoji.dev
789
+ [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
790
+ [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
791
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-0.423-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
792
+ [🔐security]: SECURITY.md
793
+ [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
794
+ [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
795
+ [📄license]: LICENSE.txt
796
+ [📄license-ref]: https://opensource.org/licenses/MIT
797
+ [📄license-img]: https://img.shields.io/badge/License-MIT-259D6C.svg
798
+ [📄license-compat]: https://dev.to/galtzo/how-to-check-license-compatibility-41h0
799
+ [📄license-compat-img]: https://img.shields.io/badge/Apache_Compatible:_Category_A-%E2%9C%93-259D6C.svg?style=flat&logo=Apache
800
+ [📄ilo-declaration]: https://www.ilo.org/declaration/lang--en/index.htm
801
+ [📄ilo-declaration-img]: https://img.shields.io/badge/ILO_Fundamental_Principles-✓-259D6C.svg?style=flat
802
+ [🚎yard-current]: http://rubydoc.info/gems/yaml-converter
803
+ [🚎yard-head]: https://yaml-converter.galtzo.com
804
+ [💎stone_checksums]: https://github.com/galtzo-floss/stone_checksums
805
+ [💎SHA_checksums]: https://gitlab.com/galtzo-floss/yaml-converter/-/tree/main/checksums
806
+ [💎rlts]: https://github.com/rubocop-lts/rubocop-lts
807
+ [💎rlts-img]: https://img.shields.io/badge/code_style_&_linting-rubocop--lts-34495e.svg?plastic&logo=ruby&logoColor=white
808
+ [💎appraisal2]: https://github.com/appraisal-rb/appraisal2
809
+ [💎appraisal2-img]: https://img.shields.io/badge/appraised_by-appraisal2-34495e.svg?plastic&logo=ruby&logoColor=white
810
+ [💎d-in-dvcs]: https://railsbling.com/posts/dvcs/put_the_d_in_dvcs/