Repository navigation
Releases: erdemtuna/normalizer-tr
Release list
normalizer-tr 0.8.0
normalizer-tr 0.8.0
Primary Turkish names for standalone uppercase letters, corrected quote
boundaries, and atomic ownership of unsupported suffixed phones.
- Name supported standalone uppercase letters in every policy, including
unmarked initials and bare single Roman letters, without guessing a following
technical phrase. Preserve established units, identifiers, initialisms,
contextual Romans and explicit hints. - Recognize externally isolated straight/smart quote pairs with interior
whitespace and unambiguous nesting. Keep wrappers and original UTF-8 ranges. - Keep malformed or unsupported suffixed phone expressions as one invalid
source owner instead of rewriting numeric fragments. Protect neighboring
quantities, identifiers and address fields. - Separate scanner/ownership and performance-tooling responsibilities without
adding Python language rules or changing public API shapes.
Migration
Public Rust/Python calls, fields, enum labels, hints, policy defaults and limits
are unchanged, but text and diagnostic semantics deliberately change.
| Input / policy | Before | 0.8.0 |
|---|---|---|
P ve S dalgaları, all policies |
Unchanged prose | pe ve se dalgaları |
C vitamini, Preserve/Reject |
Unresolved Roman intent | Primary ce vitamini |
C vitamini, Fallback |
Literal Roman fallback | Same text, primary Symbol / letter.name, no letter fallback record |
0532 123 45 67'den, Preserve |
Successful final Cardinal escaped | Whole source preserved with one issue over [0,18) |
Preserve is not an opt-out from primary letter readings. Consumers of segment
kinds, fallback counters, issue ranges and stored snapshots should review these
changes. Unknown uppercase words and lowercase letters are not automatically
spelled.
Phone suffixes remain unsupported; this fixes ownership, not suffix
pronunciation. Former partial hints such as Hint(0,11,"digits") or
Hint(12,18,"cardinal") on the suffixed phone now fail with invalid_hint.
Original-byte coordinates, including decomposed Unicode, remain authoritative.
See the 0.8.0 changelog,
versioned normalization reference
and versioned fallback contract.
The reviewed implementations are #40
and #41.
Artifacts and installation
The release contains 16 tested wheels for CPython 3.11-3.14 on Windows x64,
Linux x64 (manylinux_2_28), and macOS x64/arm64, together with a tested Python
source distribution and Rust core archive. Rust requires 1.94 or newer.
release-manifest.json identifies the exact source revision and SHA-256 hashes
for the attached artifact set. Source:
ef878d400e53f982d98b1fccbc44d539302e57e6.
Both registries were independently verified against this same manifest.
python -m pip install normalizer-tr==0.8.0[dependencies]
normalizer-tr = "0.8"Publication verification
All 16 wheel jobs, source/core builds, advisory checks and artifact inspection
passed in the
protected release run.
PyPI publication received the configured owner approval and its upload succeeded.
The workflow's immediate post-upload file-set check failed; a subsequent
independent run of the unchanged tagged verifier downloaded all 17 published
Python files, matched every checksum, and passed a fresh Linux/Python 3.12
consumer. Rust registry checksums and fresh default/Serde consumers also passed.
Windows file-host downloads encountered TLS handshake errors. Certificate
validation was not disabled: the standard verifier completed through the
already-installed Ubuntu runtime. No packages were re-uploaded, replaced or
versioned differently to recover verification.
Known limits
The phone fix retains an explicitly accepted measured cost on equivalent
malformed 4-32 KiB name-suffix workloads. The
accepted risk and pinned evidence
include absolute latency deltas, failed-work distinctions and source/host scope.
Those measurements are not a universal latency, hard-deadline, peak-memory or
no-regression guarantee, nor a measurement of every 0.7.0-to-0.8.0 workload.
Validation covers normalized text and library behavior; no downstream
speech-model or audio-quality improvement is claimed.
normalizer-tr 0.7.0
normalizer-tr 0.7.0
Bounded Turkish notation coverage, with independently reviewed source ownership
and scanner performance improvements.
- Add numeric, percentage and quantity plural/possession/case/copular suffixes,
including compound-aware money endings. - Extend date suffixes, year-first slash dates, following date cues, dotted
clocks with suffixes and validated clock ranges. - Read flat multiplication without calculating it; retain grouped money and
exclude protected phone/electronic/identifier operands. - Recognize contextual address aliases, atomic fields, numbered streets, postal
digits/labels and locality pauses. - Correct grouped-account and independent-address ownership, clock-range
overclaiming and mixed-arithmetic prefix certification. - Remove pre-existing quadratic failed-telephone traversal and electronic
parenthesis trimming; preserve diagnostics, limits and cooperative controls.
Migration
Public Rust/Python call shapes, enum variants, serialized labels and record
fields are unchanged. New primary readings can change text, strict-mode success
and diagnostic boundaries. Composite readings emit multiple existing segment
kinds, but hints must still cover their entire source owner.
Rates now use written unit order: 5 km/sa becomes beş kilometre saat,
instead of the earlier saatte beş kilometre. Date suffixes validate against the
last written component and attach to the canonical spoken year. Address-specific
readings apply only in reviewed address context. Invalid accounts remain
uncertified, and mixed arithmetic remains unsupported.
See the changelog
and normalization reference
for coverage and examples.
Verification and artifacts
PR #7 received independent
correctness and performance reviews. All four correctness findings and both
scoped performance findings were fixed and independently rechecked; all five
inline threads were resolved.
Release artifacts are built and tested for CPython 3.11-3.14 on Windows x64,
Linux x64 (manylinux_2_28), and macOS x64/arm64, together with a tested Python
source distribution and Rust core archive. Rust requires 1.94 or newer.
release-manifest.json records the source revision and SHA-256 checksums for
the exact artifact set.
python -m pip install normalizer-tr==0.7.0[dependencies]
normalizer-tr = "0.7"Performance observations are shared-host measurements, not a universal latency,
hard deadline or peak-memory guarantee. Validation covers normalized text and
library behavior; no downstream speech model or audio-quality claim is made.
normalizer-tr 0.6.0
Highlights
Approved foreign names now accept bounded plural, all six possessive forms
and a final case suffix. Examples include iPhone'umdan → ayfonumdan,
iPhone'una → ayfonuna, and iPhone'larımıza → ayfonlarımıza.
These are primary pronunciations under Preserve, Reject and Fallback,
not fallback repairs.
The grammar applies to all 47 exact approved keys and bounded phrases.
It uses current stem harmony and case buffers, combines noun plural with
third person plural possession, and accepts equivalent grammatical analyses
when their spoken results agree. Catalog consistency is validated once during
initialization. Unknown words, protected contexts and other normalization
families retain their existing boundaries.
Migration
This pre 1.0 minor release deliberately changes pronunciation behavior:
- Instagram now reads
instagram, and WhatsApp/Whatsapp readsvatsap. Instagram'a,Instagram'daandWhatsApp'tannow resolve normally.- Previously accepted spellings based on the old readings, including
Instagram'e,Instagram'deandWhatsApp'ten, no longer validate.
Preserve retains the whole source with an issue, Reject errors, and
Fallback spells it literally. There is no older pronunciation option.
Public signatures, enum values, serialized labels, result fields, hint kinds,
policy defaults, limits and dependencies are unchanged. Review output snapshots
and diagnostic consumers: newly supported suffixes no longer create unresolved
issues or fallback records.
Consumers pinned below 0.6, including the inspected EMA Lightning constraint
normalizer-tr>=0.5,<0.6, must explicitly opt into this version.
See the complete changelog
and suffix coverage.
Verification and limitations
Rust, installed Python, source distribution and package consumer checks cover
the library behavior. Warm release native performance is measured separately
from speech generation and is a host specific target, not a universal SLA.
The frozen original benchmark inputs are unchanged; the shared policy catalog
contains 198 cases.
Independent EMA listening was not performed. The release owner waived that
gate. Text tests and measurements do not establish audio quality.
Packages and artifacts
PyPI 0.6.0
and crates.io 0.6.0.
Attached: 16 interpreter specific wheels for CPython 3.11–3.14 on Windows/Linux
x64 and macOS x64/arm64, one tested Python source distribution, the Rust core
archive, and release-manifest.json with exact checksums and source provenance.
normalizer-tr 0.5.0
Highlights
- 80 approved abbreviation spellings, with validated Turkish suffixes and explicit reading alternatives.
- 35 foreign-name text readings across 47 exact keys, including Claude, GitHub Copilot, Visual Studio Code and EMA Lightning (
ema laytning). - Expanded exact quantity, money, percentage, range and date recognition; improved quotation/list boundaries and whole-span validation.
- Fixed numeric-scanning, duplicate-currency and mixed/multiword-list regressions; 179 shared policy-contract cases cover the resulting behavior.
- Internal module reorganization preserves public import paths. No dependency changes.
Migration: Rust and serialized consumers
This pre-1.0 minor release breaks existing exhaustive Rust matches. Handle the new SegmentKind::Pronunciation and FallbackClass::Pronunciation variants. Closed Serde schemas/allowlists must accept "Pronunciation"; Python segment kinds and fallback attempted classes use "pronunciation".
Expanded primary recognition deliberately changes some outputs, segment kinds, completeness and diagnostics. Review output snapshots, hint ranges and diagnostic-dependent logic. Policy defaults, limits, public signatures and result fields are unchanged. Speech aliases are Turkish-readable text, not phonemes or speech-model/audio validation.
See the full changelog and migration notes.
Packages and verified artifacts
PyPI 0.5.0 and crates.io 0.5.0.
Attached: 16 interpreter-specific wheels (CPython 3.11-3.14; Windows/Linux x64 and macOS x64/arm64), one tested source distribution, the core crate archive and release-manifest.json. The manifest records exact SHA-256 checksums and source/workflow provenance for this tag.
normalizer-tr 0.4.0
0.4.0 adds optional fallback support to the shared Rust and Python engine. Use
ambiguity_policy="fallback" in Python or AmbiguityPolicy::Fallback in Rust
to render unresolved notation and symbols, with handled assumptions in fallbacks.
Preserve remains the default. Existing valid readings and Reject behavior are
unchanged. Fallback reads source as written, without repairing invalid facts or
certifying identifiers. Invalid input, hints, cancellation and resource limits
remain errors.
Rust adds fallback enum variants and diagnostic types. Serde results include
fallbacks and fallback_used; update exhaustive matches or strict schemas
as needed. The README now focuses on quickstarts, with detailed guides linked.
Install with python -m pip install --upgrade normalizer-tr or
normalizer-tr = "0.4" in Cargo.toml.
Rust 1.94 or newer. Python includes 16 tested wheels for CPython 3.11 to 3.14
on Windows/Linux x64 and macOS x64/arm64, plus a tested source distribution.