Skip to content

Releases: techouse/qs_codec

1.5.0

15 Mar 23:21
68d6027

Choose a tag to compare

1.5.0

  • [FEAT] add the Programming Language :: Python :: Free Threading :: 3 - Stable classifier
  • [CHORE] clarify in the thread-safety docs that the free-threaded CPython build is supported and covered by the test suite
  • [CHORE] treat free-threaded CPython (3.13t, 3.14t) CI jobs as normal required test runs instead of experimental jobs

PyPI: https://pypi.org/project/qs_codec/1.5.0/

1.4.6

08 Mar 23:02
2782794

Choose a tag to compare

1.4.6

  • [FIX] avoid a shared default EncodeOptions() instance in encode() by constructing defaults per call
  • [CHORE] document the library's thread-safety boundary for concurrent encode() / decode() use and shared read-only options
  • [CHORE] add concurrent regression coverage for encode(), decode(), WeakWrapper, and KeyPathNode cache behavior
  • [CHORE] scale deep stack-safety and thread-stress canaries for older PyPy 3.8 CI runners while preserving coverage on other interpreters

PyPI: https://pypi.org/project/qs_codec/1.4.6/

1.4.5

08 Mar 17:46
eb3414d

Choose a tag to compare

1.4.5

  • [CHORE] optimize encode hot paths with lower-overhead iterative traversal, cheaper container checks, and deep linear mapping fast paths
  • [CHORE] optimize EncodeUtils ASCII/BMP handling and KeyPathNode path materialization caching for repeated encode workloads
  • [FIX] preserve legacy max_depth vs circular-reference error precedence in both generic and fast-path encoding
  • [FIX] keep EncodeOptions free of encode-time mutable cache state while preserving encoder/equality behavior
  • [CHORE] expand encode regression coverage for deep nesting, cycle handling, key-path caching, and EncodeOptions semantics

PyPI: https://pypi.org/project/qs_codec/1.4.5/

1.4.4

05 Mar 00:03
cc8e162

Choose a tag to compare

1.4.4

  • [CHORE] optimize decode hot paths via structured-key pre-scan/bypass logic and lower-overhead default decoder dispatch
  • [FIX] align decode edge cases with Node qs for mixed flat/structured keys and leading-zero bracket roots (e.g. [01])
  • [FIX] avoid incorrect list forcing when []= appears only in the value token
  • [FIX] restore Python 3.8 compatibility in decode by avoiding runtime subscripting of collections.abc.Mapping
  • [CHORE] refactor encode traversal internals into dedicated frame/state models and constants
  • [CHORE] add repeatable local benchmark snapshots for decode (C1/C2/C3) and deep encode traversal
  • [CHORE] expand decode/utils regression coverage for collision semantics and parser compatibility paths

PyPI: https://pypi.org/project/qs_codec/1.4.4/

1.4.3

25 Feb 18:58
1f32dde

Choose a tag to compare

1.4.3

  • [CHORE] optimize encode traversal internals and hot paths with lower allocation overhead
  • [CHORE] add internal KeyPathNode path caching for lazy materialization and dot-encoded path reuse
  • [FIX] avoid RecursionError in deep key-path dot encoding by making KeyPathNode.as_dot_encoded iterative
  • [FIX] ensure strict null handling applies RFC formatter behavior for bare-key output (e.g. RFC1738 space handling)
  • [FIX] avoid mutating caller-owned root list/tuple elements when EncodeOptions.filter is callable
  • [CHORE] remove unused KeyPathNode.total_length state to keep nodes lightweight
  • [CHORE] expand encode regression and internal helper tests (path caching, list format generators, strict-null formatting, mutation safety)

PyPI: https://pypi.org/project/qs_codec/1.4.3/

1.4.2

23 Feb 23:29
3c7db66

Choose a tag to compare

1.4.2

  • [CHORE] optimize decode by skipping dot-in-keys normalization when "%2" is not present in key segments

PyPI: https://pypi.org/project/qs_codec/1.4.2/

1.4.1

22 Feb 09:50
4e3be95

Choose a tag to compare

1.4.1

  • [FIX] harden encoder traversal to an iterative implementation to avoid recursion-based crashes on very deep nested input
  • [FIX] harden decode merge path (Utils.merge) with iterative traversal to prevent RecursionError on deep conflicting merges
  • [FIX] update EncodeOptions.max_depth semantics: None is unbounded by this option; explicit limits are enforced directly
  • [FIX] preserve legacy map-merge key collision semantics for mixed key types ('1' vs 1) in iterative merge
  • [CHORE] optimize deep encode performance by replacing per-frame side-channel chain scans with O(1) ancestry cycle state lookups
  • [CHORE] add deep stack-safety regressions (depth 12_000) and cycle-state compatibility tests
  • [CHORE] update encoding depth documentation

PyPI: https://pypi.org/project/qs_codec/1.4.1/

1.4.0

01 Feb 14:21
77fac3c

Choose a tag to compare

1.4.0

  • [FEAT] add EncodeOptions.max_depth to cap encoding traversal depth (capped to the current recursion limit)
  • [FIX] avoid RecursionError on deeply nested input by enforcing a configurable encoding depth guard
  • [FIX] make WeakWrapper hashing identity-based to keep weak-key lookups stable after mutations
  • [CHORE] optimize encode/merge paths (shallow-copy root mappings, reuse dict targets in internal merges)
  • [CHORE] expand tests and documentation for encoding depth limits

PyPI: https://pypi.org/project/qs_codec/1.4.0/

1.3.4

31 Jan 13:39
d86d201

Choose a tag to compare

1.3.4

  • [CHORE] stricter static type checking with pyright

PyPI: https://pypi.org/project/qs_codec/1.3.4/

1.3.3

11 Jan 19:09
5a6c2dd

Choose a tag to compare

1.3.3

  • [FIX] implement DecodeOptions.list_limit handling in Utils.combine function to prevent DoS via memory exhaustion

PyPI: https://pypi.org/project/qs_codec/1.3.3/