I went over the patches, syntax and everything looks fine, but I have to say I'm a little confused by some of the calls and variables, like current = self.instLang.getLangName(self.instLang.instLang) We have a lot of defaultLangName, countryLangName, canonLang, instLang etc so it's easy to get lost. And this: > +MIRROR_MANAGER_URL = "mirrors.fedoraproject.org" > +MIRROR_LIST_REQUEST = "/mirrorlist?repo=fedora-15&arch=i386" Will we need to change this every release? On Tue, 2011-10-04 at 15:46 +0200, Vratislav Podzimek wrote: > --- > pyanaconda/iw/language_gui.py | 20 ++++++++++++-- > pyanaconda/language.py | 43 +++++++++++++++++++++++++---- > pyanaconda/localeinfo.py | 7 ++++- > scripts/getlangnames.py | 2 +- > tests/pyanaconda_test/language_test.py | 22 ++++++++++++--- > tests/pyanaconda_test/localeinfo_test.py | 2 +- > 6 files changed, 79 insertions(+), 17 deletions(-) > > diff --git a/pyanaconda/iw/language_gui.py b/pyanaconda/iw/language_gui.py > index 34aa88d..245c5fa 100644 > --- a/pyanaconda/iw/language_gui.py > +++ b/pyanaconda/iw/language_gui.py > @@ -69,6 +69,17 @@ class LanguageWindow (InstallWindow): > > # LanguageWindow tag="lang" > def getScreen (self, anaconda): > + self.instLang = anaconda.instLanguage > + > + wait_window = gui.WaitWindow(_("Getting GeoIP information"), _("Trying to get GeoIP information.")) > + current = None > + try: > + guess = self.instLang.getGeoIPinfo() > + current = self.instLang.getCountryLang(guess) > + except ValueError: > + pass > + wait_window.pop() > + > mainBox = gtk.VBox (False, 10) > > hbox = gtk.HBox(False, 5) > @@ -84,8 +95,6 @@ class LanguageWindow (InstallWindow): > label.set_size_request(350, -1) > hbox.pack_start(label, False) > > - self.instLang = anaconda.instLanguage > - > self.listStore = gtk.ListStore(gobject.TYPE_STRING, > gobject.TYPE_STRING, > gobject.TYPE_STRING) > @@ -107,7 +116,12 @@ class LanguageWindow (InstallWindow): > self.listView.append_column(col) > self.listView.set_property("headers-visible", False) > > - current = self.instLang.getLangName(self.instLang.instLang) > + if not current: > + try: > + current = self.instLang.getLangName(self.instLang.instLang) > + except ValueError: > + current = self.instLang.defaultLangName > + > iter = self.listStore.get_iter_first() > while iter: > if self.listStore.get_value(iter, 1) == current: > diff --git a/pyanaconda/language.py b/pyanaconda/language.py > index 8a0d7f6..3ebacb3 100644 > --- a/pyanaconda/language.py > +++ b/pyanaconda/language.py > @@ -31,9 +31,15 @@ import localeinfo > from simpleconfig import SimpleConfigFile > import system_config_keyboard.keyboard as keyboard > > +import httplib > +import pyanaconda.network > + > import logging > log = logging.getLogger("anaconda") > > +MIRROR_MANAGER_URL = "mirrors.fedoraproject.org" > +MIRROR_LIST_REQUEST = "/mirrorlist?repo=fedora-15&arch=i386" > + > def langComponents(astring): > pattern = re.compile("(?P<language>[A-Za-z]+)(_(?P<territory>[A-Za-z]+))?(\.(?P<codeset>[-\w]+))?(@(?P<modifier>[-\w]+))?") > m = pattern.match(astring) > @@ -137,7 +143,7 @@ class Language(object): > f.close() > break > > - self.localeInfo = localeinfo.get(self._default) > + (self.localeInfo, self.countriesLangs) = localeinfo.get(self._default) > > # instLang must be set after localeInfo is populated, in case the > # current setting is unsupported by anaconda.. > @@ -225,11 +231,8 @@ class Language(object): > return self.localeInfo[l][2] > > def getLangName(self, lang): > - try: > - l = self._canonLang(lang) > - except ValueError: > - l = self._default > - > + """@raise ValueError: if lang is not recognized""" > + l = self._canonLang(lang) > return self.localeInfo[l][0] > > def getLangByName(self, name): > @@ -251,3 +254,31 @@ class Language(object): > > def writeKS(self, f): > f.write("lang %s\n" % self.info['LANG']) > + > + def getCountryLang(self, country_code): > + return self.countriesLangs.get(country_code, self.defaultLangName) > + > + @property > + def defaultLangName(self): > + return self.localeInfo[self._default][0] > + > + def getGeoIPinfo(self): > + if not pyanaconda.network.hasActiveNetDev(): > + log.info("Cannot get GeoIP information: network down") > + raise ValueError > + conn = httplib.HTTPSConnection(MIRROR_MANAGER_URL) > + conn.request("GET", MIRROR_LIST_REQUEST) > + response = conn.getresponse() > + data = response.read() > + lines = data.split("\n") > + > + match = re.search(r'country\s+=\s+([A-Z]+)', lines[0]) > + if match: > + country = match.group(1).upper() > + log.debug("Country guessed by GeoIP: {0}".format(country)) > + return country > + else: > + log.info("Cannot get GeoIP information: {0} {1}".format( > + response.status, response.reason)) > + raise ValueError > + > diff --git a/pyanaconda/localeinfo.py b/pyanaconda/localeinfo.py > index eefdf2e..9f90770 100644 > --- a/pyanaconda/localeinfo.py > +++ b/pyanaconda/localeinfo.py > @@ -30,6 +30,7 @@ import string > > def get(default): > localeInfo = {} > + countriesLangs = {} #country code (e.g. US) -> language code (e.g. en) > # nick -> (name, short name, font, keyboard, timezone) mapping > search = ('lang-table', '/tmp/updates/lang-table', '/etc/lang-table', > '/usr/share/anaconda/lang-table') > @@ -46,12 +47,16 @@ def get(default): > > localeInfo[l[3]] = (l[0], l[1], l[2], l[4], string.strip(l[5])) > > + if len(l) > 6: > + for country in l[6].split(","): > + countriesLangs[country] = l[0] > + > f.close() > break > > # Hard code this to prevent errors in the build environment. > localeInfo['C'] = localeInfo[default] > - return localeInfo > + return (localeInfo, countriesLangs) > > # Converts a single language into a "language search path". For example, > # fr_FR.utf8@euro would become "fr_FR.utf8@euro fr_FR.utf8 fr_FR fr" > diff --git a/scripts/getlangnames.py b/scripts/getlangnames.py > index 2e579a4..b794f5f 100644 > --- a/scripts/getlangnames.py > +++ b/scripts/getlangnames.py > @@ -23,7 +23,7 @@ import localeinfo > > import gettext > > -localeInfo = localeinfo.get("en_US.UTF-8") > +localeInfo = localeinfo.get("en_US.UTF-8")[0] > names = {} > for k in localeInfo.keys(): > found = False > diff --git a/tests/pyanaconda_test/language_test.py b/tests/pyanaconda_test/language_test.py > index daf500b..1eb31db 100644 > --- a/tests/pyanaconda_test/language_test.py > +++ b/tests/pyanaconda_test/language_test.py > @@ -211,26 +211,38 @@ class LanguageTest(mock.TestCase): > def get_lang_name_1_test(self): > import pyanaconda.language > lang = pyanaconda.language.Language() > - ret = lang.getLangName('en') > + try: > + ret = lang.getLangName('en') > + except ValueError: > + ret = lang.defaultLangName > self.assertEqual(ret, 'English') > > def get_lang_name_2_test(self): > import pyanaconda.language > lang = pyanaconda.language.Language() > - ret = lang.getLangName('cs') > + try: > + ret = lang.getLangName('cs') > + except ValueError: > + ret = lang.defaultLangName > self.assertEqual(ret, 'Czech') > > def get_lang_name_3_test(self): > import pyanaconda.language > lang = pyanaconda.language.Language() > - ret = lang.getLangName('he') > + try: > + ret = lang.getLangName('he') > + except ValueError: > + ret = lang.defaultLangName > self.assertEqual(ret, 'Hebrew') > > def get_lang_name_4_test(self): > import pyanaconda.language > lang = pyanaconda.language.Language() > - ret = lang.getLangName('foo') > - self.assertEqual(ret, 'English') > + try: > + ret = lang.getLangName('foo') > + except ValueError: > + ret = lang.defaultLangName > + self.assertEqual(ret, lang.defaultLangName) > > def get_lang_by_name_1_test(self): > import pyanaconda.language > diff --git a/tests/pyanaconda_test/localeinfo_test.py b/tests/pyanaconda_test/localeinfo_test.py > index 32f0916..bd42444 100644 > --- a/tests/pyanaconda_test/localeinfo_test.py > +++ b/tests/pyanaconda_test/localeinfo_test.py > @@ -26,7 +26,7 @@ English en latarcyrheb-sun16 en_US.UTF-8 us America/New_York\n > Hebrew he none he_IL.UTF-8 us Asia/Jerusalem""" > self.take_over_io(fs, localeinfo) > > - info = localeinfo.get("en_US.UTF-8") > + info = localeinfo.get("en_US.UTF-8")[0] > self.assertEqual( > info, > {'C': ('English', 'en', 'latarcyrheb-sun16', 'us', 'America/New_York'), -- Martin Gracik <mgracik@xxxxxxxxxx> _______________________________________________ Anaconda-devel-list mailing list Anaconda-devel-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/anaconda-devel-list