ast-crispr-toml 7.1.12

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 6385250ea313d6489e00541d95727884d6eea34ed1810fb7c02f0466be01916c
4
+ data.tar.gz: 0d461236f604c5d18fa80a99cf4b8e6506ac0e037eb3119ed1f2a922a9cfaa00
5
+ SHA512:
6
+ metadata.gz: 3851f2e9c742409899dec6e06f3a0e4e325095acea726b592d4895af9f3b3e70d16ae95b6494e4ba0e3646487c2a1954cb94cba8f0792051c89571de24df82c1
7
+ data.tar.gz: c66338e346dcd4e8edd558a033aed5c33ccff4a9477e39e910cfd2be6c8d39a7ad017750ad85e165ca94cb964cc74f258d2c5ca99588a79074b92991ac330859
checksums.yaml.gz.sig ADDED
@@ -0,0 +1 @@
1
+ ������̻@� ��ؔa��o"NU�O_����[�̓|���>��z(�H��ب<c�+-)̣E�� ?JX���*U'�ǧ�����%�lT���v=�Dl85!�߱�ѵ��Uঠ$�����i� ��~���ޖ�gN�:����}3� ��+�V5 ���Q�E���R�R��o�K6���:�Y��m��c�=]/�|���ݸ���q>bs�X�W�xCm�
data/CHANGELOG.md ADDED
@@ -0,0 +1,104 @@
1
+ # Changelog
2
+
3
+ [![SemVer 2.0.0][📌semver-img]][📌semver] [![Keep-A-Changelog 1.0.0][📗keep-changelog-img]][📗keep-changelog]
4
+
5
+ All notable changes to this project will be documented in this file.
6
+
7
+ The format is based on [Keep a Changelog][📗keep-changelog],
8
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html),
9
+ and [yes][📌major-versions-not-sacred], platform and engine support are part of the [public API][📌semver-breaking].
10
+ Please file a bug if you notice a violation of semantic versioning.
11
+
12
+ [📌semver]: https://semver.org/spec/v2.0.0.html
13
+ [📌semver-img]: https://img.shields.io/badge/semver-2.0.0-FFDD67.svg?style=flat
14
+ [📌semver-breaking]: https://github.com/semver/semver/issues/716#issuecomment-869336139
15
+ [📌major-versions-not-sacred]: https://tom.preston-werner.com/2022/05/23/major-version-numbers-are-not-sacred.html
16
+ [📗keep-changelog]: https://keepachangelog.com/en/1.0.0/
17
+ [📗keep-changelog-img]: https://img.shields.io/badge/keep--a--changelog-1.0.0-FFDD67.svg?style=flat
18
+
19
+ ## [Unreleased]
20
+
21
+ ### Added
22
+
23
+ - kettle-jem-template-20260720-005 - README Support & Community links now
24
+ include RubyForum.
25
+ - kettle-jem-template-20260726-001 - Projects now include YARD lint
26
+ configuration and documentation dependencies so documentation issues fail
27
+ before generated docs are refreshed.
28
+ - kettle-jem-template-20260727-001 - Spec harness documentation now lists the
29
+ RSpec helpers provided by `kettle-test`.
30
+ - kettle-jem-template-20260913-001 - Templating now also surfaces a review
31
+ entry in `dependency_conflicts.resolve` when a direct development
32
+ dependency doesn't support one or more of this project's declared
33
+ `engines:` and has no template-managed modular home (e.g. `sqlite3` on
34
+ `jruby`). Review each entry and pick a resolution per the project's own
35
+ engine support needs.
36
+
37
+ ### Changed
38
+
39
+ - kettle-jem-template-20260716-002 - Gemspecs now ship fewer repository-only
40
+ files, reducing package noise for downstream packagers.
41
+ - kettle-jem-template-20260720-002 - Development Gemfiles now use the released
42
+ `tree_sitter_language_pack` gem 1.13.3 or newer by default.
43
+ - kettle-jem-template-20260725-002 - Version specs now use `anonymous_loader` to
44
+ cover `version.rb` without redefining constants, or are removed when version
45
+ specs are not managed for the project.
46
+ - kettle-jem-template-20260801-001 - Generated README gem dashboard links now
47
+ use ClickGems instead of BestGems.
48
+
49
+ - kettle-jem-template-20260728-001 - Generated Ruby workflows now use clearer
50
+ setup-ruby-flash planning and can prepare appraisal-only jobs without
51
+ installing the main Gemfile bundle.
52
+
53
+ - [kc] kettle-jem/template: updated 110 project files:
54
+ - code and tests (8)
55
+ - configuration (4)
56
+ - dependencies (45)
57
+ - documentation (3)
58
+ - other (37)
59
+ - workflows (13)
60
+
61
+ ### Deprecated
62
+
63
+ ### Removed
64
+
65
+ ### Fixed
66
+
67
+ - kettle-jem-template-20260720-003 - StructuredMerge Git diff driver config now
68
+ uses the installed `smorg-rb` driver command.
69
+ - kettle-jem-template-20260725-001 - Release pull request branches beginning
70
+ with `feature/release` now run JRuby and TruffleRuby workflows.
71
+ - kettle-jem-template-20260726-002 - Generated version files now document their
72
+ version namespace and constants, reducing warning-only YARD lint output.
73
+ - kettle-jem-template-20260726-003 - Coverage upload steps now treat Coveralls,
74
+ QLTY, and Codecov as optional, so provider outages do not fail CI when local
75
+ coverage thresholds still pass.
76
+ - kettle-jem-template-20260728-002 - Generated RuboCop configs now ignore the
77
+ same `gemfiles/vendor/bundle` tree as `.gitignore`, so vendored dependency
78
+ installs are not reported as project lint debt.
79
+ - kettle-jem-template-20260728-005 - VersionGem bootstrap now creates the
80
+ missing canonical version spec when a project only has shim namespace version
81
+ specs.
82
+ - kettle-jem-template-20260730-001 - Gemspec package file enumeration now runs
83
+ relative to the gemspec directory, so release package contents stay correct
84
+ even when the gemspec is loaded from another working directory.
85
+ - kettle-jem-template-20260801-002 - Generated RSpec helpers now normalize
86
+ managed configuration block bindings structurally, preventing mixed block
87
+ parameter names from producing invalid configuration after a merge.
88
+ - kettle-jem-template-20260801-003 - Generated project metadata and
89
+ documentation now normalize configured underscore hostnames to valid
90
+ hyphenated hostnames.
91
+ - kettle-jem-template-20260801-004 - Generated organization README logos now
92
+ use GitHub's stable organization avatar endpoint instead of assuming a
93
+ matching Galtzo-hosted asset exists.
94
+ - kettle-jem-template-20260802-001 - Devcontainer JSON files now merge as JSONC,
95
+ preserving comments and trailing commas during template updates.
96
+
97
+ - kettle-jem-template-20260728-003 - Generated dep-heads workflows now run
98
+ TruffleRuby jobs with current RubyGems and Bundler, avoiding setup failures
99
+ before the test suite starts.
100
+ - kettle-jem-template-20260728-004 - Generated dep-heads workflows now use the
101
+ setup-ruby Bundler install path for direct appraisal Gemfiles, avoiding rv
102
+ lockfile parser failures on Git and path dependencies.
103
+
104
+ ### Security
data/LICENSE.md ADDED
@@ -0,0 +1,13 @@
1
+ # License
2
+
3
+ This project is made available under the following licenses.
4
+ Choose the option that best fits your use case:
5
+
6
+ - [AGPL-3.0-only](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/AGPL-3.0-only.md)
7
+ - [PolyForm-Small-Business-1.0.0](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/PolyForm-Small-Business-1.0.0.md)
8
+
9
+ If none of the above licenses fit your use case, please [contact us](mailto:floss@galtzo.com) to discuss a custom commercial license.
10
+
11
+ ## Copyright Notice
12
+
13
+ - Required Notice: Copyright (c) 2026 Peter H. Boling
data/README.md ADDED
@@ -0,0 +1,447 @@
1
+ <a href="https://github.com/structuredmerge"><img alt="structuredmerge Logo by GitHub" src="https://github.com/structuredmerge.png?size=192" width="14%" align="right"/></a>
2
+
3
+ # 🧬 Ast::Crispr::Toml
4
+
5
+ [![Version][👽versioni]][👽version] [![Ruby Users Forum][✉️ruby-forum-top-img]][✉️ruby-forum] [![GitHub tag (latest SemVer)][⛳️tag-img]][⛳️tag] [![License: AGPL-3.0-only OR PolyForm-Small-Business-1.0.0][📄license-img]][📄license] [![Total downloads][👽dl-ranki]][👽dl-rank] [![CI Current][🚎11-c-wfi]][🚎11-c-wf]
6
+
7
+ `if ci_badges.map(&:color).detect { it != "green"}` ☝️ [let me know on Discord][✉️discord-invite] or [RubyForum][✉️ruby-forum], as I may have missed the notification.
8
+
9
+ ---
10
+
11
+ `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.
12
+
13
+ [![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 at ko-fi.com][🖇kofi-img]][🖇kofi]
14
+
15
+ <details markdown="1">
16
+ <summary>👣 How will this project approach the September 2025 hostile takeover of RubyGems? 🚑️</summary>
17
+
18
+ I've summarized my thoughts in [this blog post](https://dev.to/galtzo/hostile-takeover-of-rubygems-my-thoughts-5hlo).
19
+
20
+ </details>
21
+
22
+ ## 🌻 Synopsis <a href="https://discord.gg/3qme4XHNKN"><img alt="Galtzo FLOSS Logo by Aboling0, CC BY-SA 4.0" src="https://logos.galtzo.com/assets/images/galtzo-floss/avatar-128px.svg" width="8%" align="right"/></a> <a href="https://ruby-toolbox.com"><img alt="ruby-lang Logo, Yukihiro Matsumoto, Ruby Visual Identity Team, CC BY-SA 2.5" src="https://logos.galtzo.com/assets/images/ruby-lang/avatar-128px.svg" width="8%" align="right"/></a>
23
+
24
+ `ast-crispr-toml` is the TOML adapter for `ast-crispr`. It exposes TOML tables (including dotted sub-tables and array tables) and key/value pairs addressed by dotted key paths as structural owners, so configuration files like `mise.toml` can be edited through ast-crispr Actors without line-oriented string surgery.
25
+
26
+ ### Key Features
27
+
28
+ - toml-merge-backed TOML document contexts (parser-agnostic over TreeHaver, Citrus, and Parslet backends).
29
+ - Table selectors with ranges that include leading comments and clamp to the table's body end.
30
+ - Dotted-key-path pair selectors (`tasks.family-lint.run`).
31
+ - Leading/trailing comment regions for table owners.
32
+ - Edits through the shared ast-crispr Actors (`Insert`, `Replace`, `Delete`, `DeleteBatch`).
33
+
34
+ ## 💡 Info you can shake a stick at
35
+
36
+ | Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] |
37
+ |-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
38
+ | Works with MRI Ruby 4 | [![Ruby current Compat][💎ruby-c-i]][🚎11-c-wf]|
39
+ | Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Get help from RubyForum][✉️ruby-forum-img]][✉️ruby-forum] [![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] |
40
+ | 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] |
41
+ | 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] |
42
+ | Compliance | [![License: AGPL-3.0-only OR PolyForm-Small-Business-1.0.0][📄license-img]][📄license] [![Apache license compatibility: Category X][📄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] |
43
+ | 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] |
44
+ | 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] |
45
+ | `...` 💖 | [![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] |
46
+
47
+ ### Compatibility
48
+
49
+ Compatible with MRI Ruby 4.0.0+, JRuby, and TruffleRuby.
50
+ CI workflows and Appraisals are generated for MRI Ruby 4.0.0+.
51
+ This test floor is configured by `ruby.test_minimum` in `.kettle-jem.yml` and
52
+ may be higher than the gem's runtime compatibility floor when legacy Rubies are
53
+ not practical for the current toolchain.
54
+
55
+ <a href="https://github.com/kettle-dev"><img alt="kettle-dev Logo by Aboling0, CC BY-SA 4.0" src="https://logos.galtzo.com/assets/images/kettle-dev/avatar-128px.svg" width="14%" align="right"/></a>
56
+
57
+ The _amazing_ test matrix is powered by the kettle-dev stack.
58
+
59
+ <details markdown="1">
60
+ <summary>How kettle-dev manages complexity in tests</summary>
61
+
62
+ | Gem | Source | Role | Total downloads |
63
+ |-----|--------|------|---------------------|
64
+ | [appraisal2](https://clickgems.clickhouse.com/dashboard/appraisal2) | [GitHub](https://github.com/appraisal-rb/appraisal2) | multi-dependency Appraisal matrix generation | [![Total downloads for appraisal2](https://img.shields.io/gem/dt/appraisal2.svg?style=flat-square)](https://clickgems.clickhouse.com/dashboard/appraisal2) |
65
+ | [appraisal2-rubocop](https://clickgems.clickhouse.com/dashboard/appraisal2-rubocop) | [GitHub](https://github.com/appraisal-rb/appraisal2-rubocop) | RuboCop Appraisal generator integration | [![Total downloads for appraisal2-rubocop](https://img.shields.io/gem/dt/appraisal2-rubocop.svg?style=flat-square)](https://clickgems.clickhouse.com/dashboard/appraisal2-rubocop) |
66
+ | [kettle-dev](https://clickgems.clickhouse.com/dashboard/kettle-dev) | [GitHub](https://github.com/kettle-dev/kettle-dev) | development, release, and CI workflow tooling | [![Total downloads for kettle-dev](https://img.shields.io/gem/dt/kettle-dev.svg?style=flat-square)](https://clickgems.clickhouse.com/dashboard/kettle-dev) |
67
+ | [kettle-jem](https://clickgems.clickhouse.com/dashboard/kettle-jem) | [GitHub](https://github.com/kettle-dev/kettle-jem) | Appraisals & CI workflow templates | [![Total downloads for kettle-jem](https://img.shields.io/gem/dt/kettle-jem.svg?style=flat-square)](https://clickgems.clickhouse.com/dashboard/kettle-jem) |
68
+ | [kettle-soup-cover](https://clickgems.clickhouse.com/dashboard/kettle-soup-cover) | [GitHub](https://github.com/kettle-dev/kettle-soup-cover) | SimpleCov coverage policy and reporting | [![Total downloads for kettle-soup-cover](https://img.shields.io/gem/dt/kettle-soup-cover.svg?style=flat-square)](https://clickgems.clickhouse.com/dashboard/kettle-soup-cover) |
69
+ | [kettle-test](https://clickgems.clickhouse.com/dashboard/kettle-test) | [GitHub](https://github.com/kettle-dev/kettle-test) | standard test runner and coverage harness | [![Total downloads for kettle-test](https://img.shields.io/gem/dt/kettle-test.svg?style=flat-square)](https://clickgems.clickhouse.com/dashboard/kettle-test) |
70
+ | [rubocop-lts](https://clickgems.clickhouse.com/dashboard/rubocop-lts) | [GitHub](https://github.com/rubocop-lts/rubocop-lts) | Ruby-version-aware linting | [![Total downloads for rubocop-lts](https://img.shields.io/gem/dt/rubocop-lts.svg?style=flat-square)](https://clickgems.clickhouse.com/dashboard/rubocop-lts) |
71
+ | [turbo_tests2](https://clickgems.clickhouse.com/dashboard/turbo_tests2) | [GitHub](https://github.com/galtzo-floss/turbo_tests2) | parallel test execution | [![Total downloads for turbo_tests2](https://img.shields.io/gem/dt/turbo_tests2.svg?style=flat-square)](https://clickgems.clickhouse.com/dashboard/turbo_tests2) |
72
+
73
+ </details>
74
+
75
+ ### Runtime and Platform Support
76
+
77
+ Support tiers describe what this project's CI actually exercises, not what may
78
+ work in an untested environment:
79
+
80
+ - **Parallel support**: CI runs the test suite with multiple workers available.
81
+ - **Unsupported**: the engine/platform combination is not covered by CI and is
82
+ not a project compatibility claim.
83
+
84
+ | Ruby engine/version | Linux | macOS | Windows | Notes |
85
+ |---------------------|-------|-------|---------|-------|
86
+ | MRI 4.0-4.0 | Parallel support | Unsupported | Unsupported | Versioned Ruby workflows run on Linux. |
87
+ | MRI current | Parallel support | Parallel support | Unsupported | Current Ruby workflow covers the declared OS platforms. |
88
+ | MRI head | Parallel support | Unsupported | Unsupported | CI is allowed to fail while Ruby is in development. |
89
+ | JRuby (all CI lanes) | Parallel support | Unsupported | Unsupported | Engine workflows run on Linux; macOS and Windows are not exercised by CI. |
90
+ | TruffleRuby (all CI lanes) | Parallel support | Unsupported | Unsupported | Never shipped a Windows build (zero Windows assets across 66 releases scanned 2026-10-10); setup-ruby hard-fails ([source](https://github.com/ruby/setup-ruby/blob/master/README.md)) |
91
+
92
+ ### Federated DVCS
93
+
94
+ <details markdown="1">
95
+ <summary>Find this repo on federated forges (Coming soon!)</summary>
96
+
97
+ | Federated [DVCS][💎d-in-dvcs] Repository | Status | Issues | PRs | Wiki | CI |
98
+ |-------------------------------------------------|-------------------------------------------|-------------------|------------------|-----------------|----------------|
99
+ | 🧪 [structuredmerge/structuredmerge-ruby on GitLab][📜src-gl] | The Truth | [💚][🤝gl-issues] | [💚][🤝gl-pulls] | [💚][📜gl-wiki] | 🐭 Tiny Matrix |
100
+ | 🧊 [structuredmerge/structuredmerge-ruby on CodeBerg][📜src-cb] | An Ethical Mirror ([Donate][🤝cb-donate]) | [💚][🤝cb-issues] | [💚][🤝cb-pulls] | ➖ | ⭕️ No Matrix |
101
+ | 🐙 [structuredmerge/structuredmerge-ruby on GitHub][📜src-gh] | Another Mirror | [💚][🤝gh-issues] | [💚][🤝gh-pulls] | [💚][📜gh-wiki] | 💯 Full Matrix |
102
+
103
+ </details>
104
+
105
+ ### Enterprise Support
106
+
107
+ [![Tidelift](https://tidelift.com/badges/package/rubygems/ast-crispr-toml)](https://tidelift.com/subscription/pkg/rubygems-ast-crispr-toml?utm_source=rubygems-ast-crispr-toml&utm_medium=referral&utm_campaign=readme)
108
+
109
+ Available as part of the Tidelift Subscription.
110
+
111
+ <details markdown="1">
112
+ <summary>Need enterprise-level guarantees?</summary>
113
+
114
+ 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.
115
+
116
+ [![Get help from me on Tidelift][🏙️entsup-tidelift-img]][🏙️entsup-tidelift]
117
+
118
+ - 💡Subscribe for support guarantees covering _all_ your FLOSS dependencies
119
+ - 💡Tidelift is part of [Sonar][🏙️entsup-tidelift-sonar]
120
+ - 💡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
121
+
122
+ Alternatively:
123
+
124
+ - [![Ruby Users Forum][✉️ruby-forum-img]][✉️ruby-forum]
125
+ - [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite]
126
+ - [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork]
127
+ - [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor]
128
+
129
+ </details>
130
+
131
+ ## ✨ Installation
132
+
133
+ Install the gem and add to the application's Gemfile by executing:
134
+
135
+ ```console
136
+ bundle add ast-crispr-toml
137
+ ```
138
+
139
+ If bundler is not being used to manage dependencies, install the gem by executing:
140
+
141
+ ```console
142
+ gem install ast-crispr-toml
143
+ ```
144
+
145
+ ## ⚙️ Configuration
146
+
147
+ Nothing to configure. The adapter is passed to `ast-crispr` when building a document context:
148
+
149
+ ```ruby
150
+ require 'ast/crispr/toml'
151
+
152
+ context = Ast::Crispr::Toml.document_context(content: toml_source, source_label: 'mise.toml')
153
+ ```
154
+
155
+ ## 🔧 Basic Usage
156
+
157
+ ### Structural owners
158
+
159
+ ```ruby
160
+ owners = context.structural_owners(owner_scope: :tables)
161
+ # => [#<Ast::Crispr::Toml::TableOwner name="tasks" ...>, #<... name="tasks.family-lint">]
162
+
163
+ pairs = context.structural_owners(owner_scope: :pairs)
164
+ # => [#<Ast::Crispr::Toml::PairOwner full_path="min_version">, #<... full_path="tasks.family-lint.run">]
165
+ ```
166
+
167
+ Table owner ranges include the block's leading comment lines and end at the
168
+ table's clamped body end (never spilling into the next table's header).
169
+
170
+ ### Selectors
171
+
172
+ ```ruby
173
+ selector = Ast::Crispr::Toml::Selectors.table(path: 'tasks.family-lint')
174
+ matches = selector.locate_matches(context)
175
+ matches.first.line_range # => 7..9 (leading comment through body)
176
+
177
+ pair_selector = Ast::Crispr::Toml::Selectors.pair(path: 'tasks.family-lint.run')
178
+ ```
179
+
180
+ ### Edits through the core Actors
181
+
182
+ ```ruby
183
+ result = Ast::Crispr::Delete.result(
184
+ content: toml_source,
185
+ target: Ast::Crispr::Toml::Selectors.table(path: 'tasks.family-lint'),
186
+ source_label: 'mise.toml'
187
+ )
188
+ result.success? # => true
189
+ result.updated_content # => TOML with the table (and its leading comments) removed
190
+ ```
191
+
192
+ ## 🔐 Security
193
+
194
+ See [SECURITY.md][🔐security].
195
+
196
+ ## 🤝 Contributing
197
+
198
+ If you need some ideas of where to help, you could work on adding more code coverage,
199
+ check [issues][🤝gh-issues] or [PRs][🤝gh-pulls], or use the gem and think about how it could be better.
200
+
201
+ We [![Keep A Changelog][📗keep-changelog-img]][📗keep-changelog] so if you make changes, remember to update it.
202
+
203
+ See [CONTRIBUTING.md][🤝contributing] for more detailed instructions.
204
+
205
+ ### 🚀 Release Instructions
206
+
207
+ See [CONTRIBUTING.md][🤝contributing].
208
+
209
+ ### Code Coverage
210
+
211
+ <details markdown="1">
212
+ <summary>Coverage service badges</summary>
213
+
214
+ </details>
215
+
216
+ ### 🪇 Code of Conduct
217
+
218
+ Everyone interacting with this project's codebases, issue trackers,
219
+ chat rooms and mailing lists agrees to follow the [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct].
220
+
221
+ ## 🌈 Contributors
222
+
223
+ [![Contributors][🖐contributors-img]][🖐contributors]
224
+
225
+ Made with [contributors-img][🖐contrib-rocks].
226
+
227
+ Also see GitLab Contributors: [https://gitlab.com/structuredmerge/structuredmerge-ruby/-/graphs/main][🚎contributors-gl]
228
+
229
+ ## 📌 Versioning
230
+
231
+ This library follows [![Semantic Versioning 2.0.0][📌semver-img]][📌semver] for its public API where practical.
232
+ For most applications, prefer the [Pessimistic Version Constraint][📌pvc] with two digits of precision.
233
+
234
+ For example:
235
+
236
+ ```ruby
237
+ spec.add_dependency("ast-crispr-toml", "~> 7.0")
238
+ ```
239
+
240
+ <details markdown="1">
241
+ <summary>📌 Is "Platform Support" part of the public API? More details inside.</summary>
242
+
243
+ Dropping support for a platform can be a breaking change for affected users.
244
+ If a release changes supported platforms, it should be called out clearly in the changelog and versioned with that impact in mind.
245
+
246
+ To get a better understanding of how SemVer is intended to work over a project's lifetime,
247
+ read this article from the creator of SemVer:
248
+
249
+ - ["Major Version Numbers are Not Sacred"][📌major-versions-not-sacred]
250
+
251
+ </details>
252
+
253
+ See [CHANGELOG.md][📌changelog] for a list of releases.
254
+
255
+ ## 📄 License
256
+
257
+ The gem is available under the following licenses: [AGPL-3.0-only](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/AGPL-3.0-only.md), [PolyForm-Small-Business-1.0.0](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/PolyForm-Small-Business-1.0.0.md).
258
+ See [LICENSE.md][📄license] for details.
259
+
260
+ If none of the available licenses suit your use case, please [contact us](mailto:floss@galtzo.com) to discuss a custom commercial license.
261
+
262
+ ### © Copyright
263
+
264
+ See [LICENSE.md][📄license] for the official copyright notice.
265
+
266
+ <details markdown="1">
267
+ <summary>Copyright holders</summary>
268
+
269
+ - Required Notice: Copyright (c) 2026 Peter H. Boling
270
+
271
+ </details>
272
+
273
+ ## 🤑 A request for help
274
+
275
+ Maintainers have teeth and need to pay their dentists.
276
+ After getting laid off in an RIF in March, and encountering difficulty finding a new one,
277
+ I began spending most of my time building open source tools.
278
+ I'm hoping to be able to pay for my kids' health insurance this month,
279
+ so if you value the work I am doing, I need your support.
280
+ Please consider sponsoring me or the project.
281
+
282
+ To join the community or get help, use the RubyForum or Discord.
283
+
284
+ [![Ruby Users Forum][✉️ruby-forum-img]][✉️ruby-forum]
285
+ [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite]
286
+
287
+ To say "thanks!" ☝️ Join the community or 👇️ send money.
288
+
289
+ [![Sponsor galtzo-floss/ast-crispr-toml 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]
290
+
291
+ ### Please give the project a star ⭐ ♥.
292
+
293
+ Many parts of this project are actively managed by a [kettle-jem](https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/kettle-jem) smart template utilizing [StructuredMerge.org](https://structuredmerge.org) merge contracts.
294
+
295
+ Thanks for RTFM. ☺️
296
+
297
+ [⛳liberapay-img]: https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay&color=a51611&style=flat
298
+ [⛳liberapay-bottom-img]: https://img.shields.io/liberapay/goal/pboling.svg?style=for-the-badge&logo=liberapay&color=a51611
299
+ [⛳liberapay]: https://liberapay.com/pboling/donate
300
+ [🖇osc-all-img]: https://img.shields.io/opencollective/all/galtzo-floss
301
+ [🖇osc-sponsors-img]: https://img.shields.io/opencollective/sponsors/galtzo-floss
302
+ [🖇osc-backers-img]: https://img.shields.io/opencollective/backers/galtzo-floss
303
+ [🖇osc-backers]: https://opencollective.com/galtzo-floss#backer
304
+ [🖇osc-backers-i]: https://opencollective.com/galtzo-floss/backers/badge.svg?style=flat
305
+ [🖇osc-sponsors]: https://opencollective.com/galtzo-floss#sponsor
306
+ [🖇osc-sponsors-i]: https://opencollective.com/galtzo-floss/sponsors/badge.svg?style=flat
307
+ [🖇osc-all-bottom-img]: https://img.shields.io/opencollective/all/galtzo-floss?style=for-the-badge
308
+ [🖇osc-sponsors-bottom-img]: https://img.shields.io/opencollective/sponsors/galtzo-floss?style=for-the-badge
309
+ [🖇osc-backers-bottom-img]: https://img.shields.io/opencollective/backers/galtzo-floss?style=for-the-badge
310
+ [🖇osc]: https://opencollective.com/galtzo-floss
311
+ [🖇sponsor-img]: https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social&logo=github
312
+ [🖇sponsor-bottom-img]: https://img.shields.io/badge/Sponsor_Me!-pboling-blue?style=for-the-badge&logo=github
313
+ [🖇sponsor]: https://github.com/sponsors/pboling
314
+ [🖇kofi-img]: https://img.shields.io/badge/ko--fi-%E2%9C%93-a51611.svg?style=flat
315
+ [🖇kofi]: https://ko-fi.com/pboling
316
+ [🖇buyme-small-img]: https://img.shields.io/badge/buy_me_a_coffee-%E2%9C%93-a51611.svg?style=flat
317
+ [🖇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
318
+ [🖇buyme]: https://www.buymeacoffee.com/pboling
319
+ [🖇paypal-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=flat&logo=paypal
320
+ [🖇paypal-bottom-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=for-the-badge&logo=paypal&color=0A0A0A
321
+ [🖇paypal]: https://www.paypal.com/paypalme/peterboling
322
+ [🖇floss-funding.dev]: https://floss-funding.dev
323
+ [🖇floss-funding-gem]: https://github.com/galtzo-floss/floss_funding
324
+ [✉️discord-invite]: https://discord.gg/3qme4XHNKN
325
+ [✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord
326
+ [✉️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
327
+ [✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends
328
+ [✉️ruby-forum-top-img]: https://img.shields.io/discourse/topics?server=https%3A%2F%2Fwww.rubyforum.org&style=flat&logo=discourse&label=Ruby%20Users%20Forum
329
+ [✉️ruby-forum-img]: https://img.shields.io/discourse/topics?server=https%3A%2F%2Fwww.rubyforum.org&style=for-the-badge&logo=discourse&label=Ruby%20Users%20Forum
330
+ [✉️ruby-forum]: https://www.rubyforum.org/tag/structuredmerge
331
+
332
+ [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780
333
+ [⛳️gem-namespace]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/ast-crispr-toml
334
+ [⛳️namespace-img]: https://img.shields.io/badge/namespace-Ast::Crispr::Toml-3C2D2D.svg?style=square&logo=ruby&logoColor=white
335
+ [⛳️gem-name]: https://clickgems.clickhouse.com/dashboard/ast-crispr-toml
336
+ [⛳️name-img]: https://img.shields.io/badge/name-ast--crispr--toml-3C2D2D.svg?style=square&logo=rubygems&logoColor=red
337
+ [⛳️tag-img]: https://img.shields.io/github/tag/structuredmerge/structuredmerge-ruby.svg
338
+ [⛳️tag]: https://github.com/structuredmerge/structuredmerge-ruby/releases
339
+ [🚂maint-blog]: http://www.railsbling.com/tags/ast-crispr-toml
340
+ [🚂maint-blog-img]: https://img.shields.io/badge/blog-railsbling-0093D0.svg?style=for-the-badge&logo=rubyonrails&logoColor=orange
341
+ [🚂maint-contact]: http://www.railsbling.com/contact
342
+ [🚂maint-contact-img]: https://img.shields.io/badge/Contact-Maintainer-0093D0.svg?style=flat&logo=rubyonrails&logoColor=red
343
+ [💖🖇linkedin]: http://www.linkedin.com/in/peterboling
344
+ [💖🖇linkedin-img]: https://img.shields.io/badge/LinkedIn-Profile-0B66C2?style=flat&logo=newjapanprowrestling
345
+ [💖✌️wellfound]: https://wellfound.com/u/peter-boling
346
+ [💖✌️wellfound-img]: https://img.shields.io/badge/peter--boling-orange?style=flat&logo=wellfound
347
+ [💖💲crunchbase]: https://www.crunchbase.com/person/peter-boling
348
+ [💖💲crunchbase-img]: https://img.shields.io/badge/peter--boling-purple?style=flat&logo=crunchbase
349
+ [💖🐘ruby-mast]: https://ruby.social/@galtzo
350
+ [💖🐘ruby-mast-img]: https://img.shields.io/mastodon/follow/109447111526622197?domain=https://ruby.social&style=flat&logo=mastodon&label=Ruby%20@galtzo
351
+ [💖🦋bluesky]: https://bsky.app/profile/galtzo.com
352
+ [💖🦋bluesky-img]: https://img.shields.io/badge/@galtzo.com-0285FF?style=flat&logo=bluesky&logoColor=white
353
+ [💖🌳linktree]: https://linktr.ee/galtzo
354
+ [💖🌳linktree-img]: https://img.shields.io/badge/galtzo-purple?style=flat&logo=linktree
355
+ [💖💁🏼‍♂️devto]: https://dev.to/galtzo
356
+ [💖💁🏼‍♂️devto-img]: https://img.shields.io/badge/dev.to-0A0A0A?style=flat&logo=devdotto&logoColor=white
357
+ [💖💁🏼‍♂️aboutme]: https://about.me/peter.boling
358
+ [💖💁🏼‍♂️aboutme-img]: https://img.shields.io/badge/about.me-0A0A0A?style=flat&logo=aboutme&logoColor=white
359
+ [💖🧊berg]: https://codeberg.org/pboling
360
+ [💖🐙hub]: https://github.org/pboling
361
+ [💖🛖hut]: https://sr.ht/~galtzo/
362
+ [💖🧪lab]: https://gitlab.com/pboling
363
+ [👨🏼‍🏫expsup-upwork]: https://www.upwork.com/freelancers/~014942e9b056abdf86?mp_source=share
364
+ [👨🏼‍🏫expsup-upwork-img]: https://img.shields.io/badge/UpWork-13544E?style=for-the-badge&logo=Upwork&logoColor=white
365
+ [👨🏼‍🏫expsup-codementor]: https://www.codementor.io/peterboling?utm_source=github&utm_medium=button&utm_term=peterboling&utm_campaign=github
366
+ [👨🏼‍🏫expsup-codementor-img]: https://img.shields.io/badge/CodeMentor-Get_Help-1abc9c?style=for-the-badge&logo=CodeMentor&logoColor=white
367
+ [🏙️entsup-tidelift]: https://tidelift.com/subscription/pkg/rubygems-ast-crispr-toml?utm_source=rubygems-ast-crispr-toml&utm_medium=referral&utm_campaign=readme
368
+ [🏙️entsup-tidelift-img]: https://img.shields.io/badge/Tidelift_and_Sonar-Enterprise_Support-FD3456?style=for-the-badge&logo=sonar&logoColor=white
369
+ [🏙️entsup-tidelift-sonar]: https://blog.tidelift.com/tidelift-joins-sonar
370
+ [💁🏼‍♂️peterboling]: http://www.peterboling.com
371
+ [🚂railsbling]: http://www.railsbling.com
372
+ [📜src-gl-img]: https://img.shields.io/badge/GitLab-FBA326?style=for-the-badge&logo=Gitlab&logoColor=orange
373
+ [📜src-gl]: https://gitlab.com/structuredmerge/structuredmerge-ruby/-/tree/main/gems/ast-crispr-toml
374
+ [📜src-cb-img]: https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge&logo=CodeBerg&logoColor=blue
375
+ [📜src-cb]: https://codeberg.org/structuredmerge/structuredmerge-ruby/src/branch/main/gems/ast-crispr-toml
376
+ [📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=GitHub&logoColor=green
377
+ [📜src-gh]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/ast-crispr-toml
378
+ [📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
379
+ [📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
380
+ [📜gl-wiki]: https://gitlab.com/structuredmerge/structuredmerge-ruby/-/wikis/home
381
+ [📜gh-wiki]: https://github.com/structuredmerge/structuredmerge-ruby/wiki
382
+ [📜gl-wiki-img]: https://img.shields.io/badge/wiki-gitlab-943CD2.svg?style=for-the-badge&logo=gitlab&logoColor=white
383
+ [📜gh-wiki-img]: https://img.shields.io/badge/wiki-github-943CD2.svg?style=for-the-badge&logo=github&logoColor=white
384
+ [👽dl-rank]: https://clickgems.clickhouse.com/dashboard/ast-crispr-toml
385
+ [👽dl-ranki]: https://img.shields.io/gem/dt/ast-crispr-toml.svg
386
+ [👽version]: https://clickgems.clickhouse.com/dashboard/ast-crispr-toml
387
+ [👽versioni]: https://img.shields.io/gem/v/ast-crispr-toml.svg
388
+ [🚎11-c-wf]: https://github.com/structuredmerge/structuredmerge-ruby/actions/workflows/current.yml
389
+ [🚎11-c-wfi]: https://github.com/structuredmerge/structuredmerge-ruby/actions/workflows/current.yml/badge.svg
390
+ [💎ruby-c-i]: https://img.shields.io/badge/Ruby-current-CC342D?style=for-the-badge&logo=ruby&logoColor=green
391
+ [🤝gh-issues]: https://github.com/structuredmerge/structuredmerge-ruby/issues
392
+ [🤝gh-pulls]: https://github.com/structuredmerge/structuredmerge-ruby/pulls
393
+ [🤝gl-issues]: https://gitlab.com/structuredmerge/structuredmerge-ruby/-/issues
394
+ [🤝gl-pulls]: https://gitlab.com/structuredmerge/structuredmerge-ruby/-/merge_requests
395
+ [🤝cb-issues]: https://codeberg.org/structuredmerge/structuredmerge-ruby/issues
396
+ [🤝cb-pulls]: https://codeberg.org/structuredmerge/structuredmerge-ruby/pulls
397
+ [🤝cb-donate]: https://donate.codeberg.org/
398
+ [🤝contributing]: https://github.com/structuredmerge/structuredmerge-ruby/blob/main/CONTRIBUTING.md
399
+ [🖐contrib-rocks]: https://contrib.rocks
400
+ [🖐contributors]: https://github.com/structuredmerge/structuredmerge-ruby/graphs/contributors
401
+ [🖐contributors-img]: https://contrib.rocks/image?repo=structuredmerge/structuredmerge-ruby
402
+ [🚎contributors-gl]: https://gitlab.com/structuredmerge/structuredmerge-ruby/-/graphs/main
403
+ [🪇conduct]: https://github.com/structuredmerge/structuredmerge-ruby/blob/main/CODE_OF_CONDUCT.md
404
+ [🪇conduct-img]: https://img.shields.io/badge/Contributor_Covenant-2.1-259D6C.svg
405
+ [📌pvc]: http://guides.rubygems.org/patterns/#pessimistic-version-constraint
406
+ [📌semver]: https://semver.org/spec/v2.0.0.html
407
+ [📌semver-img]: https://img.shields.io/badge/semver-2.0.0-259D6C.svg?style=flat
408
+ [📌semver-breaking]: https://github.com/semver/semver/issues/716#issuecomment-869336139
409
+ [📌major-versions-not-sacred]: https://tom.preston-werner.com/2022/05/23/major-version-numbers-are-not-sacred.html
410
+ [📌changelog]: https://github.com/structuredmerge/structuredmerge-ruby/blob/main/CHANGELOG.md
411
+ [📗keep-changelog]: https://keepachangelog.com/en/1.0.0/
412
+ [📗keep-changelog-img]: https://img.shields.io/badge/keep--a--changelog-1.0.0-34495e.svg?style=flat
413
+ [📌gitmoji]: https://gitmoji.dev
414
+ [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
415
+ [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
416
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-5.053-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
417
+ [🔐security]: https://github.com/structuredmerge/structuredmerge-ruby/blob/main/SECURITY.md
418
+ [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
419
+ [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
420
+ [📄license]: LICENSE.md
421
+ [📄license-ref]: LICENSE.md
422
+ [📄license-img]: https://img.shields.io/badge/License-AGPL--3.0--only_OR_PolyForm--Small--Business--1.0.0-259D6C.svg
423
+ [📄license-compat]: https://www.apache.org/legal/resolved.html#category-x
424
+ [📄license-compat-img]: https://img.shields.io/badge/Apache_Incompatible:_Category_X-%E2%9C%97-C0392B.svg?style=flat&logo=Apache
425
+
426
+ [📄ilo-declaration]: https://www.ilo.org/declaration/lang--en/index.htm
427
+ [📄ilo-declaration-img]: https://img.shields.io/badge/ILO_Fundamental_Principles-✓-259D6C.svg?style=flat
428
+ [🚎yard-current]: http://rubydoc.info/gems/ast-crispr-toml
429
+ [🚎yard-head]: https://ast-crispr-toml.galtzo.com
430
+ [💎stone_checksums]: https://github.com/galtzo-floss/stone_checksums
431
+ [💎SHA_checksums]: https://gitlab.com/structuredmerge/structuredmerge-ruby/-/tree/main/checksums
432
+ [💎rlts]: https://github.com/rubocop-lts/rubocop-lts
433
+ [💎rlts-img]: https://img.shields.io/badge/code_style_&_linting-rubocop--lts-34495e.svg?plastic&logo=ruby&logoColor=white
434
+ [💎appraisal2]: https://github.com/appraisal-rb/appraisal2
435
+ [💎appraisal2-img]: https://img.shields.io/badge/appraised_by-appraisal2-34495e.svg?plastic&logo=ruby&logoColor=white
436
+ [💎d-in-dvcs]: https://railsbling.com/posts/dvcs/put_the_d_in_dvcs/
437
+
438
+ <!-- kettle-jem:metadata:start -->
439
+ | Field | Value |
440
+ |---|---|
441
+ | Package | ast-crispr-toml |
442
+ | Description | 🧬 TOML table and dotted-key-path selectors and edit helpers for ast-crispr, backed by toml-merge. |
443
+ | Homepage | https://github.com/structuredmerge/structuredmerge-ruby |
444
+ | Source | https://github.com/structuredmerge/structuredmerge-ruby |
445
+ | License | `AGPL-3.0-only` OR `PolyForm-Small-Business-1.0.0` |
446
+ | Funding | https://github.com/sponsors/pboling, https://ko-fi.com/pboling, https://liberapay.com/pboling/donate, https://opencollective.com/galtzo-floss, https://thanks.dev/u/gh/pboling, https://tidelift.com/funding/github/rubygems/ast-crispr-toml, https://www.buymeacoffee.com/pboling |
447
+ <!-- kettle-jem:metadata:end -->
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ast
4
+ module Crispr
5
+ module Toml
6
+ # Version namespace for this gem.
7
+ module Version
8
+ # Current gem version.
9
+ VERSION = "7.1.12"
10
+ end
11
+ # Current gem version exposed at the traditional constant location.
12
+ VERSION = Version::VERSION # Traditional Constant Location
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,231 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "ast/crispr"
4
+ require "toml/merge"
5
+ require_relative "toml/version"
6
+
7
+ module Ast
8
+ module Crispr
9
+ # TOML adapter for AST CRISPR structural edits.
10
+ #
11
+ # Backed by `toml-merge`'s FileAnalysis, which normalizes over the
12
+ # available TOML parser backends (tree-sitter via TreeHaver, Citrus,
13
+ # Parslet). Owners are TOML tables (including array-of-tables and dotted
14
+ # sub-tables) and key/value pairs addressed by dotted key paths.
15
+ module Toml
16
+ class Error < StandardError; end
17
+
18
+ # Byte range of a structural owner. 1-based, inclusive.
19
+ Location = Struct.new(:start_line, :end_line, keyword_init: true)
20
+
21
+ # A `[table]` / `[[table_array]]` block owner. `location.start_line`
22
+ # includes the block's leading comment lines; `location.end_line` is the
23
+ # clamped body end (the last line the table owns, not the next header).
24
+ TableOwner = Struct.new(:location, :name, :kind, :leading_region, :wrapper, keyword_init: true)
25
+
26
+ # A `key = value` pair owner, addressed by its dotted path from the
27
+ # document root (e.g. `tasks.family-lint.run`).
28
+ PairOwner = Struct.new(:location, :name, :full_path, :wrapper, keyword_init: true)
29
+
30
+ class Adapter
31
+ def read_ast(document)
32
+ analysis = ::Toml::Merge::FileAnalysis.new(document.content)
33
+ return analysis if analysis.valid?
34
+
35
+ raise Ast::Crispr::Error.new("Unable to read structural owners from #{document.source_label}",
36
+ details: {source_label: document.source_label})
37
+ end
38
+
39
+ def structural_owners(document, owner_scope: :shared_default)
40
+ analysis = document.ast
41
+ case owner_scope
42
+ when :shared_default, :tables
43
+ analysis.tables.map { |wrapper| table_owner(analysis, wrapper) }
44
+ when :root_pairs
45
+ analysis.root_pairs.map { |wrapper| pair_owner(nil, wrapper) }
46
+ when :pairs
47
+ analysis.root_pairs.map { |wrapper| pair_owner(nil, wrapper) } +
48
+ analysis.tables.flat_map do |table|
49
+ table.pairs.map { |wrapper| pair_owner(table, wrapper) }
50
+ end
51
+ else
52
+ raise Ast::Crispr::Error.new("Unsupported CRISPR owner scope", details: {owner_scope: owner_scope})
53
+ end
54
+ end
55
+
56
+ def comment_regions_for(document, owner, region: :leading, owner_scope: :shared_default)
57
+ analysis = document.ast
58
+ case region
59
+ when :leading then attachment_for(analysis, owner).leading_region
60
+ when :trailing then attachment_for(analysis, owner).trailing_region
61
+ else
62
+ raise Ast::Crispr::Error.new(
63
+ "Unsupported CRISPR comment region",
64
+ details: {region: region, owner_scope: owner_scope}
65
+ )
66
+ end
67
+ end
68
+
69
+ def comment_region_text(_document, comment_region)
70
+ comment_region.text
71
+ end
72
+
73
+ def structure_profile(owner_scope: :shared_default)
74
+ case owner_scope
75
+ when :shared_default, :tables
76
+ Ast::Crispr::StructureProfile.new(
77
+ owner_scope: owner_scope,
78
+ owner_selector: :tables,
79
+ supported_comment_regions: %i[leading trailing],
80
+ metadata: {adapter: :toml}
81
+ )
82
+ when :root_pairs
83
+ Ast::Crispr::StructureProfile.new(
84
+ owner_scope: owner_scope,
85
+ owner_selector: :root_pairs,
86
+ supported_comment_regions: %i[leading trailing],
87
+ metadata: {adapter: :toml, toml_owner: :root_pair}
88
+ )
89
+ when :pairs
90
+ Ast::Crispr::StructureProfile.new(
91
+ owner_scope: owner_scope,
92
+ owner_selector: :pairs,
93
+ supported_comment_regions: %i[leading trailing],
94
+ metadata: {adapter: :toml, toml_owner: :pair}
95
+ )
96
+ else
97
+ raise Ast::Crispr::Error.new("Unsupported CRISPR owner scope", details: {owner_scope: owner_scope})
98
+ end
99
+ end
100
+
101
+ private
102
+
103
+ def attachment_for(analysis, owner)
104
+ analysis.comment_attachment_for(owner.wrapper)
105
+ end
106
+
107
+ def table_owner(analysis, wrapper)
108
+ attachment = analysis.comment_attachment_for(wrapper)
109
+ leading = attachment.leading_region
110
+ TableOwner.new(
111
+ location: Location.new(
112
+ start_line: leading ? leading.start_line : wrapper.start_line,
113
+ end_line: wrapper.effective_end_line
114
+ ),
115
+ name: wrapper.table_name,
116
+ kind: wrapper.array_of_tables? ? :table_array : :table,
117
+ leading_region: leading,
118
+ wrapper: wrapper
119
+ )
120
+ end
121
+
122
+ def pair_owner(parent_table, wrapper)
123
+ parent_path = parent_table ? split_path(parent_table.table_name) : []
124
+ full_path = parent_path + split_path(wrapper.key_name.to_s)
125
+ PairOwner.new(
126
+ location: Location.new(start_line: wrapper.start_line, end_line: wrapper.end_line),
127
+ name: wrapper.key_name,
128
+ full_path: full_path.join("."),
129
+ wrapper: wrapper
130
+ )
131
+ end
132
+
133
+ def split_path(dotted)
134
+ dotted.to_s.split(".").map(&:strip).reject(&:empty?)
135
+ end
136
+ end
137
+
138
+ # Selectors for TOML structural owners. Paths are dotted strings
139
+ # (`tasks.family-lint`, `tasks.family-lint.run`, `min_version`).
140
+ module Selectors
141
+ module_function
142
+
143
+ def table(path:, id: nil, limit: nil, metadata: {}, **options)
144
+ Ast::Crispr::OwnerSelector.new(
145
+ id: id || "table_#{path}",
146
+ limit: limit,
147
+ metadata: metadata.merge(
148
+ adapter: Ast::Crispr::Toml.adapter,
149
+ owner_scope: :tables,
150
+ selector_kind: :table,
151
+ selection_intent: :predicate_filter,
152
+ include_trailing_gap: false
153
+ ).merge(options),
154
+ locate: lambda do |context|
155
+ context.structural_owners(owner_scope: :tables).filter_map do |owner|
156
+ next unless owner.name.to_s == path.to_s
157
+
158
+ Ast::Crispr::Match.new(
159
+ node: owner,
160
+ start_line: owner.location.start_line,
161
+ end_line: owner.location.end_line,
162
+ metadata: {
163
+ start_boundary: :owner_start,
164
+ end_boundary: :owner_end,
165
+ payload_kind: :table_block,
166
+ table_name: owner.name,
167
+ kind: owner.kind
168
+ }
169
+ )
170
+ end
171
+ end
172
+ )
173
+ end
174
+
175
+ def pair(path:, id: nil, limit: nil, metadata: {}, **options)
176
+ Ast::Crispr::OwnerSelector.new(
177
+ id: id || "pair_#{path}",
178
+ limit: limit,
179
+ metadata: metadata.merge(
180
+ adapter: Ast::Crispr::Toml.adapter,
181
+ owner_scope: :pairs,
182
+ selector_kind: :pair,
183
+ selection_intent: :predicate_filter,
184
+ include_trailing_gap: false
185
+ ).merge(options),
186
+ locate: lambda do |context|
187
+ context.structural_owners(owner_scope: :pairs).filter_map do |owner|
188
+ next unless owner.full_path == normalize_path(path)
189
+
190
+ Ast::Crispr::Match.new(
191
+ node: owner,
192
+ start_line: owner.location.start_line,
193
+ end_line: owner.location.end_line,
194
+ metadata: {
195
+ start_boundary: :owner_start,
196
+ end_boundary: :owner_end,
197
+ payload_kind: :structural_owner_body,
198
+ key_name: owner.name,
199
+ full_path: owner.full_path
200
+ }
201
+ )
202
+ end
203
+ end
204
+ )
205
+ end
206
+
207
+ def normalize_path(path)
208
+ path.to_s.split(".").map(&:strip).reject(&:empty?).join(".")
209
+ end
210
+ end
211
+
212
+ Targets = Selectors
213
+
214
+ class << self
215
+ def adapter
216
+ @adapter ||= Adapter.new
217
+ end
218
+
219
+ def document_context(content:, source_label: "source", metadata: {}, **options)
220
+ Ast::Crispr::DocumentContext.new(
221
+ content: content,
222
+ source_label: source_label,
223
+ adapter: adapter,
224
+ metadata: metadata,
225
+ **options
226
+ )
227
+ end
228
+ end
229
+ end
230
+ end
231
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "ast/crispr/toml"
4
+ require "version_gem"
5
+ require_relative "ast/crispr/toml/version"
6
+
7
+ Ast::Crispr::Toml::Version.class_eval do
8
+ extend VersionGem::Basic
9
+ end
@@ -0,0 +1,10 @@
1
+ module Ast
2
+ module Crispr
3
+ module Toml
4
+ module Version
5
+ VERSION: String
6
+ end
7
+ VERSION: String
8
+ end
9
+ end
10
+ end
data.tar.gz.sig ADDED
Binary file
metadata ADDED
@@ -0,0 +1,347 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ast-crispr-toml
3
+ version: !ruby/object:Gem::Version
4
+ version: 7.1.12
5
+ platform: ruby
6
+ authors:
7
+ - Peter H. Boling
8
+ bindir: exe
9
+ cert_chain:
10
+ - |
11
+ -----BEGIN CERTIFICATE-----
12
+ MIIEgDCCAuigAwIBAgIBATANBgkqhkiG9w0BAQsFADBDMRUwEwYDVQQDDAxwZXRl
13
+ ci5ib2xpbmcxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixkARkW
14
+ A2NvbTAeFw0yNTA1MDQxNTMzMDlaFw00NTA0MjkxNTMzMDlaMEMxFTATBgNVBAMM
15
+ DHBldGVyLmJvbGluZzEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPy
16
+ LGQBGRYDY29tMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAruUoo0WA
17
+ uoNuq6puKWYeRYiZekz/nsDeK5x/0IEirzcCEvaHr3Bmz7rjo1I6On3gGKmiZs61
18
+ LRmQ3oxy77ydmkGTXBjruJB+pQEn7UfLSgQ0xa1/X3kdBZt6RmabFlBxnHkoaGY5
19
+ mZuZ5+Z7walmv6sFD9ajhzj+oIgwWfnEHkXYTR8I6VLN7MRRKGMPoZ/yvOmxb2DN
20
+ coEEHWKO9CvgYpW7asIihl/9GMpKiRkcYPm9dGQzZc6uTwom1COfW0+ZOFrDVBuV
21
+ FMQRPswZcY4Wlq0uEBLPU7hxnCL9nKK6Y9IhdDcz1mY6HZ91WImNslOSI0S8hRpj
22
+ yGOWxQIhBT3fqCBlRIqFQBudrnD9jSNpSGsFvbEijd5ns7Z9ZMehXkXDycpGAUj1
23
+ to/5cuTWWw1JqUWrKJYoifnVhtE1o1DZ+LkPtWxHtz5kjDG/zR3MG0Ula0UOavlD
24
+ qbnbcXPBnwXtTFeZ3C+yrWpE4pGnl3yGkZj9SMTlo9qnTMiPmuWKQDatAgMBAAGj
25
+ fzB9MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQWBBQE8uWvNbPVNRXZ
26
+ HlgPbc2PCzC4bjAhBgNVHREEGjAYgRZwZXRlci5ib2xpbmdAZ21haWwuY29tMCEG
27
+ A1UdEgQaMBiBFnBldGVyLmJvbGluZ0BnbWFpbC5jb20wDQYJKoZIhvcNAQELBQAD
28
+ ggGBAJbnUwfJQFPkBgH9cL7hoBfRtmWiCvdqdjeTmi04u8zVNCUox0A4gT982DE9
29
+ wmuN12LpdajxZONqbXuzZvc+nb0StFwmFYZG6iDwaf4BPywm2e/Vmq0YG45vZXGR
30
+ L8yMDSK1cQXjmA+ZBKOHKWavxP6Vp7lWvjAhz8RFwqF9GuNIdhv9NpnCAWcMZtpm
31
+ GUPyIWw/Cw/2wZp74QzZj6Npx+LdXoLTF1HMSJXZ7/pkxLCsB8m4EFVdb/IrW/0k
32
+ kNSfjtAfBHO8nLGuqQZVH9IBD1i9K6aSs7pT6TW8itXUIlkIUI2tg5YzW6OFfPzq
33
+ QekSkX3lZfY+HTSp/o+YvKkqWLUV7PQ7xh1ZYDtocpaHwgxe/j3bBqHE+CUPH2vA
34
+ 0V/FwdTRWcwsjVoOJTrYcff8pBZ8r2MvtAc54xfnnhGFzeRHfcltobgFxkAXdE6p
35
+ DVjBtqT23eugOqQ73umLcYDZkc36vnqGxUBSsXrzY9pzV5gGr2I8YUxMqf6ATrZt
36
+ L9nRqA==
37
+ -----END CERTIFICATE-----
38
+ date: 1980-01-02 00:00:00.000000000 Z
39
+ dependencies:
40
+ - !ruby/object:Gem::Dependency
41
+ name: ast-crispr
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - '='
45
+ - !ruby/object:Gem::Version
46
+ version: 7.1.12
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - '='
52
+ - !ruby/object:Gem::Version
53
+ version: 7.1.12
54
+ - !ruby/object:Gem::Dependency
55
+ name: toml-merge
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - '='
59
+ - !ruby/object:Gem::Version
60
+ version: 7.1.12
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - '='
66
+ - !ruby/object:Gem::Version
67
+ version: 7.1.12
68
+ - !ruby/object:Gem::Dependency
69
+ name: version_gem
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '1.1'
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: 1.1.15
78
+ type: :runtime
79
+ prerelease: false
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - "~>"
83
+ - !ruby/object:Gem::Version
84
+ version: '1.1'
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: 1.1.15
88
+ - !ruby/object:Gem::Dependency
89
+ name: kettle-dev
90
+ requirement: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - "~>"
93
+ - !ruby/object:Gem::Version
94
+ version: '3.1'
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: 3.1.15
98
+ type: :development
99
+ prerelease: false
100
+ version_requirements: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: '3.1'
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: 3.1.15
108
+ - !ruby/object:Gem::Dependency
109
+ name: bundler-audit
110
+ requirement: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - "~>"
113
+ - !ruby/object:Gem::Version
114
+ version: 0.9.3
115
+ type: :development
116
+ prerelease: false
117
+ version_requirements: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - "~>"
120
+ - !ruby/object:Gem::Version
121
+ version: 0.9.3
122
+ - !ruby/object:Gem::Dependency
123
+ name: rake
124
+ requirement: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - "~>"
127
+ - !ruby/object:Gem::Version
128
+ version: '13.0'
129
+ type: :development
130
+ prerelease: false
131
+ version_requirements: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - "~>"
134
+ - !ruby/object:Gem::Version
135
+ version: '13.0'
136
+ - !ruby/object:Gem::Dependency
137
+ name: require_bench
138
+ requirement: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - "~>"
141
+ - !ruby/object:Gem::Version
142
+ version: '1.0'
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: 1.0.4
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '1.0'
153
+ - - ">="
154
+ - !ruby/object:Gem::Version
155
+ version: 1.0.4
156
+ - !ruby/object:Gem::Dependency
157
+ name: anonymous_loader
158
+ requirement: !ruby/object:Gem::Requirement
159
+ requirements:
160
+ - - "~>"
161
+ - !ruby/object:Gem::Version
162
+ version: '0.1'
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ version: 0.1.3
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - "~>"
171
+ - !ruby/object:Gem::Version
172
+ version: '0.1'
173
+ - - ">="
174
+ - !ruby/object:Gem::Version
175
+ version: 0.1.3
176
+ - !ruby/object:Gem::Dependency
177
+ name: appraisal2
178
+ requirement: !ruby/object:Gem::Requirement
179
+ requirements:
180
+ - - "~>"
181
+ - !ruby/object:Gem::Version
182
+ version: '3.2'
183
+ - - ">="
184
+ - !ruby/object:Gem::Version
185
+ version: 3.2.5
186
+ type: :development
187
+ prerelease: false
188
+ version_requirements: !ruby/object:Gem::Requirement
189
+ requirements:
190
+ - - "~>"
191
+ - !ruby/object:Gem::Version
192
+ version: '3.2'
193
+ - - ">="
194
+ - !ruby/object:Gem::Version
195
+ version: 3.2.5
196
+ - !ruby/object:Gem::Dependency
197
+ name: kettle-test
198
+ requirement: !ruby/object:Gem::Requirement
199
+ requirements:
200
+ - - "~>"
201
+ - !ruby/object:Gem::Version
202
+ version: '2.0'
203
+ - - ">="
204
+ - !ruby/object:Gem::Version
205
+ version: 2.0.27
206
+ type: :development
207
+ prerelease: false
208
+ version_requirements: !ruby/object:Gem::Requirement
209
+ requirements:
210
+ - - "~>"
211
+ - !ruby/object:Gem::Version
212
+ version: '2.0'
213
+ - - ">="
214
+ - !ruby/object:Gem::Version
215
+ version: 2.0.27
216
+ - !ruby/object:Gem::Dependency
217
+ name: turbo_tests2
218
+ requirement: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - "~>"
221
+ - !ruby/object:Gem::Version
222
+ version: '3.2'
223
+ - - ">="
224
+ - !ruby/object:Gem::Version
225
+ version: 3.2.14
226
+ type: :development
227
+ prerelease: false
228
+ version_requirements: !ruby/object:Gem::Requirement
229
+ requirements:
230
+ - - "~>"
231
+ - !ruby/object:Gem::Version
232
+ version: '3.2'
233
+ - - ">="
234
+ - !ruby/object:Gem::Version
235
+ version: 3.2.14
236
+ - !ruby/object:Gem::Dependency
237
+ name: ruby-progressbar
238
+ requirement: !ruby/object:Gem::Requirement
239
+ requirements:
240
+ - - "~>"
241
+ - !ruby/object:Gem::Version
242
+ version: '1.13'
243
+ type: :development
244
+ prerelease: false
245
+ version_requirements: !ruby/object:Gem::Requirement
246
+ requirements:
247
+ - - "~>"
248
+ - !ruby/object:Gem::Version
249
+ version: '1.13'
250
+ - !ruby/object:Gem::Dependency
251
+ name: stone_checksums
252
+ requirement: !ruby/object:Gem::Requirement
253
+ requirements:
254
+ - - "~>"
255
+ - !ruby/object:Gem::Version
256
+ version: '1.0'
257
+ - - ">="
258
+ - !ruby/object:Gem::Version
259
+ version: 1.0.9
260
+ type: :development
261
+ prerelease: false
262
+ version_requirements: !ruby/object:Gem::Requirement
263
+ requirements:
264
+ - - "~>"
265
+ - !ruby/object:Gem::Version
266
+ version: '1.0'
267
+ - - ">="
268
+ - !ruby/object:Gem::Version
269
+ version: 1.0.9
270
+ - !ruby/object:Gem::Dependency
271
+ name: gitmoji-regex
272
+ requirement: !ruby/object:Gem::Requirement
273
+ requirements:
274
+ - - "~>"
275
+ - !ruby/object:Gem::Version
276
+ version: '2.0'
277
+ - - ">="
278
+ - !ruby/object:Gem::Version
279
+ version: 2.0.15
280
+ type: :development
281
+ prerelease: false
282
+ version_requirements: !ruby/object:Gem::Requirement
283
+ requirements:
284
+ - - "~>"
285
+ - !ruby/object:Gem::Version
286
+ version: '2.0'
287
+ - - ">="
288
+ - !ruby/object:Gem::Version
289
+ version: 2.0.15
290
+ description: "\U0001F9EC TOML table and dotted-key-path selectors and edit helpers
291
+ for ast-crispr, backed by toml-merge."
292
+ email:
293
+ - floss@galtzo.com
294
+ executables: []
295
+ extensions: []
296
+ extra_rdoc_files: []
297
+ files:
298
+ - CHANGELOG.md
299
+ - LICENSE.md
300
+ - README.md
301
+ - lib/ast-crispr-toml.rb
302
+ - lib/ast/crispr/toml.rb
303
+ - lib/ast/crispr/toml/version.rb
304
+ - sig/ast/crispr/toml.rbs
305
+ homepage: https://github.com/structuredmerge/structuredmerge-ruby
306
+ licenses:
307
+ - AGPL-3.0-only
308
+ - PolyForm-Small-Business-1.0.0
309
+ metadata:
310
+ homepage_uri: https://structuredmerge.org
311
+ source_code_uri: https://github.com/structuredmerge/structuredmerge-ruby/tree/v7.1.12
312
+ changelog_uri: https://github.com/structuredmerge/structuredmerge-ruby/blob/v7.1.12/CHANGELOG.md
313
+ bug_tracker_uri: https://github.com/structuredmerge/structuredmerge-ruby/issues
314
+ documentation_uri: https://www.rubydoc.info/gems/ast-crispr-toml/7.1.12
315
+ funding_uri: https://github.com/sponsors/pboling
316
+ wiki_uri: https://github.com/structuredmerge/structuredmerge-ruby/wiki
317
+ news_uri: https://www.railsbling.com/tags/ast-crispr-toml
318
+ discord_uri: https://discord.gg/3qme4XHNKN
319
+ mailing_list_uri: https://www.rubyforum.org/tag/structuredmerge
320
+ rubygems_mfa_required: 'true'
321
+ rdoc_options:
322
+ - "--title"
323
+ - "ast-crispr-toml - \U0001F9EC TOML adapter for AST CRISPR structural edits"
324
+ - "--main"
325
+ - README.md
326
+ - "--exclude"
327
+ - "^sig/"
328
+ - "--line-numbers"
329
+ - "--inline-source"
330
+ - "--quiet"
331
+ require_paths:
332
+ - lib
333
+ required_ruby_version: !ruby/object:Gem::Requirement
334
+ requirements:
335
+ - - ">="
336
+ - !ruby/object:Gem::Version
337
+ version: 4.0.0
338
+ required_rubygems_version: !ruby/object:Gem::Requirement
339
+ requirements:
340
+ - - ">="
341
+ - !ruby/object:Gem::Version
342
+ version: '0'
343
+ requirements: []
344
+ rubygems_version: 4.0.20
345
+ specification_version: 4
346
+ summary: "\U0001F9EC TOML adapter for AST CRISPR structural edits"
347
+ test_files: []
metadata.gz.sig ADDED
Binary file