On Tue, 2011-10-04 at 16:50 +0200, Martin Gracik wrote: > 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. I absolutely agree, but there's not much I can do with it. I think the biggest problem is in naming an instance of pyanaconda/language.py:class Language as instLang when it itself has the instLang attribute. > > 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? Only every second. ;) This is a "non-sense" request, but there is no other option how to query Mirror Manager for the GeoIP information at the moment. And it doesn't make much sense to patch it somehow until we agree that we will really use it this way. -- Vratislav Podzimek > > > 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'), > _______________________________________________ Anaconda-devel-list mailing list Anaconda-devel-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/anaconda-devel-list