Skip to main content

Boundary-aware fuzzy keyword matching with pluggable conflict resolution

Project description

TurboText

TurboText

Lightning-fast, boundary-aware keyword matching for Python
Exact · Fuzzy · Multi-word · Unicode · Pluggable conflict resolution

PyPI Python License CI Typed Cython


TurboText finds keywords in text the way a human editor would — enforcing real word boundaries, tolerating typos, handling multi-word phrases, and letting you declare which match wins when keywords overlap, including an optimal (not just greedy) weighted resolver that no other keyword library provides.


Table of Contents


Why TurboText?

re FlashText RapidFuzz TurboText
Exact keyword extraction
Fuzzy / typo-tolerant
Word boundary enforcement
Extracts spans from running text
Multi-word phrases (native) ⚠️
O(text) scaling with vocab
Per-keyword metadata
Conflict resolution policies
Optimal weighted resolution

Features

  • Exact matching — trie-based O(n) scan, constant in vocabulary size
  • Fuzzy matching — Levenshtein distance up to k via bounded-edit frontier search
  • Word boundary enforcement — Unicode-correct; matches cat but not cats, scat, or concatenate
  • Multi-word keywords"new york", "product manager" work out of the box
  • Bulk loading — accepts list, dict[str, str], or dict[str, list[str]]
  • Five conflict policiesALL_OVERLAPS, LEFTMOST_LONGEST, LEFTMOST_FIRST, HIGHEST_PRIORITY, OPTIMAL_WEIGHTED
  • Optimal resolution — O(n log n) weighted interval scheduling DP — picks the globally best non-overlapping set
  • Rich match objects — canonical form, offsets, edit distance, category, priority, custom metadata
  • Cython fast-path — compiled extension ships with every wheel; 1.4× faster than FlashText on 1 M-word corpora

Installation

pip install turbotext

The Cython extension is built automatically when installing from PyPI (wheels are pre-compiled for CPython 3.10–3.13 on Linux, macOS, and Windows). No extra steps needed.

TurboText falls back to pure Python automatically if the compiled extension is unavailable (e.g. unsupported platform or source install without a C compiler).

Install with uv (development)
git clone https://github.com/nishankmahore/TurboText
cd TurboText
uv sync --group dev
python setup.py build_ext --inplace

Quick Start

from turbotext import KeywordStore, MatchPolicy, FuzzyConfig

store = KeywordStore(
    policy=MatchPolicy.LEFTMOST_LONGEST,
    fuzzy=FuzzyConfig(max_edit_distance=1),
)

store.add_keywords({
    "aspirin":   ["aspirin", "asprin", "aspirin tablet"],
    "ibuprofen": ["ibuprofen", "ibuprofen tablet"],
})

text = "Patient takes asprin and ibuprofen tablet daily"

for m in store.extract(text):
    print(f"{m.canonical:12}  ed={m.edit_distance}  [{m.start}:{m.end}]  '{m.text}'")
# aspirin       ed=1  [14:20]  'asprin'
# ibuprofen     ed=0  [25:42]  'ibuprofen tablet'

print(store.replace(text))
# Patient takes aspirin and ibuprofen daily

Adding Keywords

Single keyword

store = KeywordStore()

# minimal — surface form becomes the canonical
store.add_keyword("aspirin")

# with canonical form
store.add_keyword("aspirin", canonical="Aspirin")

# with full metadata
kid = store.add_keyword(
    "aspirin",
    canonical="Aspirin",
    category="DRUG",
    priority=10.0,
    rxnorm_code="1191",   # any extra kwargs become metadata
    source="rxnorm",
)
print(kid)  # "3f4a2b1c-..."  UUID — useful for tracking

From a list

store.add_keywords(["java", "python", "rust"])
# surface form = canonical for each entry

From a {surface: canonical} dict

store.add_keywords({
    "py":   "Python",
    "js":   "JavaScript",
    "k8s":  "Kubernetes",
})

From a {canonical: [surfaces]} dict (most common bulk shape)

keyword_dict = {
    "java":               ["java", "java_2e", "java programing"],
    "product management": ["PM", "product manager", "prod mgmt"],
    "machine learning":   ["ML", "machine learning", "deep learning"],
}
store.add_keywords(keyword_dict)

