plain-merge 7.0.0 → 7.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fd3d000aba244c2628a3216cb39596c0019700c11ae89568efef00a6aa3aa796
4
- data.tar.gz: 3e2c8c645cc153e6e48194d8ce9860b0adf8c4ce1d5582ab6b9f14d8a85fe2f7
3
+ metadata.gz: 5da79765d212fbd8c3734697f1bf0879be015dfee2c126b2784356b75badf72f
4
+ data.tar.gz: '0218ac56ff565a835d03b85cd48095a463ac415eabb1ffcf9a88ca2600fba806'
5
5
  SHA512:
6
- metadata.gz: f4ac184c99e041ed6b0f0551022fc9e0163b681db893344a07b1f30503220250ffe9fd19092b5b60fe05a5ed78c627fc736ec0c3d7a9884259977a60f03e7278
7
- data.tar.gz: eaf6d3f57d5cf225ef29e5aa9e0f5021df15d6b74d6aaa2b2d62bf9fa495dfe91fbd784b8775fbe443c38756749ea2c1282b6f784eaf69f2158cb3908f7a54ca
6
+ metadata.gz: 84e346b9c77e9c93eb93e38a10d0e38bf2fee19efcab787f261f321f7efecf67f2cb918f46a75bcf060ee5e5cb3ac1027476c442397fd988b61696f725e68df7
7
+ data.tar.gz: 426d63fd97bbc694cd05b8c3e9a2264389a9b8516db32377ea946569616adb3b95409621b995d371ae84a94fb39b2658393420d316ba2b5f26ef87161e5cee73
checksums.yaml.gz.sig CHANGED
Binary file
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,293 @@
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
+ # ☯️ Plain::Merge
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
+ [![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
+ `Plain::Merge` provides text-family fallback behavior for content without a richer parser. It normalizes paragraphs into blocks, compares block similarity, and reports whether two text bodies are close enough for a safe fallback decision.
25
+ It also registers the StructuredMerge line substrate with `tree_haver`, so
26
+ callers can enter plain text analysis through
27
+ `TreeHaver.parser_for(:text, backend_type: :line)` or
28
+ `TreeHaver.parser_for(:plain, backend_type: :line)`.
29
+
30
+ ### Key Features
31
+
32
+ - Paragraph/block normalization for plain text.
33
+ - Jaccard similarity scoring.
34
+ - Configurable text-refinement threshold and weights.
35
+ - Module-level `merge_text` API for fallback integrations.
36
+ - `TreeHaver.parser_for` registration for `:text` and `:plain` through the
37
+ `:line` backend.
38
+
39
+ ## 💡 Info you can shake a stick at
40
+
41
+ | Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] |
42
+ |-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
43
+ | Works with MRI Ruby 4 | [![Ruby current Compat][💎ruby-c-i]][🚎11-c-wf]|
44
+ | 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] |
45
+ | 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] |
46
+ | 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] |
47
+ | 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] |
48
+ | 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] |
49
+ | 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] |
50
+ | `...` 💖 | [![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] |
51
+
52
+ ### Compatibility
53
+
54
+ Compatible with MRI Ruby 4.0.0+, and concordant releases of JRuby, and TruffleRuby.
55
+ CI workflows and Appraisals are generated for MRI Ruby 4.0.0+.
56
+ This test floor is configured by `ruby.test_minimum` in `.kettle-jem.yml` and
57
+ may be higher than the gem's runtime compatibility floor when legacy Rubies are
58
+ not practical for the current toolchain.
59
+
60
+ <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>
61
+
62
+ The _amazing_ test matrix is powered by the kettle-dev stack.
63
+
64
+ <details markdown="1">
65
+ <summary>How kettle-dev manages complexity in tests</summary>
66
+
67
+ | Gem | Source | Role | Total downloads |
68
+ |-----|--------|------|---------------------|
69
+ | [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) |
70
+ | [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) |
71
+ | [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) |
72
+ | [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) |
73
+ | [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) |
74
+ | [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) |
75
+ | [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) |
76
+ | [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) |
77
+
78
+ </details>
79
+
80
+ ## ✨ Installation
81
+
82
+ Install the gem and add to the application's Gemfile by executing:
83
+
84
+ ```console
85
+ bundle add plain-merge
86
+ ```
87
+
88
+ If bundler is not being used to manage dependencies, install the gem by executing:
89
+
90
+ ```console
91
+ gem install plain-merge
92
+ ```
93
+
94
+ ## ⚙️ Configuration
95
+
96
+ The default similarity threshold is `Plain::Merge::DEFAULT_TEXT_REFINEMENT_THRESHOLD`. Use `Plain::Merge.is_similar(left, right, threshold)` when a caller needs to decide whether a text fallback is acceptable.
97
+
98
+ `Plain::Merge.text_feature_profile` returns the family profile used by conformance runners.
99
+
100
+ ## 🔧 Basic Usage
101
+
102
+ ```ruby
103
+ require "plain/merge"
104
+
105
+ result = Plain::Merge.merge_text(
106
+ File.read("template.txt"),
107
+ File.read("notes.txt"),
108
+ )
109
+
110
+ abort result.fetch(:diagnostics).inspect unless result.fetch(:ok)
111
+ File.write("notes.txt", result.fetch(:output))
112
+ ```
113
+
114
+ ## 🔐 Security
115
+
116
+ See [SECURITY.md][🔐security].
117
+
118
+ ## 🤝 Contributing
119
+
120
+ If you need some ideas of where to help, you could work on adding more code coverage,
121
+ or if it is already 💯 (see [below](#code-coverage)) check [issues][🤝gh-issues] or [PRs][🤝gh-pulls],
122
+ or use the gem and think about how it could be better.
123
+
124
+ We [![Keep A Changelog][📗keep-changelog-img]][📗keep-changelog] so if you make changes, remember to update it.
125
+
126
+ See [CONTRIBUTING.md][🤝contributing] for more detailed instructions.
127
+
128
+ ### Code Coverage
129
+
130
+ <details markdown="1">
131
+ <summary>Coverage service badges</summary>
132
+
133
+ </details>
134
+
135
+ ## 📌 Versioning
136
+
137
+ This library follows [![Semantic Versioning 2.0.0][📌semver-img]][📌semver] for its public API where practical.
138
+ For most applications, prefer the [Pessimistic Version Constraint][📌pvc] with two digits of precision.
139
+
140
+ For example:
141
+
142
+ ```ruby
143
+ spec.add_dependency("plain-merge", "~> 7.0")
144
+ ```
145
+
146
+ <details markdown="1">
147
+ <summary>📌 Is "Platform Support" part of the public API? More details inside.</summary>
148
+
149
+ Dropping support for a platform can be a breaking change for affected users.
150
+ If a release changes supported platforms, it should be called out clearly in the changelog and versioned with that impact in mind.
151
+
152
+ To get a better understanding of how SemVer is intended to work over a project's lifetime,
153
+ read this article from the creator of SemVer:
154
+
155
+ - ["Major Version Numbers are Not Sacred"][📌major-versions-not-sacred]
156
+
157
+ </details>
158
+
159
+ See [CHANGELOG.md][📌changelog] for a list of releases.
160
+
161
+ ## 📄 License
162
+
163
+ 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).
164
+ See [LICENSE.md][📄license] for details.
165
+
166
+ If none of the available licenses suit your use case, please [contact us](mailto:floss@galtzo.com) to discuss a custom commercial license.
167
+
168
+ [⛳liberapay-img]: https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay&color=a51611&style=flat
169
+ [⛳liberapay-bottom-img]: https://img.shields.io/liberapay/goal/pboling.svg?style=for-the-badge&logo=liberapay&color=a51611
170
+ [⛳liberapay]: https://liberapay.com/pboling/donate
171
+ [🖇sponsor-img]: https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social&logo=github
172
+ [🖇sponsor-bottom-img]: https://img.shields.io/badge/Sponsor_Me!-pboling-blue?style=for-the-badge&logo=github
173
+ [🖇sponsor]: https://github.com/sponsors/pboling
174
+ [🖇kofi-img]: https://img.shields.io/badge/ko--fi-%E2%9C%93-a51611.svg?style=flat
175
+ [🖇kofi]: https://ko-fi.com/pboling
176
+ [🖇buyme-small-img]: https://img.shields.io/badge/buy_me_a_coffee-%E2%9C%93-a51611.svg?style=flat
177
+ [🖇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
178
+ [🖇buyme]: https://www.buymeacoffee.com/pboling
179
+ [🖇paypal-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=flat&logo=paypal
180
+ [🖇paypal-bottom-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=for-the-badge&logo=paypal&color=0A0A0A
181
+ [🖇paypal]: https://www.paypal.com/paypalme/peterboling
182
+ [🖇floss-funding.dev]: https://floss-funding.dev
183
+ [🖇floss-funding-gem]: https://github.com/galtzo-floss/floss_funding
184
+ [✉️discord-invite]: https://discord.gg/3qme4XHNKN
185
+ [✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord
186
+ [✉️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
187
+ [✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends
188
+ [✉️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
189
+ [✉️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
190
+ [✉️ruby-forum]: https://www.rubyforum.org/tag/structuredmerge
191
+ [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780
192
+ [⛳️gem-namespace]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/plain-merge
193
+ [⛳️namespace-img]: https://img.shields.io/badge/namespace-Plain::Merge-3C2D2D.svg?style=square&logo=ruby&logoColor=white
194
+ [⛳️gem-name]: https://clickgems.clickhouse.com/dashboard/plain-merge
195
+ [⛳️name-img]: https://img.shields.io/badge/name-plain--merge-3C2D2D.svg?style=square&logo=rubygems&logoColor=red
196
+ [⛳️tag-img]: https://img.shields.io/github/tag/structuredmerge/structuredmerge-ruby.svg
197
+ [⛳️tag]: https://github.com/structuredmerge/structuredmerge-ruby/releases
198
+ [🚂maint-blog]: http://www.railsbling.com/tags/plain-merge
199
+ [🚂maint-blog-img]: https://img.shields.io/badge/blog-railsbling-0093D0.svg?style=for-the-badge&logo=rubyonrails&logoColor=orange
200
+ [🚂maint-contact]: http://www.railsbling.com/contact
201
+ [🚂maint-contact-img]: https://img.shields.io/badge/Contact-Maintainer-0093D0.svg?style=flat&logo=rubyonrails&logoColor=red
202
+ [💖🖇linkedin]: http://www.linkedin.com/in/peterboling
203
+ [💖🖇linkedin-img]: https://img.shields.io/badge/LinkedIn-Profile-0B66C2?style=flat&logo=newjapanprowrestling
204
+ [💖✌️wellfound]: https://wellfound.com/u/peter-boling
205
+ [💖✌️wellfound-img]: https://img.shields.io/badge/peter--boling-orange?style=flat&logo=wellfound
206
+ [💖💲crunchbase]: https://www.crunchbase.com/person/peter-boling
207
+ [💖💲crunchbase-img]: https://img.shields.io/badge/peter--boling-purple?style=flat&logo=crunchbase
208
+ [💖🐘ruby-mast]: https://ruby.social/@galtzo
209
+ [💖🐘ruby-mast-img]: https://img.shields.io/mastodon/follow/109447111526622197?domain=https://ruby.social&style=flat&logo=mastodon&label=Ruby%20@galtzo
210
+ [💖🦋bluesky]: https://bsky.app/profile/galtzo.com
211
+ [💖🦋bluesky-img]: https://img.shields.io/badge/@galtzo.com-0285FF?style=flat&logo=bluesky&logoColor=white
212
+ [💖🌳linktree]: https://linktr.ee/galtzo
213
+ [💖🌳linktree-img]: https://img.shields.io/badge/galtzo-purple?style=flat&logo=linktree
214
+ [💖💁🏼‍♂️devto]: https://dev.to/galtzo
215
+ [💖💁🏼‍♂️devto-img]: https://img.shields.io/badge/dev.to-0A0A0A?style=flat&logo=devdotto&logoColor=white
216
+ [💖💁🏼‍♂️aboutme]: https://about.me/peter.boling
217
+ [💖💁🏼‍♂️aboutme-img]: https://img.shields.io/badge/about.me-0A0A0A?style=flat&logo=aboutme&logoColor=white
218
+ [💖🧊berg]: https://codeberg.org/pboling
219
+ [💖🐙hub]: https://github.org/pboling
220
+ [💖🛖hut]: https://sr.ht/~galtzo/
221
+ [💖🧪lab]: https://gitlab.com/pboling
222
+ [👨🏼‍🏫expsup-upwork]: https://www.upwork.com/freelancers/~014942e9b056abdf86?mp_source=share
223
+ [👨🏼‍🏫expsup-upwork-img]: https://img.shields.io/badge/UpWork-13544E?style=for-the-badge&logo=Upwork&logoColor=white
224
+ [👨🏼‍🏫expsup-codementor]: https://www.codementor.io/peterboling?utm_source=github&utm_medium=button&utm_term=peterboling&utm_campaign=github
225
+ [👨🏼‍🏫expsup-codementor-img]: https://img.shields.io/badge/CodeMentor-Get_Help-1abc9c?style=for-the-badge&logo=CodeMentor&logoColor=white
226
+ [🏙️entsup-tidelift]: https://tidelift.com/subscription/pkg/rubygems-plain-merge?utm_source=rubygems-plain-merge&utm_medium=referral&utm_campaign=readme
227
+ [🏙️entsup-tidelift-img]: https://img.shields.io/badge/Tidelift_and_Sonar-Enterprise_Support-FD3456?style=for-the-badge&logo=sonar&logoColor=white
228
+ [🏙️entsup-tidelift-sonar]: https://blog.tidelift.com/tidelift-joins-sonar
229
+ [💁🏼‍♂️peterboling]: http://www.peterboling.com
230
+ [🚂railsbling]: http://www.railsbling.com
231
+ [📜src-gl-img]: https://img.shields.io/badge/GitLab-FBA326?style=for-the-badge&logo=Gitlab&logoColor=orange
232
+ [📜src-gl]: https://gitlab.com/structuredmerge/structuredmerge-ruby/-/tree/main/gems/plain-merge
233
+ [📜src-cb-img]: https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge&logo=CodeBerg&logoColor=blue
234
+ [📜src-cb]: https://codeberg.org/structuredmerge/structuredmerge-ruby/src/branch/main/gems/plain-merge
235
+ [📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=GitHub&logoColor=green
236
+ [📜src-gh]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/plain-merge
237
+ [📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
238
+ [📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
239
+ [📜gl-wiki]: https://gitlab.com/structuredmerge/structuredmerge-ruby/-/wikis/home
240
+ [📜gh-wiki]: https://github.com/structuredmerge/structuredmerge-ruby/wiki
241
+ [📜gl-wiki-img]: https://img.shields.io/badge/wiki-gitlab-943CD2.svg?style=for-the-badge&logo=gitlab&logoColor=white
242
+ [📜gh-wiki-img]: https://img.shields.io/badge/wiki-github-943CD2.svg?style=for-the-badge&logo=github&logoColor=white
243
+ [👽dl-rank]: https://clickgems.clickhouse.com/dashboard/plain-merge
244
+ [👽dl-ranki]: https://img.shields.io/gem/dt/plain-merge.svg
245
+ [👽version]: https://clickgems.clickhouse.com/dashboard/plain-merge
246
+ [👽versioni]: https://img.shields.io/gem/v/plain-merge.svg
247
+ [🚎11-c-wf]: https://github.com/structuredmerge/structuredmerge-ruby/actions/workflows/current.yml
248
+ [🚎11-c-wfi]: https://github.com/structuredmerge/structuredmerge-ruby/actions/workflows/current.yml/badge.svg
249
+ [💎ruby-c-i]: https://img.shields.io/badge/Ruby-current-CC342D?style=for-the-badge&logo=ruby&logoColor=green
250
+ [🤝gh-issues]: https://github.com/structuredmerge/structuredmerge-ruby/issues
251
+ [🤝gh-pulls]: https://github.com/structuredmerge/structuredmerge-ruby/pulls
252
+ [🤝gl-issues]: https://gitlab.com/structuredmerge/structuredmerge-ruby/-/issues
253
+ [🤝gl-pulls]: https://gitlab.com/structuredmerge/structuredmerge-ruby/-/merge_requests
254
+ [🤝cb-issues]: https://codeberg.org/structuredmerge/structuredmerge-ruby/issues
255
+ [🤝cb-pulls]: https://codeberg.org/structuredmerge/structuredmerge-ruby/pulls
256
+ [🤝cb-donate]: https://donate.codeberg.org/
257
+ [🤝contributing]: https://github.com/structuredmerge/structuredmerge-ruby/blob/main/CONTRIBUTING.md
258
+ [🖐contrib-rocks]: https://contrib.rocks
259
+ [🖐contributors]: https://github.com/structuredmerge/structuredmerge-ruby/graphs/contributors
260
+ [🖐contributors-img]: https://contrib.rocks/image?repo=structuredmerge/structuredmerge-ruby
261
+ [🪇conduct]: https://github.com/structuredmerge/structuredmerge-ruby/blob/main/CODE_OF_CONDUCT.md
262
+ [🪇conduct-img]: https://img.shields.io/badge/Contributor_Covenant-2.1-259D6C.svg
263
+ [📌pvc]: http://guides.rubygems.org/patterns/#pessimistic-version-constraint
264
+ [📌semver]: https://semver.org/spec/v2.0.0.html
265
+ [📌semver-img]: https://img.shields.io/badge/semver-2.0.0-259D6C.svg?style=flat
266
+ [📌semver-breaking]: https://github.com/semver/semver/issues/716#issuecomment-869336139
267
+ [📌major-versions-not-sacred]: https://tom.preston-werner.com/2022/05/23/major-version-numbers-are-not-sacred.html
268
+ [📌changelog]: https://github.com/structuredmerge/structuredmerge-ruby/blob/main/CHANGELOG.md
269
+ [📗keep-changelog]: https://keepachangelog.com/en/1.0.0/
270
+ [📗keep-changelog-img]: https://img.shields.io/badge/keep--a--changelog-1.0.0-34495e.svg?style=flat
271
+ [📌gitmoji]: https://gitmoji.dev
272
+ [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
273
+ [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
274
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-0.164-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
275
+ [🔐security]: https://github.com/structuredmerge/structuredmerge-ruby/blob/main/SECURITY.md
276
+ [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
277
+ [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
278
+ [📄license]: LICENSE.md
279
+ [📄license-ref]: LICENSE.md
280
+ [📄license-img]: https://img.shields.io/badge/License-AGPL--3.0--only_OR_PolyForm--Small--Business--1.0.0-259D6C.svg
281
+ [📄license-compat]: https://www.apache.org/legal/resolved.html#category-x
282
+ [📄license-compat-img]: https://img.shields.io/badge/Apache_Incompatible:_Category_X-%E2%9C%97-C0392B.svg?style=flat&logo=Apache
283
+ [📄ilo-declaration]: https://www.ilo.org/declaration/lang--en/index.htm
284
+ [📄ilo-declaration-img]: https://img.shields.io/badge/ILO_Fundamental_Principles-✓-259D6C.svg?style=flat
285
+ [🚎yard-current]: http://rubydoc.info/gems/plain-merge
286
+ [🚎yard-head]: https://plain-merge.galtzo.com
287
+ [💎stone_checksums]: https://github.com/galtzo-floss/stone_checksums
288
+ [💎SHA_checksums]: https://gitlab.com/structuredmerge/structuredmerge-ruby/-/tree/main/checksums
289
+ [💎rlts]: https://github.com/rubocop-lts/rubocop-lts
290
+ [💎rlts-img]: https://img.shields.io/badge/code_style_&_linting-rubocop--lts-34495e.svg?plastic&logo=ruby&logoColor=white
291
+ [💎appraisal2]: https://github.com/appraisal-rb/appraisal2
292
+ [💎appraisal2-img]: https://img.shields.io/badge/appraised_by-appraisal2-34495e.svg?plastic&logo=ruby&logoColor=white
293
+ [💎d-in-dvcs]: https://railsbling.com/posts/dvcs/put_the_d_in_dvcs/
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Plain
4
+ # StructuredMerge plain text fallback behavior.
5
+ module Merge
6
+ BACKEND_REFERENCE = TreeHaver::BackendReference.new(id: 'plain-line', family: 'line')
7
+
8
+ module Backend
9
+ # TreeHaver language wrapper for plain text parsed into normalized line
10
+ # and paragraph/block ownership data.
11
+ class Language < TreeHaver::Base::Language
12
+ def initialize(name = :text)
13
+ super(name, backend: :line, options: {})
14
+ end
15
+
16
+ def self.text
17
+ new(:text)
18
+ end
19
+
20
+ def self.plain
21
+ new(:plain)
22
+ end
23
+ end
24
+
25
+ # Parser adapter that exposes plain text analysis through TreeHaver's
26
+ # normalized backend registry.
27
+ class Parser < TreeHaver::Base::Parser
28
+ def parse(source)
29
+ raise 'Language not set' unless language
30
+
31
+ Plain::Merge.analyze_text(source)
32
+ end
33
+
34
+ def parse_string(_old_tree, source)
35
+ parse(source)
36
+ end
37
+ end
38
+ end
39
+
40
+ def self.register_backend!
41
+ TreeHaver::BackendRegistry.register(BACKEND_REFERENCE)
42
+ %i[text plain].each do |language_name|
43
+ register_language!(language_name)
44
+ end
45
+ nil
46
+ end
47
+
48
+ def self.register_language!(language_name)
49
+ TreeHaver.register_language(
50
+ language_name,
51
+ backend_module: Backend,
52
+ backend_type: :line,
53
+ gem_name: 'plain-merge',
54
+ contract: :line
55
+ )
56
+ end
57
+ end
58
+ end
@@ -2,10 +2,12 @@
2
2
 
3
3
  module Plain
4
4
  module Merge
5
+ # Version namespace for this gem.
5
6
  module Version
6
- VERSION = "7.0.0"
7
+ # Current gem version.
8
+ VERSION = '7.1.1'
7
9
  end
8
-
9
- VERSION = Version::VERSION
10
+ # Current gem version exposed at the traditional constant location.
11
+ VERSION = Version::VERSION # Traditional Constant Location
10
12
  end
11
13
  end
data/lib/plain/merge.rb CHANGED
@@ -1,10 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "tree_haver"
3
+ require 'tree_haver'
4
+ require_relative 'merge/version'
4
5
 
5
6
  module Plain
6
7
  module Merge
7
- PACKAGE_NAME = "plain-merge"
8
+ PACKAGE_NAME = 'plain-merge'
8
9
  DEFAULT_TEXT_REFINEMENT_THRESHOLD = 0.7
9
10
  DEFAULT_TEXT_REFINEMENT_WEIGHTS = {
10
11
  content: 0.7,
@@ -16,14 +17,14 @@ module Plain
16
17
 
17
18
  def text_feature_profile
18
19
  {
19
- family: "text",
20
+ family: 'text',
20
21
  supported_dialects: [],
21
22
  supported_policies: []
22
23
  }
23
24
  end
24
25
 
25
26
  def text_parse_request(source)
26
- TreeHaver::ParserRequest.new(source: source, language: "text")
27
+ TreeHaver::ParserRequest.new(source: source, language: 'text')
27
28
  end
28
29
 
29
30
  def normalize_text(source)
@@ -31,7 +32,7 @@ module Plain
31
32
  .gsub(/\r\n?/, "\n")
32
33
  .strip
33
34
  .split(/\n\s*\n+/)
34
- .map { |block| block.strip.gsub(/\s+/, " ") }
35
+ .map { |block| block.strip.gsub(/\s+/, ' ') }
35
36
  .reject(&:empty?)
36
37
  .join("\n\n")
37
38
  end
@@ -57,7 +58,7 @@ module Plain
57
58
  end
58
59
 
59
60
  {
60
- kind: "text",
61
+ kind: 'text',
61
62
  normalized_source: normalized_source,
62
63
  blocks: blocks
63
64
  }
@@ -101,20 +102,17 @@ module Plain
101
102
  template_index = template[:blocks].find_index.with_index do |template_block, candidate_index|
102
103
  !matched_template[candidate_index] && template_block[:normalized] == destination_block[:normalized]
103
104
  end
104
- next unless template_index
105
-
106
- matched_template[template_index] = true
107
- matched_destination[destination_index] = true
108
- matched << {
109
- template_index: template_index,
110
- destination_index: destination_index,
111
- phase: "exact",
112
- score: 1.0
113
- }
114
- end
115
-
116
- destination[:blocks].each_with_index do |destination_block, destination_index|
117
- next if matched_destination[destination_index]
105
+ if template_index
106
+ matched_template[template_index] = true
107
+ matched_destination[destination_index] = true
108
+ matched << {
109
+ template_index: template_index,
110
+ destination_index: destination_index,
111
+ phase: 'exact',
112
+ score: 1.0
113
+ }
114
+ next
115
+ end
118
116
 
119
117
  best_template_index = nil
120
118
  best_score = 0.0
@@ -140,7 +138,7 @@ module Plain
140
138
  matched << {
141
139
  template_index: best_template_index,
142
140
  destination_index: destination_index,
143
- phase: "refined",
141
+ phase: 'refined',
144
142
  score: best_score
145
143
  }
146
144
  end
@@ -172,7 +170,8 @@ module Plain
172
170
  }
173
171
  end
174
172
 
175
- def refined_text_similarity(template_block, destination_block, template_total, destination_total, weights = DEFAULT_TEXT_REFINEMENT_WEIGHTS)
173
+ def refined_text_similarity(template_block, destination_block, template_total, destination_total,
174
+ weights = DEFAULT_TEXT_REFINEMENT_WEIGHTS)
176
175
  content = string_similarity(template_block[:normalized], destination_block[:normalized])
177
176
  length = length_similarity(template_block[:normalized], destination_block[:normalized])
178
177
  position = position_similarity(
@@ -239,6 +238,7 @@ module Plain
239
238
 
240
239
  def length_similarity(left, right)
241
240
  return 1.0 if left.length == right.length
241
+
242
242
  max_length = [left.length, right.length].max
243
243
  return 1.0 if max_length.zero?
244
244
 
@@ -260,3 +260,6 @@ module Plain
260
260
  private_class_method :position_similarity
261
261
  end
262
262
  end
263
+
264
+ require_relative 'merge/backend'
265
+ Plain::Merge.register_backend!
data/lib/plain-merge.rb CHANGED
@@ -1,3 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "plain/merge"
3
+ require_relative 'plain/merge'
4
+ require 'version_gem'
5
+ require_relative 'plain/merge/version'
6
+
7
+ Plain::Merge::Version.class_eval do
8
+ extend VersionGem::Basic
9
+ end
@@ -0,0 +1,8 @@
1
+ module Plain
2
+ module Merge
3
+ module Version
4
+ VERSION: String
5
+ end
6
+ VERSION: String
7
+ end
8
+ end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,11 +1,11 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: plain-merge
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.0.0
4
+ version: 7.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
8
- bindir: bin
8
+ bindir: exe
9
9
  cert_chain:
10
10
  - |
11
11
  -----BEGIN CERTIFICATE-----
@@ -43,54 +43,291 @@ dependencies:
43
43
  requirements:
44
44
  - - '='
45
45
  - !ruby/object:Gem::Version
46
- version: 7.0.0
46
+ version: 7.1.1
47
47
  type: :runtime
48
48
  prerelease: false
49
49
  version_requirements: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - '='
52
52
  - !ruby/object:Gem::Version
53
- version: 7.0.0
53
+ version: 7.1.1
54
54
  - !ruby/object:Gem::Dependency
55
55
  name: tree_haver
56
56
  requirement: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - '='
59
59
  - !ruby/object:Gem::Version
60
- version: 7.0.0
60
+ version: 7.1.1
61
61
  type: :runtime
62
62
  prerelease: false
63
63
  version_requirements: !ruby/object:Gem::Requirement
64
64
  requirements:
65
65
  - - '='
66
66
  - !ruby/object:Gem::Version
67
- version: 7.0.0
68
- description: Portable text normalization, similarity, matching, and merge behavior
69
- for Structured Merge.
67
+ version: 7.1.1
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: '2.5'
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: 2.5.17
98
+ type: :development
99
+ prerelease: false
100
+ version_requirements: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: '2.5'
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: 2.5.17
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.0
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.0
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.19
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.19
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.4
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.4
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.8
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.8
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.11
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.11
290
+ description: "☯️ Portable text normalization, similarity, matching, and merge behavior
291
+ for Structured Merge."
70
292
  email:
71
- - info@structuredmerge.org
293
+ - floss@galtzo.com
72
294
  executables: []
73
295
  extensions: []
74
296
  extra_rdoc_files: []
75
297
  files:
298
+ - LICENSE.md
299
+ - README.md
76
300
  - lib/plain-merge.rb
77
301
  - lib/plain/merge.rb
302
+ - lib/plain/merge/backend.rb
78
303
  - lib/plain/merge/version.rb
304
+ - sig/plain/merge.rbs
79
305
  homepage: https://github.com/structuredmerge/structuredmerge-ruby
80
306
  licenses:
81
307
  - AGPL-3.0-only
82
308
  - PolyForm-Small-Business-1.0.0
83
309
  metadata:
84
310
  homepage_uri: https://structuredmerge.org
85
- source_code_uri: https://github.com/structuredmerge/structuredmerge-ruby/tree/v7.0.0
86
- changelog_uri: https://github.com/structuredmerge/structuredmerge-ruby/blob/v7.0.0/CHANGELOG.md
311
+ source_code_uri: https://github.com/structuredmerge/structuredmerge-ruby/tree/v7.1.1
312
+ changelog_uri: https://github.com/structuredmerge/structuredmerge-ruby/blob/v7.1.1/CHANGELOG.md
87
313
  bug_tracker_uri: https://github.com/structuredmerge/structuredmerge-ruby/issues
88
- documentation_uri: https://www.rubydoc.info/gems/plain-merge/7.0.0
314
+ documentation_uri: https://www.rubydoc.info/gems/plain-merge/7.1.1
89
315
  funding_uri: https://github.com/sponsors/pboling
90
316
  wiki_uri: https://github.com/structuredmerge/structuredmerge-ruby/wiki
317
+ news_uri: https://www.railsbling.com/tags/plain-merge
91
318
  discord_uri: https://discord.gg/3qme4XHNKN
319
+ mailing_list_uri: https://www.rubyforum.org/tag/structuredmerge
92
320
  rubygems_mfa_required: 'true'
93
- rdoc_options: []
321
+ rdoc_options:
322
+ - "--title"
323
+ - plain-merge - ☯️ Structured Merge plain text analysis and merge for Ruby
324
+ - "--main"
325
+ - README.md
326
+ - "--exclude"
327
+ - "^sig/"
328
+ - "--line-numbers"
329
+ - "--inline-source"
330
+ - "--quiet"
94
331
  require_paths:
95
332
  - lib
96
333
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -104,7 +341,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
104
341
  - !ruby/object:Gem::Version
105
342
  version: '0'
106
343
  requirements: []
107
- rubygems_version: 4.0.10
344
+ rubygems_version: 4.0.17
108
345
  specification_version: 4
109
- summary: Structured Merge plain text analysis and merge for Ruby
346
+ summary: "☯️ Structured Merge plain text analysis and merge for Ruby"
110
347
  test_files: []
metadata.gz.sig CHANGED
Binary file