radixly 0.1.0.dev0__tar.gz → 1.0.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.
- radixly-1.0.0/LICENSE +21 -0
- radixly-1.0.0/MANIFEST.in +15 -0
- radixly-1.0.0/PKG-INFO +139 -0
- radixly-1.0.0/README.md +110 -0
- radixly-1.0.0/pyproject.toml +163 -0
- radixly-1.0.0/src/radixly/__init__.py +34 -0
- {radixly-0.1.0.dev0 → radixly-1.0.0}/src/radixly/_about.py +1 -1
- radixly-1.0.0/src/radixly/_codec.py +110 -0
- radixly-1.0.0/src/radixly/_common/block.c +158 -0
- radixly-1.0.0/src/radixly/_common/block.h +28 -0
- radixly-1.0.0/src/radixly/_common/errors.c +248 -0
- radixly-1.0.0/src/radixly/_common/errors.h +30 -0
- radixly-1.0.0/src/radixly/_common/internal.h +39 -0
- radixly-1.0.0/src/radixly/_core.c +96 -0
- radixly-1.0.0/src/radixly/_core.pyi +30 -0
- radixly-1.0.0/src/radixly/base32768/__init__.py +24 -0
- radixly-1.0.0/src/radixly/base32768/_api.py +107 -0
- radixly-1.0.0/src/radixly/base32768/_tables.h +2387 -0
- radixly-1.0.0/src/radixly/base32768/base32768.c +317 -0
- radixly-1.0.0/src/radixly/base32768/base32768.h +34 -0
- radixly-1.0.0/src/radixly/braille/__init__.py +24 -0
- radixly-1.0.0/src/radixly/braille/_api.py +95 -0
- radixly-1.0.0/src/radixly/braille/braille.c +107 -0
- radixly-1.0.0/src/radixly/braille/braille.h +32 -0
- radixly-1.0.0/src/radixly/hexagram/__init__.py +24 -0
- radixly-1.0.0/src/radixly/hexagram/_api.py +107 -0
- radixly-1.0.0/src/radixly/hexagram/hexagram.c +109 -0
- radixly-1.0.0/src/radixly/hexagram/hexagram.h +32 -0
- radixly-1.0.0/src/radixly/py.typed +0 -0
- radixly-1.0.0/src/radixly/uro14/__init__.py +24 -0
- radixly-1.0.0/src/radixly/uro14/_api.py +112 -0
- radixly-1.0.0/src/radixly/uro14/uro14.c +244 -0
- radixly-1.0.0/src/radixly/uro14/uro14.h +32 -0
- radixly-1.0.0/src/radixly.egg-info/PKG-INFO +139 -0
- radixly-1.0.0/src/radixly.egg-info/SOURCES.txt +608 -0
- radixly-1.0.0/tests/__init__.py +20 -0
- radixly-1.0.0/tests/base32768/__init__.py +20 -0
- radixly-1.0.0/tests/base32768/conftest.py +48 -0
- radixly-1.0.0/tests/base32768/error_cases.py +70 -0
- radixly-1.0.0/tests/base32768/test_api.py +90 -0
- radixly-1.0.0/tests/base32768/test_core.py +260 -0
- radixly-1.0.0/tests/base32768/test_fuzz.py +122 -0
- radixly-1.0.0/tests/base32768/test_reference.py +183 -0
- radixly-1.0.0/tests/bench/__init__.py +20 -0
- radixly-1.0.0/tests/bench/factories.py +76 -0
- radixly-1.0.0/tests/bench/test_baseline.py +118 -0
- radixly-1.0.0/tests/bench/test_ci.py +110 -0
- radixly-1.0.0/tests/bench/test_cli.py +283 -0
- radixly-1.0.0/tests/bench/test_graphs.py +103 -0
- radixly-1.0.0/tests/bench/test_markdown.py +118 -0
- radixly-1.0.0/tests/bench/test_model.py +150 -0
- radixly-1.0.0/tests/bench/test_registry.py +94 -0
- radixly-1.0.0/tests/block/__init__.py +20 -0
- radixly-1.0.0/tests/block/error_cases.py +79 -0
- radixly-1.0.0/tests/block/test_api.py +151 -0
- radixly-1.0.0/tests/block/test_core.py +172 -0
- radixly-1.0.0/tests/block/test_reference.py +111 -0
- radixly-1.0.0/tests/payloads.py +45 -0
- radixly-1.0.0/tests/reference/__init__.py +20 -0
- radixly-1.0.0/tests/reference/base32768.py +152 -0
- radixly-1.0.0/tests/reference/block.py +90 -0
- radixly-1.0.0/tests/reference/braille.py +39 -0
- radixly-1.0.0/tests/reference/errors.py +56 -0
- radixly-1.0.0/tests/reference/hexagram.py +39 -0
- radixly-1.0.0/tests/reference/shared.py +28 -0
- radixly-1.0.0/tests/reference/uro14.py +90 -0
- radixly-1.0.0/tests/test_api.py +78 -0
- radixly-1.0.0/tests/test_import.py +44 -0
- radixly-1.0.0/tests/uro14/__init__.py +20 -0
- radixly-1.0.0/tests/uro14/test_api.py +97 -0
- radixly-1.0.0/tests/uro14/test_core.py +134 -0
- radixly-1.0.0/tests/uro14/test_reference.py +125 -0
- radixly-0.1.0.dev0/LICENSE → radixly-1.0.0/tests/vectors/base32768/LICENSE.txt +1 -1
- radixly-1.0.0/tests/vectors/base32768/README.md +27 -0
- radixly-1.0.0/tests/vectors/base32768/bad/bad-padding.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/bad/bad0.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/bad/not-base32768-char.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/caseDemo.bin +0 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/caseDemo.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/caseEmpty.bin +0 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/caseEmpty.txt +0 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/every-byte.bin +0 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/every-byte.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/every-pair-of-bytes.bin +0 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/every-pair-of-bytes.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/hatetris-wr-rle.bin +0 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/hatetris-wr-rle.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/hatetris-wr-rle2.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/hatetris-wr-rle2.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/hatetris-wr.bin +0 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/hatetris-wr.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/lena_std.tif.bin +0 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/lena_std.tif.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/seven-bit-final.bin +0 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/seven-bit-final.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case0.bin +0 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case0.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case1.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case1.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case10.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case10.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case100.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case100.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case101.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case101.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case102.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case102.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case103.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case103.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case104.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case104.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case105.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case105.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case106.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case106.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case107.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case107.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case108.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case108.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case109.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case109.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case11.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case11.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case110.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case110.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case111.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case111.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case112.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case112.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case113.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case113.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case114.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case114.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case115.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case115.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case116.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case116.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case117.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case117.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case118.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case118.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case119.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case119.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case12.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case12.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case120.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case120.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case121.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case121.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case122.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case122.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case123.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case123.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case124.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case124.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case125.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case125.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case126.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case126.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case127.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case127.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case128.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case128.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case129.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case129.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case13.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case13.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case130.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case130.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case131.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case131.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case132.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case132.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case133.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case133.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case134.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case134.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case135.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case135.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case136.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case136.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case137.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case137.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case138.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case138.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case139.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case139.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case14.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case14.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case140.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case140.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case141.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case141.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case142.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case142.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case143.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case143.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case144.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case144.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case145.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case145.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case146.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case146.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case147.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case147.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case148.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case148.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case149.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case149.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case15.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case15.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case150.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case150.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case151.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case151.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case152.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case152.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case153.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case153.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case154.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case154.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case155.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case155.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case156.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case156.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case157.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case157.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case158.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case158.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case159.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case159.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case16.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case16.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case160.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case160.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case161.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case161.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case162.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case162.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case163.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case163.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case164.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case164.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case165.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case165.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case166.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case166.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case167.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case167.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case168.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case168.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case169.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case169.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case17.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case17.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case170.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case170.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case171.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case171.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case172.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case172.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case173.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case173.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case174.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case174.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case175.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case175.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case176.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case176.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case177.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case177.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case178.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case178.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case179.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case179.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case18.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case18.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case180.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case180.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case181.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case181.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case182.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case182.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case183.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case183.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case184.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case184.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case185.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case185.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case186.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case186.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case187.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case187.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case188.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case188.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case189.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case189.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case19.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case19.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case190.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case190.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case191.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case191.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case192.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case192.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case193.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case193.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case194.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case194.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case195.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case195.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case196.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case196.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case197.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case197.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case198.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case198.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case199.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case199.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case2.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case2.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case20.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case20.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case200.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case200.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case201.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case201.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case202.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case202.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case203.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case203.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case204.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case204.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case205.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case205.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case206.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case206.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case207.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case207.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case208.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case208.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case209.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case209.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case21.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case21.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case210.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case210.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case211.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case211.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case212.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case212.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case213.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case213.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case214.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case214.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case215.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case215.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case216.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case216.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case217.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case217.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case218.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case218.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case219.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case219.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case22.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case22.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case220.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case220.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case221.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case221.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case222.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case222.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case223.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case223.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case224.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case224.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case225.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case225.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case226.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case226.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case227.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case227.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case228.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case228.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case229.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case229.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case23.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case23.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case230.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case230.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case231.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case231.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case232.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case232.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case233.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case233.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case234.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case234.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case235.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case235.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case236.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case236.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case237.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case237.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case238.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case238.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case239.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case239.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case24.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case24.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case240.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case240.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case241.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case241.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case242.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case242.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case243.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case243.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case244.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case244.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case245.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case245.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case246.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case246.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case247.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case247.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case248.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case248.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case249.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case249.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case25.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case25.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case250.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case250.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case251.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case251.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case252.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case252.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case253.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case253.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case254.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case254.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case255.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case255.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case26.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case26.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case27.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case27.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case28.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case28.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case29.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case29.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case3.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case3.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case30.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case30.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case31.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case31.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case32.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case32.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case33.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case33.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case34.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case34.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case35.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case35.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case36.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case36.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case37.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case37.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case38.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case38.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case39.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case39.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case4.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case4.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case40.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case40.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case41.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case41.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case42.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case42.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case43.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case43.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case44.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case44.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case45.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case45.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case46.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case46.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case47.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case47.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case48.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case48.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case49.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case49.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case5.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case5.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case50.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case50.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case51.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case51.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case52.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case52.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case53.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case53.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case54.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case54.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case55.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case55.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case56.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case56.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case57.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case57.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case58.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case58.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case59.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case59.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case6.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case6.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case60.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case60.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case61.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case61.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case62.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case62.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case63.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case63.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case64.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case64.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case65.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case65.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case66.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case66.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case67.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case67.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case68.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case68.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case69.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case69.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case7.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case7.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case70.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case70.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case71.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case71.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case72.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case72.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case73.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case73.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case74.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case74.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case75.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case75.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case76.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case76.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case77.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case77.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case78.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case78.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case79.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case79.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case8.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case8.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case80.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case80.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case81.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case81.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case82.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case82.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case83.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case83.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case84.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case84.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case85.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case85.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case86.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case86.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case87.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case87.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case88.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case88.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case89.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case89.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case9.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case9.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case90.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case90.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case91.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case91.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case92.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case92.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case93.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case93.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case94.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case94.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case95.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case95.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case96.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case96.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case97.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case97.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case98.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case98.txt +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case99.bin +1 -0
- radixly-1.0.0/tests/vectors/base32768/pairs/single-bytes/case99.txt +1 -0
- radixly-0.1.0.dev0/PKG-INFO +0 -17
- radixly-0.1.0.dev0/README.md +0 -1
- radixly-0.1.0.dev0/pyproject.toml +0 -51
- radixly-0.1.0.dev0/src/radixly/__init__.py +0 -7
- radixly-0.1.0.dev0/src/radixly/_core.c +0 -20
- radixly-0.1.0.dev0/src/radixly.egg-info/PKG-INFO +0 -17
- radixly-0.1.0.dev0/src/radixly.egg-info/SOURCES.txt +0 -11
- radixly-0.1.0.dev0/tests/test_import.py +0 -15
- {radixly-0.1.0.dev0 → radixly-1.0.0}/setup.cfg +0 -0
- {radixly-0.1.0.dev0 → radixly-1.0.0}/src/radixly.egg-info/dependency_links.txt +0 -0
- {radixly-0.1.0.dev0 → radixly-1.0.0}/src/radixly.egg-info/top_level.txt +0 -0
radixly-1.0.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026-present rayakame
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Ship the complete test suite in the sdist: the reference oracle and the
|
|
2
|
+
# conformance vectors are what let a from-source builder (distro packager,
|
|
3
|
+
# --no-binary install) actually validate the compiled extension. Without
|
|
4
|
+
# graft, setuptools ships the top-level test files but not reference/ or
|
|
5
|
+
# vectors/, leaving an uncollectable suite.
|
|
6
|
+
graft tests
|
|
7
|
+
# Headers are not auto-collected the way ext-modules .c sources are; without
|
|
8
|
+
# this line an sdist cannot compile.
|
|
9
|
+
recursive-include src/radixly *.h
|
|
10
|
+
# Stubs are source too; py.typed is the PEP 561 marker (both also ship in
|
|
11
|
+
# wheels via package-data — decided M9).
|
|
12
|
+
recursive-include src/radixly *.pyi
|
|
13
|
+
include src/radixly/py.typed
|
|
14
|
+
prune changes
|
|
15
|
+
global-exclude __pycache__ *.py[cod]
|
radixly-1.0.0/PKG-INFO
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: radixly
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Fast binary-to-text codecs for Python: base32768, uro14, braille and hexagram in C
|
|
5
|
+
Author-email: rayakame <github.android206@passmail.net>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://radixly.rayakame.dev
|
|
8
|
+
Project-URL: Documentation, https://radixly.rayakame.dev/en/latest/
|
|
9
|
+
Project-URL: Source, https://github.com/rayakame/radixly
|
|
10
|
+
Project-URL: Issues, https://github.com/rayakame/radixly/issues
|
|
11
|
+
Keywords: base32768,binary-to-text,codec,encoding,unicode,c-extension
|
|
12
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: Operating System :: OS Independent
|
|
15
|
+
Classifier: Programming Language :: C
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
21
|
+
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
22
|
+
Classifier: Topic :: Software Development :: Libraries
|
|
23
|
+
Classifier: Topic :: Text Processing
|
|
24
|
+
Classifier: Typing :: Typed
|
|
25
|
+
Requires-Python: >=3.11
|
|
26
|
+
Description-Content-Type: text/markdown
|
|
27
|
+
License-File: LICENSE
|
|
28
|
+
Dynamic: license-file
|
|
29
|
+
|
|
30
|
+
<p align="center">
|
|
31
|
+
<a href="https://radixly.rayakame.dev/en/latest/">
|
|
32
|
+
<picture>
|
|
33
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/rayakame/radixly/main/docs/_static/logo-wordmark-dark.svg">
|
|
34
|
+
<img src="https://raw.githubusercontent.com/rayakame/radixly/main/docs/_static/logo-wordmark-light.svg" alt="radixly" width="420">
|
|
35
|
+
</picture>
|
|
36
|
+
</a>
|
|
37
|
+
</p>
|
|
38
|
+
|
|
39
|
+
<p align="center">
|
|
40
|
+
<a href="https://pypi.org/project/radixly/"><img src="https://img.shields.io/pypi/v/radixly" alt="PyPI"></a>
|
|
41
|
+
<a href="https://radixly.rayakame.dev/en/latest/"><img src="https://readthedocs.org/projects/radixly/badge/?version=latest" alt="Documentation"></a>
|
|
42
|
+
<a href="https://github.com/rayakame/radixly/actions/workflows/ci.yml"><img src="https://github.com/rayakame/radixly/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
|
|
43
|
+
<a href="https://github.com/rayakame/radixly/actions/workflows/wheels.yml"><img src="https://github.com/rayakame/radixly/actions/workflows/wheels.yml/badge.svg" alt="Wheels"></a>
|
|
44
|
+
<a href="https://pypi.org/project/radixly/"><img src="https://img.shields.io/pypi/pyversions/radixly" alt="Python versions"></a>
|
|
45
|
+
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-green" alt="MIT license"></a>
|
|
46
|
+
</p>
|
|
47
|
+
|
|
48
|
+
Fast binary-to-text codecs for Python. Every codec is a hand-written C
|
|
49
|
+
extension behind one small interface: `encode`, `decode` and the size math to
|
|
50
|
+
plan around a length limit. Decoding is strict, the package has no
|
|
51
|
+
dependencies and ships type stubs.
|
|
52
|
+
|
|
53
|
+
Documentation: <https://radixly.rayakame.dev/en/latest/>
|
|
54
|
+
|
|
55
|
+
## Install
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
pip install radixly
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Releases ship wheels for CPython 3.11 to 3.14 on Linux, macOS and Windows.
|
|
62
|
+
There is no pure-Python fallback; anywhere else pip builds from source and
|
|
63
|
+
needs a C compiler.
|
|
64
|
+
|
|
65
|
+
## Usage
|
|
66
|
+
|
|
67
|
+
```python
|
|
68
|
+
import radixly
|
|
69
|
+
|
|
70
|
+
text = radixly.base32768.encode(b"hello") # str, 3 characters
|
|
71
|
+
radixly.base32768.decode(text) # b'hello'
|
|
72
|
+
|
|
73
|
+
radixly.base32768.max_bytes(100) # 187: largest payload that fits 100 characters
|
|
74
|
+
|
|
75
|
+
try:
|
|
76
|
+
radixly.base32768.decode("hello")
|
|
77
|
+
except radixly.DecodeError as error: # a ValueError with the position
|
|
78
|
+
error.position # 0
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Every codec module has the same four functions; `radixly.get_codec(name)` and
|
|
82
|
+
`radixly.CODECS` pick one at runtime.
|
|
83
|
+
|
|
84
|
+
## Codecs
|
|
85
|
+
|
|
86
|
+
| codec | bits per char | 100 chars hold | alphabet | catches truncation |
|
|
87
|
+
|---|---|---|---|---|
|
|
88
|
+
| [base32768](https://radixly.rayakame.dev/en/latest/codecs/base32768.html) | 15 | 187 bytes | qntm's 32,768 BMP code points | no |
|
|
89
|
+
| [uro14](https://radixly.rayakame.dev/en/latest/codecs/uro14.html) | 14 | 173 bytes | one CJK block, plus a length prefix | below 16,384 bytes |
|
|
90
|
+
| [braille](https://radixly.rayakame.dev/en/latest/codecs/braille.html) | 8 | 100 bytes | 256 Braille patterns | no |
|
|
91
|
+
| [hexagram](https://radixly.rayakame.dev/en/latest/codecs/hexagram.html) | 6 | 75 bytes | 64 Yijing hexagrams | partly |
|
|
92
|
+
|
|
93
|
+
[Choosing a codec](https://radixly.rayakame.dev/en/latest/guides/choosing-a-codec.html) walks through the
|
|
94
|
+
trade-offs.
|
|
95
|
+
|
|
96
|
+
## Performance
|
|
97
|
+
|
|
98
|
+
Generated from the committed record run by the benchmark suite in
|
|
99
|
+
[`benchmarks/`](benchmarks/); no number here is typed by hand. Sizes below
|
|
100
|
+
64 KiB show per-call latency, larger ones sustained throughput; "vs reference"
|
|
101
|
+
is the speedup over the pure-Python oracle in `tests/reference/`.
|
|
102
|
+
|
|
103
|
+
<!-- radixly-bench:begin -->
|
|
104
|
+
*Measured on Intel(R) Core(TM) i9-14900KF (performance governor), CachyOS, kernel 7.2.3-1-cachyos, CPython 3.13.14, gcc 16.2.1 20260810, radixly 0.1.0.dev0 @ cefe701, 2026-09-08T18:59:26+00:00.*
|
|
105
|
+
|
|
106
|
+
| codec | direction | 1 B | 200 B | 64 KiB | 1 MiB | vs reference |
|
|
107
|
+
|---|---|---|---|---|---|---|
|
|
108
|
+
| base32768 | encode | 0.019 μs | 0.114 μs | 1,963 MB/s | 1,963 MB/s | 117x at 200 B |
|
|
109
|
+
| base32768 | decode | 0.014 μs | 0.173 μs | 1,275 MB/s | 1,269 MB/s | 127x at 200 B |
|
|
110
|
+
| braille | encode | 0.019 μs | 0.168 μs | 1,397 MB/s | 1,404 MB/s | 95x at 200 B |
|
|
111
|
+
| braille | decode | 0.016 μs | 0.269 μs | 800 MB/s | 799 MB/s | 77x at 200 B |
|
|
112
|
+
| hexagram | encode | 0.019 μs | 0.201 μs | 1,137 MB/s | 1,126 MB/s | 108x at 200 B |
|
|
113
|
+
| hexagram | decode | 0.016 μs | 0.328 μs | 616 MB/s | 641 MB/s | 84x at 200 B |
|
|
114
|
+
| uro14 | encode | 0.018 μs | 0.118 μs | 2,020 MB/s | 2,007 MB/s | 122x at 200 B |
|
|
115
|
+
| uro14 | decode | 0.015 μs | 0.242 μs | 899 MB/s | 896 MB/s | 91x at 200 B |
|
|
116
|
+
<!-- radixly-bench:end -->
|
|
117
|
+
|
|
118
|
+
<picture>
|
|
119
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/rayakame/radixly/main/benchmarks/charts/throughput.dark.svg">
|
|
120
|
+
<img src="https://raw.githubusercontent.com/rayakame/radixly/main/benchmarks/charts/throughput.svg" alt="Sustained throughput per codec, encode and decode, 1 MiB payloads">
|
|
121
|
+
</picture>
|
|
122
|
+
|
|
123
|
+
<picture>
|
|
124
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/rayakame/radixly/main/benchmarks/charts/latency.dark.svg">
|
|
125
|
+
<img src="https://raw.githubusercontent.com/rayakame/radixly/main/benchmarks/charts/latency.svg" alt="Per-call latency per codec, encode and decode, 200 B payloads">
|
|
126
|
+
</picture>
|
|
127
|
+
|
|
128
|
+
Reproduce with `uv run python -m benchmarks` from the repository root.
|
|
129
|
+
|
|
130
|
+
## Limits
|
|
131
|
+
|
|
132
|
+
- CPython only, 3.11 and later.
|
|
133
|
+
- No subinterpreters: on 3.12+ the import raises `ImportError` inside one.
|
|
134
|
+
Free-threaded builds import but switch the GIL back on. Details in
|
|
135
|
+
[Subinterpreters and threads](https://radixly.rayakame.dev/en/latest/guides/subinterpreters.html).
|
|
136
|
+
|
|
137
|
+
## License
|
|
138
|
+
|
|
139
|
+
MIT, see [LICENSE](LICENSE).
|
radixly-1.0.0/README.md
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<a href="https://radixly.rayakame.dev/en/latest/">
|
|
3
|
+
<picture>
|
|
4
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/rayakame/radixly/main/docs/_static/logo-wordmark-dark.svg">
|
|
5
|
+
<img src="https://raw.githubusercontent.com/rayakame/radixly/main/docs/_static/logo-wordmark-light.svg" alt="radixly" width="420">
|
|
6
|
+
</picture>
|
|
7
|
+
</a>
|
|
8
|
+
</p>
|
|
9
|
+
|
|
10
|
+
<p align="center">
|
|
11
|
+
<a href="https://pypi.org/project/radixly/"><img src="https://img.shields.io/pypi/v/radixly" alt="PyPI"></a>
|
|
12
|
+
<a href="https://radixly.rayakame.dev/en/latest/"><img src="https://readthedocs.org/projects/radixly/badge/?version=latest" alt="Documentation"></a>
|
|
13
|
+
<a href="https://github.com/rayakame/radixly/actions/workflows/ci.yml"><img src="https://github.com/rayakame/radixly/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
|
|
14
|
+
<a href="https://github.com/rayakame/radixly/actions/workflows/wheels.yml"><img src="https://github.com/rayakame/radixly/actions/workflows/wheels.yml/badge.svg" alt="Wheels"></a>
|
|
15
|
+
<a href="https://pypi.org/project/radixly/"><img src="https://img.shields.io/pypi/pyversions/radixly" alt="Python versions"></a>
|
|
16
|
+
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-green" alt="MIT license"></a>
|
|
17
|
+
</p>
|
|
18
|
+
|
|
19
|
+
Fast binary-to-text codecs for Python. Every codec is a hand-written C
|
|
20
|
+
extension behind one small interface: `encode`, `decode` and the size math to
|
|
21
|
+
plan around a length limit. Decoding is strict, the package has no
|
|
22
|
+
dependencies and ships type stubs.
|
|
23
|
+
|
|
24
|
+
Documentation: <https://radixly.rayakame.dev/en/latest/>
|
|
25
|
+
|
|
26
|
+
## Install
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
pip install radixly
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Releases ship wheels for CPython 3.11 to 3.14 on Linux, macOS and Windows.
|
|
33
|
+
There is no pure-Python fallback; anywhere else pip builds from source and
|
|
34
|
+
needs a C compiler.
|
|
35
|
+
|
|
36
|
+
## Usage
|
|
37
|
+
|
|
38
|
+
```python
|
|
39
|
+
import radixly
|
|
40
|
+
|
|
41
|
+
text = radixly.base32768.encode(b"hello") # str, 3 characters
|
|
42
|
+
radixly.base32768.decode(text) # b'hello'
|
|
43
|
+
|
|
44
|
+
radixly.base32768.max_bytes(100) # 187: largest payload that fits 100 characters
|
|
45
|
+
|
|
46
|
+
try:
|
|
47
|
+
radixly.base32768.decode("hello")
|
|
48
|
+
except radixly.DecodeError as error: # a ValueError with the position
|
|
49
|
+
error.position # 0
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Every codec module has the same four functions; `radixly.get_codec(name)` and
|
|
53
|
+
`radixly.CODECS` pick one at runtime.
|
|
54
|
+
|
|
55
|
+
## Codecs
|
|
56
|
+
|
|
57
|
+
| codec | bits per char | 100 chars hold | alphabet | catches truncation |
|
|
58
|
+
|---|---|---|---|---|
|
|
59
|
+
| [base32768](https://radixly.rayakame.dev/en/latest/codecs/base32768.html) | 15 | 187 bytes | qntm's 32,768 BMP code points | no |
|
|
60
|
+
| [uro14](https://radixly.rayakame.dev/en/latest/codecs/uro14.html) | 14 | 173 bytes | one CJK block, plus a length prefix | below 16,384 bytes |
|
|
61
|
+
| [braille](https://radixly.rayakame.dev/en/latest/codecs/braille.html) | 8 | 100 bytes | 256 Braille patterns | no |
|
|
62
|
+
| [hexagram](https://radixly.rayakame.dev/en/latest/codecs/hexagram.html) | 6 | 75 bytes | 64 Yijing hexagrams | partly |
|
|
63
|
+
|
|
64
|
+
[Choosing a codec](https://radixly.rayakame.dev/en/latest/guides/choosing-a-codec.html) walks through the
|
|
65
|
+
trade-offs.
|
|
66
|
+
|
|
67
|
+
## Performance
|
|
68
|
+
|
|
69
|
+
Generated from the committed record run by the benchmark suite in
|
|
70
|
+
[`benchmarks/`](benchmarks/); no number here is typed by hand. Sizes below
|
|
71
|
+
64 KiB show per-call latency, larger ones sustained throughput; "vs reference"
|
|
72
|
+
is the speedup over the pure-Python oracle in `tests/reference/`.
|
|
73
|
+
|
|
74
|
+
<!-- radixly-bench:begin -->
|
|
75
|
+
*Measured on Intel(R) Core(TM) i9-14900KF (performance governor), CachyOS, kernel 7.2.3-1-cachyos, CPython 3.13.14, gcc 16.2.1 20260810, radixly 0.1.0.dev0 @ cefe701, 2026-09-08T18:59:26+00:00.*
|
|
76
|
+
|
|
77
|
+
| codec | direction | 1 B | 200 B | 64 KiB | 1 MiB | vs reference |
|
|
78
|
+
|---|---|---|---|---|---|---|
|
|
79
|
+
| base32768 | encode | 0.019 μs | 0.114 μs | 1,963 MB/s | 1,963 MB/s | 117x at 200 B |
|
|
80
|
+
| base32768 | decode | 0.014 μs | 0.173 μs | 1,275 MB/s | 1,269 MB/s | 127x at 200 B |
|
|
81
|
+
| braille | encode | 0.019 μs | 0.168 μs | 1,397 MB/s | 1,404 MB/s | 95x at 200 B |
|
|
82
|
+
| braille | decode | 0.016 μs | 0.269 μs | 800 MB/s | 799 MB/s | 77x at 200 B |
|
|
83
|
+
| hexagram | encode | 0.019 μs | 0.201 μs | 1,137 MB/s | 1,126 MB/s | 108x at 200 B |
|
|
84
|
+
| hexagram | decode | 0.016 μs | 0.328 μs | 616 MB/s | 641 MB/s | 84x at 200 B |
|
|
85
|
+
| uro14 | encode | 0.018 μs | 0.118 μs | 2,020 MB/s | 2,007 MB/s | 122x at 200 B |
|
|
86
|
+
| uro14 | decode | 0.015 μs | 0.242 μs | 899 MB/s | 896 MB/s | 91x at 200 B |
|
|
87
|
+
<!-- radixly-bench:end -->
|
|
88
|
+
|
|
89
|
+
<picture>
|
|
90
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/rayakame/radixly/main/benchmarks/charts/throughput.dark.svg">
|
|
91
|
+
<img src="https://raw.githubusercontent.com/rayakame/radixly/main/benchmarks/charts/throughput.svg" alt="Sustained throughput per codec, encode and decode, 1 MiB payloads">
|
|
92
|
+
</picture>
|
|
93
|
+
|
|
94
|
+
<picture>
|
|
95
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/rayakame/radixly/main/benchmarks/charts/latency.dark.svg">
|
|
96
|
+
<img src="https://raw.githubusercontent.com/rayakame/radixly/main/benchmarks/charts/latency.svg" alt="Per-call latency per codec, encode and decode, 200 B payloads">
|
|
97
|
+
</picture>
|
|
98
|
+
|
|
99
|
+
Reproduce with `uv run python -m benchmarks` from the repository root.
|
|
100
|
+
|
|
101
|
+
## Limits
|
|
102
|
+
|
|
103
|
+
- CPython only, 3.11 and later.
|
|
104
|
+
- No subinterpreters: on 3.12+ the import raises `ImportError` inside one.
|
|
105
|
+
Free-threaded builds import but switch the GIL back on. Details in
|
|
106
|
+
[Subinterpreters and threads](https://radixly.rayakame.dev/en/latest/guides/subinterpreters.html).
|
|
107
|
+
|
|
108
|
+
## License
|
|
109
|
+
|
|
110
|
+
MIT, see [LICENSE](LICENSE).
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "radixly"
|
|
3
|
+
dynamic = ["version"]
|
|
4
|
+
description = "Fast binary-to-text codecs for Python: base32768, uro14, braille and hexagram in C"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
authors = [
|
|
7
|
+
{ name = "rayakame", email = "github.android206@passmail.net" }
|
|
8
|
+
]
|
|
9
|
+
requires-python = ">=3.11"
|
|
10
|
+
dependencies = []
|
|
11
|
+
license = "MIT"
|
|
12
|
+
license-files = ["LICENSE"]
|
|
13
|
+
keywords = ["base32768", "binary-to-text", "codec", "encoding", "unicode", "c-extension"]
|
|
14
|
+
classifiers = [
|
|
15
|
+
"Development Status :: 5 - Production/Stable",
|
|
16
|
+
"Intended Audience :: Developers",
|
|
17
|
+
"Operating System :: OS Independent",
|
|
18
|
+
"Programming Language :: C",
|
|
19
|
+
"Programming Language :: Python :: 3",
|
|
20
|
+
"Programming Language :: Python :: 3.11",
|
|
21
|
+
"Programming Language :: Python :: 3.12",
|
|
22
|
+
"Programming Language :: Python :: 3.13",
|
|
23
|
+
"Programming Language :: Python :: 3.14",
|
|
24
|
+
"Programming Language :: Python :: Implementation :: CPython",
|
|
25
|
+
"Topic :: Software Development :: Libraries",
|
|
26
|
+
"Topic :: Text Processing",
|
|
27
|
+
"Typing :: Typed",
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
[project.urls]
|
|
31
|
+
Homepage = "https://radixly.rayakame.dev"
|
|
32
|
+
Documentation = "https://radixly.rayakame.dev/en/latest/"
|
|
33
|
+
Source = "https://github.com/rayakame/radixly"
|
|
34
|
+
Issues = "https://github.com/rayakame/radixly/issues"
|
|
35
|
+
|
|
36
|
+
[build-system]
|
|
37
|
+
requires = ["setuptools >= 77.0.3"]
|
|
38
|
+
build-backend = "setuptools.build_meta"
|
|
39
|
+
|
|
40
|
+
[dependency-groups]
|
|
41
|
+
dev = [
|
|
42
|
+
{ include-group = "bench" },
|
|
43
|
+
{ include-group = "clang" },
|
|
44
|
+
{ include-group = "docs" },
|
|
45
|
+
{ include-group = "nox" },
|
|
46
|
+
{ include-group = "pyright" },
|
|
47
|
+
{ include-group = "pytest" },
|
|
48
|
+
{ include-group = "ruff" },
|
|
49
|
+
]
|
|
50
|
+
bench = [
|
|
51
|
+
"matplotlib>=3.10",
|
|
52
|
+
]
|
|
53
|
+
clang = [
|
|
54
|
+
"clang-format>=19",
|
|
55
|
+
"clang-tidy>=19",
|
|
56
|
+
]
|
|
57
|
+
release = [
|
|
58
|
+
"towncrier>=24.8",
|
|
59
|
+
]
|
|
60
|
+
docs = [
|
|
61
|
+
"sphinx>=9.0",
|
|
62
|
+
"furo>=2025.12",
|
|
63
|
+
"myst-parser>=5.0",
|
|
64
|
+
"sphinx-design>=0.7",
|
|
65
|
+
"sphinx-copybutton>=0.5",
|
|
66
|
+
"sphinx-autodoc-typehints>=3.0",
|
|
67
|
+
"sphinx-autobuild>=2024.10",
|
|
68
|
+
]
|
|
69
|
+
nox = [
|
|
70
|
+
"nox>=2026.8.17",
|
|
71
|
+
]
|
|
72
|
+
pytest = [
|
|
73
|
+
"pytest>=9.1.1",
|
|
74
|
+
"hypothesis>=6.100",
|
|
75
|
+
]
|
|
76
|
+
ruff = [
|
|
77
|
+
"ruff>=0.16.3",
|
|
78
|
+
]
|
|
79
|
+
pyright = [
|
|
80
|
+
"basedpyright>=1.39.10",
|
|
81
|
+
]
|
|
82
|
+
|
|
83
|
+
[tool.basedpyright]
|
|
84
|
+
typeCheckingMode = "recommended"
|
|
85
|
+
include = ["noxfile.py", "src", "tests", "scripts", "benchmarks"]
|
|
86
|
+
# Resolve radixly from src/ so the checker sees the working tree, not the
|
|
87
|
+
# installed copy; consumers get types via py.typed + the verifytypes gate.
|
|
88
|
+
extraPaths = ["src"]
|
|
89
|
+
executionEnvironments = [
|
|
90
|
+
{ root = "tests", extraPaths = [".", "src"], pythonVersion = "3.11" },
|
|
91
|
+
{ root = "src", pythonVersion = "3.11" },
|
|
92
|
+
{ root = "scripts", pythonVersion = "3.14" },
|
|
93
|
+
{ root = "benchmarks", extraPaths = [".", "src"], pythonVersion = "3.11" },
|
|
94
|
+
]
|
|
95
|
+
|
|
96
|
+
reportUnusedCallResult = "none" # every nox.session() triggers this
|
|
97
|
+
|
|
98
|
+
[tool.towncrier]
|
|
99
|
+
package = "radixly"
|
|
100
|
+
directory = "changes"
|
|
101
|
+
filename = "CHANGELOG.md"
|
|
102
|
+
start_string = "<!-- towncrier release notes start -->\n"
|
|
103
|
+
title_format = "## {version} ({project_date})"
|
|
104
|
+
issue_format = "[#{issue}](https://github.com/rayakame/radixly/pull/{issue})"
|
|
105
|
+
underlines = ["", "", ""]
|
|
106
|
+
ignore = ["README.md"]
|
|
107
|
+
|
|
108
|
+
[[tool.towncrier.type]]
|
|
109
|
+
directory = "feature"
|
|
110
|
+
name = "Added"
|
|
111
|
+
showcontent = true
|
|
112
|
+
|
|
113
|
+
[[tool.towncrier.type]]
|
|
114
|
+
directory = "bugfix"
|
|
115
|
+
name = "Fixed"
|
|
116
|
+
showcontent = true
|
|
117
|
+
|
|
118
|
+
[[tool.towncrier.type]]
|
|
119
|
+
directory = "removal"
|
|
120
|
+
name = "Removed"
|
|
121
|
+
showcontent = true
|
|
122
|
+
|
|
123
|
+
[[tool.towncrier.type]]
|
|
124
|
+
directory = "doc"
|
|
125
|
+
name = "Documentation"
|
|
126
|
+
showcontent = true
|
|
127
|
+
|
|
128
|
+
[[tool.towncrier.type]]
|
|
129
|
+
directory = "misc"
|
|
130
|
+
name = "Other"
|
|
131
|
+
showcontent = true
|
|
132
|
+
|
|
133
|
+
[tool.setuptools.dynamic]
|
|
134
|
+
version = { attr = "radixly._about.__version__" }
|
|
135
|
+
|
|
136
|
+
[tool.setuptools]
|
|
137
|
+
ext-modules = [
|
|
138
|
+
{name = "radixly._core", sources=["src/radixly/_core.c", "src/radixly/base32768/base32768.c", "src/radixly/braille/braille.c", "src/radixly/hexagram/hexagram.c", "src/radixly/uro14/uro14.c", "src/radixly/_common/block.c", "src/radixly/_common/errors.c"], include-dirs=["src/radixly"], extra-compile-args=["-std=c11"]}
|
|
139
|
+
]
|
|
140
|
+
|
|
141
|
+
# Keep C sources and headers out of binary wheels for every (sub)package;
|
|
142
|
+
# sdists still ship them (ext-modules sources + MANIFEST.in headers).
|
|
143
|
+
[tool.setuptools.exclude-package-data]
|
|
144
|
+
"*" = ["*.c", "*.h"]
|
|
145
|
+
|
|
146
|
+
# PEP 561: the marker and the _core stub must ride the wheel, or installed
|
|
147
|
+
# consumers see an untyped package no matter how typed the source is.
|
|
148
|
+
[tool.setuptools.package-data]
|
|
149
|
+
radixly = ["py.typed", "*.pyi"]
|
|
150
|
+
|
|
151
|
+
# CPython-only (C-API internals), no free-threading (static globals).
|
|
152
|
+
# Warning flags (-Wall/-Wextra) are dev-only: MSVC rejects them, and the
|
|
153
|
+
# Linux CI matrix already enforces them. 64-bit only; no win32.
|
|
154
|
+
[tool.cibuildwheel]
|
|
155
|
+
build = "cp311-* cp312-* cp313-* cp314-*"
|
|
156
|
+
skip = "*t-* *-win32 *_i686"
|
|
157
|
+
build-verbosity = 1
|
|
158
|
+
test-requires = ["pytest>=9.1.1", "hypothesis>=6.100"]
|
|
159
|
+
# No `cd`: Windows cmd does not switch drives without /d.
|
|
160
|
+
test-command = "python -m pytest {project}/tests --ignore={project}/tests/bench -q"
|
|
161
|
+
|
|
162
|
+
[tool.pytest.ini_options]
|
|
163
|
+
testpaths = ["tests"]
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Copyright (c) 2026-present rayakame
|
|
2
|
+
#
|
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
4
|
+
# of this software and associated documentation files (the "Software"), to deal
|
|
5
|
+
# in the Software without restriction, including without limitation the rights
|
|
6
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
7
|
+
# copies of the Software, and to permit persons to whom the Software is
|
|
8
|
+
# furnished to do so, subject to the following conditions:
|
|
9
|
+
#
|
|
10
|
+
# The above copyright notice and this permission notice shall be included in all
|
|
11
|
+
# copies or substantial portions of the Software.
|
|
12
|
+
#
|
|
13
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
14
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
15
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
16
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
17
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
18
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
19
|
+
# SOFTWARE.
|
|
20
|
+
"""Fast binary-to-text codecs."""
|
|
21
|
+
|
|
22
|
+
from __future__ import annotations
|
|
23
|
+
|
|
24
|
+
from radixly import base32768 as base32768
|
|
25
|
+
from radixly import braille as braille
|
|
26
|
+
from radixly import hexagram as hexagram
|
|
27
|
+
from radixly import uro14 as uro14
|
|
28
|
+
from radixly._about import __author__ as __author__
|
|
29
|
+
from radixly._about import __copyright__ as __copyright__
|
|
30
|
+
from radixly._about import __license__ as __license__
|
|
31
|
+
from radixly._about import __url__ as __url__
|
|
32
|
+
from radixly._about import __version__ as __version__
|
|
33
|
+
from radixly._codec import *
|
|
34
|
+
from radixly._core import DecodeError as DecodeError
|
|
@@ -24,5 +24,5 @@ import typing
|
|
|
24
24
|
__author__: typing.Final[str] = "rayakame"
|
|
25
25
|
__copyright__: typing.Final[str] = "2026-present, Rayakame"
|
|
26
26
|
__url__: typing.Final[str] = "https://github.com/rayakame/radixly"
|
|
27
|
-
__version__: typing.Final[str] = "
|
|
27
|
+
__version__: typing.Final[str] = "1.0.0"
|
|
28
28
|
__license__: typing.Final[str] = "MIT"
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# Copyright (c) 2026-present rayakame
|
|
2
|
+
#
|
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
4
|
+
# of this software and associated documentation files (the "Software"), to deal
|
|
5
|
+
# in the Software without restriction, including without limitation the rights
|
|
6
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
7
|
+
# copies of the Software, and to permit persons to whom the Software is
|
|
8
|
+
# furnished to do so, subject to the following conditions:
|
|
9
|
+
#
|
|
10
|
+
# The above copyright notice and this permission notice shall be included in all
|
|
11
|
+
# copies or substantial portions of the Software.
|
|
12
|
+
#
|
|
13
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
14
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
15
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
16
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
17
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
18
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
19
|
+
# SOFTWARE.
|
|
20
|
+
"""The Codec value type and the name registry shared by every codec."""
|
|
21
|
+
|
|
22
|
+
from __future__ import annotations
|
|
23
|
+
|
|
24
|
+
import dataclasses
|
|
25
|
+
import types
|
|
26
|
+
import typing
|
|
27
|
+
|
|
28
|
+
if typing.TYPE_CHECKING:
|
|
29
|
+
import collections.abc
|
|
30
|
+
|
|
31
|
+
from _typeshed import ReadableBuffer
|
|
32
|
+
|
|
33
|
+
__all__ = ("CODECS", "Codec", "get_codec", "register")
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@dataclasses.dataclass(frozen=True, slots=True)
|
|
37
|
+
class Codec:
|
|
38
|
+
"""One codec as a value: the C functions bound as attributes, plus its numbers.
|
|
39
|
+
|
|
40
|
+
codec.encode(data) is one attribute load and the C call, no Python frame.
|
|
41
|
+
|
|
42
|
+
Attributes
|
|
43
|
+
----------
|
|
44
|
+
name
|
|
45
|
+
The registry key, e.g. ``"base32768"``.
|
|
46
|
+
bits_per_char
|
|
47
|
+
Payload bits per output character.
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
name: str
|
|
51
|
+
bits_per_char: int
|
|
52
|
+
encode: collections.abc.Callable[[ReadableBuffer], str]
|
|
53
|
+
decode: collections.abc.Callable[[str], bytes]
|
|
54
|
+
encoded_len: collections.abc.Callable[[int], int]
|
|
55
|
+
max_bytes: collections.abc.Callable[[int], int]
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
_registry: dict[str, Codec] = {}
|
|
59
|
+
CODECS = types.MappingProxyType(_registry)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def register(codec: Codec) -> None:
|
|
63
|
+
"""Add ``codec`` under its name; a taken name is refused.
|
|
64
|
+
|
|
65
|
+
Parameters
|
|
66
|
+
----------
|
|
67
|
+
codec
|
|
68
|
+
The codec to register.
|
|
69
|
+
|
|
70
|
+
Raises
|
|
71
|
+
------
|
|
72
|
+
ValueError
|
|
73
|
+
If the name is already registered.
|
|
74
|
+
"""
|
|
75
|
+
if codec.name in _registry:
|
|
76
|
+
msg = f"codec {codec.name!r} is already registered"
|
|
77
|
+
raise ValueError(msg)
|
|
78
|
+
|
|
79
|
+
_registry[codec.name] = codec
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def get_codec(name: str) -> Codec:
|
|
83
|
+
"""Look up a registered codec by name.
|
|
84
|
+
|
|
85
|
+
Parameters
|
|
86
|
+
----------
|
|
87
|
+
name
|
|
88
|
+
The registry key.
|
|
89
|
+
|
|
90
|
+
Returns
|
|
91
|
+
-------
|
|
92
|
+
Codec
|
|
93
|
+
The registered codec.
|
|
94
|
+
|
|
95
|
+
Raises
|
|
96
|
+
------
|
|
97
|
+
KeyError
|
|
98
|
+
Unknown name; the message lists what is registered.
|
|
99
|
+
|
|
100
|
+
Examples
|
|
101
|
+
--------
|
|
102
|
+
>>> import radixly
|
|
103
|
+
>>> radixly.get_codec("uro14").bits_per_char
|
|
104
|
+
14
|
|
105
|
+
"""
|
|
106
|
+
codec = _registry.get(name)
|
|
107
|
+
if codec is None:
|
|
108
|
+
msg = f"unknown codec {name!r}; registered: {', '.join(sorted(_registry))}"
|
|
109
|
+
raise KeyError(msg)
|
|
110
|
+
return codec
|