Mixed dict

String values follow {surface: canonical}; list values follow {canonical: [surfaces]}.

store.add_keywords({
    "java": ["java_2e", "java programing"],  # canonical → [surfaces]
    "py":   "Python",                         # surface   → canonical
})

Shared category and priority

store.add_keywords(
    {
        "aspirin":   ["aspirin", "asprin"],
        "ibuprofen": ["ibuprofen", "advil"],
    },
    category="DRUG",
    priority=5.0,
)

Extracting Matches

matches = store.extract("take aspirin and ibuprofen daily")

for m in matches:
    print(m.text)           # surface text found in the input
    print(m.canonical)      # normalised keyword name
    print(m.start, m.end)   # character offsets — text[m.start:m.end]
    print(m.edit_distance)  # 0 = exact, 1 = one typo, etc.
    print(m.category)       # "DRUG"
    print(m.priority)       # 10.0
    print(m.keyword_id)     # UUID string
    print(m.metadata)       # {"rxnorm_code": "1191", ...}

Match uses __slots__ for fast bulk creation — all fields are fixed and the object is lightweight.


Replacing Keywords

store = KeywordStore()
store.add_keywords({
    "aspirin":       "Aspirin",
    "tylenol":       "Acetaminophen",   # alias → same canonical
    "ibuprofen":     "Ibuprofen",
})

print(store.replace("take aspirin or tylenol twice daily"))
# take Aspirin or Acetaminophen twice daily

Fuzzy Matching

from turbotext import FuzzyConfig

store = KeywordStore(fuzzy=FuzzyConfig(max_edit_distance=1))
store.add_keyword("aspirin")

store.extract("take asprin")    # substitution  i → r  ✅
store.extract("take aspirn")    # deletion      missing i  ✅
store.extract("take aspirrin")  # insertion     extra r  ✅

Boundary enforcement still applies

store.extract("I see cbt")   # ✅ whole word
store.extract("I see xcbt")  # ❌ left boundary fails
store.extract("I see cbts")  # ❌ right boundary fails

Choosing max_edit_distance

Value Use case
0 Exact matching only (default) — uses Cython fast-path when available
1 Single-character typos — medical terms, product names
2 Two-character errors — longer technical terms

Higher values increase recall but also false positives. Start with 1 and tune.


Conflict Resolution Policies

When keywords overlap, the policy decides which match to keep.

ALL_OVERLAPS — return everything, you decide
store = KeywordStore(policy=MatchPolicy.ALL_OVERLAPS)
store.add_keywords(["new", "new york", "york"])

store.extract("new york")
# → ["new", "new york", "york"]
LEFTMOST_LONGEST (default) — FlashText-compatible greedy
store = KeywordStore(policy=MatchPolicy.LEFTMOST_LONGEST)
store.add_keywords(["new", "new york"])

store.extract("new york")
# → ["new york"]   longest match wins
LEFTMOST_FIRST — earliest start wins
store = KeywordStore(policy=MatchPolicy.LEFTMOST_FIRST)
store.add_keywords(["new", "new york"])

store.extract("new york")
# → ["new"]   first token wins
HIGHEST_PRIORITY — priority-based greedy
store = KeywordStore(policy=MatchPolicy.HIGHEST_PRIORITY)
store.add_keyword("new york", canonical="New York", priority=2.0)
store.add_keyword("york",     canonical="York",     priority=5.0)
store.add_keyword("new",      canonical="New",      priority=1.0)

store.extract("new york")
# → ["New", "York"]   priority 5 beats priority 2; "new" doesn't overlap "york"
OPTIMAL_WEIGHTED — globally optimal, not greedy
store = KeywordStore(policy=MatchPolicy.OPTIMAL_WEIGHTED)
store.add_keyword("ab cd", canonical="LONG",   priority=5.0)
store.add_keyword("ab",    canonical="SHORT1", priority=3.0)
store.add_keyword("cd",    canonical="SHORT2", priority=3.0)

store.extract("ab cd")
# Greedy picks "LONG" (5).  Optimal picks "SHORT1"+"SHORT2" (3+3=6).
# → ["SHORT1", "SHORT2"]

