binary-merge 7.0.0 → 7.1.3

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: b349575345081a53402e6ea2e04998d863b7acdcfc327037ef60591aafdc1d9d
4
- data.tar.gz: 3a5f7b7eb71932cf7845b92204dd3c71520472f455b75a9463850763f5d9fbcd
3
+ metadata.gz: e44595c3208c046ae8140cc0151c9202f79173c8bf6a2a0c04ffc9d898320ddf
4
+ data.tar.gz: 5b52152c70810249660103bb8440b3e67f63c8618a12d6b86ca9a14b6b939f7b
5
5
  SHA512:
6
- metadata.gz: f68920281184c993ed61ea09b4cbbda1cbb1edf73ed1b8dee5a0a4936d1895d2b0281ab686d6de5766f963c4e8a9b77c4317ca522c6626434a38888f59439713
7
- data.tar.gz: e45e8bd9237ae78ae12778737531a736b5a62664e1bab6d63e6ddc17cb24616d3d459a08a3502745e4021e200341c8c598eef73f63f5e33f184328ea0db181a3
6
+ metadata.gz: 172e31e494e2f283239071cee63f26ea8e79948acc06c4f9752713f18d6a3fd3e9da8a5755c5d4e29edf8c0fdd6586434bac4b8b3f5f367d6e49c7397af31e24
7
+ data.tar.gz: 1fcf18dbbaf050c487b8f59eedc442d57b79c1bb8c2240d4ac2a415e431f1fc41dd0e5d726b2c118e2e8cc7c23c77e33b9ac3a39a0fac8994719260e3e1c6727
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,286 @@
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
+ # ☯️ Binary::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
+ `Binary::Merge` is the StructuredMerge substrate for Kaitai-style binary merge
25
+ families. It does not pretend arbitrary bytes are structurally mergeable;
26
+ instead, it records byte ranges, render policies, preservation decisions, and
27
+ unsafe mutation diagnostics for schema-specific parser gems such as
28
+ `zip-merge`.
29
+
30
+ ### Key Features
31
+
32
+ - Binary feature profile for fixture runners.
33
+ - Render policy helpers for schema-aware binary renderers.
34
+ - Unsafe mutation diagnostics with byte ranges.
35
+ - Preservation reports for callers that can safely retain raw byte ranges.
36
+ - Shared substrate vocabulary for Kaitai-family parser gems such as
37
+ `zip-merge`.
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+, 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 binary-merge
86
+ ```
87
+
88
+ If bundler is not being used to manage dependencies, install the gem by executing:
89
+
90
+ ```console
91
+ gem install binary-merge
92
+ ```
93
+
94
+ ## ⚙️ Configuration
95
+
96
+ `Binary::Merge` has no global parser configuration. Schema-specific parser gems
97
+ register their own TreeHaver parser paths and use this package for shared
98
+ binary-family reporting and renderer-planning behavior.
99
+
100
+ ## 🔧 Basic Usage
101
+
102
+ ```ruby
103
+ require "binary/merge"
104
+
105
+ report = Binary::Merge.preservation_report(
106
+ format: "custom-binary",
107
+ schema: "custom.ksy",
108
+ matched_schema_paths: ["/header"],
109
+ preserved_ranges: [TreeHaver::ByteRange.new(start_byte: 0, end_byte: 16)],
110
+ )
111
+
112
+ puts report.format
113
+ ```
114
+
115
+ ## 🔐 Security
116
+
117
+ See [SECURITY.md][🔐security].
118
+
119
+ ## 🤝 Contributing
120
+
121
+ If you need some ideas of where to help, you could work on adding more code coverage,
122
+ check [issues][🤝gh-issues] or [PRs][🤝gh-pulls], 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
+ ## 📌 Versioning
129
+
130
+ This library follows [![Semantic Versioning 2.0.0][📌semver-img]][📌semver] for its public API where practical.
131
+ For most applications, prefer the [Pessimistic Version Constraint][📌pvc] with two digits of precision.
132
+
133
+ For example:
134
+
135
+ ```ruby
136
+ spec.add_dependency("binary-merge", "~> 7.0")
137
+ ```
138
+
139
+ <details markdown="1">
140
+ <summary>📌 Is "Platform Support" part of the public API? More details inside.</summary>
141
+
142
+ Dropping support for a platform can be a breaking change for affected users.
143
+ If a release changes supported platforms, it should be called out clearly in the changelog and versioned with that impact in mind.
144
+
145
+ To get a better understanding of how SemVer is intended to work over a project's lifetime,
146
+ read this article from the creator of SemVer:
147
+
148
+ - ["Major Version Numbers are Not Sacred"][📌major-versions-not-sacred]
149
+
150
+ </details>
151
+
152
+ See [CHANGELOG.md][📌changelog] for a list of releases.
153
+
154
+ ## 📄 License
155
+
156
+ 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).
157
+ See [LICENSE.md][📄license] for details.
158
+
159
+ If none of the available licenses suit your use case, please [contact us](mailto:floss@galtzo.com) to discuss a custom commercial license.
160
+
161
+ [⛳liberapay-img]: https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay&color=a51611&style=flat
162
+ [⛳liberapay-bottom-img]: https://img.shields.io/liberapay/goal/pboling.svg?style=for-the-badge&logo=liberapay&color=a51611
163
+ [⛳liberapay]: https://liberapay.com/pboling/donate
164
+ [🖇sponsor-img]: https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social&logo=github
165
+ [🖇sponsor-bottom-img]: https://img.shields.io/badge/Sponsor_Me!-pboling-blue?style=for-the-badge&logo=github
166
+ [🖇sponsor]: https://github.com/sponsors/pboling
167
+ [🖇kofi-img]: https://img.shields.io/badge/ko--fi-%E2%9C%93-a51611.svg?style=flat
168
+ [🖇kofi]: https://ko-fi.com/pboling
169
+ [🖇buyme-small-img]: https://img.shields.io/badge/buy_me_a_coffee-%E2%9C%93-a51611.svg?style=flat
170
+ [🖇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
171
+ [🖇buyme]: https://www.buymeacoffee.com/pboling
172
+ [🖇paypal-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=flat&logo=paypal
173
+ [🖇paypal-bottom-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=for-the-badge&logo=paypal&color=0A0A0A
174
+ [🖇paypal]: https://www.paypal.com/paypalme/peterboling
175
+ [🖇floss-funding.dev]: https://floss-funding.dev
176
+ [🖇floss-funding-gem]: https://github.com/galtzo-floss/floss_funding
177
+ [✉️discord-invite]: https://discord.gg/3qme4XHNKN
178
+ [✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord
179
+ [✉️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
180
+ [✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends
181
+ [✉️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
182
+ [✉️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
183
+ [✉️ruby-forum]: https://www.rubyforum.org/tag/structuredmerge
184
+ [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780
185
+ [⛳️gem-namespace]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/binary-merge
186
+ [⛳️namespace-img]: https://img.shields.io/badge/namespace-Binary::Merge-3C2D2D.svg?style=square&logo=ruby&logoColor=white
187
+ [⛳️gem-name]: https://clickgems.clickhouse.com/dashboard/binary-merge
188
+ [⛳️name-img]: https://img.shields.io/badge/name-binary--merge-3C2D2D.svg?style=square&logo=rubygems&logoColor=red
189
+ [⛳️tag-img]: https://img.shields.io/github/tag/structuredmerge/structuredmerge-ruby.svg
190
+ [⛳️tag]: https://github.com/structuredmerge/structuredmerge-ruby/releases
191
+ [🚂maint-blog]: http://www.railsbling.com/tags/binary-merge
192
+ [🚂maint-blog-img]: https://img.shields.io/badge/blog-railsbling-0093D0.svg?style=for-the-badge&logo=rubyonrails&logoColor=orange
193
+ [🚂maint-contact]: http://www.railsbling.com/contact
194
+ [🚂maint-contact-img]: https://img.shields.io/badge/Contact-Maintainer-0093D0.svg?style=flat&logo=rubyonrails&logoColor=red
195
+ [💖🖇linkedin]: http://www.linkedin.com/in/peterboling
196
+ [💖🖇linkedin-img]: https://img.shields.io/badge/LinkedIn-Profile-0B66C2?style=flat&logo=newjapanprowrestling
197
+ [💖✌️wellfound]: https://wellfound.com/u/peter-boling
198
+ [💖✌️wellfound-img]: https://img.shields.io/badge/peter--boling-orange?style=flat&logo=wellfound
199
+ [💖💲crunchbase]: https://www.crunchbase.com/person/peter-boling
200
+ [💖💲crunchbase-img]: https://img.shields.io/badge/peter--boling-purple?style=flat&logo=crunchbase
201
+ [💖🐘ruby-mast]: https://ruby.social/@galtzo
202
+ [💖🐘ruby-mast-img]: https://img.shields.io/mastodon/follow/109447111526622197?domain=https://ruby.social&style=flat&logo=mastodon&label=Ruby%20@galtzo
203
+ [💖🦋bluesky]: https://bsky.app/profile/galtzo.com
204
+ [💖🦋bluesky-img]: https://img.shields.io/badge/@galtzo.com-0285FF?style=flat&logo=bluesky&logoColor=white
205
+ [💖🌳linktree]: https://linktr.ee/galtzo
206
+ [💖🌳linktree-img]: https://img.shields.io/badge/galtzo-purple?style=flat&logo=linktree
207
+ [💖💁🏼‍♂️devto]: https://dev.to/galtzo
208
+ [💖💁🏼‍♂️devto-img]: https://img.shields.io/badge/dev.to-0A0A0A?style=flat&logo=devdotto&logoColor=white
209
+ [💖💁🏼‍♂️aboutme]: https://about.me/peter.boling
210
+ [💖💁🏼‍♂️aboutme-img]: https://img.shields.io/badge/about.me-0A0A0A?style=flat&logo=aboutme&logoColor=white
211
+ [💖🧊berg]: https://codeberg.org/pboling
212
+ [💖🐙hub]: https://github.org/pboling
213
+ [💖🛖hut]: https://sr.ht/~galtzo/
214
+ [💖🧪lab]: https://gitlab.com/pboling
215
+ [👨🏼‍🏫expsup-upwork]: https://www.upwork.com/freelancers/~014942e9b056abdf86?mp_source=share
216
+ [👨🏼‍🏫expsup-upwork-img]: https://img.shields.io/badge/UpWork-13544E?style=for-the-badge&logo=Upwork&logoColor=white
217
+ [👨🏼‍🏫expsup-codementor]: https://www.codementor.io/peterboling?utm_source=github&utm_medium=button&utm_term=peterboling&utm_campaign=github
218
+ [👨🏼‍🏫expsup-codementor-img]: https://img.shields.io/badge/CodeMentor-Get_Help-1abc9c?style=for-the-badge&logo=CodeMentor&logoColor=white
219
+ [🏙️entsup-tidelift]: https://tidelift.com/subscription/pkg/rubygems-binary-merge?utm_source=rubygems-binary-merge&utm_medium=referral&utm_campaign=readme
220
+ [🏙️entsup-tidelift-img]: https://img.shields.io/badge/Tidelift_and_Sonar-Enterprise_Support-FD3456?style=for-the-badge&logo=sonar&logoColor=white
221
+ [🏙️entsup-tidelift-sonar]: https://blog.tidelift.com/tidelift-joins-sonar
222
+ [💁🏼‍♂️peterboling]: http://www.peterboling.com
223
+ [🚂railsbling]: http://www.railsbling.com
224
+ [📜src-gl-img]: https://img.shields.io/badge/GitLab-FBA326?style=for-the-badge&logo=Gitlab&logoColor=orange
225
+ [📜src-gl]: https://gitlab.com/structuredmerge/structuredmerge-ruby/-/tree/main/gems/binary-merge
226
+ [📜src-cb-img]: https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge&logo=CodeBerg&logoColor=blue
227
+ [📜src-cb]: https://codeberg.org/structuredmerge/structuredmerge-ruby/src/branch/main/gems/binary-merge
228
+ [📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=GitHub&logoColor=green
229
+ [📜src-gh]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/binary-merge
230
+ [📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
231
+ [📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white
232
+ [📜gl-wiki]: https://gitlab.com/structuredmerge/structuredmerge-ruby/-/wikis/home
233
+ [📜gh-wiki]: https://github.com/structuredmerge/structuredmerge-ruby/wiki
234
+ [📜gl-wiki-img]: https://img.shields.io/badge/wiki-gitlab-943CD2.svg?style=for-the-badge&logo=gitlab&logoColor=white
235
+ [📜gh-wiki-img]: https://img.shields.io/badge/wiki-github-943CD2.svg?style=for-the-badge&logo=github&logoColor=white
236
+ [👽dl-rank]: https://clickgems.clickhouse.com/dashboard/binary-merge
237
+ [👽dl-ranki]: https://img.shields.io/gem/dt/binary-merge.svg
238
+ [👽version]: https://clickgems.clickhouse.com/dashboard/binary-merge
239
+ [👽versioni]: https://img.shields.io/gem/v/binary-merge.svg
240
+ [🚎11-c-wf]: https://github.com/structuredmerge/structuredmerge-ruby/actions/workflows/current.yml
241
+ [🚎11-c-wfi]: https://github.com/structuredmerge/structuredmerge-ruby/actions/workflows/current.yml/badge.svg
242
+ [💎ruby-c-i]: https://img.shields.io/badge/Ruby-current-CC342D?style=for-the-badge&logo=ruby&logoColor=green
243
+ [🤝gh-issues]: https://github.com/structuredmerge/structuredmerge-ruby/issues
244
+ [🤝gh-pulls]: https://github.com/structuredmerge/structuredmerge-ruby/pulls
245
+ [🤝gl-issues]: https://gitlab.com/structuredmerge/structuredmerge-ruby/-/issues
246
+ [🤝gl-pulls]: https://gitlab.com/structuredmerge/structuredmerge-ruby/-/merge_requests
247
+ [🤝cb-issues]: https://codeberg.org/structuredmerge/structuredmerge-ruby/issues
248
+ [🤝cb-pulls]: https://codeberg.org/structuredmerge/structuredmerge-ruby/pulls
249
+ [🤝cb-donate]: https://donate.codeberg.org/
250
+ [🤝contributing]: https://github.com/structuredmerge/structuredmerge-ruby/blob/main/CONTRIBUTING.md
251
+ [🖐contrib-rocks]: https://contrib.rocks
252
+ [🖐contributors]: https://github.com/structuredmerge/structuredmerge-ruby/graphs/contributors
253
+ [🖐contributors-img]: https://contrib.rocks/image?repo=structuredmerge/structuredmerge-ruby
254
+ [🪇conduct]: https://github.com/structuredmerge/structuredmerge-ruby/blob/main/CODE_OF_CONDUCT.md
255
+ [🪇conduct-img]: https://img.shields.io/badge/Contributor_Covenant-2.1-259D6C.svg
256
+ [📌pvc]: http://guides.rubygems.org/patterns/#pessimistic-version-constraint
257
+ [📌semver]: https://semver.org/spec/v2.0.0.html
258
+ [📌semver-img]: https://img.shields.io/badge/semver-2.0.0-259D6C.svg?style=flat
259
+ [📌semver-breaking]: https://github.com/semver/semver/issues/716#issuecomment-869336139
260
+ [📌major-versions-not-sacred]: https://tom.preston-werner.com/2022/05/23/major-version-numbers-are-not-sacred.html
261
+ [📌changelog]: https://github.com/structuredmerge/structuredmerge-ruby/blob/main/CHANGELOG.md
262
+ [📗keep-changelog]: https://keepachangelog.com/en/1.0.0/
263
+ [📗keep-changelog-img]: https://img.shields.io/badge/keep--a--changelog-1.0.0-34495e.svg?style=flat
264
+ [📌gitmoji]: https://gitmoji.dev
265
+ [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
266
+ [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
267
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-0.024-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
268
+ [🔐security]: https://github.com/structuredmerge/structuredmerge-ruby/blob/main/SECURITY.md
269
+ [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
270
+ [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
271
+ [📄license]: LICENSE.md
272
+ [📄license-ref]: LICENSE.md
273
+ [📄license-img]: https://img.shields.io/badge/License-AGPL--3.0--only_OR_PolyForm--Small--Business--1.0.0-259D6C.svg
274
+ [📄license-compat]: https://www.apache.org/legal/resolved.html#category-x
275
+ [📄license-compat-img]: https://img.shields.io/badge/Apache_Incompatible:_Category_X-%E2%9C%97-C0392B.svg?style=flat&logo=Apache
276
+ [📄ilo-declaration]: https://www.ilo.org/declaration/lang--en/index.htm
277
+ [📄ilo-declaration-img]: https://img.shields.io/badge/ILO_Fundamental_Principles-✓-259D6C.svg?style=flat
278
+ [🚎yard-current]: http://rubydoc.info/gems/binary-merge
279
+ [🚎yard-head]: https://binary-merge.galtzo.com
280
+ [💎stone_checksums]: https://github.com/galtzo-floss/stone_checksums
281
+ [💎SHA_checksums]: https://gitlab.com/structuredmerge/structuredmerge-ruby/-/tree/main/checksums
282
+ [💎rlts]: https://github.com/rubocop-lts/rubocop-lts
283
+ [💎rlts-img]: https://img.shields.io/badge/code_style_&_linting-rubocop--lts-34495e.svg?plastic&logo=ruby&logoColor=white
284
+ [💎appraisal2]: https://github.com/appraisal-rb/appraisal2
285
+ [💎appraisal2-img]: https://img.shields.io/badge/appraised_by-appraisal2-34495e.svg?plastic&logo=ruby&logoColor=white
286
+ [💎d-in-dvcs]: https://railsbling.com/posts/dvcs/put_the_d_in_dvcs/
@@ -0,0 +1,208 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Binary
4
+ module Merge
5
+ # Safety-first provider for opaque binary documents.
6
+ # rubocop:disable Metrics/ClassLength, Metrics/MethodLength, Metrics/ParameterLists -- provider operations and envelopes form one cohesive boundary
7
+ class Provider
8
+ def provider_id = 'ruby.binary'
9
+ def family = 'binary'
10
+
11
+ def capabilities
12
+ {
13
+ operations: Ast::Merge::ProviderContract::OPERATIONS,
14
+ dialects: %i[binary],
15
+ backends: %i[raw_bytes],
16
+ profiles: %i[opaque_document],
17
+ role: :workflow,
18
+ source_preservation: %i[exact_source opaque_conflict_retains_ours]
19
+ }.freeze
20
+ end
21
+
22
+ def analyze(request)
23
+ source = request.fetch(:source)
24
+ result(:analyze, request, analysis: { bytesize: source.bytesize, binary: true })
25
+ end
26
+
27
+ def diff2(request)
28
+ before = request.fetch(:before_source)
29
+ after = request.fetch(:after_source)
30
+ changes = before == after ? [] : [classification(before, before, after)]
31
+ result(:diff2, request, changes: changes, diff: { changed: before != after })
32
+ end
33
+
34
+ def merge2(request)
35
+ current = request.fetch(:current_source)
36
+ incoming = request.fetch(:incoming_source)
37
+ rendered = render(request, :ours, current)
38
+ fallback = if current == incoming
39
+ []
40
+ else
41
+ [{
42
+ category: :opaque_binary_preserve_current,
43
+ reason: 'Opaque binary documents cannot be combined safely without a format-specific provider.'
44
+ }]
45
+ end
46
+ result(
47
+ :merge2,
48
+ request,
49
+ output: rendered.content,
50
+ changes: current == incoming ? [] : [classification(current, current, incoming)],
51
+ fallbacks: fallback,
52
+ render_report: render_report(rendered, current == incoming ? :exact_revision : :preserve_current),
53
+ verification: exact_verification(rendered, current)
54
+ )
55
+ end
56
+
57
+ def merge3(request)
58
+ base = request.fetch(:base_source)
59
+ ours = request.fetch(:ours_source)
60
+ theirs = request.fetch(:theirs_source)
61
+ return exact_merge3(request, :ours, ours, base, ours, theirs) if ours == theirs || base == theirs
62
+ return exact_merge3(request, :theirs, theirs, base, ours, theirs) if base == ours
63
+
64
+ conflicted_merge3(request, base, ours, theirs)
65
+ end
66
+
67
+ private
68
+
69
+ def exact_merge3(request, role, output, base, ours, theirs)
70
+ rendered = render(request, role, output)
71
+ result(
72
+ :merge3,
73
+ request,
74
+ output: rendered.content,
75
+ changes: [classification(base, ours, theirs)],
76
+ render_report: render_report(rendered, :exact_revision),
77
+ verification: exact_verification(rendered, output).merge(base_participated: true)
78
+ )
79
+ end
80
+
81
+ def conflicted_merge3(request, base, ours, theirs)
82
+ rendered = render(request, :ours, ours)
83
+ conflict = {
84
+ conflict_id: 'binary-conflict-root',
85
+ category: :opaque_edit_edit,
86
+ path: '',
87
+ change_classification: classification(base, ours, theirs)
88
+ }
89
+ failure(
90
+ :merge3,
91
+ request,
92
+ category: :merge_conflict,
93
+ message: 'Opaque binary content changed independently on both sides; retaining ours without markers.',
94
+ changes: [conflict.fetch(:change_classification)],
95
+ conflicts: [conflict],
96
+ conflicted_output: rendered.content,
97
+ render_report: render_report(rendered, :opaque_conflict_retains_ours),
98
+ verification: { base_participated: true, ours_preserved_exactly: rendered.content == ours }
99
+ )
100
+ end
101
+
102
+ def classification(base, ours, theirs)
103
+ {
104
+ path: '',
105
+ ours: base == ours ? :unchanged : :edited,
106
+ theirs: base == theirs ? :unchanged : :edited
107
+ }.freeze
108
+ end
109
+
110
+ def render(request, role, source)
111
+ Ast::Merge::SourceRender::Renderer.new.render(
112
+ Ast::Merge::SourceRender::Plan.new(
113
+ sources: {
114
+ base: request[:base_source].to_s,
115
+ ours: (request[:ours_source] || request[:current_source]).to_s,
116
+ theirs: request[:theirs_source].to_s
117
+ },
118
+ fragments: [source_fragment(role, source)],
119
+ metadata: { provider_id: provider_id }
120
+ )
121
+ )
122
+ end
123
+
124
+ def source_fragment(role, source)
125
+ if source.empty?
126
+ return Ast::Merge::SourceRender::SynthesizedFragment.new(
127
+ content: '',
128
+ reason: :exact_empty_source,
129
+ producer: provider_id,
130
+ metadata: { source_role: role }
131
+ )
132
+ end
133
+
134
+ Ast::Merge::SourceRender::SourceFragment.new(
135
+ revision: role,
136
+ start_line: 1,
137
+ end_line: [source.lines.length, 1].max,
138
+ metadata: { source_role: role }
139
+ )
140
+ end
141
+
142
+ def render_report(rendered, strategy)
143
+ {
144
+ strategy: strategy,
145
+ line_records: rendered.line_records,
146
+ synthesized_fragments: rendered.synthesized_fragments,
147
+ conflicts: rendered.conflicts,
148
+ verification_input: rendered.verification_input
149
+ }
150
+ end
151
+
152
+ def exact_verification(rendered, source)
153
+ {
154
+ output_reparsed: true,
155
+ semantic_match: rendered.content == source,
156
+ bytes_preserved: rendered.content.b == source.b
157
+ }
158
+ end
159
+
160
+ def result(operation, request, changes: [], fallbacks: [], render_report: {}, verification: {}, **payload)
161
+ Ast::Merge::ProviderResult.build(
162
+ operation: operation,
163
+ success: true,
164
+ envelope: envelope(
165
+ request,
166
+ changes: changes,
167
+ fallbacks: fallbacks,
168
+ render_report: render_report,
169
+ verification: verification
170
+ ),
171
+ **payload
172
+ )
173
+ end
174
+
175
+ def failure(operation, request, category:, message:, changes: [], conflicts: [], render_report: {},
176
+ verification: {}, **payload)
177
+ Ast::Merge::ProviderResult.build(
178
+ operation: operation,
179
+ success: false,
180
+ envelope: envelope(
181
+ request,
182
+ changes: changes,
183
+ conflicts: conflicts,
184
+ diagnostics: [{ category: category, severity: :error, message: message, blocking: true }],
185
+ render_report: render_report,
186
+ verification: verification
187
+ ),
188
+ **payload
189
+ )
190
+ end
191
+
192
+ def envelope(request, **fields)
193
+ {
194
+ provider: {
195
+ provider_id: provider_id,
196
+ family: family,
197
+ dialect: request[:dialect] || :binary,
198
+ backend: request[:backend],
199
+ package: Binary::Merge::PACKAGE_NAME,
200
+ package_version: Binary::Merge::Version::VERSION
201
+ },
202
+ profile: { profile_id: request[:profile_id] || :opaque_document }
203
+ }.merge(fields)
204
+ end
205
+ end
206
+ # rubocop:enable Metrics/ClassLength, Metrics/MethodLength, Metrics/ParameterLists
207
+ end
208
+ end
@@ -2,10 +2,12 @@
2
2
 
3
3
  module Binary
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.3'
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/binary/merge.rb CHANGED
@@ -1,16 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "tree_haver"
3
+ require 'tree_haver'
4
+ require 'ast/merge'
5
+ require_relative 'merge/version'
6
+ require_relative 'merge/provider'
4
7
 
8
+ # Binary preservation contracts and provider registration.
5
9
  module Binary
10
+ # Binary merge reports, diagnostics, and the opaque-document provider.
6
11
  module Merge
7
- PACKAGE_NAME = "binary-merge"
12
+ PACKAGE_NAME = 'binary-merge'
8
13
 
9
14
  module_function
10
15
 
11
16
  def binary_feature_profile
12
17
  {
13
- family: "binary",
18
+ family: 'binary',
14
19
  supported_dialects: [],
15
20
  supported_policies: []
16
21
  }
@@ -26,9 +31,9 @@ module Binary
26
31
  )
27
32
  end
28
33
 
29
- def unsafe_diagnostic(schema_path:, byte_range:, message:, category: "unsafe_binary_mutation")
34
+ def unsafe_diagnostic(schema_path:, byte_range:, message:, category: 'unsafe_binary_mutation')
30
35
  TreeHaver::BinaryDiagnostic.new(
31
- severity: "error",
36
+ severity: 'error',
32
37
  category: category,
33
38
  message: message,
34
39
  schema_path: schema_path,
@@ -48,5 +53,15 @@ module Binary
48
53
  diagnostics: []
49
54
  )
50
55
  end
56
+
57
+ def merge_provider
58
+ @merge_provider ||= Provider.new
59
+ end
60
+
61
+ def register_provider!
62
+ Ast::Merge.register_provider(merge_provider, replace: true)
63
+ end
51
64
  end
52
65
  end
66
+
67
+ Binary::Merge.register_provider!
data/lib/binary-merge.rb CHANGED
@@ -1,3 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "binary/merge"
3
+ require 'binary/merge'
4
+ require 'version_gem'
5
+ require_relative 'binary/merge/version'
6
+
7
+ Binary::Merge::Version.class_eval do
8
+ extend VersionGem::Basic
9
+ end
@@ -0,0 +1,23 @@
1
+ module Binary
2
+ module Merge
3
+ PACKAGE_NAME: String
4
+
5
+ class Provider
6
+ def provider_id: () -> String
7
+ def family: () -> String
8
+ def capabilities: () -> Hash[Symbol, untyped]
9
+ def analyze: (Hash[Symbol, untyped] request) -> Hash[Symbol, untyped]
10
+ def diff2: (Hash[Symbol, untyped] request) -> Hash[Symbol, untyped]
11
+ def merge2: (Hash[Symbol, untyped] request) -> Hash[Symbol, untyped]
12
+ def merge3: (Hash[Symbol, untyped] request) -> Hash[Symbol, untyped]
13
+ end
14
+
15
+ def self.merge_provider: () -> Provider
16
+ def self.register_provider!: () -> Hash[Symbol, untyped]
17
+
18
+ module Version
19
+ VERSION: String
20
+ end
21
+ VERSION: String
22
+ end
23
+ end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,11 +1,11 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: binary-merge
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.0.0
4
+ version: 7.1.3
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-----
@@ -37,46 +37,297 @@ cert_chain:
37
37
  -----END CERTIFICATE-----
38
38
  date: 1980-01-02 00:00:00.000000000 Z
39
39
  dependencies:
40
+ - !ruby/object:Gem::Dependency
41
+ name: ast-merge
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - '='
45
+ - !ruby/object:Gem::Version
46
+ version: 7.1.3
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.3
40
54
  - !ruby/object:Gem::Dependency
41
55
  name: tree_haver
42
56
  requirement: !ruby/object:Gem::Requirement
43
57
  requirements:
44
58
  - - '='
45
59
  - !ruby/object:Gem::Version
46
- version: 7.0.0
60
+ version: 7.1.3
47
61
  type: :runtime
48
62
  prerelease: false
49
63
  version_requirements: !ruby/object:Gem::Requirement
50
64
  requirements:
51
65
  - - '='
52
66
  - !ruby/object:Gem::Version
53
- version: 7.0.0
54
- description: Portable binary preservation planning and diagnostics for Structured
55
- Merge.
67
+ version: 7.1.3
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.0'
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: 3.0.0
98
+ type: :development
99
+ prerelease: false
100
+ version_requirements: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: '3.0'
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: 3.0.0
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.2
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.2
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.5
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.5
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 binary preservation planning and diagnostics for Structured
291
+ Merge."
56
292
  email:
57
- - info@structuredmerge.org
293
+ - floss@galtzo.com
58
294
  executables: []
59
295
  extensions: []
60
296
  extra_rdoc_files: []
61
297
  files:
298
+ - LICENSE.md
299
+ - README.md
62
300
  - lib/binary-merge.rb
63
301
  - lib/binary/merge.rb
302
+ - lib/binary/merge/provider.rb
64
303
  - lib/binary/merge/version.rb
304
+ - sig/binary/merge.rbs
65
305
  homepage: https://github.com/structuredmerge/structuredmerge-ruby
66
306
  licenses:
67
307
  - AGPL-3.0-only
68
308
  - PolyForm-Small-Business-1.0.0
69
309
  metadata:
70
310
  homepage_uri: https://structuredmerge.org
71
- source_code_uri: https://github.com/structuredmerge/structuredmerge-ruby/tree/v7.0.0
72
- 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.3
312
+ changelog_uri: https://github.com/structuredmerge/structuredmerge-ruby/blob/v7.1.3/CHANGELOG.md
73
313
  bug_tracker_uri: https://github.com/structuredmerge/structuredmerge-ruby/issues
74
- documentation_uri: https://www.rubydoc.info/gems/binary-merge/7.0.0
314
+ documentation_uri: https://www.rubydoc.info/gems/binary-merge/7.1.3
75
315
  funding_uri: https://github.com/sponsors/pboling
76
316
  wiki_uri: https://github.com/structuredmerge/structuredmerge-ruby/wiki
317
+ news_uri: https://www.railsbling.com/tags/binary-merge
77
318
  discord_uri: https://discord.gg/3qme4XHNKN
319
+ mailing_list_uri: https://www.rubyforum.org/tag/structuredmerge
78
320
  rubygems_mfa_required: 'true'
79
- rdoc_options: []
321
+ rdoc_options:
322
+ - "--title"
323
+ - binary-merge - ☯️ Structured Merge binary merge contracts for Ruby
324
+ - "--main"
325
+ - README.md
326
+ - "--exclude"
327
+ - "^sig/"
328
+ - "--line-numbers"
329
+ - "--inline-source"
330
+ - "--quiet"
80
331
  require_paths:
81
332
  - lib
82
333
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -90,7 +341,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
90
341
  - !ruby/object:Gem::Version
91
342
  version: '0'
92
343
  requirements: []
93
- rubygems_version: 4.0.10
344
+ rubygems_version: 4.0.17
94
345
  specification_version: 4
95
- summary: Structured Merge binary merge contracts for Ruby
346
+ summary: "☯️ Structured Merge binary merge contracts for Ruby"
96
347
  test_files: []
metadata.gz.sig CHANGED
Binary file