leptris 1.6.0 → 1.6.2

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 (55) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +70 -0
  3. data/CLAUDE.md +76 -87
  4. data/README.adoc +80 -6
  5. data/Rakefile +1 -1
  6. data/benchmark/README.md +8 -164
  7. data/lib/leptris/version.rb +1 -1
  8. data/lib/leptris/xml/cdata.rb +1 -0
  9. data/lib/leptris/xml/comment.rb +1 -0
  10. data/lib/leptris/xml/document.rb +29 -14
  11. data/lib/leptris/xml/element.rb +21 -3
  12. data/lib/leptris/xml/ffi.rb +3 -13
  13. data/lib/leptris/xml/node.rb +32 -10
  14. data/lib/leptris/xml/node_set.rb +6 -5
  15. data/lib/leptris/xml/processing_instruction.rb +2 -0
  16. data/lib/leptris/xml/searchable.rb +1 -1
  17. data/lib/leptris/xml/serialization.rb +20 -2
  18. data/lib/leptris/xml/text.rb +1 -0
  19. data/lib/leptris/xml.rb +3 -2
  20. metadata +1 -36
  21. data/TODO.impl/01-architecture.md +0 -217
  22. data/TODO.impl/02-ffi-declarations.md +0 -236
  23. data/TODO.impl/03-document-node-element-nodeset.md +0 -382
  24. data/TODO.impl/04-sax-parser.md +0 -203
  25. data/TODO.impl/05-serialize-c14n-memory-specs-css.md +0 -276
  26. data/docs/ARCHITECTURE.adoc +0 -559
  27. data/docs/BUILD.md +0 -395
  28. data/docs/ERROR_MESSAGES.md +0 -458
  29. data/docs/FFI_ARCHITECTURE.md +0 -439
  30. data/docs/FUTURE_VISION.md +0 -303
  31. data/docs/GITHUB_ACTIONS.md +0 -293
  32. data/docs/OPTIMIZATIONS_IMPLEMENTED.adoc +0 -459
  33. data/docs/PERFORMANCE.adoc +0 -668
  34. data/docs/PERFORMANCE.md +0 -448
  35. data/docs/RELEASE_NOTES_v1.0.0.md +0 -515
  36. data/docs/XPATH_SPEC_COMPLIANCE.md +0 -298
  37. data/docs/completion/leptris.bash +0 -86
  38. data/docs/completion/leptris.zsh +0 -74
  39. data/docs/man/leptris-format.1 +0 -227
  40. data/docs/man/leptris-parse.1 +0 -178
  41. data/docs/man/leptris-xpath.1 +0 -312
  42. data/docs/man/leptris.1 +0 -160
  43. data/docs/v0.9.0_PERFORMANCE_IMPROVEMENTS.md +0 -217
  44. data/docs/v0.9.0_RELEASE_SUMMARY.md +0 -281
  45. data/docs/v1.0.0_CONTINUATION_PLAN.md +0 -172
  46. data/docs/v1.0.0_CONTINUATION_PROMPT.md +0 -382
  47. data/docs/v1.0.0_SESSION_6_CONTINUATION.md +0 -434
  48. data/docs/v1.0.0_SESSION_6_PROMPT.md +0 -231
  49. data/docs/v1.0.0_STATUS_TRACKER.md +0 -224
  50. data/docs/v1.1.0_CONTINUATION_PLAN.md +0 -299
  51. data/docs/v1.1.0_FINAL_CONTINUATION_PLAN.md +0 -201
  52. data/docs/v1.1.0_SESSION_3_PROMPT.md +0 -223
  53. data/docs/v1.1.0_STATUS_TRACKER.md +0 -355
  54. data/docs/xml-performance.adoc +0 -115
  55. data/docs/xpath-performance.adoc +0 -379
