Comments below. On 09/05/2011 09:51 AM, Ales Kozumplik wrote:
After 0c662ebeaf4043ff2e2a1f7d09b527f4bf243047, we can not build due to imports problem during build time (importing pyanaconda.constants tries to import pyanaconda.__init__ which tries to import isys etc.). This change separates the language.py bits and the bits needed during build time. Includes new unit tests. --- pyanaconda/gui.py | 1 - pyanaconda/iw/progress_gui.py | 4 +- pyanaconda/language.py | 54 ++------------------ pyanaconda/localeinfo.py | 81 ++++++++++++++++++++++++++++++ pyanaconda/text.py | 2 +- scripts/getlangnames.py | 12 ++-- tests/pyanaconda_test/language_test.py | 12 ++-- tests/pyanaconda_test/localeinfo_test.py | 35 +++++++++++++ 8 files changed, 135 insertions(+), 66 deletions(-) create mode 100644 pyanaconda/localeinfo.py create mode 100644 tests/pyanaconda_test/localeinfo_test.py diff --git a/pyanaconda/gui.py b/pyanaconda/gui.py index e306852..bd17653 100755 --- a/pyanaconda/gui.py +++ b/pyanaconda/gui.py @@ -35,7 +35,6 @@ import shutil import gtk import gtk.glade import gobject -from language import expandLangs from constants import * from product import * import network diff --git a/pyanaconda/iw/progress_gui.py b/pyanaconda/iw/progress_gui.py index 2967092..93d4970 100644 --- a/pyanaconda/iw/progress_gui.py +++ b/pyanaconda/iw/progress_gui.py @@ -28,7 +28,7 @@ from pyanaconda import gui from pyanaconda.flags import flags from iw_gui import * from pyanaconda.constants import * -from pyanaconda import language +from pyanaconda import localeinfo import logging log = logging.getLogger("anaconda") @@ -87,7 +87,7 @@ class InstallProgressWindow (InstallWindow): langs = [] pixmaps = [] if (os.environ.has_key('LANG')): - langs = language.expandLangs(os.environ['LANG']) + langs = localeinfo.expandLangs(os.environ['LANG']) langs.append('') pixmaps = [] diff --git a/pyanaconda/language.py b/pyanaconda/language.py index b5dd94f..8a0d7f6 100644 --- a/pyanaconda/language.py +++ b/pyanaconda/language.py @@ -27,6 +27,7 @@ import locale import gettext from pyanaconda.constants import ROOT_PATH +import localeinfo from simpleconfig import SimpleConfigFile import system_config_keyboard.keyboard as keyboard @@ -38,32 +39,6 @@ def langComponents(astring): m = pattern.match(astring) return m.groupdict() -# 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" -def expandLangs(astring): - langs = [astring] - charset = None - base = None - - # remove charset ... - if '.' in astring: - langs.append(string.split(astring, '.')[0]) - - if '@' in astring: - charset = string.split(astring, '@')[1] - - if '_' in astring: - base = string.split(astring, '_')[0] - - if charset: - langs.append("%s@%s" % (base, charset)) - - langs.append(base) - else: - langs.append(astring[:2]) - - return langs - class Language(object): def _setInstLang(self, value): # Always store in its full form so we know what we're comparing with. @@ -147,7 +122,6 @@ class Language(object): self._default = "en_US.UTF-8" self.displayMode = display_mode self.info = {} - self.localeInfo = {} self.nativeLangNames = {} # English name -> native name mapping @@ -163,27 +137,7 @@ class Language(object): f.close() break - # nick -> (name, short name, font, keyboard, timezone) mapping - search = ('lang-table', '/tmp/updates/lang-table', '/etc/lang-table', - '/usr/share/anaconda/lang-table') - for path in search: - if os.access(path, os.R_OK): - f = open(path, "r") - for line in f.readlines(): - string.strip(line) - l = string.split(line, '\t') - - # throw out invalid lines - if len(l)< 6: - continue - - self.localeInfo[l[3]] = (l[0], l[1], l[2], l[4], string.strip(l[5])) - - f.close() - break - - # Hard code this to prevent errors in the build environment. - self.localeInfo['C'] = self.localeInfo[self._default] + self.localeInfo = localeinfo.get(self._default) # instLang must be set after localeInfo is populated, in case the # current setting is unsupported by anaconda.. @@ -199,7 +153,7 @@ class Language(object): fr_CA -> ValueError """ for key in self.localeInfo.keys(): - if lang in expandLangs(key): + if lang in localeinfo.expandLangs(key): return key raise ValueError @@ -229,7 +183,7 @@ class Language(object): return args def getCurrentLangSearchList(self): - return expandLangs(self.systemLang) + ['C'] + return localeinfo.expandLangs(self.systemLang) + ['C'] def getDefaultKeyboard(self): try: diff --git a/pyanaconda/localeinfo.py b/pyanaconda/localeinfo.py new file mode 100644 index 0000000..f036358 --- /dev/null +++ b/pyanaconda/localeinfo.py @@ -0,0 +1,81 @@ +# __init__.py +# Entry point for anaconda's storage configuration module.
No it's not.
+# +# Copyright (C) 2009 Red Hat, Inc.
2011
+# +# This copyrighted material is made available to anyone wishing to use, +# modify, copy, or redistribute it subject to the terms and conditions of +# the GNU General Public License v.2, or (at your option) any later version. +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY expressed or implied, including the implied warranties of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. You should have received a copy of the +# GNU General Public License along with this program; if not, write to the +# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. Any Red Hat trademarks that are incorporated in the +# source code or documentation are not subject to the GNU General Public +# License and may only be used or replicated with the express permission of +# Red Hat, Inc. +# + + +""" Basic locale operations useful during both Anaconda build time and run time. + + This module can be imported without importing pyanaconda/__init__.py and it + is desirable to keep it that way. +""" + +import os +import string + +def get(default): + localeInfo = {} + # nick -> (name, short name, font, keyboard, timezone) mapping + search = ('lang-table', '/tmp/updates/lang-table', '/etc/lang-table', + '/usr/share/anaconda/lang-table') + for path in search: + if os.access(path, os.R_OK): + f = open(path, "r") + for line in f.readlines(): + string.strip(line) + l = string.split(line, '\t') + + # throw out invalid lines + if len(l)< 6: + continue + + localeInfo[l[3]] = (l[0], l[1], l[2], l[4], string.strip(l[5])) + + f.close() + break + + # Hard code this to prevent errors in the build environment. + localeInfo['C'] = localeInfo[default] + return localeInfo + +# 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" +def expandLangs(astring): + langs = [astring] + charset = None + base = None + + # remove charset ... + if '.' in astring: + langs.append(string.split(astring, '.')[0]) + + if '@' in astring: + charset = string.split(astring, '@')[1] + + if '_' in astring: + base = string.split(astring, '_')[0] + + if charset: + langs.append("%s@%s" % (base, charset)) + + langs.append(base) + else: + langs.append(astring[:2]) + + return langs + diff --git a/pyanaconda/text.py b/pyanaconda/text.py index 6396f25..cb85bb5 100644 --- a/pyanaconda/text.py +++ b/pyanaconda/text.py @@ -32,7 +32,7 @@ import signal import parted import product import string -from language import expandLangs +from localeinfo import expandLangs from flags import flags from textw.constants_text import * from constants import * diff --git a/scripts/getlangnames.py b/scripts/getlangnames.py index bc3cced..2e579a4 100644 --- a/scripts/getlangnames.py +++ b/scripts/getlangnames.py @@ -19,26 +19,26 @@ import sys sys.path.append("..") -import language as language +import localeinfo import gettext -langs = language.Language() +localeInfo = localeinfo.get("en_US.UTF-8") names = {} -for k in langs.localeInfo.keys(): +for k in localeInfo.keys(): found = False - for l in language.expandLangs(k): + for l in localeinfo.expandLangs(k): try: f = open("../po/%s.gmo" %(l,)) except (OSError, IOError): continue cat = gettext.GNUTranslations(f) cat.set_output_charset("utf-8") - names[langs.localeInfo[k][0]] = cat.lgettext(langs.localeInfo[k][0]) + names[localeInfo[k][0]] = cat.lgettext(localeInfo[k][0]) found = True break if not found: - names[langs.localeInfo[k][0]] = langs.localeInfo[k][0] + names[localeInfo[k][0]] = localeInfo[k][0] nameList = names.keys() nameList.sort() diff --git a/tests/pyanaconda_test/language_test.py b/tests/pyanaconda_test/language_test.py index 3d4498a..daf500b 100644 --- a/tests/pyanaconda_test/language_test.py +++ b/tests/pyanaconda_test/language_test.py @@ -13,12 +13,7 @@ class LanguageTest(mock.TestCase): self.fs = mock.DiskIO() def fake_os_access(path, _): - return path == 'lang-table' or path == 'lang-names' - - self.fs.open('lang-table', 'w').write( - "Czech cs latarcyrheb-sun16 cs_CZ.UTF-8 cz-lat2 Europe/Prague\n" - "English en latarcyrheb-sun16 en_US.UTF-8 us America/New_York\n" - "Hebrew he none he_IL.UTF-8 us Asia/Jerusalem") + return path == 'lang-names' self.fs.open('lang-names', 'w').write( "Czech\tCestina\n" @@ -33,6 +28,11 @@ class LanguageTest(mock.TestCase): pyanaconda.language.os.access = fake_os_access pyanaconda.language.os.environ = {'LANG': ENVIRON_LANG} pyanaconda.language.locale = mock.Mock() + pyanaconda.language.localeinfo.get = mock.Mock(return_value={ + 'C': ('English', 'en', 'latarcyrheb-sun16', 'us', 'America/New_York'), + 'cs_CZ.UTF-8': ('Czech', 'cs', 'latarcyrheb-sun16', 'cz-lat2', 'Europe/Prague'), + 'en_US.UTF-8': ('English', 'en', 'latarcyrheb-sun16', 'us', 'America/New_York'), + 'he_IL.UTF-8': ('Hebrew', 'he', 'none', 'us', 'Asia/Jerusalem')}) def tearDown(self): self.tearDownModules() diff --git a/tests/pyanaconda_test/localeinfo_test.py b/tests/pyanaconda_test/localeinfo_test.py new file mode 100644 index 0000000..32f0916 --- /dev/null +++ b/tests/pyanaconda_test/localeinfo_test.py @@ -0,0 +1,35 @@ +import mock + +class LocaleinfoTest(mock.TestCase): + def setUp(self): + self.setupModules( + ['_isys', 'logging', 'pyanaconda.anaconda_log', 'block']) + + import pyanaconda + pyanaconda.anaconda_log = mock.Mock() + + def tearDown(self): + self.tearDownModules() + + def expandLangs_test(self): + from pyanaconda import localeinfo + exp = localeinfo.expandLangs("fr_FR.utf8@euro") + self.assertEqual(exp, ['fr_FR.utf8@euro', 'fr_FR', 'fr@euro', 'fr']) + + def get_test(self): + from pyanaconda import localeinfo + + fs = mock.DiskIO() + fs['/lang-table'] = """ +Czech cs latarcyrheb-sun16 cs_CZ.UTF-8 cz-lat2 Europe/Prague\n +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") + self.assertEqual( + info, + {'C': ('English', 'en', 'latarcyrheb-sun16', 'us', 'America/New_York'), + 'cs_CZ.UTF-8': ('Czech', 'cs', 'latarcyrheb-sun16', 'cz-lat2', 'Europe/Prague'), + 'en_US.UTF-8': ('English', 'en', 'latarcyrheb-sun16', 'us', 'America/New_York'), + 'he_IL.UTF-8': ('Hebrew', 'he', 'none', 'us', 'Asia/Jerusalem')})
-- David Cantrell <dcantrell@xxxxxxxxxx> Supervisor, Installer Engineering Team Red Hat, Inc. | Westford, MA | EST5EDT _______________________________________________ Anaconda-devel-list mailing list Anaconda-devel-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/anaconda-devel-list