leptris 1.9.197.2-arm-linux

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 (124) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +3890 -0
  3. data/CLAUDE.md +115 -0
  4. data/CONTEXT.md +39 -0
  5. data/LICENSE.md +33 -0
  6. data/README.adoc +755 -0
  7. data/Rakefile +407 -0
  8. data/TODO.perf/01-ext-accelerated-default-reads.md +28 -0
  9. data/TODO.perf/02-auto-enable-native-layer.md +19 -0
  10. data/TODO.perf/03-bulk-xpath-result-materialization.md +18 -0
  11. data/TODO.perf/04-ext-bound-serialization.md +15 -0
  12. data/TODO.perf/05-native-surface-completion.md +19 -0
  13. data/TODO.perf/06-perf-battery-native-legs.md +16 -0
  14. data/TODO.perf/07-native-read-floor.md +31 -0
  15. data/TODO.perf/08-version-coherent-native-mutations.md +24 -0
  16. data/TODO.perf/09-adoption-lift-fast-path.md +38 -0
  17. data/TODO.perf/10-bulk-attribute-materialization.md +20 -0
  18. data/TODO.perf/11-moxml-gap-battery.md +18 -0
  19. data/TODO.perf/12-document-lifetime-in-c.md +47 -0
  20. data/TODO.perf/13-structural-memos.md +49 -0
  21. data/TODO.perf/14-insert-family-c-bound.md +31 -0
  22. data/TODO.perf/15-compiled-expression-cache.md +35 -0
  23. data/TODO.perf/16-at-xpath-single-result-seam.md +38 -0
  24. data/TODO.perf/17-precomputed-fast-path-flags.md +35 -0
  25. data/TODO.perf/18-inner-html-one-c-pass.md +32 -0
  26. data/TODO.perf/19-lazy-node-pointer.md +39 -0
  27. data/TODO.perf/20-css-translation-cache.md +24 -0
  28. data/TODO.perf/21-key-memo-consult.md +20 -0
  29. data/TODO.perf/22-eager-nodeset-materialization.md +30 -0
  30. data/TODO.perf/23-cbound-value-mutations.md +27 -0
  31. data/TODO.perf/24-immutable-read-lanes.md +22 -0
  32. data/TODO.perf/25-scope-owned-bulk-path.md +39 -0
  33. data/TODO.perf/26-post-mutation-memo-seeding.md +26 -0
  34. data/TODO.perf/27-c-yield-traversal.md +38 -0
  35. data/TODO.perf/28-address-fills.md +25 -0
  36. data/TODO.perf/29-ns-xpath-compiled.md +23 -0
  37. data/TODO.perf/30-copy-and-element-child-faces.md +31 -0
  38. data/TODO.perf/31-battery-rounds-4-8.md +23 -0
  39. data/TODO.perf/32-clean-host-floor-table.md +29 -0
  40. data/TODO.perf/33-cbound-root-set.md +29 -0
  41. data/TODO.perf/34-fragment-fast-lane.md +41 -0
  42. data/TODO.perf/35-parse-default-c-face.md +24 -0
  43. data/TODO.perf/36-raise-in-c-serializer-encoding.md +34 -0
  44. data/TODO.perf/37-document-lazy-pointer.md +28 -0
  45. data/TODO.perf/38-bulk-walk-and-bench-gate.md +23 -0
  46. data/TODO.restructure/01-constraint-compliance-audit.md +40 -0
  47. data/TODO.restructure/02-deep-copy-seam.md +21 -0
  48. data/TODO.restructure/03-evaluation-context-seam.md +18 -0
  49. data/TODO.restructure/04-spec-mece-restructure.md +20 -0
  50. data/TODO.restructure/05-memory-documentation.md +13 -0
  51. data/TODO.restructure/06-architecture-map-refresh.md +12 -0
  52. data/TODO.restructure/07-external-gates.md +16 -0
  53. data/TODO.restructure/08-new-code-audit-and-ext-memo.md +11 -0
  54. data/TODO.restructure/09-iteration-scope.md +29 -0
  55. data/TODO.restructure/10-cold-attr-read-diet.md +19 -0
  56. data/TODO.restructure/11-construction-factory-diet.md +16 -0
  57. data/TODO.restructure/12-resultattr-merge.md +12 -0
  58. data/TODO.restructure/13-spec-mece-followup.md +9 -0
  59. data/TODO.restructure/14-constraint-audit-refresh.md +15 -0
  60. data/TODO.restructure/15-readme-feature-documentation.md +10 -0
  61. data/TODO.restructure/16-claudemd-map-refresh.md +5 -0
  62. data/TODO.restructure/17-perf-drift-record.md +12 -0
  63. data/TODO.restructure/18-audit-spec-doubles-and-gem-contents.md +12 -0
  64. data/TODO.restructure/19-gitignore-hygiene.md +10 -0
  65. data/TODO.restructure/20-utf8proc-enablement.md +34 -0
  66. data/TODO.restructure/21-typeddata-variant-prototype.md +42 -0
  67. data/TODO.restructure/22-sax-drain-bulk-strip.md +28 -0
  68. data/docs/adr/0001-lockstep-mirror.md +17 -0
  69. data/docs/adr/0002-utf8-at-the-seam.md +19 -0
  70. data/docs/adr/0003-readonly-memoization-pattern.md +34 -0
  71. data/docs/adr/0004-lifetime-guard.md +21 -0
  72. data/docs/adr/0005-autoload-manifest-ordering.md +19 -0
  73. data/docs/adr/0006-ruby-variant-policy.md +25 -0
  74. data/ext/build_windows_native.rb +42 -0
  75. data/ext/leptris/native/extconf.rb +55 -0
  76. data/ext/leptris/native/native.c +2646 -0
  77. data/leptris.gemspec +43 -0
  78. data/lib/leptris/version.rb +5 -0
  79. data/lib/leptris/xml/attr.rb +76 -0
  80. data/lib/leptris/xml/c_string_array.rb +37 -0
  81. data/lib/leptris/xml/cdata.rb +27 -0
  82. data/lib/leptris/xml/comment.rb +27 -0
  83. data/lib/leptris/xml/css_to_xpath.rb +192 -0
  84. data/lib/leptris/xml/descriptor.rb +214 -0
  85. data/lib/leptris/xml/diff.rb +74 -0
  86. data/lib/leptris/xml/doc_type.rb +54 -0
  87. data/lib/leptris/xml/document.rb +716 -0
  88. data/lib/leptris/xml/document_fragment.rb +63 -0
  89. data/lib/leptris/xml/element.rb +771 -0
  90. data/lib/leptris/xml/entity_reference.rb +13 -0
  91. data/lib/leptris/xml/evaluation_context.rb +32 -0
  92. data/lib/leptris/xml/ffi.rb +1527 -0
  93. data/lib/leptris/xml/iteration_scope.rb +56 -0
  94. data/lib/leptris/xml/iterparse.rb +144 -0
  95. data/lib/leptris/xml/namespace.rb +43 -0
  96. data/lib/leptris/xml/native.so +0 -0
  97. data/lib/leptris/xml/native_layer.rb +92 -0
  98. data/lib/leptris/xml/node.rb +686 -0
  99. data/lib/leptris/xml/node_set.rb +212 -0
  100. data/lib/leptris/xml/parse_options.rb +97 -0
  101. data/lib/leptris/xml/plan_value.rb +121 -0
  102. data/lib/leptris/xml/processing_instruction.rb +90 -0
  103. data/lib/leptris/xml/pull.rb +212 -0
  104. data/lib/leptris/xml/relaxng.rb +126 -0
  105. data/lib/leptris/xml/result_attr.rb +39 -0
  106. data/lib/leptris/xml/result_text.rb +36 -0
  107. data/lib/leptris/xml/sax/document.rb +45 -0
  108. data/lib/leptris/xml/sax/dom_dispatch.rb +144 -0
  109. data/lib/leptris/xml/sax/parser.rb +326 -0
  110. data/lib/leptris/xml/sax/recorder.rb +374 -0
  111. data/lib/leptris/xml/sax.rb +14 -0
  112. data/lib/leptris/xml/schematron.rb +88 -0
  113. data/lib/leptris/xml/searchable.rb +361 -0
  114. data/lib/leptris/xml/serialization.rb +180 -0
  115. data/lib/leptris/xml/text.rb +32 -0
  116. data/lib/leptris/xml/xpath.rb +89 -0
  117. data/lib/leptris/xml/xquery.rb +77 -0
  118. data/lib/leptris/xml/xslt.rb +85 -0
  119. data/lib/leptris/xml.rb +108 -0
  120. data/lib/leptris.rb +53 -0
  121. data/lib/libleptris.so +0 -0
  122. data/lib/libutf8proc.so.3 +0 -0
  123. data/scripts/gem_smoke.rb +36 -0
  124. metadata +214 -0
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "ffi"
4
+
5
+ # Tree diff between two documents (libleptris >= 1.9.126):
6
+ # equal subtrees prune in O(1) via the #869 content-defined Merkle
7
+ # digest; diverging regions align through an LCS on child digests,
8
+ # then same-named elements recurse. Attribute add/remove are
9
+ # UPDATE_ATTR ops with an empty side.
10
+ #
11
+ # diff = Leptris::XML.diff(before_doc, after_doc)
12
+ # diff.ops # => [{type: :update_text, name: "price",
13
+ # # path: "/r/item[2]/price", before: "3", after: "4"}, ...]
14
+ # diff.to_s # => serialized op list
15
+ # Leptris::XML.diff(a, b, ignore_ws: true) # ws-only text absent
16
+ #
17
+ class Leptris::XML::Diff
18
+ class Handle < ::FFI::AutoPointer
19
+ def self.release(ptr)
20
+ Leptris::XML::FFI.leptris_diff_free(ptr)
21
+ end
22
+ end
23
+
24
+ OP_TYPES = {
25
+ 1 => :insert,
26
+ 2 => :delete,
27
+ 3 => :update_text,
28
+ 4 => :update_attr,
29
+ }.freeze
30
+ private_constant :OP_TYPES
31
+
32
+ def self.compute(document_a, document_b, ignore_ws: false)
33
+ flags = ignore_ws ? 1 : 0
34
+ raw = Leptris::XML::FFI.leptris_diff(
35
+ document_a.c_ptr, document_b.c_ptr, flags, nil)
36
+ if raw.null?
37
+ raise Leptris::XML::Error,
38
+ "leptris_diff failed: #{Leptris::XML::FFI.leptris_last_error}"
39
+ end
40
+ new(Handle.new(raw))
41
+ end
42
+
43
+ # The boolean fast path canon-style consumers want: are the two
44
+ # trees structurally identical? Zero ops == identical — the
45
+ # digest pruning makes the common equal case O(1) per subtree.
46
+ def self.identical?(document_a, document_b, ignore_ws: false)
47
+ compute(document_a, document_b, ignore_ws: ignore_ws).ops.empty?
48
+ end
49
+
50
+ def initialize(handle)
51
+ @handle = handle
52
+ end
53
+
54
+ # The op list in document order: {type:, name:, path:, before:,
55
+ # after:} — paths are root-relative ("/r/i[2]"); before/after
56
+ # carry payloads (attribute values / text) where the op has them.
57
+ def ops
58
+ count = Leptris::XML::FFI.leptris_diff_op_count(@handle)
59
+ Array.new(count) do |i|
60
+ {
61
+ type: OP_TYPES[Leptris::XML::FFI.leptris_diff_op_type(@handle, i)],
62
+ name: Leptris::XML::FFI.leptris_diff_op_name(@handle, i),
63
+ path: Leptris::XML::FFI.leptris_diff_op_path(@handle, i),
64
+ before: Leptris::XML::FFI.leptris_diff_op_before(@handle, i),
65
+ after: Leptris::XML::FFI.leptris_diff_op_after(@handle, i),
66
+ }
67
+ end
68
+ end
69
+
70
+ def to_s
71
+ str_ptr = Leptris::XML::FFI.leptris_diff_serialize(@handle)
72
+ Leptris::XML::FFI.read_owned_string(str_ptr)
73
+ end
74
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Leptris::XML::DocType
4
+ attr_reader :c_ptr, :document
5
+
6
+ def initialize(c_ptr, document)
7
+ @c_ptr = c_ptr
8
+ @document = document
9
+ end
10
+
11
+ def name
12
+ Leptris::XML::FFI.leptris_doctype_get_name(c_ptr)
13
+ end
14
+ alias_method :node_name, :name
15
+
16
+ def root_name
17
+ Leptris::XML::FFI.leptris_doctype_get_root_name(c_ptr)
18
+ end
19
+
20
+ def public_id
21
+ Leptris::XML::FFI.leptris_doctype_get_public_id(c_ptr)
22
+ end
23
+
24
+ def system_id
25
+ Leptris::XML::FFI.leptris_doctype_get_system_id(c_ptr)
26
+ end
27
+
28
+ def internal_subset
29
+ Leptris::XML::FFI.leptris_doctype_get_internal_subset(c_ptr)
30
+ end
31
+
32
+ def external_id
33
+ pub = public_id
34
+ sys = system_id
35
+ return nil if pub.nil? && sys.nil?
36
+ parts = []
37
+ parts << "PUBLIC \"#{pub}\"" if pub
38
+ parts << "SYSTEM \"#{sys}\"" if sys && pub.nil?
39
+ parts << "\"#{sys}\"" if pub && sys
40
+ parts.join(" ")
41
+ end
42
+
43
+ def to_s
44
+ inner = internal_subset
45
+ parts = ["<!DOCTYPE #{name}"]
46
+ parts << external_id if external_id
47
+ parts << "[#{inner}]" if inner && !inner.empty?
48
+ parts.join(" ") + ">"
49
+ end
50
+
51
+ def inspect
52
+ "#<#{self.class.name} name=#{name.inspect} public=#{public_id.inspect} system=#{system_id.inspect}>"
53
+ end
54
+ end