jsonatapy 2.2.3__tar.gz → 2.2.4__tar.gz

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 (56) hide show
  1. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/CHANGELOG.md +40 -0
  2. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/Cargo.lock +5 -5
  3. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/Cargo.toml +1 -1
  4. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/PKG-INFO +1 -1
  5. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/pyproject.toml +1 -1
  6. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/src/evaluator.rs +531 -77
  7. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/src/functions.rs +109 -3
  8. jsonatapy-2.2.4/src/lazy.rs +232 -0
  9. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/src/lib.rs +24 -62
  10. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/src/signature.rs +4 -0
  11. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/src/value.rs +76 -1
  12. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/src/vm.rs +4 -2
  13. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/tests/datetime_picture_suite.rs +2 -0
  14. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/tests/parent_and_focus_binding_suite.rs +2 -0
  15. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/.gitignore +0 -0
  16. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/.gitmodules +0 -0
  17. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/.serena/.gitignore +0 -0
  18. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/.serena/memories/architecture.md +0 -0
  19. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/.serena/memories/conventions.md +0 -0
  20. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/.serena/memories/core.md +0 -0
  21. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/.serena/memories/memory_maintenance.md +0 -0
  22. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/.serena/memories/suggested_commands.md +0 -0
  23. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/.serena/memories/task_completion.md +0 -0
  24. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/.serena/memories/tech_stack.md +0 -0
  25. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/.serena/project.yml +0 -0
  26. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/LICENSE +0 -0
  27. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/README.md +0 -0
  28. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/benches/evaluator_bench.rs +0 -0
  29. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/examples/evaluator_demo.rs +0 -0
  30. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/examples/parser_demo.rs +0 -0
  31. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/examples/simd_json_bench.rs +0 -0
  32. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/python/jsonatapy/__init__.py +0 -0
  33. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/python/jsonatapy/__main__.py +0 -0
  34. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/python/jsonatapy/_cli/__init__.py +0 -0
  35. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/python/jsonatapy/_cli/bindings.py +0 -0
  36. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/python/jsonatapy/_cli/error_format.py +0 -0
  37. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/python/jsonatapy/_cli/mcp_server.py +0 -0
  38. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/python/jsonatapy/_cli/resolve.py +0 -0
  39. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/python/jsonatapy/_cli/run.py +0 -0
  40. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/python/jsonatapy/py.typed +0 -0
  41. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/src/ast.rs +0 -0
  42. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/src/ast_transform.rs +0 -0
  43. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/src/bin/jsonata/bindings.rs +0 -0
  44. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/src/bin/jsonata/error_format.rs +0 -0
  45. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/src/bin/jsonata/main.rs +0 -0
  46. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/src/bin/jsonata/resolve.rs +0 -0
  47. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/src/compiler.rs +0 -0
  48. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/src/datetime.rs +0 -0
  49. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/src/parser/README.md +0 -0
  50. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/src/parser.rs +0 -0
  51. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/study/cli_fixtures.json +0 -0
  52. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/study/cli_fixtures_testdata.json +0 -0
  53. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/study/cli_spec.md +0 -0
  54. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/tests/cli_fixtures_test.rs +0 -0
  55. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/tests/cli_test.rs +0 -0
  56. {jsonatapy-2.2.3 → jsonatapy-2.2.4}/tests/integration_test.rs +0 -0
@@ -19,6 +19,46 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
19
19
 
20
20
  ### Security
21
21
 
