comparison mercurial/encoding.py @ 33782:f5fc54e7e467

encoding: drop circular import by proxying through '<policy>.charencode' I decided not to split charencode.c to new C extension module because it would duplicate binary codes unnecessarily.
author Yuya Nishihara <yuya@tcha.org>
date Mon, 31 Jul 2017 23:13:47 +0900
parents ce96efec8112
children dabe1f11ae3a
comparison
equal deleted inserted replaced
33781:cd2aca0808f8 33782:f5fc54e7e467
15 from . import ( 15 from . import (
16 error, 16 error,
17 policy, 17 policy,
18 pycompat, 18 pycompat,
19 ) 19 )
20
21 charencode = policy.importmod(r'charencode')
22
23 asciilower = charencode.asciilower
24 asciiupper = charencode.asciiupper
20 25
21 _sysstr = pycompat.sysstr 26 _sysstr = pycompat.sysstr
22 27
23 if pycompat.ispy3: 28 if pycompat.ispy3:
24 unichr = chr 29 unichr = chr
316 usub = uslice(i) 321 usub = uslice(i)
317 if ucolwidth(usub) <= width: 322 if ucolwidth(usub) <= width:
318 return concat(usub.encode(_sysstr(encoding))) 323 return concat(usub.encode(_sysstr(encoding)))
319 return ellipsis # no enough room for multi-column characters 324 return ellipsis # no enough room for multi-column characters
320 325
321 def _asciilower(s):
322 '''convert a string to lowercase if ASCII
323
324 Raises UnicodeDecodeError if non-ASCII characters are found.'''
325 s.decode('ascii')
326 return s.lower()
327
328 def asciilower(s):
329 # delay importing avoids cyclic dependency around "parsers" in
330 # pure Python build (util => i18n => encoding => parsers => util)
331 parsers = policy.importmod(r'parsers')
332 impl = getattr(parsers, 'asciilower', _asciilower)
333 global asciilower
334 asciilower = impl
335 return impl(s)
336
337 def _asciiupper(s):
338 '''convert a string to uppercase if ASCII
339
340 Raises UnicodeDecodeError if non-ASCII characters are found.'''
341 s.decode('ascii')
342 return s.upper()
343
344 def asciiupper(s):
345 # delay importing avoids cyclic dependency around "parsers" in
346 # pure Python build (util => i18n => encoding => parsers => util)
347 parsers = policy.importmod(r'parsers')
348 impl = getattr(parsers, 'asciiupper', _asciiupper)
349 global asciiupper
350 asciiupper = impl
351 return impl(s)
352
353 def lower(s): 326 def lower(s):
354 "best-effort encoding-aware case-folding of local string s" 327 "best-effort encoding-aware case-folding of local string s"
355 try: 328 try:
356 return asciilower(s) 329 return asciilower(s)
357 except UnicodeDecodeError: 330 except UnicodeDecodeError: