automerge-rb 0.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.
Files changed (481) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +22 -0
  3. data/README.md +175 -0
  4. data/ext/automerge_ext/automerge_ext.c +1805 -0
  5. data/ext/automerge_ext/extconf.rb +132 -0
  6. data/lib/automerge/version.rb +6 -0
  7. data/lib/automerge.rb +110 -0
  8. data/rust-toolchain.toml +4 -0
  9. data/vendor/automerge-rust/Cargo.lock +1909 -0
  10. data/vendor/automerge-rust/Cargo.toml +15 -0
  11. data/vendor/automerge-rust/automerge/Cargo.toml +78 -0
  12. data/vendor/automerge-rust/automerge/README.md +5 -0
  13. data/vendor/automerge-rust/automerge/benches/load_save.rs +102 -0
  14. data/vendor/automerge-rust/automerge/benches/map.rs +260 -0
  15. data/vendor/automerge-rust/automerge/benches/range.rs +37 -0
  16. data/vendor/automerge-rust/automerge/benches/sync.rs +95 -0
  17. data/vendor/automerge-rust/automerge/examples/README.md +7 -0
  18. data/vendor/automerge-rust/automerge/examples/quickstart.rs +57 -0
  19. data/vendor/automerge-rust/automerge/examples/watch.rs +94 -0
  20. data/vendor/automerge-rust/automerge/fuzz/Cargo.toml +29 -0
  21. data/vendor/automerge-rust/automerge/fuzz/fuzz_targets/load.rs +37 -0
  22. data/vendor/automerge-rust/automerge/src/autocommit.rs +1286 -0
  23. data/vendor/automerge-rust/automerge/src/automerge/current_state.rs +546 -0
  24. data/vendor/automerge-rust/automerge/src/automerge/tests.rs +2023 -0
  25. data/vendor/automerge-rust/automerge/src/automerge.rs +2071 -0
  26. data/vendor/automerge-rust/automerge/src/autoserde.rs +128 -0
  27. data/vendor/automerge-rust/automerge/src/change.rs +357 -0
  28. data/vendor/automerge-rust/automerge/src/change_graph.rs +1215 -0
  29. data/vendor/automerge-rust/automerge/src/change_queue.rs +46 -0
  30. data/vendor/automerge-rust/automerge/src/clock.rs +206 -0
  31. data/vendor/automerge-rust/automerge/src/columnar/column_range/boolean.rs +83 -0
  32. data/vendor/automerge-rust/automerge/src/columnar/column_range/delta.rs +148 -0
  33. data/vendor/automerge-rust/automerge/src/columnar/column_range/generic/group.rs +138 -0
  34. data/vendor/automerge-rust/automerge/src/columnar/column_range/generic/simple.rs +76 -0
  35. data/vendor/automerge-rust/automerge/src/columnar/column_range/generic.rs +93 -0
  36. data/vendor/automerge-rust/automerge/src/columnar/column_range/key.rs +272 -0
  37. data/vendor/automerge-rust/automerge/src/columnar/column_range/obj_id.rs +202 -0
  38. data/vendor/automerge-rust/automerge/src/columnar/column_range/opid_list.rs +329 -0
  39. data/vendor/automerge-rust/automerge/src/columnar/column_range/raw.rs +38 -0
  40. data/vendor/automerge-rust/automerge/src/columnar/column_range/rle.rs +216 -0
  41. data/vendor/automerge-rust/automerge/src/columnar/column_range/value.rs +547 -0
  42. data/vendor/automerge-rust/automerge/src/columnar/column_range.rs +17 -0
  43. data/vendor/automerge-rust/automerge/src/columnar/encoding/boolean.rs +197 -0
  44. data/vendor/automerge-rust/automerge/src/columnar/encoding/col_error.rs +88 -0
  45. data/vendor/automerge-rust/automerge/src/columnar/encoding/column_decoder.rs +133 -0
  46. data/vendor/automerge-rust/automerge/src/columnar/encoding/decodable_impls.rs +175 -0
  47. data/vendor/automerge-rust/automerge/src/columnar/encoding/delta.rs +96 -0
  48. data/vendor/automerge-rust/automerge/src/columnar/encoding/encodable_impls.rs +200 -0
  49. data/vendor/automerge-rust/automerge/src/columnar/encoding/leb128.rs +82 -0
  50. data/vendor/automerge-rust/automerge/src/columnar/encoding/properties.rs +178 -0
  51. data/vendor/automerge-rust/automerge/src/columnar/encoding/raw.rs +101 -0
  52. data/vendor/automerge-rust/automerge/src/columnar/encoding/rle.rs +239 -0
  53. data/vendor/automerge-rust/automerge/src/columnar/encoding.rs +67 -0
  54. data/vendor/automerge-rust/automerge/src/columnar/splice_error.rs +47 -0
  55. data/vendor/automerge-rust/automerge/src/columnar.rs +14 -0
  56. data/vendor/automerge-rust/automerge/src/convert.rs +112 -0
  57. data/vendor/automerge-rust/automerge/src/cursor.rs +296 -0
  58. data/vendor/automerge-rust/automerge/src/decoding.rs +475 -0
  59. data/vendor/automerge-rust/automerge/src/error.rs +159 -0
  60. data/vendor/automerge-rust/automerge/src/exid.rs +238 -0
  61. data/vendor/automerge-rust/automerge/src/hydrate/list.rs +140 -0
  62. data/vendor/automerge-rust/automerge/src/hydrate/map.rs +132 -0
  63. data/vendor/automerge-rust/automerge/src/hydrate/tests.rs +40 -0
  64. data/vendor/automerge-rust/automerge/src/hydrate/text.rs +89 -0
  65. data/vendor/automerge-rust/automerge/src/hydrate.rs +368 -0
  66. data/vendor/automerge-rust/automerge/src/indexed_cache.rs +113 -0
  67. data/vendor/automerge-rust/automerge/src/iter/doc.rs +603 -0
  68. data/vendor/automerge-rust/automerge/src/iter/keys.rs +93 -0
  69. data/vendor/automerge-rust/automerge/src/iter/list_range.rs +433 -0
  70. data/vendor/automerge-rust/automerge/src/iter/map_range.rs +316 -0
  71. data/vendor/automerge-rust/automerge/src/iter/spans.rs +601 -0
  72. data/vendor/automerge-rust/automerge/src/iter/tools.rs +427 -0
  73. data/vendor/automerge-rust/automerge/src/iter/values.rs +36 -0
  74. data/vendor/automerge-rust/automerge/src/iter.rs +25 -0
  75. data/vendor/automerge-rust/automerge/src/legacy/mod.rs +364 -0
  76. data/vendor/automerge-rust/automerge/src/legacy/serde_impls/actor_id.rs +25 -0
  77. data/vendor/automerge-rust/automerge/src/legacy/serde_impls/change_hash.rs +29 -0
  78. data/vendor/automerge-rust/automerge/src/legacy/serde_impls/element_id.rs +27 -0
  79. data/vendor/automerge-rust/automerge/src/legacy/serde_impls/mod.rs +31 -0
  80. data/vendor/automerge-rust/automerge/src/legacy/serde_impls/object_id.rs +36 -0
  81. data/vendor/automerge-rust/automerge/src/legacy/serde_impls/op.rs +668 -0
  82. data/vendor/automerge-rust/automerge/src/legacy/serde_impls/op_type.rs +26 -0
  83. data/vendor/automerge-rust/automerge/src/legacy/serde_impls/opid.rs +25 -0
  84. data/vendor/automerge-rust/automerge/src/legacy/serde_impls/scalar_value.rs +63 -0
  85. data/vendor/automerge-rust/automerge/src/legacy/utility_impls/element_id.rs +66 -0
  86. data/vendor/automerge-rust/automerge/src/legacy/utility_impls/key.rs +49 -0
  87. data/vendor/automerge-rust/automerge/src/legacy/utility_impls/mod.rs +4 -0
  88. data/vendor/automerge-rust/automerge/src/legacy/utility_impls/object_id.rs +74 -0
  89. data/vendor/automerge-rust/automerge/src/legacy/utility_impls/opid.rs +68 -0
  90. data/vendor/automerge-rust/automerge/src/lib.rs +315 -0
  91. data/vendor/automerge-rust/automerge/src/marks.rs +478 -0
  92. data/vendor/automerge-rust/automerge/src/op_set2/change/batch.rs +2002 -0
  93. data/vendor/automerge-rust/automerge/src/op_set2/change/collector.rs +974 -0
  94. data/vendor/automerge-rust/automerge/src/op_set2/change.rs +332 -0
  95. data/vendor/automerge-rust/automerge/src/op_set2/columns.rs +714 -0
  96. data/vendor/automerge-rust/automerge/src/op_set2/meta.rs +174 -0
  97. data/vendor/automerge-rust/automerge/src/op_set2/op.rs +1363 -0
  98. data/vendor/automerge-rust/automerge/src/op_set2/op_set/elems.rs +43 -0
  99. data/vendor/automerge-rust/automerge/src/op_set2/op_set/found_op.rs +60 -0
  100. data/vendor/automerge-rust/automerge/src/op_set2/op_set/index.rs +197 -0
  101. data/vendor/automerge-rust/automerge/src/op_set2/op_set/insert.rs +179 -0
  102. data/vendor/automerge-rust/automerge/src/op_set2/op_set/mark_index.rs +292 -0
  103. data/vendor/automerge-rust/automerge/src/op_set2/op_set/marks.rs +86 -0
  104. data/vendor/automerge-rust/automerge/src/op_set2/op_set/op_iter.rs +1295 -0
  105. data/vendor/automerge-rust/automerge/src/op_set2/op_set/op_query.rs +82 -0
  106. data/vendor/automerge-rust/automerge/src/op_set2/op_set/top_op.rs +50 -0
  107. data/vendor/automerge-rust/automerge/src/op_set2/op_set/visible.rs +290 -0
  108. data/vendor/automerge-rust/automerge/src/op_set2/op_set.rs +1793 -0
  109. data/vendor/automerge-rust/automerge/src/op_set2/parents.rs +133 -0
  110. data/vendor/automerge-rust/automerge/src/op_set2/skip_list.rs +714 -0
  111. data/vendor/automerge-rust/automerge/src/op_set2/types.rs +769 -0
  112. data/vendor/automerge-rust/automerge/src/op_set2.rs +18 -0
  113. data/vendor/automerge-rust/automerge/src/patches/patch.rs +95 -0
  114. data/vendor/automerge-rust/automerge/src/patches/patch_builder.rs +382 -0
  115. data/vendor/automerge-rust/automerge/src/patches/patch_log.rs +584 -0
  116. data/vendor/automerge-rust/automerge/src/patches.rs +7 -0
  117. data/vendor/automerge-rust/automerge/src/query/list_state.rs +230 -0
  118. data/vendor/automerge-rust/automerge/src/query/seek_mark.rs +142 -0
  119. data/vendor/automerge-rust/automerge/src/read.rs +326 -0
  120. data/vendor/automerge-rust/automerge/src/sequence_tree.rs +662 -0
  121. data/vendor/automerge-rust/automerge/src/storage/bundle/builder.rs +942 -0
  122. data/vendor/automerge-rust/automerge/src/storage/bundle/error.rs +42 -0
  123. data/vendor/automerge-rust/automerge/src/storage/bundle/meta.rs +23 -0
  124. data/vendor/automerge-rust/automerge/src/storage/bundle/storage.rs +146 -0
  125. data/vendor/automerge-rust/automerge/src/storage/bundle.rs +210 -0
  126. data/vendor/automerge-rust/automerge/src/storage/change/change_actors.rs +311 -0
  127. data/vendor/automerge-rust/automerge/src/storage/change/change_op_columns.rs +621 -0
  128. data/vendor/automerge-rust/automerge/src/storage/change/compressed.rs +51 -0
  129. data/vendor/automerge-rust/automerge/src/storage/change/op_with_change_actors.rs +1 -0
  130. data/vendor/automerge-rust/automerge/src/storage/change.rs +523 -0
  131. data/vendor/automerge-rust/automerge/src/storage/chunk.rs +312 -0
  132. data/vendor/automerge-rust/automerge/src/storage/columns/column.rs +42 -0
  133. data/vendor/automerge-rust/automerge/src/storage/columns/column_builder.rs +199 -0
  134. data/vendor/automerge-rust/automerge/src/storage/columns/column_specification.rs +340 -0
  135. data/vendor/automerge-rust/automerge/src/storage/columns/raw_column.rs +286 -0
  136. data/vendor/automerge-rust/automerge/src/storage/columns.rs +355 -0
  137. data/vendor/automerge-rust/automerge/src/storage/document/compression.rs +362 -0
  138. data/vendor/automerge-rust/automerge/src/storage/document.rs +411 -0
  139. data/vendor/automerge-rust/automerge/src/storage/load/change_collector.rs +15 -0
  140. data/vendor/automerge-rust/automerge/src/storage/load.rs +136 -0
  141. data/vendor/automerge-rust/automerge/src/storage/parse/leb128.rs +302 -0
  142. data/vendor/automerge-rust/automerge/src/storage/parse.rs +619 -0
  143. data/vendor/automerge-rust/automerge/src/storage/save/document.rs +27 -0
  144. data/vendor/automerge-rust/automerge/src/storage.rs +26 -0
  145. data/vendor/automerge-rust/automerge/src/sync/bloom.rs +161 -0
  146. data/vendor/automerge-rust/automerge/src/sync/message_builder.rs +118 -0
  147. data/vendor/automerge-rust/automerge/src/sync/state.rs +214 -0
  148. data/vendor/automerge-rust/automerge/src/sync/v1_compat_test/bloom.rs +162 -0
  149. data/vendor/automerge-rust/automerge/src/sync/v1_compat_test/mod.rs +625 -0
  150. data/vendor/automerge-rust/automerge/src/sync/v1_compat_test/state.rs +120 -0
  151. data/vendor/automerge-rust/automerge/src/sync.rs +2482 -0
  152. data/vendor/automerge-rust/automerge/src/text_diff/LICENSE +201 -0
  153. data/vendor/automerge-rust/automerge/src/text_diff/myers.rs +332 -0
  154. data/vendor/automerge-rust/automerge/src/text_diff/replace.rs +139 -0
  155. data/vendor/automerge-rust/automerge/src/text_diff/utils.rs +119 -0
  156. data/vendor/automerge-rust/automerge/src/text_diff.rs +515 -0
  157. data/vendor/automerge-rust/automerge/src/text_value.rs +276 -0
  158. data/vendor/automerge-rust/automerge/src/transaction/commit.rs +34 -0
  159. data/vendor/automerge-rust/automerge/src/transaction/inner.rs +1403 -0
  160. data/vendor/automerge-rust/automerge/src/transaction/manual_transaction.rs +147 -0
  161. data/vendor/automerge-rust/automerge/src/transaction/owned_transaction.rs +266 -0
  162. data/vendor/automerge-rust/automerge/src/transaction/result.rs +21 -0
  163. data/vendor/automerge-rust/automerge/src/transaction/transactable.rs +203 -0
  164. data/vendor/automerge-rust/automerge/src/transaction.rs +513 -0
  165. data/vendor/automerge-rust/automerge/src/types.rs +749 -0
  166. data/vendor/automerge-rust/automerge/src/validation.rs +29 -0
  167. data/vendor/automerge-rust/automerge/src/value.rs +763 -0
  168. data/vendor/automerge-rust/automerge/tests/batch_insert.rs +1034 -0
  169. data/vendor/automerge-rust/automerge/tests/block_tests.rs +887 -0
  170. data/vendor/automerge-rust/automerge/tests/convert_string_to_text.rs +72 -0
  171. data/vendor/automerge-rust/automerge/tests/diff_marks.rs +1508 -0
  172. data/vendor/automerge-rust/automerge/tests/fixtures/64bit_obj_id_change.automerge +0 -0
  173. data/vendor/automerge-rust/automerge/tests/fixtures/64bit_obj_id_doc.automerge +0 -0
  174. data/vendor/automerge-rust/automerge/tests/fixtures/counter_value_has_incorrect_meta.automerge +0 -0
  175. data/vendor/automerge-rust/automerge/tests/fixtures/counter_value_is_ok.automerge +0 -0
  176. data/vendor/automerge-rust/automerge/tests/fixtures/counter_value_is_overlong.automerge +0 -0
  177. data/vendor/automerge-rust/automerge/tests/fixtures/two_change_chunks.automerge +0 -0
  178. data/vendor/automerge-rust/automerge/tests/fixtures/two_change_chunks_compressed.automerge +0 -0
  179. data/vendor/automerge-rust/automerge/tests/fixtures/two_change_chunks_out_of_order.automerge +0 -0
  180. data/vendor/automerge-rust/automerge/tests/fuzz-crashers/action-is-48.automerge +0 -0
  181. data/vendor/automerge-rust/automerge/tests/fuzz-crashers/crash-da39a3ee5e6b4b0d3255bfef95601890afd80709 +0 -0
  182. data/vendor/automerge-rust/automerge/tests/fuzz-crashers/incorrect_max_op.automerge +0 -0
  183. data/vendor/automerge-rust/automerge/tests/fuzz-crashers/invalid_deflate_stream.automerge +0 -0
  184. data/vendor/automerge-rust/automerge/tests/fuzz-crashers/missing_actor.automerge +0 -0
  185. data/vendor/automerge-rust/automerge/tests/fuzz-crashers/overflow_in_length.automerge +0 -0
  186. data/vendor/automerge-rust/automerge/tests/fuzz-crashers/too_many_deps.automerge +0 -0
  187. data/vendor/automerge-rust/automerge/tests/fuzz-crashers/too_many_ops.automerge +0 -0
  188. data/vendor/automerge-rust/automerge/tests/test.rs +2668 -0
  189. data/vendor/automerge-rust/automerge/tests/test_mark_patches.rs +41 -0
  190. data/vendor/automerge-rust/automerge/tests/test_save_load_orphans.rs +84 -0
  191. data/vendor/automerge-rust/automerge/tests/text.rs +1098 -0
  192. data/vendor/automerge-rust/automerge/tests/text_encoding.rs +640 -0
  193. data/vendor/automerge-rust/automerge-c/CMakeLists.txt +439 -0
  194. data/vendor/automerge-rust/automerge-c/Cargo.toml +22 -0
  195. data/vendor/automerge-rust/automerge-c/README.md +233 -0
  196. data/vendor/automerge-rust/automerge-c/build.rs +21 -0
  197. data/vendor/automerge-rust/automerge-c/cbindgen.toml +48 -0
  198. data/vendor/automerge-rust/automerge-c/cmake/Cargo.toml.in +22 -0
  199. data/vendor/automerge-rust/automerge-c/cmake/automerge-c-config.cmake.in +99 -0
  200. data/vendor/automerge-rust/automerge-c/cmake/cbindgen.toml.in +48 -0
  201. data/vendor/automerge-rust/automerge-c/cmake/config.h.in +58 -0
  202. data/vendor/automerge-rust/automerge-c/cmake/enum-string-functions-gen.cmake +183 -0
  203. data/vendor/automerge-rust/automerge-c/cmake/file-regex-replace.cmake +33 -0
  204. data/vendor/automerge-rust/automerge-c/cmake/file-touch.cmake +35 -0
  205. data/vendor/automerge-rust/automerge-c/docs/CMakeLists.txt +39 -0
  206. data/vendor/automerge-rust/automerge-c/docs/img/brandmark.png +0 -0
  207. data/vendor/automerge-rust/automerge-c/examples/CMakeLists.txt +42 -0
  208. data/vendor/automerge-rust/automerge-c/examples/README.md +9 -0
  209. data/vendor/automerge-rust/automerge-c/examples/quickstart.c +131 -0
  210. data/vendor/automerge-rust/automerge-c/include/automerge-c/utils/result.h +30 -0
  211. data/vendor/automerge-rust/automerge-c/include/automerge-c/utils/stack.h +130 -0
  212. data/vendor/automerge-rust/automerge-c/include/automerge-c/utils/stack_callback_data.h +53 -0
  213. data/vendor/automerge-rust/automerge-c/include/automerge-c/utils/string.h +29 -0
  214. data/vendor/automerge-rust/automerge-c/src/actor_id.rs +193 -0
  215. data/vendor/automerge-rust/automerge-c/src/byte_span.rs +227 -0
  216. data/vendor/automerge-rust/automerge-c/src/change.rs +356 -0
  217. data/vendor/automerge-rust/automerge-c/src/cursor.rs +168 -0
  218. data/vendor/automerge-rust/automerge-c/src/doc/list.rs +636 -0
  219. data/vendor/automerge-rust/automerge-c/src/doc/map.rs +556 -0
  220. data/vendor/automerge-rust/automerge-c/src/doc/mark.rs +296 -0
  221. data/vendor/automerge-rust/automerge-c/src/doc/utils.rs +46 -0
  222. data/vendor/automerge-rust/automerge-c/src/doc.rs +1009 -0
  223. data/vendor/automerge-rust/automerge-c/src/index.rs +84 -0
  224. data/vendor/automerge-rust/automerge-c/src/item.rs +2177 -0
  225. data/vendor/automerge-rust/automerge-c/src/items.rs +401 -0
  226. data/vendor/automerge-rust/automerge-c/src/lib.rs +11 -0
  227. data/vendor/automerge-rust/automerge-c/src/obj.rs +216 -0
  228. data/vendor/automerge-rust/automerge-c/src/result.rs +653 -0
  229. data/vendor/automerge-rust/automerge-c/src/sync/have.rs +42 -0
  230. data/vendor/automerge-rust/automerge-c/src/sync/message.rs +146 -0
  231. data/vendor/automerge-rust/automerge-c/src/sync/state.rs +262 -0
  232. data/vendor/automerge-rust/automerge-c/src/sync.rs +7 -0
  233. data/vendor/automerge-rust/automerge-c/src/utils/result.c +33 -0
  234. data/vendor/automerge-rust/automerge-c/src/utils/stack.c +106 -0
  235. data/vendor/automerge-rust/automerge-c/src/utils/stack_callback_data.c +9 -0
  236. data/vendor/automerge-rust/automerge-c/src/utils/string.c +46 -0
  237. data/vendor/automerge-rust/automerge-c/test/CMakeLists.txt +67 -0
  238. data/vendor/automerge-rust/automerge-c/test/actor_id_tests.c +140 -0
  239. data/vendor/automerge-rust/automerge-c/test/base_state.c +17 -0
  240. data/vendor/automerge-rust/automerge-c/test/base_state.h +39 -0
  241. data/vendor/automerge-rust/automerge-c/test/byte_span_tests.c +119 -0
  242. data/vendor/automerge-rust/automerge-c/test/cmocka_utils.c +91 -0
  243. data/vendor/automerge-rust/automerge-c/test/cmocka_utils.h +42 -0
  244. data/vendor/automerge-rust/automerge-c/test/cursor_tests.c +263 -0
  245. data/vendor/automerge-rust/automerge-c/test/doc_state.c +27 -0
  246. data/vendor/automerge-rust/automerge-c/test/doc_state.h +17 -0
  247. data/vendor/automerge-rust/automerge-c/test/doc_tests.c +335 -0
  248. data/vendor/automerge-rust/automerge-c/test/enum_string_tests.c +148 -0
  249. data/vendor/automerge-rust/automerge-c/test/files/brave-ape-49.automerge +0 -0
  250. data/vendor/automerge-rust/automerge-c/test/item_tests.c +313 -0
  251. data/vendor/automerge-rust/automerge-c/test/list_tests.c +544 -0
  252. data/vendor/automerge-rust/automerge-c/test/macro_utils.c +38 -0
  253. data/vendor/automerge-rust/automerge-c/test/macro_utils.h +23 -0
  254. data/vendor/automerge-rust/automerge-c/test/main.c +33 -0
  255. data/vendor/automerge-rust/automerge-c/test/map_tests.c +1610 -0
  256. data/vendor/automerge-rust/automerge-c/test/mark_tests.c +124 -0
  257. data/vendor/automerge-rust/automerge-c/test/ported_wasm/basic_tests.c +1642 -0
  258. data/vendor/automerge-rust/automerge-c/test/ported_wasm/cursor_tests.c +108 -0
  259. data/vendor/automerge-rust/automerge-c/test/ported_wasm/suite.c +17 -0
  260. data/vendor/automerge-rust/automerge-c/test/ported_wasm/sync_tests.c +1280 -0
  261. data/vendor/automerge-rust/automerge-c/test/str_utils.c +15 -0
  262. data/vendor/automerge-rust/automerge-c/test/str_utils.h +17 -0
  263. data/vendor/automerge-rust/automerge-test/Cargo.toml +17 -0
  264. data/vendor/automerge-rust/automerge-test/README.md +3 -0
  265. data/vendor/automerge-rust/automerge-test/src/lib.rs +487 -0
  266. data/vendor/automerge-rust/hexane/CHANGELOG.md +34 -0
  267. data/vendor/automerge-rust/hexane/Cargo.toml +47 -0
  268. data/vendor/automerge-rust/hexane/README.md +292 -0
  269. data/vendor/automerge-rust/hexane/RESULTS.txt +20 -0
  270. data/vendor/automerge-rust/hexane/TODO +18 -0
  271. data/vendor/automerge-rust/hexane/benches/insert.rs +82 -0
  272. data/vendor/automerge-rust/hexane/benches/seek.rs +77 -0
  273. data/vendor/automerge-rust/hexane/benches/splice.rs +82 -0
  274. data/vendor/automerge-rust/hexane/src/aggregate.rs +288 -0
  275. data/vendor/automerge-rust/hexane/src/boolean.rs +478 -0
  276. data/vendor/automerge-rust/hexane/src/columndata.rs +2540 -0
  277. data/vendor/automerge-rust/hexane/src/cursor.rs +756 -0
  278. data/vendor/automerge-rust/hexane/src/delta.rs +793 -0
  279. data/vendor/automerge-rust/hexane/src/encoder.rs +639 -0
  280. data/vendor/automerge-rust/hexane/src/leb128.rs +82 -0
  281. data/vendor/automerge-rust/hexane/src/lib.rs +95 -0
  282. data/vendor/automerge-rust/hexane/src/pack.rs +325 -0
  283. data/vendor/automerge-rust/hexane/src/raw.rs +314 -0
  284. data/vendor/automerge-rust/hexane/src/rle.rs +928 -0
  285. data/vendor/automerge-rust/hexane/src/slab/tree.rs +1373 -0
  286. data/vendor/automerge-rust/hexane/src/slab/writer.rs +535 -0
  287. data/vendor/automerge-rust/hexane/src/slab.rs +224 -0
  288. data/vendor/automerge-rust/hexane/src/test.rs +108 -0
  289. data/vendor/bundle/ruby/3.3.0/bin/rake +29 -0
  290. data/vendor/bundle/ruby/3.3.0/bin/rake-compiler +29 -0
  291. data/vendor/bundle/ruby/3.3.0/bin/rake-compiler-dock +29 -0
  292. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/History.rdoc +1732 -0
  293. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/Manifest.txt +32 -0
  294. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/README.rdoc +845 -0
  295. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/Rakefile +97 -0
  296. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/design_rationale.rb +54 -0
  297. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/hoe/minitest.rb +30 -0
  298. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/assertions.rb +850 -0
  299. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/autorun.rb +6 -0
  300. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/benchmark.rb +452 -0
  301. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/compress.rb +94 -0
  302. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/error_on_warning.rb +11 -0
  303. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/expectations.rb +321 -0
  304. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/hell.rb +11 -0
  305. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/manual_plugins.rb +16 -0
  306. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/mock.rb +327 -0
  307. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/parallel.rb +72 -0
  308. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/pride.rb +4 -0
  309. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/pride_plugin.rb +135 -0
  310. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/spec.rb +353 -0
  311. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/test.rb +238 -0
  312. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/test_task.rb +324 -0
  313. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/unit.rb +42 -0
  314. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest.rb +1250 -0
  315. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/metametameta.rb +150 -0
  316. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/test_minitest_assertions.rb +1677 -0
  317. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/test_minitest_benchmark.rb +137 -0
  318. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/test_minitest_mock.rb +1213 -0
  319. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/test_minitest_reporter.rb +437 -0
  320. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/test_minitest_spec.rb +1159 -0
  321. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/test_minitest_test.rb +1374 -0
  322. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/test_minitest_test_task.rb +57 -0
  323. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/History.rdoc +2454 -0
  324. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/MIT-LICENSE +21 -0
  325. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/README.rdoc +155 -0
  326. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/command_line_usage.rdoc +171 -0
  327. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/example/Rakefile1 +38 -0
  328. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/example/Rakefile2 +35 -0
  329. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/example/a.c +6 -0
  330. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/example/b.c +6 -0
  331. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/example/main.c +11 -0
  332. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/glossary.rdoc +42 -0
  333. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/jamis.rb +592 -0
  334. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/proto_rake.rdoc +127 -0
  335. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/rake.1 +156 -0
  336. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/rakefile.rdoc +635 -0
  337. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/rational.rdoc +151 -0
  338. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/exe/rake +27 -0
  339. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/application.rb +847 -0
  340. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/backtrace.rb +25 -0
  341. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/clean.rb +78 -0
  342. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/cloneable.rb +17 -0
  343. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/cpu_counter.rb +122 -0
  344. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/default_loader.rb +15 -0
  345. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/dsl_definition.rb +196 -0
  346. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/early_time.rb +22 -0
  347. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/ext/core.rb +26 -0
  348. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/ext/string.rb +176 -0
  349. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/file_creation_task.rb +25 -0
  350. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/file_list.rb +435 -0
  351. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/file_task.rb +58 -0
  352. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/file_utils.rb +137 -0
  353. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/file_utils_ext.rb +135 -0
  354. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/invocation_chain.rb +57 -0
  355. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/invocation_exception_mixin.rb +17 -0
  356. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/late_time.rb +18 -0
  357. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/linked_list.rb +112 -0
  358. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/loaders/makefile.rb +54 -0
  359. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/multi_task.rb +14 -0
  360. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/name_space.rb +38 -0
  361. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/options.rb +31 -0
  362. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/packagetask.rb +222 -0
  363. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/phony.rb +16 -0
  364. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/private_reader.rb +21 -0
  365. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/promise.rb +100 -0
  366. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/pseudo_status.rb +30 -0
  367. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/rake_module.rb +67 -0
  368. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/rake_test_loader.rb +27 -0
  369. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/rule_recursion_overflow_error.rb +20 -0
  370. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/scope.rb +43 -0
  371. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/task.rb +434 -0
  372. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/task_argument_error.rb +8 -0
  373. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/task_arguments.rb +113 -0
  374. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/task_manager.rb +333 -0
  375. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/tasklib.rb +12 -0
  376. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/testtask.rb +192 -0
  377. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/thread_history_display.rb +49 -0
  378. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/thread_pool.rb +157 -0
  379. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/trace_output.rb +23 -0
  380. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/version.rb +10 -0
  381. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/win32.rb +17 -0
  382. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake.rb +69 -0
  383. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/rake.gemspec +102 -0
  384. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/Gemfile +8 -0
  385. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/History.md +695 -0
  386. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/LICENSE.txt +20 -0
  387. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/README.md +476 -0
  388. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/Rakefile +15 -0
  389. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/appveyor.yml +22 -0
  390. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/bin/rake-compiler +24 -0
  391. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/cucumber.yml +4 -0
  392. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/compile.feature +79 -0
  393. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/cross-compile.feature +23 -0
  394. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/cross-package-multi.feature +15 -0
  395. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/cross-package.feature +14 -0
  396. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/java-compile.feature +22 -0
  397. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/java-no-native-compile.feature +33 -0
  398. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/java-package.feature +24 -0
  399. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/package.feature +40 -0
  400. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/step_definitions/compilation.rb +70 -0
  401. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/step_definitions/cross_compilation.rb +27 -0
  402. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/step_definitions/execution.rb +52 -0
  403. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/step_definitions/folders.rb +32 -0
  404. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/step_definitions/gem.rb +46 -0
  405. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/step_definitions/java_compilation.rb +7 -0
  406. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/support/env.rb +10 -0
  407. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/support/file_template_helpers.rb +137 -0
  408. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/support/generator_helpers.rb +123 -0
  409. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/support/platform_extension_helpers.rb +27 -0
  410. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/lib/rake/baseextensiontask.rb +90 -0
  411. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/lib/rake/compiler_config.rb +38 -0
  412. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/lib/rake/extensioncompiler.rb +51 -0
  413. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/lib/rake/extensiontask.rb +589 -0
  414. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/lib/rake/javaextensiontask.rb +321 -0
  415. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/tasks/bin/cross-ruby.rake +189 -0
  416. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/tasks/bootstrap.rake +11 -0
  417. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/tasks/common.rake +10 -0
  418. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/tasks/cucumber.rake +23 -0
  419. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/tasks/gem.rake +15 -0
  420. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/tasks/rspec.rake +9 -0
  421. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/CHANGELOG.md +446 -0
  422. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/CONTRIBUTING.md +109 -0
  423. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/Dockerfile.jruby +79 -0
  424. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/Dockerfile.mri.erb +282 -0
  425. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/Gemfile +8 -0
  426. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/LICENSE.txt +22 -0
  427. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/README.md +447 -0
  428. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/Rakefile +246 -0
  429. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/bin/rake-compiler-dock +18 -0
  430. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/buildkitd.toml +2 -0
  431. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/gem_helper.rb +54 -0
  432. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/mk_i686.rb +18 -0
  433. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/mk_musl_cross.sh +37 -0
  434. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/mk_osxcross.sh +45 -0
  435. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/mk_pkg_config.sh +24 -0
  436. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/parallel_docker_build.rb +169 -0
  437. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/patches/rake-compiler-1.3.1/0004-Enable-build-of-static-libruby.patch +38 -0
  438. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/patches/rake-compiler-1.3.1/0005-build-miniruby-first.patch +16 -0
  439. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/patches/rake-compiler-1.3.1/0006-ruby-4-rubyspec-capiext.patch +16 -0
  440. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/rcd-env.sh +6 -0
  441. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/runas +7 -0
  442. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/sigfw.c +45 -0
  443. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/strip_wrapper_codesign +17 -0
  444. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/strip_wrapper_vbox +30 -0
  445. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/sudoers +1 -0
  446. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/colors.rb +43 -0
  447. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/docker_check.rb +356 -0
  448. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/predefined_user_group.rb +5 -0
  449. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/starter.rb +206 -0
  450. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/version.rb +4 -0
  451. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock.rb +151 -0
  452. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/Dockerfile +66 -0
  453. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/README.md +14 -0
  454. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/binutils-mingw-w64-ignore-check-errors.patch +13 -0
  455. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/gcc-mingw-w64-only-c-c++.patch +13 -0
  456. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/mingw-w64-enable-ucrt.patch +22 -0
  457. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/rake-compiler-dock.gemspec +34 -0
  458. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/env/Dockerfile.alpine +17 -0
  459. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/env/Dockerfile.debian +24 -0
  460. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/fixtures/mig_test_rpc.defs +8 -0
  461. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/Gemfile +11 -0
  462. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/Rakefile +97 -0
  463. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/java/RcdTestExtService.java +19 -0
  464. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/java/RubyRcdTest.java +16 -0
  465. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/mri/extconf.rb +111 -0
  466. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/mri/rcd_test_ext.c +65 -0
  467. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/mri/rcd_test_ext.h +11 -0
  468. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/lib/rcd_test.rb +6 -0
  469. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/rcd_test.gemspec +28 -0
  470. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/test/test_basic.rb +49 -0
  471. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/test_environment_variables.rb +108 -0
  472. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/test_mig.rb +18 -0
  473. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/test_parallel_docker_build.rb +95 -0
  474. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/test_rubygems_plugins.rb +12 -0
  475. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/test_starter.rb +158 -0
  476. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/test_versions.rb +82 -0
  477. data/vendor/bundle/ruby/3.3.0/specifications/minitest-5.27.0.gemspec +32 -0
  478. data/vendor/bundle/ruby/3.3.0/specifications/rake-13.4.2.gemspec +26 -0
  479. data/vendor/bundle/ruby/3.3.0/specifications/rake-compiler-1.3.1.gemspec +33 -0
  480. data/vendor/bundle/ruby/3.3.0/specifications/rake-compiler-dock-1.12.0.gemspec +28 -0
  481. metadata +584 -0
