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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +3890 -0
- data/CLAUDE.md +115 -0
- data/CONTEXT.md +39 -0
- data/LICENSE.md +33 -0
- data/README.adoc +755 -0
- data/Rakefile +407 -0
- data/TODO.perf/01-ext-accelerated-default-reads.md +28 -0
- data/TODO.perf/02-auto-enable-native-layer.md +19 -0
- data/TODO.perf/03-bulk-xpath-result-materialization.md +18 -0
- data/TODO.perf/04-ext-bound-serialization.md +15 -0
- data/TODO.perf/05-native-surface-completion.md +19 -0
- data/TODO.perf/06-perf-battery-native-legs.md +16 -0
- data/TODO.perf/07-native-read-floor.md +31 -0
- data/TODO.perf/08-version-coherent-native-mutations.md +24 -0
- data/TODO.perf/09-adoption-lift-fast-path.md +38 -0
- data/TODO.perf/10-bulk-attribute-materialization.md +20 -0
- data/TODO.perf/11-moxml-gap-battery.md +18 -0
- data/TODO.perf/12-document-lifetime-in-c.md +47 -0
- data/TODO.perf/13-structural-memos.md +49 -0
- data/TODO.perf/14-insert-family-c-bound.md +31 -0
- data/TODO.perf/15-compiled-expression-cache.md +35 -0
- data/TODO.perf/16-at-xpath-single-result-seam.md +38 -0
- data/TODO.perf/17-precomputed-fast-path-flags.md +35 -0
- data/TODO.perf/18-inner-html-one-c-pass.md +32 -0
- data/TODO.perf/19-lazy-node-pointer.md +39 -0
- data/TODO.perf/20-css-translation-cache.md +24 -0
- data/TODO.perf/21-key-memo-consult.md +20 -0
- data/TODO.perf/22-eager-nodeset-materialization.md +30 -0
- data/TODO.perf/23-cbound-value-mutations.md +27 -0
- data/TODO.perf/24-immutable-read-lanes.md +22 -0
- data/TODO.perf/25-scope-owned-bulk-path.md +39 -0
- data/TODO.perf/26-post-mutation-memo-seeding.md +26 -0
- data/TODO.perf/27-c-yield-traversal.md +38 -0
- data/TODO.perf/28-address-fills.md +25 -0
- data/TODO.perf/29-ns-xpath-compiled.md +23 -0
- data/TODO.perf/30-copy-and-element-child-faces.md +31 -0
- data/TODO.perf/31-battery-rounds-4-8.md +23 -0
- data/TODO.perf/32-clean-host-floor-table.md +29 -0
- data/TODO.perf/33-cbound-root-set.md +29 -0
- data/TODO.perf/34-fragment-fast-lane.md +41 -0
- data/TODO.perf/35-parse-default-c-face.md +24 -0
- data/TODO.perf/36-raise-in-c-serializer-encoding.md +34 -0
- data/TODO.perf/37-document-lazy-pointer.md +28 -0
- data/TODO.perf/38-bulk-walk-and-bench-gate.md +23 -0
- data/TODO.restructure/01-constraint-compliance-audit.md +40 -0
- data/TODO.restructure/02-deep-copy-seam.md +21 -0
- data/TODO.restructure/03-evaluation-context-seam.md +18 -0
- data/TODO.restructure/04-spec-mece-restructure.md +20 -0
- data/TODO.restructure/05-memory-documentation.md +13 -0
- data/TODO.restructure/06-architecture-map-refresh.md +12 -0
- data/TODO.restructure/07-external-gates.md +16 -0
- data/TODO.restructure/08-new-code-audit-and-ext-memo.md +11 -0
- data/TODO.restructure/09-iteration-scope.md +29 -0
- data/TODO.restructure/10-cold-attr-read-diet.md +19 -0
- data/TODO.restructure/11-construction-factory-diet.md +16 -0
- data/TODO.restructure/12-resultattr-merge.md +12 -0
- data/TODO.restructure/13-spec-mece-followup.md +9 -0
- data/TODO.restructure/14-constraint-audit-refresh.md +15 -0
- data/TODO.restructure/15-readme-feature-documentation.md +10 -0
- data/TODO.restructure/16-claudemd-map-refresh.md +5 -0
- data/TODO.restructure/17-perf-drift-record.md +12 -0
- data/TODO.restructure/18-audit-spec-doubles-and-gem-contents.md +12 -0
- data/TODO.restructure/19-gitignore-hygiene.md +10 -0
- data/TODO.restructure/20-utf8proc-enablement.md +34 -0
- data/TODO.restructure/21-typeddata-variant-prototype.md +42 -0
- data/TODO.restructure/22-sax-drain-bulk-strip.md +28 -0
- data/docs/adr/0001-lockstep-mirror.md +17 -0
- data/docs/adr/0002-utf8-at-the-seam.md +19 -0
- data/docs/adr/0003-readonly-memoization-pattern.md +34 -0
- data/docs/adr/0004-lifetime-guard.md +21 -0
- data/docs/adr/0005-autoload-manifest-ordering.md +19 -0
- data/docs/adr/0006-ruby-variant-policy.md +25 -0
- data/ext/build_windows_native.rb +42 -0
- data/ext/leptris/native/extconf.rb +55 -0
- data/ext/leptris/native/native.c +2646 -0
- data/leptris.gemspec +43 -0
- data/lib/leptris/version.rb +5 -0
- data/lib/leptris/xml/attr.rb +76 -0
- data/lib/leptris/xml/c_string_array.rb +37 -0
- data/lib/leptris/xml/cdata.rb +27 -0
- data/lib/leptris/xml/comment.rb +27 -0
- data/lib/leptris/xml/css_to_xpath.rb +192 -0
- data/lib/leptris/xml/descriptor.rb +214 -0
- data/lib/leptris/xml/diff.rb +74 -0
- data/lib/leptris/xml/doc_type.rb +54 -0
- data/lib/leptris/xml/document.rb +716 -0
- data/lib/leptris/xml/document_fragment.rb +63 -0
- data/lib/leptris/xml/element.rb +771 -0
- data/lib/leptris/xml/entity_reference.rb +13 -0
- data/lib/leptris/xml/evaluation_context.rb +32 -0
- data/lib/leptris/xml/ffi.rb +1527 -0
- data/lib/leptris/xml/iteration_scope.rb +56 -0
- data/lib/leptris/xml/iterparse.rb +144 -0
- data/lib/leptris/xml/namespace.rb +43 -0
- data/lib/leptris/xml/native.so +0 -0
- data/lib/leptris/xml/native_layer.rb +92 -0
- data/lib/leptris/xml/node.rb +686 -0
- data/lib/leptris/xml/node_set.rb +212 -0
- data/lib/leptris/xml/parse_options.rb +97 -0
- data/lib/leptris/xml/plan_value.rb +121 -0
- data/lib/leptris/xml/processing_instruction.rb +90 -0
- data/lib/leptris/xml/pull.rb +212 -0
- data/lib/leptris/xml/relaxng.rb +126 -0
- data/lib/leptris/xml/result_attr.rb +39 -0
- data/lib/leptris/xml/result_text.rb +36 -0
- data/lib/leptris/xml/sax/document.rb +45 -0
- data/lib/leptris/xml/sax/dom_dispatch.rb +144 -0
- data/lib/leptris/xml/sax/parser.rb +326 -0
- data/lib/leptris/xml/sax/recorder.rb +374 -0
- data/lib/leptris/xml/sax.rb +14 -0
- data/lib/leptris/xml/schematron.rb +88 -0
- data/lib/leptris/xml/searchable.rb +361 -0
- data/lib/leptris/xml/serialization.rb +180 -0
- data/lib/leptris/xml/text.rb +32 -0
- data/lib/leptris/xml/xpath.rb +89 -0
- data/lib/leptris/xml/xquery.rb +77 -0
- data/lib/leptris/xml/xslt.rb +85 -0
- data/lib/leptris/xml.rb +108 -0
- data/lib/leptris.rb +53 -0
- data/lib/libleptris.so +0 -0
- data/lib/libutf8proc.so.3 +0 -0
- data/scripts/gem_smoke.rb +36 -0
- 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
|