Per-Keyword Metadata

store.add_keyword(
    "aspirin",
    canonical="Aspirin",
    category="DRUG",
    priority=10.0,
    rxnorm_code="1191",
    source="rxnorm",
    approved=True,
)

m = store.extract("take aspirin")[0]
print(m.canonical)               # "Aspirin"
print(m.category)                # "DRUG"
print(m.priority)                # 10.0
print(m.metadata["rxnorm_code"]) # "1191"

Match.metadata is a shallow copy — mutating it does not affect the stored keyword.


Word Boundary Rules

TurboText uses Unicode word boundaries — word characters are [a-zA-Z0-9_] and their Unicode equivalents.

store.add_keyword("cat")

# ✅ Accepted
store.extract("cat")          # text edge
store.extract("the cat sat")  # spaces
store.extract("(cat)")        # punctuation
store.extract("cat, sat")     # comma

# ❌ Rejected
store.extract("cats")         # right boundary fails
store.extract("scat")         # left boundary fails
store.extract("cat2")         # digit is a word char
store.extract("concatenate")  # substring

Performance

Apple M-series · best-of-3 runs · Cython extension enabled

1 M-word throughput (1,000 keywords, 7.8 MB corpus)

TurboText's Aho-Corasick engine with inline lowercasing and zero-copy resolve beats FlashText on large documents.

1M throughput

Library Time (s) Matches vs FlashText
TurboText (k=0) 0.61 ~500,000 1.4× faster
FlashText 0.85 ~500,000 baseline

Exact matching — vocabulary scaling (k=0)

Both TurboText and FlashText are O(text) — scan time is flat as vocabulary grows. re alternation degrades linearly with term count.

k=0 scaling

Library 100 terms 1,000 terms 5,000 terms 20,000 terms Complexity
TurboText 1.4 ms 1.6 ms 2.0 ms 2.9 ms O(text)
FlashText 2.9 ms 3.1 ms 3.6 ms 3.3 ms O(text)
re 4.8 ms 40.3 ms 213.5 ms 834.8 ms O(text × vocab)

Fuzzy matching — vocabulary scaling (k=1)

TurboText does a single-pass trie scan regardless of vocabulary size. RapidFuzz and FuzzyWuzzy tokenise then score every token against every keyword — O(tokens × vocab).

k=1 scaling

Library 100 terms 500 terms 1,000 terms 2,000 terms 5,000 terms Boundary-aware Extracts spans
TurboText 93 ms 141 ms 172 ms 209 ms 237 ms
RapidFuzz 13 ms 63 ms 122 ms 257 ms 607 ms
FuzzyWuzzy 222 ms 1,109 ms 2,208 ms 4,423 ms 10,924 ms

TurboText overtakes RapidFuzz at ~2,000 keywords and is 2.6× faster at 5,000 terms. Unlike RapidFuzz (a string scorer used with process.extractOne per token), TurboText returns character offsets, enforces word boundaries, and handles multi-word phrases natively.


API Reference

KeywordStore(policy, fuzzy)
store = KeywordStore(
    policy=MatchPolicy.LEFTMOST_LONGEST,    # default
    fuzzy=FuzzyConfig(max_edit_distance=0), # default — exact only
)
Parameter Type Default Description
policy MatchPolicy LEFTMOST_LONGEST Conflict-resolution strategy
fuzzy FuzzyConfig | None None Fuzzy config; None = exact only
add_keyword(surface_form, *, canonical, category, priority, **metadata) → str
kid = store.add_keyword(
    "aspirin",
    canonical="Aspirin",
    category="DRUG",
    priority=10.0,
    rxnorm_code="1191",
)
Parameter Type Default Description
surface_form str required Text to search for
canonical str surface_form Normalised name returned on match
category str | None None Grouping label
priority float 1.0 Weight for priority-based policies
**metadata Any Arbitrary extra fields

Returns the keyword's UUID string.

add_keywords(keywords, *, category, priority) → list[str]
Shape Example
list[str] ["java", "python"]
dict[str, str] {"py": "Python"} — surface → canonical
dict[str, list[str]] {"Python": ["py", "python3"]} — canonical → surfaces

category and priority apply to every keyword in the call.