@@ -1,379 +0,0 @@
1
- = XPath Performance Benchmarks
2
- :toc:
3
- :toclevels: 3
4
-
5
- == Overview
6
-
7
- This document provides comprehensive performance benchmarks, generated from actual benchmark runs using `benchmark-ips`.
8
-
9
- **IMPORTANT**: This file is auto-generated from benchmark data. Do not edit manually.
10
- To update, run the appropriate rake task (see footer).
11
-
12
- == Test Environment
13
-
14
- * **Ruby Version**: 3.1.1
15
- * **Platform**: arm64-darwin21
16
- * **Leptris Version**: 0.1.0
17
- * **Libraries Available**:
18
- * **Nokogiri**: Available
19
- * **Timestamp**: 2025-11-27T18:27:43+0800
20
- * **Method**: benchmark-ips
21
-
22
- == Performance Summary
23
-
24
- **Overall Results** (50 tests, vs Nokogiri):
25
-
26
- * **Average**: 2.34× slower
27
- * **Best case**: 3.13× faster
28
- * **Worst case**: 10.38× slower
29
- * **Tests faster**: 2/50 (4.0%)
30
- * **Tests slower**: 48/50 (96.0%)
31
-
32
- **Verdict**: ❌ **Needs Optimization** - Significantly slower than Nokogiri
33
-
34
- == axes
35
-
36
- [cols="["3", "2", "2", "2"]",options="header"]
37
- |===
38
- |Test |Leptris |Nokogiri |vs Nokogiri
39
-
40
- |Child
41
- |1.39µs
42
- |4.3µs
43
- |**3.09× faster** ✅
44
-
45
- |Descendant
46
- |59.56µs
47
- |5.74µs
48
- |**10.38× slower** ❌
49
-
50
- |Descendant Or Self
51
- |17.69µs
52
- |6.49µs
53
- |**2.73× slower** ❌
54
-
55
- |Parent
56
- |11.5µs
57
- |4.27µs
58
- |**2.69× slower** ❌
59
-
60
- |Ancestor
61
- |12.5µs
62
- |4.3µs
63
- |**2.91× slower** ❌
64
-
65
- |Ancestor Or Self
66
- |12.72µs
67
- |4.36µs
68
- |**2.92× slower** ❌
69
-
70
- |Self
71
- |11.5µs
72
- |7.53µs
73
- |**1.53× slower** ❌
74
-
75
- |Following Sibling
76
- |11.83µs
77
- |6.89µs
78
- |**1.72× slower** ❌
79
-
80
- |Preceding Sibling
81
- |11.37µs
82
- |5.52µs
83
- |**2.06× slower** ❌
84
-
85
- |Following
86
- |17.99µs
87
- |12.94µs
88
- |**1.39× slower** ❌
89
-
90
- |Preceding
91
- |12.91µs
92
- |5.3µs
93
- |**2.44× slower** ❌
94
-
95
- |Attribute
96
- |11.29µs
97
- |5.08µs
98
- |**2.22× slower** ❌
99
-
100
- |Namespace
101
- |14.79µs
102
- |7.71µs
103
- |**1.92× slower** ❌
104
-
105
- |===
106
-
107
- == simple_paths
108
-
109
- [cols="["3", "2", "2", "2"]",options="header"]
110
- |===
111
- |Test |Leptris |Nokogiri |vs Nokogiri
112
-
113
- |Absolute Path
114
- |6.01µs
115
- |4.99µs
116
- |**1.2× slower** ❌
117
-
118
- |Relative Path
119
- |1.65µs
120
- |4.66µs
121
- |**2.82× faster** ✅
122
-
123
- |Descendant Path
124
- |12.73µs
125
- |4.48µs
126
- |**2.84× slower** ❌
127
-
128
- |Wildcard
129
- |10.55µs
130
- |4.51µs
131
- |**2.34× slower** ❌
132
-
133
- |Attribute Access
134
- |25.37µs
135
- |4.76µs
136
- |**5.33× slower** ❌
137
-
138
- |Text Nodes
139
- |12.85µs
140
- |4.67µs
141
- |**2.75× slower** ❌
142
-
143
- |===
144
-
145
- == position_predicates
146
-
147
- [cols="["3", "2", "2", "2"]",options="header"]
148
- |===
149
- |Test |Leptris |Nokogiri |vs Nokogiri
150
-
151
- |First
152
- |38.24µs
153
- |5.95µs
154
- |**6.43× slower** ❌
155
-
156
- |Last
157
- |14.06µs
158
- |5.86µs
159
- |**2.4× slower** ❌
160
-
161
- |Position Eq
162
- |11.34µs
163
- |5.6µs
164
- |**2.03× slower** ❌
165
-
166
- |Position Range
167
- |11.83µs
168
- |5.56µs
169
- |**2.13× slower** ❌
170
-
171
- |===
172
-
173
- == boolean_predicates
174
-
175
- [cols="["3", "2", "2", "2"]",options="header"]
176
- |===
177
- |Test |Leptris |Nokogiri |vs Nokogiri
178
-
179
- |Attribute Exists
180
- |11.91µs
181
- |5.77µs
182
- |**2.06× slower** ❌
183
-
184
- |Attribute Value
185
- |12.15µs
186
- |7.24µs
187
- |**1.68× slower** ❌
188
-
189
- |Element Exists
190
- |13.13µs
191
- |7.57µs
192
- |**1.73× slower** ❌
193
-
194
- |Negation
195
- |11.87µs
196
- |6.21µs
197
- |**1.91× slower** ❌
198
-
199
- |===
200
-
201
- == multiple_predicates
202
-
203
- [cols="["3", "2", "2", "2"]",options="header"]
204
- |===
205
- |Test |Leptris |Nokogiri |vs Nokogiri
206
-
207
- |Two Predicates
208
- |16.65µs
209
- |6.86µs
210
- |**2.43× slower** ❌
211
-
212
- |Position And Boolean
213
- |11.52µs
214
- |11.17µs
215
- |**1.03× slower** ❌
216
-
217
- |Three Predicates
218
- |16.73µs
219
- |11.11µs
220
- |**1.51× slower** ❌
221
-
222
- |===
223
-
224
- == nodeset_functions
225
-
226
- [cols="["3", "2", "2", "2"]",options="header"]
227
- |===
228
- |Test |Leptris |Nokogiri |vs Nokogiri
229
-
230
- |Count
231
- |10.64µs
232
- |3.69µs
233
- |**2.88× slower** ❌
234
-
235
- |Last Func
236
- |17.68µs
237
- |5.06µs
238
- |**3.49× slower** ❌
239
-
240
- |Position Func
241
- |12.61µs
242
- |8.05µs
243
- |**1.57× slower** ❌
244
-
245
- |Local Name
246
- |19.11µs
247
- |13.09µs
248
- |**1.46× slower** ❌
249
-
250
- |Name
251
- |15.31µs
252
- |13.7µs
253
- |**1.12× slower** ❌
254
-
255
- |===
256
-
257
- == string_functions
258
-
259
- [cols="["3", "2", "2", "2"]",options="header"]
260
- |===
261
- |Test |Leptris |Nokogiri |vs Nokogiri
262
-
263
- |String
264
- |13.64µs
265
- |11.58µs
266
- |**1.18× slower** ❌
267
-
268
- |Concat
269
- |43.93µs
270
- |12.81µs
271
- |**3.43× slower** ❌
272
-
273
- |Starts With
274
- |20.35µs
275
- |7.64µs
276
- |**2.66× slower** ❌
277
-
278
- |Contains
279
- |14.53µs
280
- |9.3µs
281
- |**1.56× slower** ❌
282
-
283
- |String Length
284
- |15.21µs
285
- |8.94µs
286
- |**1.7× slower** ❌
287
-
288
- |===
289
-
290
- == boolean_functions
291
-
292
- [cols="["3", "2", "2", "2"]",options="header"]
293
- |===
294
- |Test |Leptris |Nokogiri |vs Nokogiri
295
-
296
- |Boolean
297
- |10.76µs
298
- |4.56µs
299
- |**2.36× slower** ❌
300
-
301
- |Not
302
- |12.34µs
303
- |6.8µs
304
- |**1.81× slower** ❌
305
-
306
- |True
307
- |11.11µs
308
- |5.15µs
309
- |**2.16× slower** ❌
310
-
311
- |===
312
-
313
- == number_functions
314
-
315
- [cols="["3", "2", "2", "2"]",options="header"]
316
- |===
317
- |Test |Leptris |Nokogiri |vs Nokogiri
318
-
319
- |Number
320
- |12.6µs
321
- |7.06µs
322
- |**1.78× slower** ❌
323
-
324
- |Sum
325
- |14.71µs
326
- |4.51µs
327
- |**3.26× slower** ❌
328
-
329
- |Floor
330
- |18.48µs
331
- |11.28µs
332
- |**1.64× slower** ❌
333
-
334
- |Ceiling
335
- |22.09µs
336
- |10.11µs
337
- |**2.18× slower** ❌
338
-
339
- |===
340
-
341
- == complex_queries
342
-
343
- [cols="["3", "2", "2", "2"]",options="header"]
344
- |===
345
- |Test |Leptris |Nokogiri |vs Nokogiri
346
-
347
- |Multi Axis
348
- |12.58µs
349
- |6.44µs
350
- |**1.95× slower** ❌
351
-
352
- |Union
353
- |24.42µs
354
- |13.61µs
355
- |**1.79× slower** ❌
356
-
357
- |Nested
358
- |18.96µs
359
- |12.73µs
360
- |**1.49× slower** ❌
361
-
362
- |===
363
-
364
- == Conclusion
365
-
366
- Based on 50 comprehensive tests (vs Nokogiri):
367
-
368
- * **Average Performance**: 2.34× slower
369
- * **Tests faster**: 2/50 (4.0%)
370
- * **Tests slower**: 48/50 (96.0%)
371
- * **Best result**: 0.32×
372
- * **Worst result**: 10.38×
373
-
374
- ❌ **Leptris performance needs optimization** - Significantly slower than Nokogiri (2.34× average).
375
-
376
- ---
377
-
378
- **Generated**: 2025-11-27T18:27:43+0800
379
- **Baseline**: Nokogiri