summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMate Barany <[email protected]>2024-10-28 16:34:10 +0100
committerMate Barany <[email protected]>2024-11-11 19:33:44 +0100
commit3045a08e5edd5d8bc7c94f425ea60a7f48786ac1 (patch)
treec81126c90ecdfd995d9834c1c0b09b341669485e
parentc0b9dc00145a6d2123b99ab8b1de692af5ead39a (diff)
Add type annotations to QLocaleXmlWriter
Also fix the annotation of englishNaming in cldr.py. Spotted it while annotating __enumTable. Task-number: QTBUG-129564 Pick-to: 6.8 Change-Id: I93f698b4cf1b5ae90c21fe77330e4f167143a9f3 Reviewed-by: Edward Welbourne <[email protected]>
-rw-r--r--util/locale_database/cldr.py3
-rw-r--r--util/locale_database/qlocalexml.py88
2 files changed, 52 insertions, 39 deletions
diff --git a/util/locale_database/cldr.py b/util/locale_database/cldr.py
index 6ed1d7a7793..4b61ba97047 100644
--- a/util/locale_database/cldr.py
+++ b/util/locale_database/cldr.py
@@ -352,7 +352,8 @@ class CldrAccess (object):
inheritance, where relevant."""
return LocaleScanner(name, self.__localeRoots(name), self.__rootLocale)
- def englishNaming(self, tag: str) -> Callable[[str], str]: # see QLocaleXmlWriter.enumData()
+ # see QLocaleXmlWriter.enumData()
+ def englishNaming(self, tag: str) -> Callable[[str, str], str]:
return self.__codeMap(tag).get
@property
diff --git a/util/locale_database/qlocalexml.py b/util/locale_database/qlocalexml.py
index 4545369801a..d1a6a6029a9 100644
--- a/util/locale_database/qlocalexml.py
+++ b/util/locale_database/qlocalexml.py
@@ -19,7 +19,7 @@ You can download jing from https://relaxng.org/jclark/jing.html if your
package manager lacks the jing package.
"""
-from typing import Callable, Iterable, Iterator
+from typing import Any, Callable, Iterable, Iterator, NoReturn
from xml.sax.saxutils import escape
from xml.dom import minidom
@@ -619,7 +619,8 @@ class QLocaleXmlWriter (object):
The output saved by this should conform to qlocalexml.rnc's
schema."""
- def __init__(self, cldrVersion, save = None, space = Spacer('\t')):
+ def __init__(self, cldrVersion: str, save: Callable[[str], int]|None = None,
+ space: Spacer = Spacer('\t')) -> None:
"""Set up to write digested CLDR data as QLocale XML.
First argument is the version of CLDR whose data we'll be
@@ -637,7 +638,7 @@ class QLocaleXmlWriter (object):
unmatched new tag and shrinks back on a close-tag (its parsing is
naive, but adequate to how this class uses it), while adding a newline
to each line."""
- self.__rawOutput = self.__printit if save is None else save
+ self.__rawOutput: Callable[[str], int] = self.__printit if save is None else save
self.__wrap = space
self.__write('<?xml version="1.0" encoding="UTF-8" ?>'
# A hint to emacs to make display nicer:
@@ -646,7 +647,7 @@ class QLocaleXmlWriter (object):
versionQt = qtVersion)
# Output of various sections, in their usual order:
- def enumData(self, code2name):
+ def enumData(self, code2name: Callable[[str], Callable[[str, str], str]]) -> None:
"""Output name/id/code tables for language, script and territory.
Parameter, code2name, is a function taking 'language',
@@ -662,14 +663,15 @@ class QLocaleXmlWriter (object):
self.__enumTable('script', script_map, code2name)
self.__enumTable('territory', territory_map, code2name)
# Prepare to detect any unused codes (see __writeLocale(), close()):
- self.__languages = set(p[1] for p in language_map.values()
- if not p[1].isspace())
- self.__scripts = set(p[1] for p in script_map.values()
- if p[1] != 'Zzzz')
- self.__territories = set(p[1] for p in territory_map.values()
- if p[1] != 'ZZ')
-
- def likelySubTags(self, entries):
+ self.__languages: set[str] = set(p[1] for p in language_map.values()
+ if not p[1].isspace())
+ self.__scripts: set[str] = set(p[1] for p in script_map.values()
+ if p[1] != 'Zzzz')
+ self.__territories: set[str] = set(p[1] for p in territory_map.values()
+ if p[1] != 'ZZ')
+
+ def likelySubTags(self, entries: Iterator[tuple[tuple[int, int, int, int],
+ tuple[int, int, int, int]]]) -> None:
self.__openTag('likelySubtags')
for have, give in entries:
self.__openTag('likelySubtag')
@@ -678,8 +680,12 @@ class QLocaleXmlWriter (object):
self.__closeTag('likelySubtag')
self.__closeTag('likelySubtags')
- def zoneData(self, alias, defaults, windowsIds,
- metamap, zones, territorial):
+ def zoneData(self, alias: dict[str, str],
+ defaults: dict[str, str],
+ windowsIds: dict[tuple[str, str], str],
+ metamap: dict[str, dict[str, str]],
+ zones: dict[str, tuple[tuple[int, int, str], ...]],
+ territorial: dict[str, str]) -> None:
self.__openTag('zoneAliases')
# iana is a single IANA ID
# name has the same form, but has been made redundant
@@ -709,7 +715,7 @@ class QLocaleXmlWriter (object):
self.inTag('landZone', iana, territory = code)
self.__closeTag('landZones')
- metaKey = {m: i for i, m in enumerate(sorted(
+ metaKey: dict[str, int] = {m: i for i, m in enumerate(sorted(
metamap, key = lambda m: m.lower()), 1)}
self.__openTag('metaZones')
@@ -730,7 +736,8 @@ class QLocaleXmlWriter (object):
self.__closeTag('zoneStory')
self.__closeTag('zoneStories')
- def locales(self, locales, calendars, en_US):
+ def locales(self, locales: dict[tuple[int, int, int, int], "Locale"], calendars: list[str],
+ en_US: tuple[int, int, int, int]) -> None:
"""Write the data for each locale.
First argument, locales, is the mapping whose values are the
@@ -740,7 +747,7 @@ class QLocaleXmlWriter (object):
tuple of numeric IDs that corresponds to en_US (needed to
provide fallbacks for the C locale)."""
- def writeLocale(locale, cal = calendars, this = self):
+ def writeLocale(locale: "Locale", cal = calendars, this = self) -> None:
this.__openTag('locale')
this.__writeLocale(locale, cal)
this.__writeLocaleZones(locale)
@@ -752,7 +759,7 @@ class QLocaleXmlWriter (object):
writeLocale(locales[key])
self.__closeTag('localeList')
- def inTag(self, tag, text, **attrs):
+ def inTag(self, tag: str, text: str, **attrs: int|str) -> None:
"""Writes an XML element with the given content.
First parameter, tag, is the element type; second, text, is the content
@@ -761,19 +768,19 @@ class QLocaleXmlWriter (object):
include in the opening tag."""
self.__write(f'<{self.__attrJoin(tag, attrs)}>{text}</{tag}>')
- def asTag(self, tag, **attrs):
+ def asTag(self, tag: str, **attrs: int|str) -> None:
"""Similar to inTag(), but with no content for the element."""
assert attrs, tag # No point to this otherwise
self.__write(f'<{self.__attrJoin(tag, attrs)} />')
- def safeInTag(self, tag, text, **attrs):
+ def safeInTag(self, tag: str, text: str, **attrs: int|str) -> None:
"""Similar to inTag(), when text isn't known to be XML-safe."""
if text.isascii():
self.inTag(tag, self.__xmlSafe(text), **attrs)
else:
self.__cdataInTag(tag, text, **attrs)
- def close(self, grumble):
+ def close(self, grumble: Callable[[str], int]) -> None:
"""Finish writing and grumble about any issues discovered."""
if self.__rawOutput != self.__complain:
self.__closeTag('localeDatabase')
@@ -794,14 +801,16 @@ class QLocaleXmlWriter (object):
# Implementation details
@staticmethod
- def __printit(text):
+ def __printit(text: str) -> int:
print(text, end='')
+ return 0
+
@staticmethod
- def __complain(text):
+ def __complain(text) -> NoReturn:
raise Error('Attempted to write data after closing :-(')
@staticmethod
- def __attrJoin(tag, attrs):
+ def __attrJoin(tag: str, attrs: dict[str, int|str]) -> str:
# Content of open-tag with given tag and attributes
if not attrs:
return tag
@@ -809,13 +818,14 @@ class QLocaleXmlWriter (object):
return f'{tag} {tail}'
@staticmethod
- def __xmlSafe(text):
+ def __xmlSafe(text: str) -> str:
return text.replace('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;')
- def __cdataInTag(self, tag, text, **attrs):
+ def __cdataInTag(self, tag: str, text: str, **attrs: int|str) -> None:
self.__write(f'<{self.__attrJoin(tag, attrs)}><![CDATA[{text}]]></{tag}>')
- def __enumTable(self, tag, table, code2name):
+ def __enumTable(self, tag: str, table: dict[int, tuple[str, str]],
+ code2name: Callable[[str], Callable[[str, str], str]]) -> None:
"""Writes a table of QLocale-enum-related data.
First parameter, tag, is 'language', 'script' or 'territory',
@@ -824,32 +834,34 @@ class QLocaleXmlWriter (object):
type. Last is the englishNaming method of the CldrAccess being used to
read CLDR data; it is used to map ISO codes to en.xml names."""
self.__openTag(f'{tag}List')
- enname = code2name(tag)
+ enname: Callable[[str, str], str] = code2name(tag)
for key, (name, code) in table.items():
self.safeInTag('naming', enname(code, name), id = key, code = code)
self.__closeTag(f'{tag}List')
- def __likelySubTag(self, tag, likely):
+ def __likelySubTag(self, tag: str, likely: tuple[int, int, int, int]) -> None:
self.asTag(tag, language = likely[0], script = likely[1],
territory = likely[2]) # variant = likely[3]
- def __writeLocale(self, locale, calendars):
+ def __writeLocale(self, locale: "Locale", calendars: list[str]) -> None:
locale.toXml(self.inTag, calendars)
self.__languages.discard(locale.language_code)
self.__scripts.discard(locale.script_code)
self.__territories.discard(locale.territory_code)
- def __writeLocaleZones(self, locale):
+ def __writeLocaleZones(self, locale: "Locale") -> None:
self.__writeZoneForms('regionZoneFormats', locale.regionZoneFormats)
self.__writeZoneNaming('zoneNaming', locale.zoneNaming)
self.__writeZoneNaming('metaZoneNaming', locale.metaZoneNaming)
- def __writeZoneNaming(self, group, naming):
+ def __writeZoneNaming(self, group: str,
+ naming: dict[str, dict[str, str|tuple[str|None, str|None, str|None]]]
+ ) -> None:
if not naming:
return
self.__openTag(group)
- for iana in sorted(naming.keys()):
- data = naming[iana]
+ for iana in sorted(naming.keys()): # str
+ data: dict[str, str|tuple[str|None, str|None, str|None]] = naming[iana]
self.__openTag('zoneNames', name=iana)
if 'exemplarCity' in data:
self.inTag('exemplar', data['exemplarCity'])
@@ -859,7 +871,7 @@ class QLocaleXmlWriter (object):
self.__closeTag('zoneNames')
self.__closeTag(group)
- def __writeZoneForms(self, group, forms):
+ def __writeZoneForms(self, group: str, forms: tuple[str|None, str|None, str|None]) -> None:
if all(x is None for x in forms):
return
self.__openTag('zoneForms', name=group)
@@ -868,13 +880,13 @@ class QLocaleXmlWriter (object):
self.safeInTag(tag, forms[i])
self.__closeTag('zoneForms')
- def __openTag(self, tag, **attrs):
+ def __openTag(self, tag: str, **attrs: int|str) -> None:
self.__write(f'<{self.__attrJoin(tag, attrs)}>')
- def __closeTag(self, tag):
+ def __closeTag(self, tag: str) -> None:
self.__write(f'</{tag}>')
- def __write(self, line):
+ def __write(self, line: str) -> None:
self.__rawOutput(self.__wrap(line))
class Locale (object):