Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions docs/intro.rst
Original file line number Diff line number Diff line change
Expand Up @@ -654,6 +654,10 @@ languages:
History
=======

0.8.2 *2026-06-29*
* **Bugfix** Do not raise IndexError when given legacy POSIX ``n`` argument to `wcswidth()`_ or
`wcstwidth()`_ exceed string length without raising IndexError

0.8.1 *2026-06-08*
* **Improved** `wcstwidth()`_ with new ``zeroer``, ``narrow_wider``, and ``narrow_zeroer``
Corrections_. `PR #226`_
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ requires = [ "hatchling" ]

[project]
name = "wcwidth"
version = "0.8.1" # don't forget to also update wcwidth/__init__.py:__version__
version = "0.8.2" # don't forget to also update wcwidth/__init__.py:__version__
description = "Measures the displayed width of unicode strings in a terminal"
readme = "README.rst"
keywords = [
Expand Down
6 changes: 6 additions & 0 deletions tests/test_core.py
Original file line number Diff line number Diff line change
Expand Up @@ -497,6 +497,12 @@ def test_zwj_at_end_of_string():
assert wcwidth.wcswidth('a\u200D') == 1


def test_wcswidth_n_exceeds_length():
"""Verify wcswidth() with n > len(string) does not raise IndexError."""
assert wcwidth.wcswidth('hello', n=999) == 5
assert wcwidth.wcswidth('\u30B3\u30F3', n=999) == 4


def test_soft_hyphen():
# Test SOFT HYPHEN, category 'Cf' usually are zero-width, but most
# implementations agree to draw it was '1' cell, visually
Expand Down
7 changes: 7 additions & 0 deletions tests/test_term_overrides.py
Original file line number Diff line number Diff line change
Expand Up @@ -418,6 +418,13 @@ def test_get_term_overrides_narrow_wider_still_empty():
assert overrides.narrow_wider == ()


@pytest.mark.parametrize('func', [wcwidth.wcstwidth, wcwidth.width])
def test_narrow_wider_width(func):
"""Verify width() & wcstwidth() match result of narrow_wider overrides."""
assert wcwidth.wcswidth('\u261d') == 1
assert func('\u261d', term_program='kitty') == 2


@pytest.mark.parametrize('codepoint', [
'\u00ad',
'\u0600',
Expand Down
2 changes: 1 addition & 1 deletion wcwidth/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,4 +78,4 @@
# Using 'hatchling', it does not seem to provide the pyproject.toml nicety, "dynamic = ['version']"
# like flit_core, maybe there is some better way but for now we have to duplicate it in both places
# Prefer the installed distribution version when available (helps test environments)
__version__ = '0.8.1' # don't forget to also update pyproject.toml:version
__version__ = '0.8.2' # don't forget to also update pyproject.toml:version
4 changes: 2 additions & 2 deletions wcwidth/_wcswidth.py
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ def wcswidth(

_wcwidth = wcwidth if ambiguous_width == 1 else lambda c: wcwidth(c, 'auto', ambiguous_width)

end = len(pwcs) if n is None else n
end = len(pwcs) if n is None else min(n, len(pwcs))
total_width = 0
idx = 0

Expand Down Expand Up @@ -262,7 +262,7 @@ def wcstwidth(
# Select wcwidth call pattern for best lru_cache performance
_wcwidth = wcwidth if ambiguous_width == 1 else lambda c: wcwidth(c, 'auto', ambiguous_width)

end = len(pwcs) if n is None else n
end = len(pwcs) if n is None else min(n, len(pwcs))
total_width = 0
idx = 0

Expand Down
Loading