extract(text) → list[Match]

Returns resolved matches in span order.

matches = store.extract("Patient takes aspirin daily")
replace(text) → str

Replaces every matched span with its canonical form.

result = store.replace("take aspirin or tylenol")
Match fields

Match uses __slots__ — all fields are set at construction and the object is lightweight.

Field Type Description
text str Matched surface text as it appears in the input
canonical str Normalised form from add_keyword
start int Start character offset
end int End character offset (exclusive)
edit_distance int Levenshtein distance (0 = exact)
category str | None User-supplied category
priority float User-supplied priority
keyword_id str UUID from add_keyword
metadata dict Copy of extra kwargs
FuzzyConfig and MatchPolicy
FuzzyConfig(max_edit_distance=1)  # int, default 0
MatchPolicy Description
ALL_OVERLAPS Return every match
LEFTMOST_LONGEST Greedy — leftmost, then longest
LEFTMOST_FIRST Greedy — leftmost, then insertion order
HIGHEST_PRIORITY Greedy — highest priority wins cluster
OPTIMAL_WEIGHTED Exact — maximise total priority globally

Development

uv sync --group dev                        # install dependencies
python setup.py build_ext --inplace        # build Cython extension
uv run pytest                              # run tests
uv run ruff check src tests                # lint
uv run mypy src/turbotext                  # type-check
uv run pytest benches/ --benchmark-only    # throughput benchmarks
uv run python benches/bench_1m_words.py    # 1 M-word TurboText vs FlashText
uv run python benches/scaling_benchmark.py # regenerate scaling charts
Project layout
src/turbotext/
    __init__.py       public API exports
    trie.py           TrieNode + TrieBuilder
    frontier.py       bounded-edit frontier search (pure Python)
    _fast.pyx         Cython hot-path for exact search (k=0)
    _fast.pyi         type stub for the Cython extension
    resolve.py        conflict-resolution policies
    store.py          KeywordStore public class
reference/
    reference_matcher.py    brute-force oracle for differential testing
tests/
    test_m0_smoke.py                   API surface + add_keywords shapes
    test_m1_exact.py                   exact matching + boundary rules
    test_m2_metadata_priorities.py     metadata, HIGHEST_PRIORITY, OPTIMAL_WEIGHTED
    test_m3_fuzzy.py                   fuzzy matching + hypothesis property tests
benches/
    bench_m3.py             pytest-benchmark: k=0 vs k=1 throughput
    bench_comparison.py     pytest-benchmark: TurboText vs FlashText vs re vs RapidFuzz
    bench_1m_words.py       1 M-word throughput: TurboText vs FlashText
    scaling_benchmark.py    vocabulary-sweep scaling charts
assets/
    logo.png

Author

Nishank Mahore
nishankmahore@gmail.com · github.com/nishankmahore

If TurboText is useful to you, feel free to open an issue, suggest a feature, or contribute a pull request.


License

Released under the MIT License — see LICENSE for the full text.


Made with Python · Powered by Cython · Built for speed

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