22
+ ## [2.2.4] - 2026-07-13
23
+
24
+ ### Added
25
+ - `JSONATAPY_FORCE_TREE_WALKER=1` environment variable (testing/debugging): forces every
26
+ evaluation through the tree-walking evaluator, bypassing the default lazy/VM-preferred path.
27
+
28
+ ### Changed
29
+ - `evaluate(dict)` now converts Python data lazily by default. Previously every call eagerly
30
+ converted the entire input `dict` (and nested structures) to the internal value tree before
31
+ evaluation began; now only the fields an expression actually touches are converted, and
32
+ untouched input subtrees pass straight through to the output unchanged. Measured on the dev
33
+ machine (min-of-5, vs. the prior eager `evaluate(dict)`):
34
+ - `products.price` (100 objects): 34.9µs → 11.3µs (3.1x)
35
+ - Filter by category (100 products, 9 fields each): 129.3µs → 23.4µs (5.5x)
36
+ - `$sum(products[inStock].price)`: 116.4µs → 17.1µs (6.8x)
37
+ - Complex dense transformation: 160.9µs → 79µs (2.0x)
38
+
39
+ Every measured row now beats jsonata-js on identical data and machine (14.6/93.7/67.6/415.1µs
40
+ respectively). See `benchmarks/python/lazy_check.py` for the reproducible gate.
41
+ - **Behavior change:** results containing an unmodified input subtree now reference the
42
+ caller's *original* Python `dict`/`list` objects (result aliasing, matching jsonata-js),
43
+ rather than a fresh copy. Mutating such a result mutates the corresponding input — copy
44
+ explicitly (e.g. `copy.deepcopy`) first if you plan to mutate. Passed-through values also keep
45
+ their exact Python type (an `int` field the expression never reads stays an `int`); fields the
46
+ expression does touch still round-trip through the engine's number representation (whole
47
+ values come back as Python `int`), as before.
48
+ - **Behavior change:** an unconvertible input value (e.g. a `set`) now raises `TypeError` only
49
+ when the expression actually touches it, instead of eagerly for the whole input at the start
50
+ of `evaluate()`. Any Python exception raised while lazily reading a field (e.g. `OverflowError`
51
+ on an integer too large to represent) is likewise normalized to `TypeError` at this boundary,
52
+ rather than propagating as its original exception type.
53
+
54
+ ### Deprecated
55
+
56
+ ### Removed
57
+
58
+ ### Fixed
59
+
60
+ ### Security
61
+
22
62
  ## [2.2.3] - 2026-07-12
23
63
 
24
64
  ### Added
@@ -586,7 +586,7 @@ dependencies = [
586
586
 
587
587
  [[package]]
588
588
  name = "jsonata-core"
589
- version = "2.2.3"
589
+ version = "2.2.4"
590
590
  dependencies = [
591
591
  "assert_cmd",
592
592
  "base64",
@@ -988,9 +988,9 @@ dependencies = [
988
988
 
989
989
  [[package]]
990
990
  name = "regex"
991
- version = "1.12.4"
991
+ version = "1.13.0"
992
992
  source = "registry+https://github.com/rust-lang/crates.io-index"
993
- checksum = "f1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6ba"
993
+ checksum = "2a0e75113e14dc5acb068cd0786884f214f1312650a3d36d269f5c4f3cdee8a2"
994
994
  dependencies = [
995
995
  "aho-corasick",
996
996
  "memchr",
@@ -1113,9 +1113,9 @@ checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba"
1113
1113
 
1114
1114
  [[package]]
1115
1115
  name = "simd-json"
1116
- version = "0.17.2"
1116
+ version = "0.17.3"
1117
1117
  source = "registry+https://github.com/rust-lang/crates.io-index"
1118
- checksum = "6f75934ad5ee9e78b79ce7731b822debcb3e5fa6c5aabe57410084715897d1ee"
1118
+ checksum = "e32d7ab2678282d21e53374fbead7119b7eacbede73685dcaac472870a29a11c"
1119
1119
  dependencies = [
1120
1120
  "halfbrown",
1121
1121
  "ref-cast",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "jsonata-core"
3
- version = "2.2.3"
3
+ version = "2.2.4"
4
4
  edition = "2021"
5
5
  authors = ["txjmb <txjmb@users.noreply.github.com>"]
6
6
  description = "High-performance Rust implementation of JSONata query and transformation language"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jsonatapy
3
- Version: 2.2.3
3
+ Version: 2.2.4
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -4,7 +4,7 @@ build-backend = "maturin"
4
4
 
5
5
  [project]
6
6
  name = "jsonatapy"
7
- version = "2.2.3"
7
+ version = "2.2.4"
8
8
  description = "High-performance Python/Rust implementation of JSONata query and transformation language"
9
9
  authors = [
10
10
  {name = "txjmb", email = "txjmb@users.noreply.github.com"}