@@ -0,0 +1,1098 @@
1
+ use std::str::FromStr;
2
+
3
+ use automerge::{
4
+ hydrate_list, hydrate_map,
5
+ iter::Span,
6
+ marks::{ExpandMark, Mark, UpdateSpansConfig},
7
+ transaction::Transactable,
8
+ ActorId, AutoCommit, ConcreteTextValue, ObjType, Patch, PatchAction, Prop, ReadDoc,
9
+ ScalarValue, TextEncoding, Value, ROOT,
10
+ };
11
+ const B: usize = 16;
12
+
13
+ use proptest::strategy::Strategy;
14
+ use test_log::test;
15
+
16
+ #[test]
17
+ fn simple_update_text() {
18
+ let mut doc = AutoCommit::new();
19
+ let text = doc.put_object(ROOT, "text", ObjType::Text).unwrap();
20
+ doc.splice_text(&text, 0, 0, "Hello, world!").unwrap();
21
+
22
+ let mut doc2 = doc.fork();
23
+ doc2.update_text(&text, "Goodbye, world!").unwrap();
24
+
25
+ doc.update_text(&text, "Hello, friends!").unwrap();
26
+
27
+ doc.merge(&mut doc2).unwrap();
28
+
29
+ assert_eq!(doc.text(&text).unwrap(), "Goodbye, friends!");
30
+ }
31
+
32
+ #[test]
33
+ fn update_text_big_ole_graphemes() {
34
+ let actor1 = ActorId::from_str("aaaaaa").unwrap();
35
+ let actor2 = ActorId::from_str("bbbbbb").unwrap();
36
+ let mut doc = AutoCommit::new().with_actor(actor1);
37
+ let text = doc.put_object(ROOT, "text", ObjType::Text).unwrap();
38
+
39
+ // <200d> is a "zero-width joiner" which is used to combine multiple graphemes into one.
40
+ // combining man+woman+boy should render as a single emoji of a familry of three
41
+ doc.splice_text(&text, 0, 0, "left👨‍👩‍👦right").unwrap();
42
+
43
+ let mut doc2 = doc.fork().with_actor(actor2);
44
+ // man, woman, girl - a different family of three
45
+ doc2.update_text(&text, "left👨‍👩‍👧right").unwrap();
46
+
47
+ // man, woman, boy, boy - a family of four
48
+ doc.update_text(&text, "left👨‍👩‍👦‍👦right").unwrap();
49
+
50
+ doc.merge(&mut doc2).unwrap();
51
+ // should render as a family of three followed by a family of four
52
+ assert_eq!(doc.text(&text).unwrap(), "left👨‍👩‍👧👨‍👩‍👦‍👦right");
53
+ }
54
+
55
+ macro_rules! assert_marks {
56
+ ($marks:expr, $expected:expr) => {
57
+ let marks = $marks
58
+ .iter()
59
+ .collect::<std::collections::HashMap<&str, &ScalarValue>>();
60
+ let expected = $expected
61
+ .into_iter()
62
+ .map(|(name, value)| (name, ScalarValue::from(value)))
63
+ .collect::<std::collections::HashMap<&str, _>>();
64
+ assert_eq!(
65
+ marks.len(),
66
+ $expected.len(),
67
+ "expected {} marks, got {}",
68
+ $expected.len(),
69
+ marks.len()
70
+ );
71
+ let mut marks_equal = true;
72
+ for (mark_name, mark_value) in &expected {
73
+ if marks.get(*mark_name) != Some(&&mark_value) {
74
+ marks_equal = false;
75
+ break;
76
+ }
77
+ }
78
+ if !marks_equal {
79
+ panic!("expected marks {:?}, got {:?}", expected, marks);
80
+ }
81
+ };
82
+ }
83
+
84
+ #[test]
85
+ fn incremental_splice_patches_include_marks() {
86
+ // Test for a splice which triggers the can_shortcut_search optimization
87
+ // failing to include marks in the incremental splice patch
88
+
89
+ let mut doc = AutoCommit::new();
90
+ let text = doc.put_object(ROOT, "text", ObjType::Text).unwrap();
91
+ doc.splice_text(&text, 0, 0, "12345").unwrap();
92
+
93
+ doc.mark(
94
+ &text,
95
+ Mark::new("strong".to_string(), true, 1, 2),
96
+ automerge::marks::ExpandMark::Both,
97
+ )
98
+ .unwrap();
99
+ doc.update_diff_cursor();
100
+
101
+ // Do the first splice
102
+ doc.splice_text(&text, 1, 0, "-").unwrap();
103
+ let patches = doc.diff_incremental();
104
+ assert_eq!(patches.len(), 1);
105
+
106
+ let PatchAction::SpliceText {
107
+ index,
108
+ value,
109
+ marks,
110
+ } = patches[0].action.clone()
111
+ else {
112
+ panic!("expected a splice patch, got {:?}", patches[0].action);
113
+ };
114
+ assert_eq!(index, 1);
115
+ assert_eq!(value.make_string(), "-");
116
+ let Some(marks) = marks else {
117
+ panic!("expected marks, got {:?}", patches[0].action);
118
+ };
119
+ assert_marks!(marks, [("strong", true)]);
120
+
121
+ // Do the second splice
122
+ doc.splice_text(&text, 2, 0, "-").unwrap();
123
+ let patches = doc.diff_incremental();
124
+ assert_eq!(patches.len(), 1);
125
+ let patch = patches[0].clone();
126
+
127
+ let PatchAction::SpliceText {
128
+ index,
129
+ value,
130
+ marks,
131
+ } = patch.action.clone()
132
+ else {
133
+ panic!("expected a splice patch, got {:?}", patch.action);
134
+ };
135
+ assert_eq!(index, 2);
136
+ assert_eq!(value.make_string(), "-");
137
+ let Some(marks) = marks else {
138
+ panic!("expected patch with marks, got {:?}", patch.action);
139
+ };
140
+ assert_marks!(marks, [("strong", true)]);
141
+ }
142
+
143
+ #[test]
144
+ fn mark_created_after_insertion() {
145
+ let mut doc = AutoCommit::new();
146
+ let text = doc.put_object(ROOT, "text", ObjType::Text).unwrap();
147
+ doc.splice_text(&text, 0, 0, "12345").unwrap();
148
+
149
+ doc.mark(
150
+ &text,
151
+ Mark::new("strong".to_string(), true, 1, 2),
152
+ automerge::marks::ExpandMark::Both,
153
+ )
154
+ .unwrap();
155
+ doc.mark(
156
+ &text,
157
+ Mark::new("strong".to_string(), true, 3, 4),
158
+ automerge::marks::ExpandMark::Both,
159
+ )
160
+ .unwrap();
161
+ }
162
+
163
+ #[test]
164
+ fn local_patches_created_for_marks() {
165
+ let mut doc = AutoCommit::new();
166
+ let text = doc
167
+ .put_object(automerge::ROOT, "text", ObjType::Text)
168
+ .unwrap();
169
+ doc.splice_text(&text, 0, 0, "the quick fox jumps over the lazy dog")
170
+ .unwrap();
171
+ doc.mark(
172
+ &text,
173
+ Mark::new("bold".to_string(), true, 0, 37),
174
+ ExpandMark::Both,
175
+ )
176
+ .unwrap();
177
+ doc.mark(
178
+ &text,
179
+ Mark::new("italic".to_string(), true, 4, 19),
180
+ ExpandMark::Both,
181
+ )
182
+ .unwrap();
183
+ let id = "somerandomcommentid".to_string();
184
+ doc.mark(
185
+ &text,
186
+ Mark::new(
187
+ format!("comment:{}", id),
188
+ "foxes are my favorite animal!".to_string(),
189
+ 10,
190
+ 13,
191
+ ),
192
+ ExpandMark::Both,
193
+ )
194
+ .unwrap();
195
+ doc.commit().unwrap();
196
+ let patches = doc.diff_incremental();
197
+
198
+ let expected_patches = vec![
199
+ Patch {
200
+ obj: automerge::ROOT,
201
+ path: vec![],
202
+ action: PatchAction::PutMap {
203
+ key: "text".to_string(),
204
+ value: (
205
+ automerge::Value::Object(automerge::ObjType::Text),
206
+ text.clone(),
207
+ ),
208
+ conflict: false,
209
+ },
210
+ },
211
+ Patch {
212
+ obj: text.clone(),
213
+ path: vec![(automerge::ROOT, "text".into())],
214
+ action: PatchAction::SpliceText {
215
+ index: 0,
216
+ value: ConcreteTextValue::new("the ", TextEncoding::platform_default()),
217
+ marks: Some(
218
+ vec![("bold".to_string(), ScalarValue::from(true))]
219
+ .into_iter()
220
+ .collect(),
221
+ ),
222
+ },
223
+ },
224
+ Patch {
225
+ obj: text.clone(),
226
+ path: vec![(automerge::ROOT, "text".into())],
227
+ action: PatchAction::SpliceText {
228
+ index: 4,
229
+ value: ConcreteTextValue::new("quick ", TextEncoding::platform_default()),
230
+ marks: Some(
231
+ vec![
232
+ ("bold".to_string(), ScalarValue::from(true)),
233
+ ("italic".to_string(), ScalarValue::from(true)),
234
+ ]
235
+ .into_iter()
236
+ .collect(),
237
+ ),
238
+ },
239
+ },
240
+ Patch {
241
+ obj: text.clone(),
242
+ path: vec![(automerge::ROOT, "text".into())],
243
+ action: PatchAction::SpliceText {
244
+ index: 10,
245
+ value: ConcreteTextValue::new("fox", TextEncoding::platform_default()),
246
+ marks: Some(
247
+ vec![
248
+ ("bold".to_string(), ScalarValue::from(true)),
249
+ (
250
+ format!("comment:{}", id),
251
+ ScalarValue::from("foxes are my favorite animal!".to_string()),
252
+ ),
253
+ ("italic".to_string(), ScalarValue::from(true)),
254
+ ]
255
+ .into_iter()
256
+ .collect(),
257
+ ),
258
+ },
259
+ },
260
+ Patch {
261
+ obj: text.clone(),
262
+ path: vec![(automerge::ROOT, "text".into())],
263
+ action: PatchAction::SpliceText {
264
+ index: 13,
265
+ value: ConcreteTextValue::new(" jumps", TextEncoding::platform_default()),
266
+ marks: Some(
267
+ vec![
268
+ ("bold".to_string(), ScalarValue::from(true)),
269
+ ("italic".to_string(), ScalarValue::from(true)),
270
+ ]
271
+ .into_iter()
272
+ .collect(),
273
+ ),
274
+ },
275
+ },
276
+ Patch {
277
+ obj: text.clone(),
278
+ path: vec![(automerge::ROOT, "text".into())],
279
+ action: PatchAction::SpliceText {
280
+ index: 19,
281
+ value: ConcreteTextValue::new(
282
+ " over the lazy dog",
283
+ TextEncoding::platform_default(),
284
+ ),
285
+ marks: Some(
286
+ vec![("bold".to_string(), ScalarValue::from(true))]
287
+ .into_iter()
288
+ .collect(),
289
+ ),
290
+ },
291
+ },
292
+ ];
293
+
294
+ assert_eq!(patches, expected_patches);
295
+ }
296
+
297
+ #[test]
298
+ fn spans_are_consolidated_in_the_presence_of_zero_length_spans() {
299
+ let mut doc = AutoCommit::new();
300
+ let text = doc.put_object(ROOT, "text", ObjType::Text).unwrap();
301
+ doc.splice_text(&text, 0, 0, "1234").unwrap();
302
+
303
+ doc.mark(
304
+ &text,
305
+ Mark::new("strong".to_string(), true, 1, 1),
306
+ automerge::marks::ExpandMark::Both,
307
+ )
308
+ .unwrap();
309
+
310
+ doc.mark(
311
+ &text,
312
+ Mark::new("strong".to_string(), true, 2, 2),
313
+ automerge::marks::ExpandMark::Both,
314
+ )
315
+ .unwrap();
316
+
317
+ let spans = doc.spans(&text).unwrap().collect::<Vec<_>>();
318
+ assert!(marks_are_consolidated(&spans));
319
+ }
320
+
321
+ #[test]
322
+ fn empty_marks_before_block_marker_dont_repeat_text() {
323
+ let mut doc = AutoCommit::new();
324
+ let text = doc.put_object(ROOT, "text", ObjType::Text).unwrap();
325
+ doc.split_block(&text, 0).unwrap();
326
+ doc.split_block(&text, 0).unwrap();
327
+ doc.mark(
328
+ &text,
329
+ Mark::new("strong".to_string(), ScalarValue::from(true), 1, 1),
330
+ automerge::marks::ExpandMark::Both,
331
+ )
332
+ .unwrap();
333
+ doc.splice_text(&text, 2, 0, "a").unwrap();
334
+
335
+ let spans = doc.spans(&text).unwrap().collect::<Vec<_>>();
336
+
337
+ assert_eq!(
338
+ spans,
339
+ vec![
340
+ Span::Block(hydrate_map! {}),
341
+ Span::Block(hydrate_map! {}),
342
+ Span::Text {
343
+ text: "a".to_string(),
344
+ marks: None
345
+ },
346
+ ]
347
+ );
348
+ }
349
+
350
+ #[test]
351
+ fn insertions_after_noexpand_spans_are_not_marked() {
352
+ let mut doc = AutoCommit::new();
353
+ let text = doc.put_object(ROOT, "text", ObjType::Text).unwrap();
354
+ let block1 = doc.split_block(&text, 0).unwrap();
355
+ doc.update_object(
356
+ &block1,
357
+ &hydrate_map! {
358
+ "type" => "heading",
359
+ "parents" => hydrate_list![],
360
+ "attrs" => hydrate_map!{},
361
+ }
362
+ .into(),
363
+ )
364
+ .unwrap();
365
+ doc.splice_text(&text, 1, 0, "Heading").unwrap();
366
+ let block2 = doc.split_block(&text, 8).unwrap();
367
+ doc.update_object(
368
+ &block2,
369
+ &hydrate_map! {
370
+ "type" => "paragraph",
371
+ "parents" => hydrate_list![],
372
+ "attrs" => hydrate_map!{},
373
+ }
374
+ .into(),
375
+ )
376
+ .unwrap();
377
+ doc.splice_text(&text, 9, 0, "a").unwrap();
378
+ doc.mark(
379
+ &text,
380
+ Mark::new("strong".to_string(), ScalarValue::from(true), 9, 9),
381
+ automerge::marks::ExpandMark::None,
382
+ )
383
+ .unwrap();
384
+
385
+ let spans = doc.spans(&text).unwrap();
386
+ let mut new_blocks = spans.collect::<Vec<_>>();
387
+ new_blocks.push(Span::Block(hydrate_map! {
388
+ "type" => "paragraph",
389
+ "parents" => hydrate_list![],
390
+ "attrs" => hydrate_map!{},
391
+ }));
392
+
393
+ doc.update_spans(&text, UpdateSpansConfig::default(), new_blocks)
394
+ .unwrap();
395
+
396
+ let heads_before = doc.get_heads();
397
+ doc.splice_text(&text, 11, 0, "a").unwrap();
398
+ let heads_after = doc.get_heads();
399
+
400
+ let patches = doc.diff(&heads_before, &heads_after);
401
+ assert_eq!(patches.len(), 1);
402
+
403
+ let Patch {
404
+ action: PatchAction::SpliceText { marks, .. },
405
+ ..
406
+ } = &patches[0]
407
+ else {
408
+ panic!("expected single splice patch, got: {:?}", patches);
409
+ };
410
+ assert_eq!(
411
+ marks, &None,
412
+ "expected marks to be none, got {:?}",
413
+ patches[0]
414
+ );
415
+ }
416
+
417
+ #[test]
418
+ fn marks_which_cross_optree_boundaries_are_not_double_counted_in_splice_patches() {
419
+ // This test exposese an issue where marks suddenly appeared on characters in a document after
420
+ // a mark which had ended much earlier in the document.The problem was caused by an interaction
421
+ // between the indexes on optree pages and a bug in the way the insert query keeps track of
422
+ // marks as it searches for its target.
423
+ //
424
+ // As the insert query traverses the op tree it keeps track of a HashMap<OpId, MarkData>. The
425
+ // OpId is the ID of the op which created the mark and the MarkData is the data associated with
426
+ // that mark. Whenever the query encounters a BeginMark operation it adds it to the map and
427
+ // whenever it encounters an EndMark operation it removes it. Once the query has found its
428
+ // target the map can be evaluated to determine the marks active at the insertion point, which
429
+ // are then passed to the patch.
430
+ //
431
+ // The OpTree nodes have indexes on them which the insert query uses to skip sections of the
432
+ // tree which definitely don't contain the target op. The primary useful thing the index
433
+ // contains is the visible length - the number of visible ops - in the node and its children.
434
+ // This allows the insert query to skip past the entire node if the target is beyond the
435
+ // visible length of the index.
436
+ //
437
+ // In order to account for the fact that the skipped nodes may contain begin or end mark
438
+ // operations the indexes also have a `mark_begin: HashMap<OpId, MarkData>` and a `mark_end:
439
+ // Vec<OpId>` field which keep track of the begin and end operations in the node and its
440
+ // children. When the insert query skips a node it also updates its map of active marks by
441
+ // removing the marks which have an end operation in the node and adding the marks which have a
442
+ // begin operation.
443
+ //
444
+ // The bug was that the removal code was doing this:
445
+ //
446
+ // for id in index.mark_end.iter() {
447
+ // marks.remove(&id);
448
+ // }
449
+ //
450
+ // Recall that `marks` is a HashMap<OpId, MarkData> which maps the ID of the op which created
451
+ // the mark, but the `mark_end` field is a Vec<OpId> which contains the ID of the end mark. End
452
+ // mark operations are always the operation immediately following the begin mark operation, so
453
+ // we can calculate the op we actually need to remove by calling `id.prev()`. Like so:
454
+ //
455
+ // for id in index.mark_end.iter() {
456
+ // marks.remove(&id.prev());
457
+ // }
458
+ let mut doc = AutoCommit::new();
459
+ let text = doc.put_object(ROOT, "text", ObjType::Text).unwrap();
460
+ // insert enough text that we cover two pages of the op tree
461
+ let one_page = "a".repeat(B * 2);
462
+ doc.splice_text(&text, doc.length(&text), 0, &one_page)
463
+ .unwrap();
464
+ // Add a mark that starts in one page and ends in the next
465
+ doc.mark(
466
+ &text,
467
+ Mark::new("strong".to_string(), ScalarValue::from(true), B - 1, B + 1),
468
+ automerge::marks::ExpandMark::None,
469
+ )
470
+ .unwrap();
471
+
472
+ // Now add characters. Eventually the end mark will be in an op tree page which is skipped by
473
+ // the insert query, exposing the faulty logic.
474
+ for _ in 0..100 {
475
+ // This is necessary to clear the `Index::last_insert cache, which otherwise just uses the
476
+ // marks of the last inserted character when generating the patch.
477
+ doc.split_block(&text, doc.length(&text)).unwrap();
478
+ // This is necessary because otherwise the patches can be generated from scratch, which
479
+ // will mean we don't use the logic in the insert query
480
+ doc.update_diff_cursor();
481
+ let heads_before = doc.get_heads();
482
+ doc.splice_text(&text, doc.length(&text), 0, "a").unwrap();
483
+ let heads_after = doc.get_heads();
484
+
485
+ let patches = doc.diff(&heads_before, &heads_after);
486
+ assert_eq!(patches.len(), 1);
487
+
488
+ let Patch {
489
+ action: PatchAction::SpliceText { marks, .. },
490
+ ..
491
+ } = &patches[0]
492
+ else {
493
+ panic!("expected single splice patch, got: {:?}", patches);
494
+ };
495
+ // If the end mark is not removed correctly then we will see unexpected marks
496
+ assert_eq!(
497
+ marks, &None,
498
+ "expected marks to be none, got {:?}",
499
+ patches[0]
500
+ );
501
+ }
502
+ }
503
+
504
+ #[test]
505
+ fn noexpand_marks_at_the_end_of_text_should_not_emit_marked_patches_on_following_insertions() {
506
+ let mut doc = AutoCommit::new();
507
+ let text = doc.put_object(ROOT, "text", ObjType::Text).unwrap();
508
+ doc.splice_text(&text, doc.length(&text), 0, "Hello world")
509
+ .unwrap();
510
+ let mark_start = doc.length(&text) - 1;
511
+ let mark_end = doc.length(&text);
512
+ doc.mark(
513
+ &text,
514
+ Mark::new(
515
+ "strong".to_string(),
516
+ ScalarValue::from(true),
517
+ mark_start,
518
+ mark_end,
519
+ ),
520
+ automerge::marks::ExpandMark::None,
521
+ )
522
+ .unwrap();
523
+
524
+ doc.update_diff_cursor();
525
+ let heads_before = doc.get_heads();
526
+ doc.splice_text(&text, doc.length(&text), 0, "a").unwrap();
527
+ let heads_after = doc.get_heads();
528
+
529
+ let patches = doc.diff(&heads_before, &heads_after);
530
+ assert_eq!(patches.len(), 1);
531
+
532
+ let Patch {
533
+ action: PatchAction::SpliceText { marks, .. },
534
+ ..
535
+ } = &patches[0]
536
+ else {
537
+ panic!("expected single splice patch, got: {:?}", patches);
538
+ };
539
+ assert_eq!(marks, &None,);
540
+ }
541
+
542
+ #[test]
543
+ fn expand_marks_are_reported_in_patches() {
544
+ let mut doc = AutoCommit::new();
545
+ let text = doc.put_object(ROOT, "text", ObjType::Text).unwrap();
546
+ doc.splice_text(&text, 0, 0, "aaabbbccc").unwrap();
547
+ doc.mark(
548
+ &text,
549
+ Mark::new("strong".to_string(), ScalarValue::from(true), 3, 6),
550
+ automerge::marks::ExpandMark::Both,
551
+ )
552
+ .unwrap();
553
+
554
+ doc.update_diff_cursor();
555
+ let mut patches = Vec::new();
556
+
557
+ doc.splice_text(&text, 6, 0, "<").unwrap();
558
+ patches.extend(doc.diff_incremental());
559
+
560
+ doc.splice_text(&text, 3, 0, ">").unwrap();
561
+ patches.extend(doc.diff_incremental());
562
+
563
+ assert_eq!(patches.len(), 2);
564
+
565
+ let Patch {
566
+ action:
567
+ PatchAction::SpliceText {
568
+ marks,
569
+ index,
570
+ value,
571
+ ..
572
+ },
573
+ ..
574
+ } = &patches[0]
575
+ else {
576
+ panic!("expected a patch, got: {:?}", patches);
577
+ };
578
+ assert_eq!(*index, 6);
579
+ assert_eq!(value.make_string(), "<".to_string());
580
+ assert_eq!(
581
+ marks,
582
+ &Some(
583
+ vec![("strong".to_string(), ScalarValue::from(true))]
584
+ .into_iter()
585
+ .collect()
586
+ )
587
+ );
588
+
589
+ let Patch {
590
+ action:
591
+ PatchAction::SpliceText {
592
+ marks,
593
+ index,
594
+ value,
595
+ ..
596
+ },
597
+ ..
598
+ } = &patches[1]
599
+ else {
600
+ panic!("expected a patch, got: {:?}", patches);
601
+ };
602
+ assert_eq!(*index, 3);
603
+ assert_eq!(value.make_string(), ">".to_string());
604
+ assert_eq!(
605
+ marks,
606
+ &Some(
607
+ vec![("strong".to_string(), ScalarValue::from(true))]
608
+ .into_iter()
609
+ .collect()
610
+ )
611
+ );
612
+ }
613
+
614
+ #[test]
615
+ fn test_remote_patches_for_marks_with_expand_after() {
616
+ let mut doc_a = AutoCommit::new();
617
+ let text = doc_a.put_object(ROOT, "text", ObjType::Text).unwrap();
618
+ doc_a.splice_text(&text, 0, 0, "fox").unwrap();
619
+ doc_a
620
+ .mark(
621
+ &text,
622
+ Mark::new("strong".to_string(), ScalarValue::from(true), 0, 3),
623
+ automerge::marks::ExpandMark::After,
624
+ )
625
+ .unwrap();
626
+
627
+ let mut doc_b = doc_a.fork();
628
+
629
+ let heads_before_a = doc_a.get_heads();
630
+ doc_a.splice_text(&text, 3, 0, "a").unwrap();
631
+ let heads_after_a = doc_a.get_heads();
632
+
633
+ doc_b.update_diff_cursor();
634
+ let heads_before_b = doc_b.get_heads();
635
+ doc_b.merge(&mut doc_a).unwrap();
636
+ let heads_after_b = doc_b.get_heads();
637
+
638
+ let patches_a = doc_a.diff(&heads_before_a, &heads_after_a);
639
+ let patches_b = doc_b.diff(&heads_before_b, &heads_after_b);
640
+
641
+ assert_eq!(patches_a, patches_b);
642
+ }
643
+
644
+ #[test]
645
+ fn update_text_change_at() {
646
+ let mut doc = AutoCommit::new();
647
+ let text = doc.put_object(ROOT, "text", ObjType::Text).unwrap();
648
+ doc.update_text(&text, "a\n").unwrap();
649
+ let initial_heads = doc.get_heads();
650
+ doc.update_text(&text, "a\nb\n").unwrap();
651
+ doc.isolate(&initial_heads);
652
+ doc.update_text(&text, "a\nc\n").unwrap();
653
+ doc.integrate();
654
+
655
+ assert_eq!(doc.text(&text).unwrap(), "a\nc\nb\n");
656
+ }
657
+
658
+ proptest::proptest! {
659
+ #[test]
660
+ fn marks_are_okay(scenario in arb_scenario()) {
661
+ let mut doc = AutoCommit::new();
662
+ let text = doc.put_object(ROOT, "text", ObjType::Text).unwrap();
663
+ let mut expected_chars = String::new();
664
+ for action in &scenario {
665
+ match action {
666
+ Action::Insert{ index, value } => {
667
+ doc.splice_text(&text, *index, 0, value).unwrap();
668
+ expected_chars.insert_str(*index, value);
669
+ }
670
+ Action::Delete{ index, len } => {
671
+ doc.splice_text(&text, *index, *len as isize, "").unwrap();
672
+ expected_chars.drain(*index..(*index + *len));
673
+ }
674
+ Action::SplitBlock{ index } => {
675
+ doc.split_block(&text, *index).unwrap();
676
+ expected_chars.insert(*index, '\n');
677
+ }
678
+ Action::AddMark{ index, len, name, value } => {
679
+ doc.mark(&text, Mark::new(name.clone(), value.clone(), *index, index + len), automerge::marks::ExpandMark::Both).unwrap();
680
+ }
681
+ }
682
+ }
683
+ let spans = doc.spans(&text).unwrap().collect::<Vec<_>>();
684
+ if !marks_are_consolidated(&spans) {
685
+ println!("scenario: {:?}", scenario);
686
+ println!("spans: {:?}", spans);
687
+ panic!("marks are not consolidated");
688
+ }
689
+
690
+ let span_chars = spans.iter().map(|span| match span {
691
+ Span::Text{ text, marks: _ } => text.clone(),
692
+ Span::Block(_) => "\n".to_string(),
693
+ }).collect::<String>();
694
+ if !span_chars.chars().eq(expected_chars.chars()) {
695
+ println!("scenario: {:?}", scenario);
696
+ println!("expected: {:?}", expected_chars);
697
+ println!("actual: {:?}", span_chars);
698
+ panic!("expected text did not match span text");
699
+ }
700
+
701
+ // replace unicode object replacement which automerge inserts for block markers wwith a newline
702
+ let actual_chars = doc.text(&text).unwrap().replace('\u{fffc}', "\n");
703
+ if !actual_chars.chars().eq(expected_chars.chars()) {
704
+ println!("scenario: {:?}", scenario);
705
+ println!("expected: {:?}", expected_chars);
706
+ println!("actual: {:?}", actual_chars);
707
+ panic!("expected text did not match actual text");
708
+ }
709
+ }
710
+ }
711
+
712
+ fn marks_are_consolidated(spans: &Vec<Span>) -> bool {
713
+ let mut last_marks = None;
714
+ for span in spans {
715
+ match span {
716
+ Span::Text { text: _, marks } => {
717
+ if Some(marks) == last_marks {
718
+ return false;
719
+ }
720
+ last_marks = Some(marks);
721
+ }
722
+ _ => {
723
+ last_marks = None;
724
+ }
725
+ }
726
+ }
727
+ true
728
+ }
729
+
730
+ #[derive(Debug, Clone)]
731
+ enum Action {
732
+ Insert {
733
+ index: usize,
734
+ value: String,
735
+ },
736
+ Delete {
737
+ index: usize,
738
+ len: usize,
739
+ },
740
+ SplitBlock {
741
+ index: usize,
742
+ },
743
+ AddMark {
744
+ index: usize,
745
+ len: usize,
746
+ name: String,
747
+ value: ScalarValue,
748
+ },
749
+ }
750
+
751
+ fn arb_insert(text: &str) -> impl proptest::strategy::Strategy<Value = Action> {
752
+ (0..=text.len(), "[a-zA-Z]{1,10}").prop_map(|(index, value)| Action::Insert { index, value })
753
+ }
754
+
755
+ fn arb_delete(text: &str) -> impl proptest::strategy::Strategy<Value = Action> {
756
+ let len = text.len();
757
+ if len == 1 {
758
+ return proptest::strategy::Just(Action::Delete { index: 0, len: 1 }).boxed();
759
+ }
760
+ (1..len)
761
+ .prop_flat_map(move |delete_len| {
762
+ (0..(len - delete_len)).prop_map(move |index| Action::Delete {
763
+ index,
764
+ len: delete_len,
765
+ })
766
+ })
767
+ .boxed()
768
+ }
769
+
770
+ fn arb_split_block(text: &str) -> impl proptest::strategy::Strategy<Value = Action> {
771
+ (0..=text.len()).prop_map(|i| Action::SplitBlock { index: i })
772
+ }
773
+
774
+ fn arb_add_mark(text: &str) -> impl proptest::strategy::Strategy<Value = Action> {
775
+ let text_len = text.len();
776
+ (0..text_len).prop_flat_map(move |index| {
777
+ (0..(text_len - index)).prop_flat_map(move |len| {
778
+ ("[a-zA-Z]{1,10}", "[a-zA-Z]{1,10}").prop_map(move |(name, value)| Action::AddMark {
779
+ index,
780
+ len,
781
+ name,
782
+ value: ScalarValue::from(value),
783
+ })
784
+ })
785
+ })
786
+ }
787
+
788
+ fn arb_action(text: &str) -> impl proptest::strategy::Strategy<Value = Action> {
789
+ if text.is_empty() {
790
+ return arb_insert(text).boxed();
791
+ }
792
+ proptest::prop_oneof![
793
+ arb_insert(text),
794
+ arb_delete(text),
795
+ arb_split_block(text),
796
+ arb_add_mark(text),
797
+ ]
798
+ .boxed()
799
+ }
800
+
801
+ fn arb_scenario() -> impl proptest::strategy::Strategy<Value = Vec<Action>> {
802
+ fn pump(
803
+ state: String,
804
+ actions_so_far: Vec<Action>,
805
+ max_actions: usize,
806
+ ) -> impl proptest::strategy::Strategy<Value = Vec<Action>> {
807
+ if actions_so_far.len() >= max_actions {
808
+ return proptest::strategy::Just(actions_so_far).boxed();
809
+ }
810
+ arb_action(&state)
811
+ .prop_flat_map(move |action| {
812
+ let mut state = state.clone();
813
+ let mut actions_so_far = actions_so_far.clone();
814
+ actions_so_far.push(action.clone());
815
+ match action {
816
+ Action::Insert { index, value } => {
817
+ state.insert_str(index, &value);
818
+ }
819
+ Action::Delete { index, len } => {
820
+ state.drain(index..index + len);
821
+ }
822
+ Action::SplitBlock { index } => {
823
+ state.insert(index, '\n');
824
+ }
825
+ Action::AddMark { .. } => {}
826
+ }
827
+ pump(state, actions_so_far, max_actions)
828
+ })
829
+ .boxed()
830
+ }
831
+ (0_usize..10)
832
+ .prop_flat_map(move |max_actions| pump(String::new(), Vec::new(), max_actions).boxed())
833
+ }
834
+
835
+ #[test]
836
+ fn removed_marks_should_not_appear_in_get_marks() {
837
+ // Reproduces an issue
838
+ // (https://github.com/automerge/automerge-swift/issues/214) where marks
839
+ // removed by setting their value to null appear as marks in the `get_marks`
840
+ // call with null values
841
+ let mut doc = AutoCommit::new();
842
+
843
+ let text = doc.put_object(ROOT, "text", ObjType::Text).unwrap();
844
+ doc.splice_text(&text, 0, 0, "abcdefg").unwrap();
845
+
846
+ doc.mark(
847
+ &text,
848
+ Mark::new("name1".into(), ScalarValue::Int(1), 0, 1),
849
+ ExpandMark::None,
850
+ )
851
+ .unwrap();
852
+
853
+ // Now remove the mark at location 0
854
+ doc.mark(
855
+ &text,
856
+ Mark::new("name1".into(), ScalarValue::Null, 0, 1),
857
+ ExpandMark::None,
858
+ )
859
+ .unwrap();
860
+
861
+ // Get the marks at location 0 (which we just removed by setting it Null) and check they are empty
862
+ let marks = doc.get_marks(&text, 0, None).unwrap();
863
+ assert_eq!(marks.iter().collect::<Vec<_>>(), vec![]);
864
+ assert_eq!(marks.len(), 0);
865
+ assert_eq!(marks.num_marks(), 0);
866
+ }
867
+
868
+ #[test]
869
+ fn incorrect_patches_produced_when_isolating_and_integrating() {
870
+ // This test exercises the bug reported in https://github.com/automerge/automerge/issues/951
871
+ //
872
+ // The issue was reported as to do with `changeAt`, hence the use of
873
+ // `isolate` and `integrate` here. But in fact it occurs whenever there are
874
+ // conflicting changes and more than 100 patches
875
+
876
+ // Hard code actor ID to avoid flakes in patch ordering
877
+ let actor = ActorId::from_str("aaaaaa").unwrap();
878
+ let mut doc = AutoCommit::new_with_encoding(TextEncoding::UnicodeCodePoint).with_actor(actor);
879
+
880
+ let beginning = doc.get_heads();
881
+
882
+ // This issue was observed when the number of patches was larger than
883
+ // 100. This is because if there are more than 100 patches then the
884
+ // PatchBuilder::new function precomputes a visible path cache
885
+ const NUM_CHARS_IN_NEW_NAME: usize = 100;
886
+ let name = doc.put_object(&ROOT, "name", ObjType::Text).unwrap();
887
+ let new_name = "a".repeat(NUM_CHARS_IN_NEW_NAME);
888
+ doc.splice_text(&name, 0, 0, &new_name).unwrap();
889
+
890
+ // Create a concurrent change at the root
891
+ doc.isolate(&beginning);
892
+ let color = doc.put_object(&ROOT, "color", ObjType::Text).unwrap();
893
+ doc.splice_text(&color, 0, 0, "red").unwrap();
894
+ doc.integrate();
895
+ assert_eq!(doc.text(&color).unwrap(), "red");
896
+
897
+ // Pop the patches - this is necessary to make the test work
898
+ let _ignored_patches = doc.diff_incremental();
899
+
900
+ // Make sure the document has a clean patch log
901
+ doc.commit();
902
+
903
+ // Create another concurrent change
904
+ doc.isolate(&beginning);
905
+ let color = doc.put_object(&ROOT, "color", ObjType::Text).unwrap();
906
+ doc.splice_text(&color, 0, 0, "unset").unwrap();
907
+ doc.commit();
908
+ doc.integrate();
909
+
910
+ let patches = doc.diff_incremental();
911
+
912
+ // Here we would expect the patches to be something like:
913
+ //
914
+ // first patch back to the beginning of doc
915
+ // * DeleteMap ROOT "color"
916
+ // * DeleteMap ROOT "name"
917
+ //
918
+ // Now insert new items
919
+ // * PutMap ROOT "color" Text
920
+ // * PutMap ROOT "name" Text
921
+ // * SpliceText "name" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
922
+ // * SpliceText "color" "unset"
923
+ //
924
+ // But what we actually get is
925
+ //
926
+ // * DeleteMap ROOT "color"
927
+ // * DeleteMap ROOT "name"
928
+ //
929
+ // Now insert new items
930
+ // * PutMap ROOT "color" Text
931
+ // * PutMap ROOT "name" Text
932
+ // * DeleteSeq "color" 3
933
+ // * SpliceText "color" "red"
934
+ // * SpliceText "name" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
935
+ // * SpliceText "unset"
936
+ //
937
+ // Where it appears that the 'red' property has been inserted into the patch
938
+ // log in the wrong order (we would at least expect the deletion to come
939
+ // after the insertion)
940
+
941
+ // This assertion works until NUM_CHARS_IN_NEW_NAME is greater than 44
942
+ assert_eq!(
943
+ patches,
944
+ vec![
945
+ Patch {
946
+ obj: ROOT,
947
+ path: vec![],
948
+ action: PatchAction::DeleteMap {
949
+ key: "color".to_string()
950
+ },
951
+ },
952
+ Patch {
953
+ obj: ROOT,
954
+ path: vec![],
955
+ action: PatchAction::DeleteMap {
956
+ key: "name".to_string()
957
+ },
958
+ },
959
+ Patch {
960
+ obj: ROOT,
961
+ path: vec![],
962
+ action: PatchAction::PutMap {
963
+ key: "color".to_string(),
964
+ value: (Value::Object(ObjType::Text), color.clone()),
965
+ conflict: true
966
+ },
967
+ },
968
+ Patch {
969
+ obj: ROOT,
970
+ path: vec![],
971
+ action: PatchAction::PutMap {
972
+ key: "name".to_string(),
973
+ value: (Value::Object(ObjType::Text), name.clone()),
974
+ conflict: false
975
+ },
976
+ },
977
+ Patch {
978
+ obj: name,
979
+ path: vec![(ROOT, Prop::Map("name".to_string()))],
980
+ action: PatchAction::SpliceText {
981
+ index: 0,
982
+ value: ConcreteTextValue::new(&new_name, TextEncoding::UnicodeCodePoint),
983
+ marks: None
984
+ }
985
+ },
986
+ Patch {
987
+ obj: color,
988
+ path: vec![(ROOT, Prop::Map("color".to_string()))],
989
+ action: PatchAction::SpliceText {
990
+ index: 0,
991
+ value: ConcreteTextValue::new("unset", TextEncoding::UnicodeCodePoint),
992
+ marks: None
993
+ }
994
+ }
995
+ ]
996
+ );
997
+ }
998
+
999
+ #[test]
1000
+ fn deleting_in_middle_of_multibyte_char_moves_the_cursor_to_after_the_character() {
1001
+ let mut doc = AutoCommit::new_with_encoding(TextEncoding::Utf16CodeUnit);
1002
+ let text = doc.put_object(ROOT, "text", ObjType::Text).unwrap();
1003
+ doc.splice_text(&text, 0, 0, "🐻🐻🐻🐻🐻🐻").unwrap();
1004
+
1005
+ assert_eq!(doc.text(&text).unwrap(), "🐻🐻🐻🐻🐻🐻");
1006
+
1007
+ doc.splice_text(&text, 2, 2, "A🐻A").unwrap();
1008
+ assert_eq!(doc.text(&text).unwrap(), "🐻A🐻A🐻🐻🐻🐻");
1009
+
1010
+ // Deleting in the middle of the multibyte character 🐻 at index 4
1011
+ // (according to utf16 offsets) should delete the following character
1012
+ doc.splice_text(&text, 4, 1, "X").unwrap();
1013
+ assert_eq!(doc.text(&text).unwrap(), "🐻A🐻X🐻🐻🐻🐻");
1014
+
1015
+ doc.splice_text(&text, 4, 2, "Y").unwrap();
1016
+ assert_eq!(doc.text(&text).unwrap(), "🐻A🐻Y🐻🐻🐻");
1017
+ }
1018
+
1019
+ #[test]
1020
+ fn splicing_into_multibyte_characters() {
1021
+ // This test checks that splicing into multibyte characters works correctly. Multibyte
1022
+ // characters are _usually_ utf16 surrogate pairs, but there are other possibilities
1023
+ // because technically the payload of an insertion operation can be any valid utf-8
1024
+ // string. In this test we use the deprecated `legacy` API to create an operation
1025
+ // which has the string 'BBBBB' as it's payload and use this string to test the
1026
+ // behavior of splicing into and around multibyte characters.
1027
+
1028
+ let mut doc = AutoCommit::new_with_encoding(TextEncoding::Utf16CodeUnit);
1029
+ let text = doc.put_object(ROOT, "text", ObjType::Text).unwrap();
1030
+ let actor = doc.get_actor().clone();
1031
+ doc.splice_text(&text, 0, 0, "A").unwrap();
1032
+ let parent_hash = doc.commit().unwrap();
1033
+
1034
+ // We have to construct this change using the legacy API because we intentionally make it
1035
+ // impossible to create these kind of changes. The notable thing here is that there is
1036
+ // an op which is a single insertion but contains multiple grapheme clusters (the 'BBBBB')
1037
+ let weird_actor = ActorId::random();
1038
+ let weird_change = automerge::ExpandedChange {
1039
+ operations: vec![
1040
+ automerge::legacy::Op {
1041
+ action: automerge::legacy::OpType::Put("BBBBB".into()),
1042
+ obj: automerge::legacy::ObjectId::Id(automerge::legacy::OpId(1, actor.clone())),
1043
+ key: automerge::legacy::Key::Seq(automerge::legacy::ElementId::Id(
1044
+ automerge::legacy::OpId(2, actor.clone()),
1045
+ )),
1046
+ pred: automerge::legacy::SortedVec::new(),
1047
+ insert: true,
1048
+ },
1049
+ automerge::legacy::Op {
1050
+ action: automerge::legacy::OpType::Make(ObjType::Map),
1051
+ obj: automerge::legacy::ObjectId::Id(automerge::legacy::OpId(1, actor.clone())),
1052
+ key: automerge::legacy::Key::Seq(automerge::legacy::ElementId::Id(
1053
+ automerge::legacy::OpId(3, weird_actor.clone()),
1054
+ )),
1055
+ pred: automerge::legacy::SortedVec::new(),
1056
+ insert: true,
1057
+ },
1058
+ automerge::legacy::Op {
1059
+ action: automerge::legacy::OpType::Put("C".into()),
1060
+ obj: automerge::legacy::ObjectId::Id(automerge::legacy::OpId(1, actor.clone())),
1061
+ key: automerge::legacy::Key::Seq(automerge::legacy::ElementId::Id(
1062
+ automerge::legacy::OpId(4, weird_actor.clone()),
1063
+ )),
1064
+ pred: automerge::legacy::SortedVec::new(),
1065
+ insert: true,
1066
+ },
1067
+ ],
1068
+ actor_id: weird_actor,
1069
+ hash: None,
1070
+ seq: 1,
1071
+ start_op: std::num::NonZero::new(3).unwrap(),
1072
+ time: 0,
1073
+ message: None,
1074
+ deps: vec![parent_hash],
1075
+ extra_bytes: Vec::new(),
1076
+ };
1077
+ doc.apply_changes(vec![weird_change.into()]).unwrap();
1078
+
1079
+ assert_eq!(doc.text(&text).unwrap(), "ABBBBB\u{fffc}C");
1080
+
1081
+ let mut doc1 = doc.clone();
1082
+ doc1.splice_text(&text, 3, 4, "X").unwrap();
1083
+
1084
+ // deleting in the middle of a multi-byte character will delete after
1085
+ assert_eq!(doc1.text(&text).unwrap(), "ABBBBBX");
1086
+
1087
+ let mut doc2 = doc.clone();
1088
+ doc2.splice_text(&text, 3, 0, "X").unwrap();
1089
+
1090
+ // inserting in the middle of a mutli-bytes span inserts after
1091
+ assert_eq!(doc2.text(&text).unwrap(), "ABBBBBX\u{fffc}C");
1092
+
1093
+ let mut doc3 = doc.clone();
1094
+ doc3.splice_text(&text, 3, 1, "").unwrap();
1095
+
1096
+ // deleting in the middle of a multi-byte character will delete after
1097
+ assert_eq!(doc3.text(&text).unwrap(), "ABBBBBC");
1098
+ }