unstd 2.1.1__tar.gz → 3.1.0__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.
- unstd-3.1.0/.gitattributes +3 -0
- unstd-3.1.0/.github/workflows/chaos.yml +75 -0
- {unstd-2.1.1 → unstd-3.1.0}/.github/workflows/ci.yml +12 -5
- unstd-3.1.0/.github/workflows/concurrency.yml +75 -0
- unstd-3.1.0/.github/workflows/fuzz.yml +84 -0
- unstd-3.1.0/.github/workflows/release.yml +93 -0
- {unstd-2.1.1 → unstd-3.1.0}/.gitignore +3 -0
- {unstd-2.1.1 → unstd-3.1.0}/CHANGELOG.md +214 -1
- {unstd-2.1.1 → unstd-3.1.0}/PKG-INFO +46 -5
- unstd-3.1.0/README.md +92 -0
- unstd-3.1.0/bench/README.md +245 -0
- {unstd-2.1.1 → unstd-3.1.0}/bench/baseline.json +70 -10
- unstd-3.1.0/bench/billy-serde-legacy-results.json +3796 -0
- unstd-3.1.0/bench/billy-serde-optimization-results.md +162 -0
- unstd-3.1.0/bench/billy-serde-optimized-legacy-results.json +7856 -0
- unstd-3.1.0/bench/billy-serde-optimized-results.json +7804 -0
- unstd-3.1.0/bench/billy-serde-release-results.json +3776 -0
- unstd-3.1.0/bench/billy-serde-results.json +4136 -0
- unstd-3.1.0/bench/billy-serde-results.md +133 -0
- unstd-3.1.0/bench/billy_serde.py +553 -0
- {unstd-2.1.1 → unstd-3.1.0}/bench/cases.py +290 -7
- unstd-3.1.0/bench/clone-ids-results.json +3002 -0
- unstd-3.1.0/bench/clone-ids-results.md +138 -0
- unstd-3.1.0/bench/clone-ids-stdlib-results.json +559 -0
- unstd-3.1.0/bench/clone_ids_profile.py +650 -0
- unstd-3.1.0/bench/optimization-results.md +95 -0
- unstd-3.1.0/bench/serde-results.json +7004 -0
- unstd-3.1.0/bench/serde-results.md +144 -0
- unstd-3.1.0/bench/serde_profile.py +607 -0
- {unstd-2.1.1 → unstd-3.1.0}/changelog.d/README.md +1 -1
- unstd-3.1.0/hatch_build.py +84 -0
- {unstd-2.1.1 → unstd-3.1.0}/pyproject.toml +46 -4
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/__init__.py +30 -7
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/audio/wavx.py +21 -2
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/clone/structural.py +47 -12
- unstd-3.1.0/src/unstd/compress/README.md +45 -0
- unstd-3.1.0/src/unstd/compress/__init__.py +5 -0
- unstd-3.1.0/src/unstd/compress/_backend.py +64 -0
- unstd-3.1.0/src/unstd/compress/_inflate.py +127 -0
- unstd-3.1.0/src/unstd/compress/gzipx.py +222 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/crypto/token.py +22 -3
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/fs/__init__.py +54 -14
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/ids/README.md +6 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/ids/uid.py +34 -17
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/pack/binpack.py +24 -2
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/proc/__init__.py +45 -10
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/rex/README.md +3 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/rex/__init__.py +6 -3
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/rex/_faithful.py +23 -6
- unstd-3.1.0/src/unstd/serde/README.md +318 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/serde/__init__.py +5 -3
- unstd-3.1.0/src/unstd/serde/_json_common.py +16 -0
- unstd-3.1.0/src/unstd/serde/_json_decode_native.h +411 -0
- unstd-3.1.0/src/unstd/serde/_json_encode.py +199 -0
- unstd-3.1.0/src/unstd/serde/_json_encode_native.h +119 -0
- unstd-3.1.0/src/unstd/serde/_json_lines_native.h +99 -0
- unstd-3.1.0/src/unstd/serde/_json_native.c +676 -0
- unstd-3.1.0/src/unstd/serde/_json_native.pyi +16 -0
- unstd-3.1.0/src/unstd/serde/b64.py +272 -0
- unstd-3.1.0/src/unstd/serde/jsonx.py +411 -0
- unstd-3.1.0/src/unstd/serde/ndjson.py +336 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/text/fuzz.py +52 -2
- unstd-3.1.0/src/unstd/yaml/README.md +48 -0
- unstd-3.1.0/src/unstd/yaml/__init__.py +182 -0
- unstd-3.1.0/tests/COVERAGE.md +373 -0
- unstd-3.1.0/tests/P0.md +79 -0
- unstd-3.1.0/tests/README.md +142 -0
- unstd-3.1.0/tests/__init__.py +1 -0
- unstd-3.1.0/tests/conftest.py +125 -0
- unstd-3.1.0/tests/suites/assurance/README.md +12 -0
- unstd-3.1.0/tests/suites/assurance/adversarial/chaos/README.md +12 -0
- unstd-3.1.0/tests/suites/assurance/adversarial/chaos/conftest.py +39 -0
- unstd-3.1.0/tests/suites/assurance/adversarial/chaos/test_clock_entropy.py +368 -0
- unstd-3.1.0/tests/suites/assurance/adversarial/chaos/test_fs_process.py +269 -0
- unstd-3.1.0/tests/suites/assurance/adversarial/chaos/test_streams.py +511 -0
- unstd-3.1.0/tests/suites/assurance/adversarial/concurrency/README.md +18 -0
- unstd-3.1.0/tests/suites/assurance/adversarial/concurrency/conftest.py +39 -0
- unstd-3.1.0/tests/suites/assurance/adversarial/concurrency/test_filesystem.py +276 -0
- unstd-3.1.0/tests/suites/assurance/adversarial/concurrency/test_ids.py +317 -0
- unstd-3.1.0/tests/suites/assurance/adversarial/concurrency/test_shared_state.py +131 -0
- unstd-3.1.0/tests/suites/assurance/adversarial/fuzz_replay/README.md +21 -0
- unstd-3.1.0/tests/suites/assurance/adversarial/fuzz_replay/test_corpus_replay.py +53 -0
- unstd-3.1.0/tests/suites/assurance/adversarial/resources/README.md +8 -0
- unstd-3.1.0/tests/suites/assurance/evals/performance/README.md +8 -0
- {unstd-2.1.1/tests → unstd-3.1.0/tests/suites/assurance/gates/bench}/test_bench.py +72 -0
- unstd-3.1.0/tests/suites/assurance/gates/bench/test_billy_serde.py +155 -0
- unstd-3.1.0/tests/suites/assurance/gates/bench/test_clone_ids_profile.py +96 -0
- unstd-3.1.0/tests/suites/assurance/gates/chaos/_campaign_fixtures.py +87 -0
- unstd-3.1.0/tests/suites/assurance/gates/chaos/test_cli.py +415 -0
- unstd-3.1.0/tests/suites/assurance/gates/chaos/test_execution.py +392 -0
- unstd-3.1.0/tests/suites/assurance/gates/chaos/test_process_policy.py +44 -0
- unstd-3.1.0/tests/suites/assurance/gates/chaos/test_schedule.py +168 -0
- unstd-3.1.0/tests/suites/assurance/gates/chaos/test_workflow.py +132 -0
- unstd-3.1.0/tests/suites/assurance/gates/concurrency/test_campaign.py +397 -0
- unstd-3.1.0/tests/suites/assurance/gates/concurrency/test_workflow.py +123 -0
- unstd-3.1.0/tests/suites/assurance/gates/fuzz/_execution_fixtures.py +75 -0
- unstd-3.1.0/tests/suites/assurance/gates/fuzz/test_cli.py +463 -0
- unstd-3.1.0/tests/suites/assurance/gates/fuzz/test_execution.py +318 -0
- unstd-3.1.0/tests/suites/assurance/gates/fuzz/test_mutate.py +193 -0
- unstd-3.1.0/tests/suites/assurance/gates/fuzz/test_parser_targets.py +358 -0
- unstd-3.1.0/tests/suites/assurance/gates/fuzz/test_registry.py +346 -0
- unstd-3.1.0/tests/suites/assurance/gates/fuzz/test_serde_targets.py +362 -0
- unstd-3.1.0/tests/suites/assurance/gates/fuzz/test_workflow.py +144 -0
- {unstd-2.1.1/tests → unstd-3.1.0/tests/suites/assurance/gates/packaging}/test_package.py +5 -4
- unstd-3.1.0/tests/suites/assurance/gates/packaging/test_startup.py +237 -0
- unstd-3.1.0/tests/suites/assurance/gates/test_backend_policy.py +21 -0
- unstd-3.1.0/tests/suites/assurance/gates/test_optional_collection.py +29 -0
- unstd-3.1.0/tests/suites/assurance/gates/test_suite_runner.py +341 -0
- unstd-3.1.0/tests/suites/assurance/planes/integration/README.md +8 -0
- unstd-3.1.0/tests/suites/assurance/planes/packaging/README.md +94 -0
- unstd-3.1.0/tests/suites/assurance/planes/packaging/conftest.py +33 -0
- unstd-3.1.0/tests/suites/assurance/planes/packaging/test_artifacts.py +316 -0
- unstd-3.1.0/tests/suites/assurance/planes/packaging/test_consumers.py +416 -0
- unstd-3.1.0/tests/suites/assurance/planes/packaging/test_extras.py +349 -0
- unstd-3.1.0/tests/suites/assurance/planes/packaging/test_typing.py +76 -0
- unstd-3.1.0/tests/suites/assurance/security/pentest/README.md +31 -0
- unstd-3.1.0/tests/suites/assurance/security/pentest/test_tls_handshakes.py +374 -0
- unstd-3.1.0/tests/suites/assurance/security/structure/README.md +8 -0
- unstd-3.1.0/tests/suites/product/README.md +14 -0
- unstd-3.1.0/tests/suites/product/audio/regression/test_partial_frames.py +59 -0
- {unstd-2.1.1/tests/audio → unstd-3.1.0/tests/suites/product/audio/unit}/test_audio.py +41 -0
- {unstd-2.1.1/tests/clone → unstd-3.1.0/tests/suites/product/clone/unit}/test_clone.py +131 -0
- unstd-3.1.0/tests/suites/product/compress/unit/test_gzipx.py +588 -0
- unstd-3.1.0/tests/suites/product/compress/unit/test_gzipx_edges.py +222 -0
- unstd-3.1.0/tests/suites/product/crypto/regression/README.md +8 -0
- {unstd-2.1.1/tests/crypto → unstd-3.1.0/tests/suites/product/crypto/security}/test_adverse.py +1 -149
- unstd-3.1.0/tests/suites/product/crypto/security/test_tls.py +159 -0
- unstd-3.1.0/tests/suites/product/crypto/security/test_token_boundary.py +160 -0
- unstd-3.1.0/tests/suites/product/fs/integration/README.md +37 -0
- unstd-3.1.0/tests/suites/product/fs/integration/test_atomic_failures.py +299 -0
- unstd-3.1.0/tests/suites/product/fs/integration/test_atomic_interruption.py +151 -0
- unstd-3.1.0/tests/suites/product/fs/integration/test_filesystem_boundaries.py +322 -0
- unstd-3.1.0/tests/suites/product/fs/regression/README.md +8 -0
- unstd-3.1.0/tests/suites/product/ids/regression/README.md +13 -0
- unstd-3.1.0/tests/suites/product/ids/regression/test_fork.py +48 -0
- {unstd-2.1.1/tests/ids → unstd-3.1.0/tests/suites/product/ids/unit}/test_uid.py +30 -1
- {unstd-2.1.1/tests/pack → unstd-3.1.0/tests/suites/product/pack/unit}/test_pack.py +43 -0
- unstd-3.1.0/tests/suites/product/proc/integration/README.md +32 -0
- unstd-3.1.0/tests/suites/product/proc/integration/test_process_boundaries.py +330 -0
- unstd-3.1.0/tests/suites/product/proc/integration/test_process_lifecycle.py +199 -0
- unstd-3.1.0/tests/suites/product/proc/regression/README.md +9 -0
- unstd-3.1.0/tests/suites/product/proc/regression/test_interrupt_reaping.py +98 -0
- unstd-3.1.0/tests/suites/product/rex/regression/README.md +11 -0
- unstd-3.1.0/tests/suites/product/rex/regression/test_cache_concurrency.py +52 -0
- unstd-3.1.0/tests/suites/product/rex/regression/test_surrogate_region.py +108 -0
- unstd-3.1.0/tests/suites/product/rex/security/test_regex_boundary.py +80 -0
- unstd-3.1.0/tests/suites/product/serde/parity/test_b64_parity.py +642 -0
- unstd-3.1.0/tests/suites/product/serde/parity/test_jsonx_decode_fast.py +126 -0
- unstd-3.1.0/tests/suites/product/serde/parity/test_jsonx_decode_parity.py +477 -0
- unstd-3.1.0/tests/suites/product/serde/parity/test_jsonx_encode_parity.py +618 -0
- unstd-3.1.0/tests/suites/product/serde/parity/test_jsonx_fast.py +651 -0
- unstd-3.1.0/tests/suites/product/serde/parity/test_jsonx_native.py +555 -0
- unstd-3.1.0/tests/suites/product/serde/parity/test_jsonx_native_decode.py +331 -0
- unstd-3.1.0/tests/suites/product/serde/parity/test_jsonx_native_lifecycle.py +113 -0
- unstd-3.1.0/tests/suites/product/serde/parity/test_jsonx_proof_boundaries.py +110 -0
- unstd-3.1.0/tests/suites/product/serde/properties/test_b64_parity.py +399 -0
- unstd-3.1.0/tests/suites/product/serde/properties/test_serde_parity.py +222 -0
- unstd-3.1.0/tests/suites/product/serde/regression/README.md +8 -0
- unstd-3.1.0/tests/suites/product/serde/security/test_parser_boundaries.py +277 -0
- {unstd-2.1.1/tests/serde → unstd-3.1.0/tests/suites/product/serde/unit}/test_b64.py +77 -1
- {unstd-2.1.1/tests/serde → unstd-3.1.0/tests/suites/product/serde/unit}/test_jsonx.py +36 -46
- {unstd-2.1.1/tests/serde → unstd-3.1.0/tests/suites/product/serde/unit}/test_ndjson.py +189 -0
- unstd-3.1.0/tests/suites/product/serde/unit/test_ndjson_typed.py +670 -0
- unstd-3.1.0/tests/suites/product/text/unit/test_distance.py +72 -0
- unstd-3.1.0/tests/suites/product/yaml/security/test_yaml_boundary.py +163 -0
- unstd-3.1.0/tests/suites/product/yaml/unit/test_yaml.py +355 -0
- unstd-3.1.0/tests/support/README.md +12 -0
- unstd-3.1.0/tests/support/__init__.py +1 -0
- unstd-3.1.0/tests/support/anchors.py +8 -0
- unstd-3.1.0/tests/support/backends.py +24 -0
- unstd-3.1.0/tests/support/chaos.py +154 -0
- unstd-3.1.0/tests/support/chaos_clock_entropy.py +356 -0
- unstd-3.1.0/tests/support/chaos_fs_process.py +403 -0
- unstd-3.1.0/tests/support/chaos_streams.py +183 -0
- unstd-3.1.0/tests/support/concurrency_filesystem.py +558 -0
- unstd-3.1.0/tests/support/concurrency_ids.py +438 -0
- unstd-3.1.0/tests/support/concurrency_shared_state.py +681 -0
- unstd-3.1.0/tests/support/hypothesis/README.md +38 -0
- unstd-3.1.0/tests/support/hypothesis/__init__.py +1 -0
- unstd-3.1.0/tests/support/hypothesis/profiles.py +21 -0
- unstd-3.1.0/tests/support/packaging.py +346 -0
- unstd-3.1.0/tests/support/parser_cases.py +36 -0
- unstd-3.1.0/tests/support/parser_worker.py +134 -0
- unstd-3.1.0/tests/support/process.py +104 -0
- unstd-3.1.0/tests/support/tls.py +292 -0
- unstd-3.1.0/tests/tooling/README.md +16 -0
- unstd-3.1.0/tests/tooling/__init__.py +1 -0
- unstd-3.1.0/tests/tooling/__main__.py +6 -0
- unstd-3.1.0/tests/tooling/bench/README.md +18 -0
- unstd-3.1.0/tests/tooling/chaos/README.md +112 -0
- unstd-3.1.0/tests/tooling/chaos/__init__.py +1 -0
- unstd-3.1.0/tests/tooling/chaos/__main__.py +224 -0
- unstd-3.1.0/tests/tooling/chaos/execution.py +502 -0
- unstd-3.1.0/tests/tooling/chaos/worker.py +227 -0
- unstd-3.1.0/tests/tooling/concurrency/README.md +101 -0
- unstd-3.1.0/tests/tooling/concurrency/__init__.py +1 -0
- unstd-3.1.0/tests/tooling/concurrency/__main__.py +12 -0
- unstd-3.1.0/tests/tooling/fuzz/README.md +214 -0
- unstd-3.1.0/tests/tooling/fuzz/__init__.py +1 -0
- unstd-3.1.0/tests/tooling/fuzz/__main__.py +268 -0
- unstd-3.1.0/tests/tooling/fuzz/atheris_driver.py +122 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/base64/empty-input.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/base64/encode-altchars-long.bin +1 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/base64/encode-altchars-pair.bin +1 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/base64/encode-altchars-short.bin +1 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/base64/encode-binary.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/base64/mime-full-line.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/base64/mime-second-line.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/base64/missing-padding.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/base64/mixed-alphabets.bin +1 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/base64/native-clean-long.bin +1 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/base64/native-filtered-long.bin +1 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/base64/padded-standard.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/base64/padding-only.bin +1 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/base64/partial-group.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/base64/raw-nontext-bytes.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/base64/seeds.json +167 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/base64/text-nonascii.bin +1 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/base64/text-surrogate.bin +1 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/base64/unused-pad-bits.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/base64/url-alphabet.bin +1 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/base64/url-ignored-junk.bin +1 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/gzip/concatenated-expansion-budget.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/gzip/declared-expansion-budget.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/gzip/empty.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/gzip/forged-expansion-budget.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/gzip/generated-concatenation.bin +1 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/gzip/generated-crc-error.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/gzip/generated-level-nine.bin +1 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/gzip/generated-stored-level-zero.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/gzip/generated-truncation.bin +1 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/gzip/raw-bad-signature.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/gzip/raw-concatenated.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/gzip/raw-crc-corruption.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/gzip/raw-empty-between-members.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/gzip/raw-empty-member.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/gzip/raw-garbage-second-member.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/gzip/raw-invalid-compression-method.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/gzip/raw-isize-corruption.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/gzip/raw-member.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/gzip/raw-oversized-extra-header.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/gzip/raw-truncated-deflate.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/gzip/raw-truncated-trailer.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/gzip/raw-zero-padding.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/gzip/seeds.json +183 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/json/empty-document.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/json/empty-input.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/json/encode-native-snapshot.bin +1 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/json/encode-rich-values.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/json/escaped-lone-surrogate.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/json/integer-digit-limit.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/json/invalid-leading-zero.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/json/invalid-utf8.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/json/nesting-limit.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/json/nesting-outside-domain.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/json/nonfinite-extensions.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/json/ordered-duplicate-keys.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/json/parsed-encode-surrogate.bin +1 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/json/seeds.json +167 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/json/signed-zero.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/json/text-lone-surrogate.bin +1 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/json/truncated-object.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/json/utf16-big-endian.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/json/utf16-bom.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/json/utf32-bom.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/json/utf8-unicode.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/ndjson/ascii-exotic-padding.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/ndjson/blank-rows.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/ndjson/crlf-rows.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/ndjson/empty-input.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/ndjson/encode-full-record-set.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/ndjson/escaped-newline-value.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/ndjson/invalid-utf8-row.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/ndjson/maximum-physical-lines.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/ndjson/mixed-invalid-rows.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/ndjson/physical-lines-outside-domain.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/ndjson/quoted-depth-guard.bin +2 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/ndjson/seeds.json +159 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/ndjson/text-lone-surrogate.bin +1 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/ndjson/truncated-final-row.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/ndjson/unicode-exotic-padding.bin +3 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/ndjson/unicode-line-separators.bin +1 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/ndjson/utf16-single-row.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/ndjson/utf32-single-row.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/ndjson/valid-final-newline.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/ndjson/valid-no-final-newline.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/pack/alias-float16.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/pack/alias-float64.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/pack/alias-int16.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/pack/alias-uint64.bin +1 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/pack/decode-double-specials-pipe.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/pack/decode-half-specials.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/pack/decode-single-specials-big.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/pack/empty-multibyte-decode.bin +1 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/pack/empty.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/pack/encode-f2-finite.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/pack/encode-f4-finite.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/pack/encode-f8-finite.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/pack/encode-i1-little.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/pack/encode-i2-native.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/pack/encode-i4-little.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/pack/encode-i8-native.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/pack/encode-u1-big.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/pack/encode-u2-pipe.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/pack/encode-u4-big.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/pack/encode-u8-pipe.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/pack/partial-float32.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/pack/partial-float64.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/pack/partial-int16.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/pack/seeds.json +191 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/rex/compile-bad-backreference.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/rex/compile-bad-repeat.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/rex/compile-dollar-divergence.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/rex/compile-duplicate-name.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/rex/compile-lone-surrogate.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/rex/compile-nested-repeat.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/rex/compile-posix-divergence.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/rex/compile-unclosed-class.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/rex/empty.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/rex/fallback-backreference.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/rex/fallback-lookahead.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/rex/fallback-nullable-repeat.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/rex/fallback-nullable.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/rex/fallback-unicode-ignorecase.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/rex/fallback-unicode-subject.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/rex/literal-metacharacters.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/rex/literal-octet-boundary.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/rex/native-absolute-anchor.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/rex/native-alternation.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/rex/native-bytes-word.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/rex/native-digit-width.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/rex/native-literal-class.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/rex/native-named-word.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/rex/native-optional-capture.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/rex/seeds.json +215 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/rex/surrogate-region-finding.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/rex/surrogate-region-minimized.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/structs/deterministic-order.bin +1 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/structs/empty-input.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/structs/escaped-lone-surrogate.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/structs/escaped-surrogate-pair.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/structs/index-maximum.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/structs/index-overflow.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/structs/label-limit.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/structs/label-over-limit.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/structs/negative-index.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/structs/relaxed-numeric-strings.bin +1 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/structs/row-list-limit.bin +1 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/structs/row-list-over-limit.bin +1 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/structs/row-list.bin +1 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/structs/seeds.json +207 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/structs/sorted-order.bin +1 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/structs/strict-row.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/structs/tagged-delete.bin +1 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/structs/tagged-put.bin +1 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/structs/tagged-unknown.bin +1 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/structs/truncated-row.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/structs/unknown-field.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/structs/utf16-rejected.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/structs/utf32-rejected.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/structs/utf8-key-error.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/structs/utf8-value-error.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/structs/wrong-field-type.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/tokens/arbitrary-invalid-utf8.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/tokens/authentic-no-json-policy.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/tokens/authentic-opaque-token.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/tokens/changed-claims.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/tokens/claims-generation-limit.bin +1 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/tokens/derive-authentic-tampering.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/tokens/derive-signed-malformed.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/tokens/empty-input.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/tokens/extra-separator.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/tokens/missing-separator.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/tokens/seeds.json +167 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/tokens/signature-pad-bit-alias.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/tokens/signed-payload-alias.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/tokens/signed-payload-junk.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/tokens/signed-payload-padding.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/tokens/signed-standard-alphabet.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/tokens/text-lone-surrogate.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/tokens/text-nonascii.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/tokens/truncated-signature.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/tokens/utf16-shaped-token.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/tokens/utf32-shaped-token.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/toml/empty.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/toml/model-boolean-false.bin +1 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/toml/model-boolean-true.bin +1 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/toml/model-empty.bin +1 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/toml/model-escapes.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/toml/model-integer-boundary.bin +1 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/toml/raw-array-of-tables.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/toml/raw-arrays-tables.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/toml/raw-basic.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/toml/raw-datetimes.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/toml/raw-dotted-key-redefinition.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/toml/raw-duplicate-key.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/toml/raw-empty.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/toml/raw-float-specials.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/toml/raw-invalid-utf8.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/toml/raw-nested-budget.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/toml/raw-nul.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/toml/raw-numeric-extrema.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/toml/raw-quoted-unicode-key.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/toml/raw-string-escapes.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/toml/raw-unterminated-array.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/toml/seeds.json +175 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/wav/declared-channel-overflow.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/wav/declared-data-overflow.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/wav/declared-riff-overflow.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/wav/empty.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/wav/generated-invalid-truncated-riff.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/wav/generated-invalid-wrong-magic.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/wav/generated-invalid-zero-channels.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/wav/generated-mono-48000.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/wav/generated-mono-8000.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/wav/generated-quad-44100.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/wav/generated-stereo-16000.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/wav/generated-three-channel-22050.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/wav/raw-empty-stereo.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/wav/raw-foreign-flac.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/wav/raw-missing-format.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/wav/raw-mono-extrema.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/wav/raw-quad-interleaved.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/wav/raw-short-riff.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/wav/raw-stereo-interleaved.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/wav/raw-truncated-pcm.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/wav/regression-declared-partial-pcm-sample.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/wav/regression-fmt-extent-outside-riff.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/wav/regression-inconsistent-pcm-byte-rate.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/wav/regression-truncated-quad-frame.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/wav/seeds.json +199 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/yaml/alias-expansion-budget.bin +1 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/yaml/alias-minimum.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/yaml/empty.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/yaml/generated-tag-python-apply.bin +1 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/yaml/generated-tag-python-new.bin +1 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/yaml/generated-tag-unknown.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/yaml/known-model-binary.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/yaml/known-model.bin +1 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/yaml/raw-alias-expansion-budget.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/yaml/raw-basic.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/yaml/raw-binary-timestamp.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/yaml/raw-duplicate-key.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/yaml/raw-float-specials.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/yaml/raw-invalid-date-finding.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/yaml/raw-invalid-utf16.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/yaml/raw-merge-overrides.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/yaml/raw-multiple-documents.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/yaml/raw-nul.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/yaml/raw-python-tag.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/yaml/raw-recursive-alias.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/yaml/raw-safe-aliases.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/yaml/raw-semantic-key-collision.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/yaml/raw-unclosed-flow.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/yaml/raw-unknown-tag.bin +0 -0
- unstd-3.1.0/tests/tooling/fuzz/corpus/yaml/seeds.json +199 -0
- unstd-3.1.0/tests/tooling/fuzz/execution.py +626 -0
- unstd-3.1.0/tests/tooling/fuzz/mutate.py +105 -0
- unstd-3.1.0/tests/tooling/fuzz/registry.py +310 -0
- unstd-3.1.0/tests/tooling/fuzz/registry.toml +111 -0
- unstd-3.1.0/tests/tooling/fuzz/targets/__init__.py +1 -0
- unstd-3.1.0/tests/tooling/fuzz/targets/base64.py +145 -0
- unstd-3.1.0/tests/tooling/fuzz/targets/gzip.py +112 -0
- unstd-3.1.0/tests/tooling/fuzz/targets/json.py +208 -0
- unstd-3.1.0/tests/tooling/fuzz/targets/ndjson.py +183 -0
- unstd-3.1.0/tests/tooling/fuzz/targets/pack.py +84 -0
- unstd-3.1.0/tests/tooling/fuzz/targets/rex.py +139 -0
- unstd-3.1.0/tests/tooling/fuzz/targets/structs.py +156 -0
- unstd-3.1.0/tests/tooling/fuzz/targets/tokens.py +156 -0
- unstd-3.1.0/tests/tooling/fuzz/targets/toml.py +69 -0
- unstd-3.1.0/tests/tooling/fuzz/targets/wav.py +205 -0
- unstd-3.1.0/tests/tooling/fuzz/targets/yaml.py +158 -0
- unstd-3.1.0/tests/tooling/fuzz/worker.py +212 -0
- unstd-3.1.0/tests/tooling/inventory.toml +172 -0
- unstd-3.1.0/tests/tooling/mutation/README.md +68 -0
- unstd-3.1.0/tests/tooling/runner.py +250 -0
- {unstd-2.1.1 → unstd-3.1.0}/uv.lock +70 -3
- unstd-2.1.1/.github/workflows/release.yml +0 -48
- unstd-2.1.1/README.md +0 -55
- unstd-2.1.1/bench/README.md +0 -124
- unstd-2.1.1/src/unstd/serde/README.md +0 -157
- unstd-2.1.1/src/unstd/serde/b64.py +0 -127
- unstd-2.1.1/src/unstd/serde/jsonx.py +0 -344
- unstd-2.1.1/src/unstd/serde/ndjson.py +0 -159
- unstd-2.1.1/tests/conftest.py +0 -80
- unstd-2.1.1/tests/properties/README.md +0 -13
- unstd-2.1.1/tests/properties/test_serde_parity.py +0 -88
- {unstd-2.1.1 → unstd-3.1.0}/LICENSE +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/NOTICE +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/bench/__init__.py +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/bench/__main__.py +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/bench/report.py +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/bench/timing.py +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/_extra.py +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/audio/README.md +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/audio/__init__.py +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/clone/README.md +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/clone/__init__.py +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/containers/README.md +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/containers/__init__.py +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/containers/persistent.py +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/containers/sorted.py +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/crypto/README.md +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/crypto/__init__.py +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/crypto/_blake3.py +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/crypto/digest.py +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/crypto/tls.py +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/fs/README.md +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/ids/__init__.py +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/iters/README.md +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/iters/__init__.py +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/iters/consecutive.py +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/iters/distinct.py +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/iters/reshape.py +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/iters/select.py +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/model/README.md +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/model/__init__.py +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/model/base.py +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/model/settings.py +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/pack/README.md +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/pack/__init__.py +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/proc/README.md +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/py.typed +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/rand/README.md +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/rand/__init__.py +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/rand/crypto.py +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/rand/draw.py +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/serde/structs.py +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/text/README.md +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/text/__init__.py +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/time/README.md +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/time/__init__.py +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/time/timeutil.py +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/time/zoned.py +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/toml/README.md +0 -0
- {unstd-2.1.1 → unstd-3.1.0}/src/unstd/toml/__init__.py +0 -0
- {unstd-2.1.1/tests → unstd-3.1.0/tests/suites/product/audio}/properties/test_wav_quant.py +0 -0
- {unstd-2.1.1/tests → unstd-3.1.0/tests/suites/product/clone}/properties/test_clone_invariants.py +0 -0
- {unstd-2.1.1/tests/containers → unstd-3.1.0/tests/suites/product/containers/unit}/test_containers.py +0 -0
- {unstd-2.1.1/tests/crypto → unstd-3.1.0/tests/suites/product/crypto/unit}/blake3_reference_vectors.json +0 -0
- {unstd-2.1.1/tests/crypto → unstd-3.1.0/tests/suites/product/crypto/unit}/test_vectors.py +0 -0
- {unstd-2.1.1/tests/fs → unstd-3.1.0/tests/suites/product/fs/unit}/test_fs.py +0 -0
- {unstd-2.1.1/tests → unstd-3.1.0/tests/suites/product/ids}/properties/test_uuid7.py +0 -0
- {unstd-2.1.1/tests/iters → unstd-3.1.0/tests/suites/product/iters/unit}/test_iters.py +0 -0
- {unstd-2.1.1/tests/model → unstd-3.1.0/tests/suites/product/model/unit}/test_model.py +0 -0
- {unstd-2.1.1/tests → unstd-3.1.0/tests/suites/product/pack}/properties/test_pack_invariants.py +0 -0
- {unstd-2.1.1/tests/proc → unstd-3.1.0/tests/suites/product/proc/unit}/test_proc.py +0 -0
- {unstd-2.1.1/tests/rand → unstd-3.1.0/tests/suites/product/rand/unit}/test_rand.py +0 -0
- {unstd-2.1.1/tests/rex → unstd-3.1.0/tests/suites/product/rex/parity}/test_fidelity.py +0 -0
- {unstd-2.1.1/tests/rex → unstd-3.1.0/tests/suites/product/rex/unit}/test_rex.py +0 -0
- {unstd-2.1.1/tests/serde → unstd-3.1.0/tests/suites/product/serde/unit}/test_structs.py +0 -0
- {unstd-2.1.1/tests/text → unstd-3.1.0/tests/suites/product/text/unit}/test_text.py +0 -0
- {unstd-2.1.1/tests/time → unstd-3.1.0/tests/suites/product/time/unit}/test_timeutil.py +0 -0
- {unstd-2.1.1/tests/time → unstd-3.1.0/tests/suites/product/time/unit}/test_zoned.py +0 -0
- {unstd-2.1.1/tests → unstd-3.1.0/tests/suites/product/toml}/properties/test_toml_invariants.py +0 -0
- {unstd-2.1.1/tests/toml → unstd-3.1.0/tests/suites/product/toml/unit}/test_toml.py +0 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
name: chaos
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
push:
|
|
6
|
+
branches: [main]
|
|
7
|
+
schedule:
|
|
8
|
+
- cron: "43 7 * * *"
|
|
9
|
+
workflow_dispatch:
|
|
10
|
+
|
|
11
|
+
permissions:
|
|
12
|
+
contents: read
|
|
13
|
+
|
|
14
|
+
concurrency:
|
|
15
|
+
group: chaos-${{ github.event_name }}-${{ github.ref }}
|
|
16
|
+
cancel-in-progress: ${{ github.event_name != 'schedule' }}
|
|
17
|
+
|
|
18
|
+
jobs:
|
|
19
|
+
inventory:
|
|
20
|
+
runs-on: ubuntu-latest
|
|
21
|
+
timeout-minutes: 5
|
|
22
|
+
outputs:
|
|
23
|
+
matrix: ${{ steps.groups.outputs.matrix }}
|
|
24
|
+
steps:
|
|
25
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
26
|
+
with:
|
|
27
|
+
persist-credentials: false
|
|
28
|
+
- uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
|
|
29
|
+
with:
|
|
30
|
+
enable-cache: false
|
|
31
|
+
version: "latest-known"
|
|
32
|
+
python-version: "3.13"
|
|
33
|
+
- id: groups
|
|
34
|
+
shell: bash
|
|
35
|
+
run: |
|
|
36
|
+
matrix=$(uv run --no-project --python 3.13 python -m tests.tooling.chaos list --json)
|
|
37
|
+
printf 'matrix=%s\n' "$matrix" >> "$GITHUB_OUTPUT"
|
|
38
|
+
|
|
39
|
+
campaign:
|
|
40
|
+
needs: inventory
|
|
41
|
+
runs-on: ${{ matrix.os }}
|
|
42
|
+
timeout-minutes: 30
|
|
43
|
+
strategy:
|
|
44
|
+
fail-fast: false
|
|
45
|
+
matrix: ${{ fromJSON(needs.inventory.outputs.matrix) }}
|
|
46
|
+
env:
|
|
47
|
+
ROUNDS: ${{ github.event_name == 'schedule' && '10' || '1' }}
|
|
48
|
+
steps:
|
|
49
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
50
|
+
with:
|
|
51
|
+
persist-credentials: false
|
|
52
|
+
- uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
|
|
53
|
+
with:
|
|
54
|
+
enable-cache: false
|
|
55
|
+
version: "latest-known"
|
|
56
|
+
python-version: "3.13"
|
|
57
|
+
# Both lanes install extras; the stdlib worker blocks acceleration imports
|
|
58
|
+
# before product loading, and propagates that policy into nested workers.
|
|
59
|
+
- run: uv sync --locked --all-extras --group dev --python 3.13
|
|
60
|
+
- name: Recorded faults, interruption and recovery
|
|
61
|
+
run: >-
|
|
62
|
+
uv run --no-sync python -m tests.tooling.chaos run
|
|
63
|
+
--group ${{ matrix.group }} --backend ${{ matrix.backend }}
|
|
64
|
+
--seed 173 --rounds "$ROUNDS"
|
|
65
|
+
--wall-seconds 120 --per-test-seconds 45 --cpu-seconds 60 --memory-mb 2048
|
|
66
|
+
--artifact-dir .local/chaos/
|
|
67
|
+
- name: Retain schedules, observations and failures
|
|
68
|
+
if: always()
|
|
69
|
+
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
|
70
|
+
with:
|
|
71
|
+
name: chaos-${{ matrix.group }}-${{ matrix.backend }}-${{ matrix.os }}-${{ github.run_attempt }}
|
|
72
|
+
path: .local/chaos/
|
|
73
|
+
include-hidden-files: true
|
|
74
|
+
if-no-files-found: error
|
|
75
|
+
retention-days: 14
|
|
@@ -35,6 +35,10 @@ jobs:
|
|
|
35
35
|
version: "latest-known"
|
|
36
36
|
python-version: "3.13"
|
|
37
37
|
- run: uv sync --locked --all-extras --group dev --python 3.13
|
|
38
|
+
- run: uv run --no-sync --python 3.13 python -m tests.tooling check
|
|
39
|
+
- run: uv run --no-sync --python 3.13 python -m tests.tooling.fuzz check
|
|
40
|
+
- run: uv run --no-sync --python 3.13 python -m tests.tooling.chaos check
|
|
41
|
+
- run: uv run --no-sync --python 3.13 python -m tests.tooling.concurrency check
|
|
38
42
|
- run: uv run --python 3.13 ruff check .
|
|
39
43
|
- run: uv run --python 3.13 ruff format --check .
|
|
40
44
|
- run: uv run --python 3.13 mypy
|
|
@@ -59,7 +63,8 @@ jobs:
|
|
|
59
63
|
version: "latest-known"
|
|
60
64
|
python-version: ${{ matrix.python-version }}
|
|
61
65
|
- run: uv sync --locked --all-extras --group dev --python ${{ matrix.python-version }}
|
|
62
|
-
- run: uv
|
|
66
|
+
- run: uv build --python ${{ matrix.python-version }} --sdist --wheel --out-dir "$RUNNER_TEMP/unstd-build-cache"
|
|
67
|
+
- run: uv run --no-sync --python ${{ matrix.python-version }} pytest --require-extras -q
|
|
63
68
|
|
|
64
69
|
floors:
|
|
65
70
|
# Every extra declares a floor, and a floor is a promise: install this old a
|
|
@@ -86,11 +91,12 @@ jobs:
|
|
|
86
91
|
# Which versions the floors admitted — the first thing anyone reading a
|
|
87
92
|
# failure here needs, and not recoverable from the traceback.
|
|
88
93
|
- run: uv pip list
|
|
94
|
+
- run: uv build --python 3.13 --sdist --wheel --out-dir "$RUNNER_TEMP/unstd-build-cache"
|
|
89
95
|
# `--no-sync` is what makes this job mean anything. A bare `uv run`
|
|
90
96
|
# re-resolves in the default `highest` mode and quietly reinstalls the
|
|
91
97
|
# newest of everything first, so the suite would run against the same
|
|
92
98
|
# environment `test` already covers and pass no matter what the floors say.
|
|
93
|
-
- run: uv run --no-sync --python 3.13 pytest -q
|
|
99
|
+
- run: uv run --no-sync --python 3.13 pytest --require-extras -q
|
|
94
100
|
|
|
95
101
|
test-fallback:
|
|
96
102
|
# A base install (no optional extras) is a load-bearing, documented contract
|
|
@@ -100,8 +106,8 @@ jobs:
|
|
|
100
106
|
# fixtures inside the suite. This job takes the real path.
|
|
101
107
|
#
|
|
102
108
|
# Which modules can't be collected without their extra is decided by
|
|
103
|
-
# `tests/conftest.py`, which
|
|
104
|
-
#
|
|
109
|
+
# `tests/conftest.py`, which centralizes module importability probes.
|
|
110
|
+
# A hardcoded `--ignore` roster here would be a second copy of that
|
|
105
111
|
# decision, and the copy that lives in CI is the one nobody updates.
|
|
106
112
|
runs-on: ubuntu-latest
|
|
107
113
|
steps:
|
|
@@ -114,8 +120,9 @@ jobs:
|
|
|
114
120
|
version: "latest-known"
|
|
115
121
|
python-version: "3.13"
|
|
116
122
|
- run: uv sync --locked --group dev --python 3.13
|
|
123
|
+
- run: uv build --python 3.13 --sdist --wheel --out-dir "$RUNNER_TEMP/unstd-build-cache"
|
|
117
124
|
# A diagnostic, not a gate — the zero-closure claim is asserted offline by
|
|
118
|
-
# `tests/test_package.py`.
|
|
125
|
+
# `tests/suites/assurance/gates/packaging/test_package.py`. A failure that reproduces
|
|
119
126
|
# only on the fallback leg is nearly unreadable without knowing which
|
|
120
127
|
# backends were actually present when it ran (the test tooling drags in a
|
|
121
128
|
# couple of its own, e.g. hypothesis → sortedcontainers).
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
name: concurrency
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
push:
|
|
6
|
+
branches: [main]
|
|
7
|
+
schedule:
|
|
8
|
+
- cron: "13 8 * * *"
|
|
9
|
+
workflow_dispatch:
|
|
10
|
+
|
|
11
|
+
permissions:
|
|
12
|
+
contents: read
|
|
13
|
+
|
|
14
|
+
concurrency:
|
|
15
|
+
group: concurrency-${{ github.event_name }}-${{ github.ref }}
|
|
16
|
+
cancel-in-progress: ${{ github.event_name != 'schedule' }}
|
|
17
|
+
|
|
18
|
+
jobs:
|
|
19
|
+
inventory:
|
|
20
|
+
runs-on: ubuntu-latest
|
|
21
|
+
timeout-minutes: 5
|
|
22
|
+
outputs:
|
|
23
|
+
matrix: ${{ steps.groups.outputs.matrix }}
|
|
24
|
+
steps:
|
|
25
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
26
|
+
with:
|
|
27
|
+
persist-credentials: false
|
|
28
|
+
- uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
|
|
29
|
+
with:
|
|
30
|
+
enable-cache: false
|
|
31
|
+
version: "latest-known"
|
|
32
|
+
python-version: "3.13"
|
|
33
|
+
- id: groups
|
|
34
|
+
shell: bash
|
|
35
|
+
run: |
|
|
36
|
+
matrix=$(uv run --no-project --python 3.13 python -m tests.tooling.concurrency list --json)
|
|
37
|
+
printf 'matrix=%s\n' "$matrix" >> "$GITHUB_OUTPUT"
|
|
38
|
+
|
|
39
|
+
campaign:
|
|
40
|
+
needs: inventory
|
|
41
|
+
runs-on: ${{ matrix.os }}
|
|
42
|
+
timeout-minutes: 30
|
|
43
|
+
strategy:
|
|
44
|
+
fail-fast: false
|
|
45
|
+
matrix: ${{ fromJSON(needs.inventory.outputs.matrix) }}
|
|
46
|
+
env:
|
|
47
|
+
ROUNDS: ${{ github.event_name == 'schedule' && '10' || '1' }}
|
|
48
|
+
steps:
|
|
49
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
50
|
+
with:
|
|
51
|
+
persist-credentials: false
|
|
52
|
+
- uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
|
|
53
|
+
with:
|
|
54
|
+
enable-cache: false
|
|
55
|
+
version: "latest-known"
|
|
56
|
+
python-version: "3.13"
|
|
57
|
+
# Both lanes install extras; the stdlib worker blocks acceleration imports
|
|
58
|
+
# before product loading, and propagates that policy into nested workers.
|
|
59
|
+
- run: uv sync --locked --all-extras --group dev --python 3.13
|
|
60
|
+
- name: Recorded overlap, ordering and isolation
|
|
61
|
+
run: >-
|
|
62
|
+
uv run --no-sync python -m tests.tooling.concurrency run
|
|
63
|
+
--group ${{ matrix.group }} --backend ${{ matrix.backend }}
|
|
64
|
+
--seed 173 --rounds "$ROUNDS"
|
|
65
|
+
--wall-seconds 120 --per-test-seconds 45 --cpu-seconds 60 --memory-mb 2048
|
|
66
|
+
--artifact-dir .local/concurrency/
|
|
67
|
+
- name: Retain schedules, observations and failures
|
|
68
|
+
if: always()
|
|
69
|
+
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
|
70
|
+
with:
|
|
71
|
+
name: concurrency-${{ matrix.group }}-${{ matrix.backend }}-${{ matrix.os }}-${{ github.run_attempt }}
|
|
72
|
+
path: .local/concurrency/
|
|
73
|
+
include-hidden-files: true
|
|
74
|
+
if-no-files-found: error
|
|
75
|
+
retention-days: 14
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
name: fuzz
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
push:
|
|
6
|
+
branches: [main]
|
|
7
|
+
schedule:
|
|
8
|
+
- cron: "23 6 * * *"
|
|
9
|
+
workflow_dispatch:
|
|
10
|
+
|
|
11
|
+
permissions:
|
|
12
|
+
contents: read
|
|
13
|
+
|
|
14
|
+
concurrency:
|
|
15
|
+
group: fuzz-${{ github.event_name }}-${{ github.ref }}
|
|
16
|
+
cancel-in-progress: ${{ github.event_name != 'schedule' }}
|
|
17
|
+
|
|
18
|
+
jobs:
|
|
19
|
+
inventory:
|
|
20
|
+
runs-on: ubuntu-latest
|
|
21
|
+
timeout-minutes: 5
|
|
22
|
+
outputs:
|
|
23
|
+
matrix: ${{ steps.targets.outputs.matrix }}
|
|
24
|
+
steps:
|
|
25
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
26
|
+
with:
|
|
27
|
+
persist-credentials: false
|
|
28
|
+
- uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
|
|
29
|
+
with:
|
|
30
|
+
enable-cache: false
|
|
31
|
+
version: "latest-known"
|
|
32
|
+
python-version: "3.12"
|
|
33
|
+
- id: targets
|
|
34
|
+
shell: bash
|
|
35
|
+
run: |
|
|
36
|
+
matrix=$(uv run --no-project --python 3.12 python -m tests.tooling.fuzz list --json --all-backends)
|
|
37
|
+
printf 'matrix=%s\n' "$matrix" >> "$GITHUB_OUTPUT"
|
|
38
|
+
|
|
39
|
+
campaign:
|
|
40
|
+
needs: inventory
|
|
41
|
+
runs-on: ubuntu-latest
|
|
42
|
+
timeout-minutes: 10
|
|
43
|
+
strategy:
|
|
44
|
+
fail-fast: false
|
|
45
|
+
matrix: ${{ fromJSON(needs.inventory.outputs.matrix) }}
|
|
46
|
+
env:
|
|
47
|
+
RUNS: ${{ github.event_name == 'schedule' && '100000' || '1000' }}
|
|
48
|
+
WALL: ${{ github.event_name == 'schedule' && '120' || '30' }}
|
|
49
|
+
CPU: ${{ github.event_name == 'schedule' && '110' || '20' }}
|
|
50
|
+
steps:
|
|
51
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
52
|
+
with:
|
|
53
|
+
persist-credentials: false
|
|
54
|
+
- uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
|
|
55
|
+
with:
|
|
56
|
+
enable-cache: false
|
|
57
|
+
version: "latest-known"
|
|
58
|
+
python-version: "3.12"
|
|
59
|
+
# Atheris has a tested binary wheel here; it is a development group,
|
|
60
|
+
# never a runtime dependency or a silently substituted mutation engine.
|
|
61
|
+
- run: uv sync --locked --all-extras --group dev --group fuzz --python 3.12
|
|
62
|
+
- name: Replay and deterministic mutation
|
|
63
|
+
run: >-
|
|
64
|
+
uv run --no-sync python -m tests.tooling.fuzz campaign
|
|
65
|
+
--target ${{ matrix.target }} --backend ${{ matrix.backend }}
|
|
66
|
+
--engine deterministic --runs 1000 --seed 173
|
|
67
|
+
--wall-seconds 30 --cpu-seconds 20
|
|
68
|
+
--artifact-dir .local/fuzz/deterministic
|
|
69
|
+
- name: Instrumented Python coverage campaign
|
|
70
|
+
run: >-
|
|
71
|
+
uv run --no-sync python -m tests.tooling.fuzz campaign
|
|
72
|
+
--target ${{ matrix.target }} --backend ${{ matrix.backend }}
|
|
73
|
+
--engine atheris --runs "$RUNS" --seed 173
|
|
74
|
+
--wall-seconds "$WALL" --cpu-seconds "$CPU"
|
|
75
|
+
--artifact-dir .local/fuzz/atheris
|
|
76
|
+
- name: Retain reports, findings, and coverage corpus
|
|
77
|
+
if: always()
|
|
78
|
+
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
|
79
|
+
with:
|
|
80
|
+
name: fuzz-${{ matrix.target }}-${{ matrix.backend }}-${{ github.run_attempt }}
|
|
81
|
+
path: .local/fuzz/
|
|
82
|
+
include-hidden-files: true
|
|
83
|
+
if-no-files-found: error
|
|
84
|
+
retention-days: 14
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# Build and verify native wheels before publishing a version tag to PyPI.
|
|
2
|
+
#
|
|
3
|
+
# ONE-TIME SETUP: PyPI Trusted Publishing, no API token in this repo.
|
|
4
|
+
# On PyPI, add a trusted publisher for the `unstd` project pointing at this
|
|
5
|
+
# repository, workflow `release.yml`, environment `pypi`. Before the project
|
|
6
|
+
# exists this is a pending publisher under Your projects -> Publishing.
|
|
7
|
+
name: release
|
|
8
|
+
|
|
9
|
+
on:
|
|
10
|
+
push:
|
|
11
|
+
tags: ["v*"]
|
|
12
|
+
workflow_dispatch:
|
|
13
|
+
|
|
14
|
+
permissions:
|
|
15
|
+
contents: read
|
|
16
|
+
|
|
17
|
+
jobs:
|
|
18
|
+
# A tag push used to publish unconditionally — nothing stood between `git tag`
|
|
19
|
+
# and PyPI, and a release is the one artifact that cannot be taken back. The
|
|
20
|
+
# full CI gate (lint + type + the 3.12/3.13/3.14 matrix + the base-install
|
|
21
|
+
# fallback leg) runs first, by reference rather than by copy, so the bar is
|
|
22
|
+
# the same one every pull request clears.
|
|
23
|
+
gate:
|
|
24
|
+
uses: ./.github/workflows/ci.yml
|
|
25
|
+
permissions:
|
|
26
|
+
contents: read
|
|
27
|
+
|
|
28
|
+
wheels:
|
|
29
|
+
needs: gate
|
|
30
|
+
strategy:
|
|
31
|
+
fail-fast: false
|
|
32
|
+
matrix:
|
|
33
|
+
os: [ubuntu-latest, ubuntu-24.04-arm, macos-15-intel, macos-14, windows-latest, windows-11-arm]
|
|
34
|
+
runs-on: ${{ matrix.os }}
|
|
35
|
+
steps:
|
|
36
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
37
|
+
with:
|
|
38
|
+
persist-credentials: false
|
|
39
|
+
- uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
|
|
40
|
+
with:
|
|
41
|
+
enable-cache: false
|
|
42
|
+
version: "latest-known"
|
|
43
|
+
- name: Build and test CPython wheels
|
|
44
|
+
run: uvx --from cibuildwheel==4.3.1 cibuildwheel --output-dir dist
|
|
45
|
+
- uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
|
|
46
|
+
with:
|
|
47
|
+
name: wheels-${{ matrix.os }}
|
|
48
|
+
path: dist/*.whl
|
|
49
|
+
if-no-files-found: error
|
|
50
|
+
|
|
51
|
+
sdist:
|
|
52
|
+
needs: gate
|
|
53
|
+
runs-on: ubuntu-latest
|
|
54
|
+
steps:
|
|
55
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
56
|
+
with:
|
|
57
|
+
persist-credentials: false
|
|
58
|
+
- uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
|
|
59
|
+
with:
|
|
60
|
+
enable-cache: false
|
|
61
|
+
version: "latest-known"
|
|
62
|
+
- run: uv build --sdist
|
|
63
|
+
- uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
|
|
64
|
+
with:
|
|
65
|
+
name: source
|
|
66
|
+
path: dist/*.tar.gz
|
|
67
|
+
if-no-files-found: error
|
|
68
|
+
|
|
69
|
+
pypi:
|
|
70
|
+
needs: [wheels, sdist]
|
|
71
|
+
if: startsWith(github.ref, 'refs/tags/v')
|
|
72
|
+
runs-on: ubuntu-latest
|
|
73
|
+
environment: pypi
|
|
74
|
+
permissions:
|
|
75
|
+
id-token: write
|
|
76
|
+
steps:
|
|
77
|
+
- uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7
|
|
78
|
+
with:
|
|
79
|
+
path: dist
|
|
80
|
+
merge-multiple: true
|
|
81
|
+
- name: The tag agrees with package metadata
|
|
82
|
+
env:
|
|
83
|
+
TAG: ${{ github.ref_name }}
|
|
84
|
+
run: |
|
|
85
|
+
python - <<'PY'
|
|
86
|
+
import os, pathlib, tarfile, tomllib
|
|
87
|
+
source, = pathlib.Path("dist").glob("*.tar.gz")
|
|
88
|
+
with tarfile.open(source) as archive:
|
|
89
|
+
manifest, = (item for item in archive.getmembers() if item.name.endswith("/pyproject.toml"))
|
|
90
|
+
version = tomllib.loads(archive.extractfile(manifest).read().decode())["project"]["version"]
|
|
91
|
+
assert os.environ["TAG"] == "v" + version
|
|
92
|
+
PY
|
|
93
|
+
- uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
|
|
@@ -8,7 +8,7 @@ doc_radar:
|
|
|
8
8
|
- file: .github/workflows/ci.yml
|
|
9
9
|
contains: ['github.sha || github.ref', 'version: "latest-known"', 'uv sync --locked']
|
|
10
10
|
- file: .github/workflows/release.yml
|
|
11
|
-
contains: ['TAG: ${{ github.ref_name }}', '
|
|
11
|
+
contains: ['TAG: ${{ github.ref_name }}', 'Build and test CPython wheels']
|
|
12
12
|
- file: src/unstd/serde/structs.py
|
|
13
13
|
contains: ['Callable[[Decimal], object]', 'decimal_format: _DecimalFormat']
|
|
14
14
|
---
|
|
@@ -17,6 +17,219 @@ doc_radar:
|
|
|
17
17
|
|
|
18
18
|
<!-- towncrier release notes start -->
|
|
19
19
|
|
|
20
|
+
## [3.1.0] - 2026-10-20
|
|
21
|
+
|
|
22
|
+
### Performance
|
|
23
|
+
|
|
24
|
+
- JSON encoding can use an optional CPython native guard that checks exact
|
|
25
|
+
builtin trees and calls orjson while retaining the GIL. Larger text records
|
|
26
|
+
avoid 3.0.0's Python snapshot budget and stdlib fallback. Compiler-less source
|
|
27
|
+
builds retain the portable path; release wheels include the guard.
|
|
28
|
+
- Native default spacing preserves punctuation and escaped quotes inside text,
|
|
29
|
+
avoiding the stdlib fallback for larger string-heavy records.
|
|
30
|
+
- Untyped JSON decoding reuses msgspec's arbitrary-precision integer and correctly
|
|
31
|
+
rounded float decoder, with a bounded native proof enabling orjson for larger
|
|
32
|
+
records. CPython 3.14 native dispatch preserves Python function metadata and
|
|
33
|
+
falls back during instrumentation. Custom options, unsupported inputs and
|
|
34
|
+
native errors retain stdlib behavior.
|
|
35
|
+
- NDJSON writes use the same guarded encoder's native trailing-newline option,
|
|
36
|
+
avoiding redundant public dispatch and an extra output copy per record.
|
|
37
|
+
- Whole-blob NDJSON reads batch native parsing over strict physical newline
|
|
38
|
+
boundaries. Streaming reads, callbacks and error diagnostics keep their
|
|
39
|
+
existing behavior.
|
|
40
|
+
- Added an output-checked Billy fixture comparison with source and fixture
|
|
41
|
+
fingerprints, alternating before/after CPU batches, direct-call companions and
|
|
42
|
+
an optional release-regression gate. The measurement report retains residual
|
|
43
|
+
costs relative to the permissive 2.1.1 codec; no universal speedup or
|
|
44
|
+
zero-overhead compatibility claim is made. Public APIs are unchanged.
|
|
45
|
+
|
|
46
|
+
### Fixed
|
|
47
|
+
|
|
48
|
+
- Native codec reinitialization keeps earlier helpers' configuration checks and
|
|
49
|
+
Python fallbacks valid. Module destruction also releases watchers and owned
|
|
50
|
+
references when garbage collection has not run the clear hook first.
|
|
51
|
+
|
|
52
|
+
## [3.0.0] - 2026-10-19
|
|
53
|
+
|
|
54
|
+
### Breaking
|
|
55
|
+
|
|
56
|
+
- `serde.jsonx` now guarantees the running stdlib's JSON defaults and semantics.
|
|
57
|
+
`dump` and `dumps` use `ensure_ascii=True` and default spaces, replacing the
|
|
58
|
+
previous compact, unescaped output. To retain compact text, pass
|
|
59
|
+
`ensure_ascii=False, separators=(",", ":")` explicitly. Dataclasses, UUIDs and
|
|
60
|
+
plain enums now require an explicit encoder or `default`, as they do in
|
|
61
|
+
stdlib `json`; orjson-only type acceptance is removed.
|
|
62
|
+
- JSON numbers retain their values: arbitrary precision integers no longer fail
|
|
63
|
+
on encode or silently become floats on decode, and non-finite floats follow
|
|
64
|
+
stdlib's `NaN`/infinity behavior instead of silently becoming `null`.
|
|
65
|
+
`allow_nan=False` rejects them. Unicode and lone surrogates, UTF-16/32 binary
|
|
66
|
+
input, supported subclasses, key coercion/sorting, callbacks, custom codec
|
|
67
|
+
keywords, error diagnostics and interpreter limits follow stdlib too.
|
|
68
|
+
`dump` preserves streamed writes, including partial output before a later
|
|
69
|
+
encoding or write failure; `load` reads once through the guarded parser.
|
|
70
|
+
- `jsonx.dumpb` now preserves exact compact stdlib float notation across
|
|
71
|
+
backends, which can change serialized bytes. NDJSON and Base64 JSON helpers
|
|
72
|
+
preserve the same numeric values. NDJSON wraps Unicode, integer-limit and
|
|
73
|
+
recursion failures with physical line numbers and honors `skip_errors=True`.
|
|
74
|
+
|
|
75
|
+
### Added
|
|
76
|
+
|
|
77
|
+
- `unstd.yaml`, behind `unstd[yaml]`, provides safe YAML 1.2 native-value
|
|
78
|
+
loading, multi-document streams, and comment-preserving parse/edit/write.
|
|
79
|
+
Duplicate keys and unknown tags are rejected; parser instances and scalar
|
|
80
|
+
semantics are isolated from optional C extensions. The base install keeps
|
|
81
|
+
zero third-party dependencies.
|
|
82
|
+
- `unstd.compress.gzipx`, behind `unstd[compress]`, accelerates gzip file and
|
|
83
|
+
one-shot operations with zlib-ng, with exact stdlib bindings on a base
|
|
84
|
+
install. Streams retain stdlib framing, ownership, modes, seeking and error
|
|
85
|
+
families; one-shot defaults follow the running interpreter. Compressed bytes
|
|
86
|
+
may differ between codecs while recovered content remains identical.
|
|
87
|
+
- NDJSON readers and writers accept a reusable `structs.Codec` through `codec=`.
|
|
88
|
+
Readers decode each row directly into its validated schema, preserving
|
|
89
|
+
physical line numbers and schema paths on errors. `on_error` reports each
|
|
90
|
+
rejected record once before the normal raise or explicit skip. Untyped
|
|
91
|
+
streaming still works on a base install, and typed processing reuses the
|
|
92
|
+
existing serde extra.
|
|
93
|
+
- Base64 exposes stdlib-compatible `b64encode`/`b64decode`, standard and URL-safe
|
|
94
|
+
functions, MIME byte helpers and `encode_file`/`decode_file` stream helpers
|
|
95
|
+
alongside the convenience API. Standard defaults, alternative alphabets,
|
|
96
|
+
buffer handling, exception types and diagnostics follow the running stdlib.
|
|
97
|
+
Acceleration is limited to plain-byte encoding and strict ASCII decoding;
|
|
98
|
+
other cases and native decode failures use stdlib.
|
|
99
|
+
- Eleven executable parser/token fuzz targets use independent oracles,
|
|
100
|
+
authenticated synthetic seed corpora, finite pytest replay, deterministic
|
|
101
|
+
mutations, and isolated Atheris campaigns. Workers preserve exact failures
|
|
102
|
+
and enforce wall/input deadlines, POSIX CPU limits and Linux address-space
|
|
103
|
+
limits. CI runs bounded pull-request campaigns and deeper nightly coverage
|
|
104
|
+
campaigns, retaining reports and generated corpora. Harness canaries verify
|
|
105
|
+
that incorrect results, unexpected exceptions, crashes and exhausted budgets
|
|
106
|
+
fail the run.
|
|
107
|
+
- Recorded chaos campaigns cover mixed filesystem/process histories,
|
|
108
|
+
handshaken writer interruption, stream failures and clock/entropy outages.
|
|
109
|
+
Bounded installed/fallback workers, seed replay, exact fault journals, strict
|
|
110
|
+
completion controls and Linux/macOS pull-request/nightly CI campaigns retain
|
|
111
|
+
recovery evidence. Ordinary correctness discovery stays separate from
|
|
112
|
+
explicit chaos runs.
|
|
113
|
+
- Recorded concurrency campaigns cover atomic filesystem histories, UUID
|
|
114
|
+
contention/fork safety, and shared clone/regex/codec/YAML/map isolation.
|
|
115
|
+
Independent models, broken-result controls, bounded installed/stdlib workers,
|
|
116
|
+
lane-specific replay and Linux/macOS pull-request/nightly jobs retain
|
|
117
|
+
schedules and observations. This explicit lane stays outside default pytest;
|
|
118
|
+
owning defect regressions remain in ordinary validation.
|
|
119
|
+
|
|
120
|
+
### Changed
|
|
121
|
+
|
|
122
|
+
- Native JSON acceleration now requires bounded eligibility proofs. Encoding
|
|
123
|
+
snapshots at most 16 exact builtin values before calling orjson, retaining
|
|
124
|
+
exact whitespace and escaping; other inputs use cached or direct stdlib
|
|
125
|
+
encoders. Decoding verifies the complete backend result and falls back to
|
|
126
|
+
stdlib for every float, including lossy large-integer conversions.
|
|
127
|
+
Hooks/custom codecs bypass speculation; deep or unproven cases and backend
|
|
128
|
+
errors retry the original input with stdlib. Callback isolation, snapshot
|
|
129
|
+
mutation, DEL escaping and near-limit recursion failures have generated
|
|
130
|
+
contracts that also assert real backend use.
|
|
131
|
+
- JSON type annotations accept duck-typed writers and typed `default`
|
|
132
|
+
callbacks. The `numpy=True` conversion extension is consistent across
|
|
133
|
+
backends. With an explicit custom `cls`, `dump`/`dumps` forward all
|
|
134
|
+
constructor keywords unchanged. Differential tests use the running stdlib as
|
|
135
|
+
the authority across Python 3.12–3.14 and optional-backend/base configurations;
|
|
136
|
+
generated cases include large integers, non-finite values, lone surrogates,
|
|
137
|
+
mixed keys, formatting options, binary encodings and malformed input.
|
|
138
|
+
- The test suite follows Billy's Python organization: module-owned contracts
|
|
139
|
+
under `tests/suites/product`, cross-cutting assurance under
|
|
140
|
+
`tests/suites/assurance`, shared support, and standalone tooling. A validated
|
|
141
|
+
inventory distinguishes active coverage from planned lanes and provides
|
|
142
|
+
`python -m tests.tooling list|check|run`. CI checks inventory drift; pytest
|
|
143
|
+
uses strict markers and shared generation profiles. Existing TLS policy tests
|
|
144
|
+
run without the BLAKE3 extra. The coverage plan maps remaining property, fuzz,
|
|
145
|
+
penetration, fault, installation, concurrency, resource and performance work
|
|
146
|
+
without counting scaffolding as implemented tests. Wall-clock benchmark
|
|
147
|
+
calibration assertions use the explicit `perf` marker, outside ordinary
|
|
148
|
+
correctness runs.
|
|
149
|
+
- P0 assurance builds and installs real artifacts in pristine consumers, checks
|
|
150
|
+
independent optional-extra installations, performs real loopback TLS
|
|
151
|
+
handshakes, injects filesystem/process failures, and challenges parser and
|
|
152
|
+
token boundaries with independent controls and bounded workers. Required CI
|
|
153
|
+
execution fails when declared extras are unavailable.
|
|
154
|
+
|
|
155
|
+
### Fixed
|
|
156
|
+
|
|
157
|
+
- Installed-extra checks use locked artifact URLs and hashes for offline
|
|
158
|
+
consumers, including source-built dependencies at declared floors. Crash
|
|
159
|
+
controls allow Python 3.14 diagnostics to finish while retaining the short
|
|
160
|
+
intentional-hang deadline.
|
|
161
|
+
- YAML fuzzing compares scalar `ValueError` exceptions from malformed dates
|
|
162
|
+
with the reference parser, retaining exact error types and messages. The
|
|
163
|
+
discovered invalid-date input is preserved in the authenticated seed corpus.
|
|
164
|
+
- URL convenience Base64 decoding behaves the same with and without pybase64:
|
|
165
|
+
ignored characters no longer interfere with missing-padding repair,
|
|
166
|
+
completed padding preserves stdlib's handling of trailing data, non-ASCII
|
|
167
|
+
text raises stdlib's `ValueError`, and strided decoding buffers work. URL
|
|
168
|
+
decoding no longer emits pybase64's alternate-alphabet warnings. Strict
|
|
169
|
+
validation still accepts nonzero unused pad bits, as stdlib does; it does not
|
|
170
|
+
promise canonical spelling. Independent differential and generated
|
|
171
|
+
malformed-input contracts cover native and fallback paths. The decode
|
|
172
|
+
benchmark compares the same strict validation mode on both paths.
|
|
173
|
+
- Process timeouts must be positive and finite. Filesystem rollback preserves
|
|
174
|
+
scratch-descriptor ownership and the original error, and directory syncing
|
|
175
|
+
remains best effort. Bearer-token envelopes require strict canonical
|
|
176
|
+
Base64url spelling, and non-ASCII MACs are rejected. The general-purpose URL
|
|
177
|
+
Base64 codec retains its documented lenient behavior. Editable YAML supports
|
|
178
|
+
standard `!!str` construction.
|
|
179
|
+
- Native WAV writes select the WAV format for file-like, extensionless and
|
|
180
|
+
misleading-extension outputs in both one-shot and streaming writers, pinned
|
|
181
|
+
by independent audio-extra consumer tests.
|
|
182
|
+
- Confirmed surrogate-region regex and truncated PCM frame findings remain as
|
|
183
|
+
module-owned regressions and corpus entries. Faithful regex recovery is
|
|
184
|
+
selected before exposing lazy match projections; incomplete PCM frames are
|
|
185
|
+
rejected explicitly.
|
|
186
|
+
- `proc.run` kills and reaps its direct child before propagating cancellation,
|
|
187
|
+
including the `KeyboardInterrupt` path where `subprocess.run` could return
|
|
188
|
+
with an unreaped child. Captured output, timeout behavior and callback
|
|
189
|
+
semantics are preserved; real SIGINT regressions cover `run`, `capture` and
|
|
190
|
+
`run_ok`, including recovery.
|
|
191
|
+
- The Python UUIDv7 fallback resets its lock and counter state after POSIX fork
|
|
192
|
+
so a child can generate IDs even when a vanished parent thread held the
|
|
193
|
+
counter lock. The parent's state and selected UUID backend are preserved;
|
|
194
|
+
a bounded ordinary regression and controlled concurrency histories pin the
|
|
195
|
+
deadlock.
|
|
196
|
+
- Concurrent regular-expression cache misses no longer exceed the documented
|
|
197
|
+
512-entry limit when multiple threads select the same oldest entry. Compiles
|
|
198
|
+
publish before trimming and retry lost evictions. A bounded regression forces
|
|
199
|
+
the duplicate-oldest interleaving against native and stdlib backends.
|
|
200
|
+
- Package metadata lookup is deferred until `unstd.__version__` is requested
|
|
201
|
+
and the result is cached. Importing submodules such as
|
|
202
|
+
`unstd.serde.structs` avoids that startup cost while retaining the same native
|
|
203
|
+
codecs, parsing behavior and metadata-derived version, including the
|
|
204
|
+
uninstalled-source fallback.
|
|
205
|
+
|
|
206
|
+
### Performance
|
|
207
|
+
|
|
208
|
+
- Reduce JSON eligibility and compact-encoding overhead, accelerate URL-safe
|
|
209
|
+
Base64 decoding, and improve structural cloning and stdlib array packing.
|
|
210
|
+
The portable Levenshtein fallback evaluates packed dynamic-programming
|
|
211
|
+
columns. Public call signatures, serialized formats and optional dependencies
|
|
212
|
+
for these hot-path optimizations stay the same; parity and regression tests
|
|
213
|
+
cover the optimized boundaries.
|
|
214
|
+
- Reduce serde dispatch and allocation overhead for default JSON encoding,
|
|
215
|
+
small decoded JSON values, integer snapshot proofs, short Base64 decoding
|
|
216
|
+
and NDJSON writer setup. These optimizations preserve public signatures,
|
|
217
|
+
codec policies, output and error semantics. A repeatable complete function
|
|
218
|
+
profile includes output-checked native/fallback benchmarks and explicit API
|
|
219
|
+
comparisons.
|
|
220
|
+
- Reduce duplicate private-attribute traversal when cloning Pydantic models
|
|
221
|
+
and the dataclass conversion entry check. Remove redundant integer
|
|
222
|
+
conversion, branching and bit assembly in the portable UUIDv7 generator.
|
|
223
|
+
Existing APIs, direct stdlib aliases, secure entropy and synchronized counter
|
|
224
|
+
behavior remain. Custom dataclass constructor arguments and msgspec copy
|
|
225
|
+
reducers defer to the stdlib copy protocol. Reproducible per-function
|
|
226
|
+
clone/UUID profiles and paired workload timings include output validation,
|
|
227
|
+
unchanged-signature checks and explicit coverage gaps.
|
|
228
|
+
- JSON benchmarks separately measure fallback records and eligible
|
|
229
|
+
text/integer cases. Python 3.13.14 measured 5.98× text encoding and 1.91×
|
|
230
|
+
integer-array decoding. The old speed floors covered incompatible behavior
|
|
231
|
+
and were reset; no uniform speedup is promised.
|
|
232
|
+
|
|
20
233
|
## [2.1.1] - 2026-10-04
|
|
21
234
|
|
|
22
235
|
### Fixed
|