Skip to content

Commit 130d1a6

Browse files
authored
Split out unicode_ljust and unicode_rjust to break import cycle (#3388)
* Split out unicode_ljust and unicode_rjust to break import cycle Previously, there was an import cycle between tui.menu_item and lib.output. * Move unicode.py from lib/ to lib/utils/
1 parent e281c2f commit 130d1a6

3 files changed

Lines changed: 42 additions & 41 deletions

File tree

archinstall/lib/output.py

Lines changed: 1 addition & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
import logging
22
import os
33
import sys
4-
import unicodedata
54
from collections.abc import Callable
65
from dataclasses import asdict, is_dataclass
76
from datetime import UTC, datetime
87
from enum import Enum
9-
from functools import lru_cache
108
from pathlib import Path
119
from typing import TYPE_CHECKING, Any
1210

1311
from .storage import storage
12+
from .utils.unicode import unicode_ljust, unicode_rjust
1413

1514
if TYPE_CHECKING:
1615
from _typeshed import DataclassInstance
@@ -335,41 +334,3 @@ def log(
335334
if level != logging.DEBUG:
336335
from archinstall.tui.curses_menu import Tui
337336
Tui.print(text)
338-
339-
340-
@lru_cache(maxsize=128)
341-
def _is_wide_character(char: str) -> bool:
342-
return unicodedata.east_asian_width(char) in 'FW'
343-
344-
345-
def _count_wchars(string: str) -> int:
346-
"Count the total number of wide characters contained in a string"
347-
return sum(_is_wide_character(c) for c in string)
348-
349-
350-
def unicode_ljust(string: str, width: int, fillbyte: str = ' ') -> str:
351-
"""Return a left-justified unicode string of length width.
352-
>>> unicode_ljust('Hello', 15, '*')
353-
'Hello**********'
354-
>>> unicode_ljust('你好', 15, '*')
355-
'你好***********'
356-
>>> unicode_ljust('안녕하세요', 15, '*')
357-
'안녕하세요*****'
358-
>>> unicode_ljust('こんにちは', 15, '*')
359-
'こんにちは*****'
360-
"""
361-
return string.ljust(width - _count_wchars(string), fillbyte)
362-
363-
364-
def unicode_rjust(string: str, width: int, fillbyte: str = ' ') -> str:
365-
"""Return a right-justified unicode string of length width.
366-
>>> unicode_rjust('Hello', 15, '*')
367-
'**********Hello'
368-
>>> unicode_rjust('你好', 15, '*')
369-
'***********你好'
370-
>>> unicode_rjust('안녕하세요', 15, '*')
371-
'*****안녕하세요'
372-
>>> unicode_rjust('こんにちは', 15, '*')
373-
'*****こんにちは'
374-
"""
375-
return string.rjust(width - _count_wchars(string), fillbyte)

archinstall/lib/utils/unicode.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import unicodedata
2+
from functools import lru_cache
3+
4+
5+
@lru_cache(maxsize=128)
6+
def _is_wide_character(char: str) -> bool:
7+
return unicodedata.east_asian_width(char) in 'FW'
8+
9+
10+
def _count_wchars(string: str) -> int:
11+
"Count the total number of wide characters contained in a string"
12+
return sum(_is_wide_character(c) for c in string)
13+
14+
15+
def unicode_ljust(string: str, width: int, fillbyte: str = ' ') -> str:
16+
"""Return a left-justified unicode string of length width.
17+
>>> unicode_ljust('Hello', 15, '*')
18+
'Hello**********'
19+
>>> unicode_ljust('你好', 15, '*')
20+
'你好***********'
21+
>>> unicode_ljust('안녕하세요', 15, '*')
22+
'안녕하세요*****'
23+
>>> unicode_ljust('こんにちは', 15, '*')
24+
'こんにちは*****'
25+
"""
26+
return string.ljust(width - _count_wchars(string), fillbyte)
27+
28+
29+
def unicode_rjust(string: str, width: int, fillbyte: str = ' ') -> str:
30+
"""Return a right-justified unicode string of length width.
31+
>>> unicode_rjust('Hello', 15, '*')
32+
'**********Hello'
33+
>>> unicode_rjust('你好', 15, '*')
34+
'***********你好'
35+
>>> unicode_rjust('안녕하세요', 15, '*')
36+
'*****안녕하세요'
37+
>>> unicode_rjust('こんにちは', 15, '*')
38+
'*****こんにちは'
39+
"""
40+
return string.rjust(width - _count_wchars(string), fillbyte)

archinstall/tui/menu_item.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from functools import cached_property
66
from typing import TYPE_CHECKING, Any, ClassVar
77

8-
from ..lib.output import unicode_ljust
8+
from ..lib.utils.unicode import unicode_ljust
99

1010
if TYPE_CHECKING:
1111
from archinstall.lib.translationhandler import DeferredTranslation

0 commit comments

Comments
 (0)