turbotext-0.2.0.tar.gz (126.9 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

turbotext-0.2.0-cp313-cp313-win_amd64.whl (152.7 kB view details)

Uploaded CPython 3.13Windows x86-64

turbotext-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl (408.7 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

turbotext-0.2.0-cp313-cp313-musllinux_1_2_aarch64.whl (398.9 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

turbotext-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (406.1 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

turbotext-0.2.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (407.0 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

turbotext-0.2.0-cp313-cp313-macosx_11_0_arm64.whl (156.9 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

turbotext-0.2.0-cp313-cp313-macosx_10_13_x86_64.whl (158.3 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

turbotext-0.2.0-cp312-cp312-win_amd64.whl (153.2 kB view details)

Uploaded CPython 3.12Windows x86-64

turbotext-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl (421.4 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

turbotext-0.2.0-cp312-cp312-musllinux_1_2_aarch64.whl (412.9 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ ARM64

turbotext-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (418.5 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

turbotext-0.2.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (417.9 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

turbotext-0.2.0-cp312-cp312-macosx_11_0_arm64.whl (157.3 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

turbotext-0.2.0-cp312-cp312-macosx_10_13_x86_64.whl (158.7 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

turbotext-0.2.0-cp311-cp311-win_amd64.whl (153.2 kB view details)

Uploaded CPython 3.11Windows x86-64

turbotext-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl (387.2 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

turbotext-0.2.0-cp311-cp311-musllinux_1_2_aarch64.whl (381.7 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ ARM64

turbotext-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (385.9 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

turbotext-0.2.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (382.7 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

turbotext-0.2.0-cp311-cp311-macosx_11_0_arm64.whl (158.1 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

turbotext-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl (158.2 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

turbotext-0.2.0-cp310-cp310-win_amd64.whl (153.3 kB view details)

Uploaded CPython 3.10Windows x86-64

turbotext-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl (368.0 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

turbotext-0.2.0-cp310-cp310-musllinux_1_2_aarch64.whl (361.2 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ ARM64

turbotext-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (364.3 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

turbotext-0.2.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (360.8 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

turbotext-0.2.0-cp310-cp310-macosx_11_0_arm64.whl (158.3 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

turbotext-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl (158.4 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

File details

Details for the file turbotext-0.2.0.tar.gz.

File metadata

  • Download URL: turbotext-0.2.0.tar.gz
  • Upload date:
  • Size: 126.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for turbotext-0.2.0.tar.gz
Algorithm Hash digest
SHA256 5d013d383666229e1ce0474f07c22f7365492b911c571eda51aa9044cbf28f5f
MD5 ed39a4c6f4266a80e603c008613f2457
BLAKE2b-256 6ddf6aad4f1db867e2e45f761954105fe8121599d780033018703089c4bfea81

See more details on using hashes here.

Provenance

The following attestation bundles were made for turbotext-0.2.0.tar.gz:

Publisher: publish.yml on nishankmahore/TurboText

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file turbotext-0.2.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: turbotext-0.2.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 152.7 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for turbotext-0.2.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 604dfc69008ba83cc3d4e39b18ece392ded4d0cb8b686daca20e064a99836f94
MD5 87d67844f7abf2747d4773d22c460fe4
BLAKE2b-256 0ca5b74974bbfcbc1df7f53b46e7533c497c9c08ee1c560bbaaa8852f47018d1

See more details on using hashes here.

Provenance

The following attestation bundles were made for turbotext-0.2.0-cp313-cp313-win_amd64.whl:

Publisher: publish.yml on nishankmahore/TurboText

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file turbotext-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for turbotext-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 627b8e9b80743da5e2431a9dbde8d4b7a28aa5da19f27dcdbe98ada91e50559f
MD5 05279a85fc243a9c807d8bde977584c9
BLAKE2b-256 322b2a2fcb181f70f2745e9ca3068a71497842be651971325380d3f94a1b277a

See more details on using hashes here.

Provenance

The following attestation bundles were made for turbotext-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl:

Publisher: publish.yml on nishankmahore/TurboText

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file turbotext-0.2.0-cp313-cp313-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for turbotext-0.2.0-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 c0e0513fb50bac70248befe50475003513585502f58b95b76a16dadb224b2966
MD5 829719332005d04bc4accd7da76b21fd
BLAKE2b-256 fe0932efaabb58ee5493300c630a53b416fb06e2855d1049be901cf6ae160445

See more details on using hashes here.

Provenance

The following attestation bundles were made for turbotext-0.2.0-cp313-cp313-musllinux_1_2_aarch64.whl:

Publisher: publish.yml on nishankmahore/TurboText

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file turbotext-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for turbotext-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 edd795c2d9474f10cec3e12bc461760bf909508553b833fe027dc5e8ed53c812
MD5 6136d8319ad45268ba75cb891dabf99a
BLAKE2b-256 2c97562176c7ffd66c0a3669587697bc17dd83b481c78de6da42b038cbabfef7

See more details on using hashes here.

Provenance

The following attestation bundles were made for turbotext-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: publish.yml on nishankmahore/TurboText

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file turbotext-0.2.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for turbotext-0.2.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e1385b3106e162c587a13ed3ec910f75ffe6d8de17b1ebf898fa0046058070f2
MD5 a1ff05f0ae0bcbdc86d71707c65a68a2
BLAKE2b-256 0d0bd2f74f764c4b894b241d7b201749a06a7301b693854bbed407564a8efc41

See more details on using hashes here.

Provenance

The following attestation bundles were made for turbotext-0.2.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on nishankmahore/TurboText

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file turbotext-0.2.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for turbotext-0.2.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 39b591cb023d977c729714cdabbef3b6e475725680aa537e30f5e005b15388d4
MD5 759aa0e7f385f8822a1485d118756aa4
BLAKE2b-256 fefb41cfaa56c65b1c032cfc5fb7cc4f58240122600799e7d7a6dedd1b436fe1

See more details on using hashes here.

Provenance

The following attestation bundles were made for turbotext-0.2.0-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: publish.yml on nishankmahore/TurboText

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file turbotext-0.2.0-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for turbotext-0.2.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 03e6b540a3467c8e4bb97d75b986dd0d7991de4d53a12fe6ac3bd51669fed7b5
MD5 58312d8874c1c5669487bbc8fa363dbf
BLAKE2b-256 534caab0ef0159017a198c6d32208b929339e9e9f58ebef0caa5d01cd10330b0

See more details on using hashes here.

Provenance

The following attestation bundles were made for turbotext-0.2.0-cp313-cp313-macosx_10_13_x86_64.whl:

Publisher: publish.yml on nishankmahore/TurboText

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file turbotext-0.2.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: turbotext-0.2.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 153.2 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for turbotext-0.2.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 cc1945e5fec4eac2c7e2560cb0b49fde915936fea4433b416d135f199e5434d2
MD5 bd954b766711ee58889f68de59fcfe2c
BLAKE2b-256 5b3819daeabaa2152acb22258ddce895f1d2a01a9e4176c543c798b8841ab4d8

See more details on using hashes here.

Provenance

The following attestation bundles were made for turbotext-0.2.0-cp312-cp312-win_amd64.whl:

Publisher: publish.yml on nishankmahore/TurboText

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file turbotext-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for turbotext-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 6475bfbfa613bd3740c7ba72afbad1c6f31abde248e5bdd940131c4911133b40
MD5 10ffe8cd0831233d83f48b3b4688a6c2
BLAKE2b-256 85bb1555bc6e695ffcd83649daf963f2a1f63b298f9bd8362e0b78f13c274c19

See more details on using hashes here.

Provenance

The following attestation bundles were made for turbotext-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl:

Publisher: publish.yml on nishankmahore/TurboText

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file turbotext-0.2.0-cp312-cp312-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for turbotext-0.2.0-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 2184cec5a71431f59110f55a246d4bcb439d4066b2f43c0ecfb09527925fee3f
MD5 562f361606566baf1543a78fda37a606
BLAKE2b-256 0d4814c5ac2e042519f6cc8967fb8e456180db0663ebbe204c9e0976fd79f1b4

See more details on using hashes here.

Provenance

The following attestation bundles were made for turbotext-0.2.0-cp312-cp312-musllinux_1_2_aarch64.whl:

Publisher: publish.yml on nishankmahore/TurboText

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file turbotext-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for turbotext-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 77e033dbfe95ff1de149a17968591e275aaddaef316cbe1d70f07dbc2069ffe8
MD5 dace3baafc05a07a70d29c853ae4c373
BLAKE2b-256 fc3b3946cefc8471aa41d177990cf438044c07db4c62d9355401ff12dd6afd04

See more details on using hashes here.

Provenance

The following attestation bundles were made for turbotext-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: publish.yml on nishankmahore/TurboText

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file turbotext-0.2.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for turbotext-0.2.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 249e2f01a0b574ab45e594e00fec6a4023b2700043e08f91c327a45c00322bab
MD5 956244b9d157fac55696b2741ebae7f3
BLAKE2b-256 6b75449bb197f151c622f8a0d20c267aada86833bac2d99a9719466dc0e929ce

See more details on using hashes here.

Provenance

The following attestation bundles were made for turbotext-0.2.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on nishankmahore/TurboText

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file turbotext-0.2.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for turbotext-0.2.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 43c73b0c5dd65632f79d40f74b33106cd7cca0f0eb757bfa0a0ca1b8a41ee2c8
MD5 2c1ff5b59f04e4af6952357b03d50fc3
BLAKE2b-256 561ec71cba261ecd7be959c59cd9431223a2aced9014a3d64bf3f78814e5f7ab

See more details on using hashes here.

Provenance

The following attestation bundles were made for turbotext-0.2.0-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: publish.yml on nishankmahore/TurboText

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file turbotext-0.2.0-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for turbotext-0.2.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 6f18ec8f8d58d563de3d0fc90801d4d711147f053e9bb7188c4f21fd7288a526
MD5 20d6187c3cdbe4a33cb30f8f8cdcbdc7
BLAKE2b-256 570da38ff33743cca143f3fa2044912af9fdbb9e5568cdfdbfc46613fa8c8a4b

See more details on using hashes here.

Provenance

The following attestation bundles were made for turbotext-0.2.0-cp312-cp312-macosx_10_13_x86_64.whl:

Publisher: publish.yml on nishankmahore/TurboText

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file turbotext-0.2.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: turbotext-0.2.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 153.2 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for turbotext-0.2.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 17e899a7c47fbd4be0eb9fe1dfc0d07b096506a272ad28dc327f4bf558511121
MD5 300cef6bab3366616e25d67e1c4297a1
BLAKE2b-256 64571c2911a8b2ad6e81cc2272154041a63352255ba6ec473b402dfe1ce96b66

See more details on using hashes here.

Provenance

The following attestation bundles were made for turbotext-0.2.0-cp311-cp311-win_amd64.whl:

Publisher: publish.yml on nishankmahore/TurboText

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file turbotext-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for turbotext-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 998e81104662fca1f58a97295d9c71408845a927675b6394812b0153aed7f1aa
MD5 4497ca030cec85097337fc866e7942e8
BLAKE2b-256 2fd4fc51d160ec8be6dab808ab292bb0176403ba3fbd788729f008ab545fedaf

See more details on using hashes here.

Provenance

The following attestation bundles were made for turbotext-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl:

Publisher: publish.yml on nishankmahore/TurboText

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file turbotext-0.2.0-cp311-cp311-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for turbotext-0.2.0-cp311-cp311-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 006ffd27178b9d19c0136108866eaa53f25b49ceba18fca451efed4998884085
MD5 419a7810348e37a89d61baa0ddd46eaa
BLAKE2b-256 caba211e2ca9861d3bfa34d0dc5dab1ba0da0e010f88f9c16692eaa2a30a3e77

See more details on using hashes here.

Provenance

The following attestation bundles were made for turbotext-0.2.0-cp311-cp311-musllinux_1_2_aarch64.whl:

Publisher: publish.yml on nishankmahore/TurboText

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file turbotext-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for turbotext-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 91bc4842df82a487c3e7f22ce60ce4c13cd1467ecec9021c8265aa20c96e0aa1
MD5 f493977c6df126237f0892e2a17dca02
BLAKE2b-256 7763c772ee677566ce4a64ca954cde37fd98bb8146361132324dff429efa4bcd

See more details on using hashes here.

Provenance

The following attestation bundles were made for turbotext-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: publish.yml on nishankmahore/TurboText

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file turbotext-0.2.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for turbotext-0.2.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3272bc3b57dc38070d38aae9d5f6896529bc744c1eb70c7d1923639591bf4131
MD5 4e180d6ec31c18112027c5e1a99461d0
BLAKE2b-256 b27945a2e5df583771292a4ad50217a00f2ef74ffe1ea8c25ad2e006727947dc

See more details on using hashes here.

Provenance

The following attestation bundles were made for turbotext-0.2.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on nishankmahore/TurboText

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file turbotext-0.2.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for turbotext-0.2.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 267d39fd27ace764b34b2c00d8b75ff093444c018f094ecf7c3dfecd907aff93
MD5 1eba79797682b25979a3f009b1b381c1
BLAKE2b-256 7d8468109025014afc2b2af1c366c88f1d1618555c49bc846e3341731c46bfbc

See more details on using hashes here.

Provenance

The following attestation bundles were made for turbotext-0.2.0-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: publish.yml on nishankmahore/TurboText

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file turbotext-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for turbotext-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 2c0b4d0eb3aa3f41bb2211923f835b6cc1b67419ab22ad7918baa82c53738fe1
MD5 1cb0948501746c563d11b208afbd9d53
BLAKE2b-256 19be78266d8c3a33e6289f08a73c21d3fbc2dfc8214f177f383285897038cf98

See more details on using hashes here.

Provenance

The following attestation bundles were made for turbotext-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl:

Publisher: publish.yml on nishankmahore/TurboText

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file turbotext-0.2.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: turbotext-0.2.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 153.3 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for turbotext-0.2.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 19d0569518b64568553f2393ffdbac616bc006a45115579dfdb64139641ed66f
MD5 bd4317e756ac55132382ec8038223d2c
BLAKE2b-256 37dd8180735ad85aef623d1de46a3e3de07fb25dd95562d1ffc90fffca2de26c

See more details on using hashes here.

Provenance

The following attestation bundles were made for turbotext-0.2.0-cp310-cp310-win_amd64.whl:

Publisher: publish.yml on nishankmahore/TurboText

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file turbotext-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for turbotext-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 ef79e6d74bec55df6de0325019b196323d06c2620d0024fa0ce7401282a26bf5
MD5 55b3b698c1d83e76535acc8a192c9c17
BLAKE2b-256 07be2986c181caea30b4baea1fad977d34c5303d372ccf27219090cdfa1e8b3d

See more details on using hashes here.

Provenance

The following attestation bundles were made for turbotext-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl:

Publisher: publish.yml on nishankmahore/TurboText

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file turbotext-0.2.0-cp310-cp310-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for turbotext-0.2.0-cp310-cp310-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 f09aa7970f230791770c2ffd17d6c81ef7822145fe0921ade73a4d15b5a2a67c
MD5 0bc85edf5ce1dbc657ad30a17e2e4a0a
BLAKE2b-256 69ed1294ea69c26e4081679e12d11b0d3e215157207d962f09cabe649f88277d

See more details on using hashes here.

Provenance

The following attestation bundles were made for turbotext-0.2.0-cp310-cp310-musllinux_1_2_aarch64.whl:

Publisher: publish.yml on nishankmahore/TurboText

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file turbotext-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for turbotext-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 560c34a1e0f83b8716f6ccd1fa7fb990aa2ff044c8a128c648e92f9075cd02e3
MD5 b44e540fb41b87846d282419679d6c09
BLAKE2b-256 c9054d4262cdacaf153ebac478ed69e0ca46455442b9f7f92a450e61391191ae

See more details on using hashes here.

Provenance

The following attestation bundles were made for turbotext-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: publish.yml on nishankmahore/TurboText

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file turbotext-0.2.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for turbotext-0.2.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0924da8167536e5434dfc5fe30fb99bd84bfd6bd181265800195d4d66e77ada2
MD5 0a4c4dcfb46446f8270a8cef6e04bed6
BLAKE2b-256 7f7d6391738889fc644d07399ae5eb5f10cd48c0994f094b3c89c15e1ef06804

See more details on using hashes here.

Provenance

The following attestation bundles were made for turbotext-0.2.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on nishankmahore/TurboText

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file turbotext-0.2.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for turbotext-0.2.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bcdb4a2ba54b5b858fdc62b5ef41183099574410f360160c8250a93e3b559924
MD5 d7103fb415eabcaaa63e6ff080ed2ef6
BLAKE2b-256 e4c17ee236ba7f6fbc495f5a23aa36ad7c268e5bbca54f9011e0cf1d45557fb5

See more details on using hashes here.

Provenance

The following attestation bundles were made for turbotext-0.2.0-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: publish.yml on nishankmahore/TurboText

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file turbotext-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for turbotext-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 80f8e93be8607f6b6ae63ba6d73c9183353b0e71e7db84910d902c1b6bd5a0a8
MD5 7fb5057e65567d076d40ee99361ad068
BLAKE2b-256 032acc265cf8fc851958b2af171b2e301dcd107cb5d63ce99d94c48e2e85a2c5

See more details on using hashes here.

Provenance

The following attestation bundles were made for turbotext-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl:

Publisher: publish.yml on nishankmahore/TurboText

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page