From bdf33a2adf08c85f7a9d5a0674d8dcd12d7d9492 Mon Sep 17 00:00:00 2001 From: Michael Hudson-Doyle Date: Fri, 10 May 2019 09:43:58 +1200 Subject: [PATCH] make SubiquityModel objects easier to construct So I can write a unittest more easily. This involves shuffling around how locale changes are done but as my new design document says the "controller also manages the relationship between the outside world and the model and views" this does make things more consistent. --- console_conf/core.py | 2 +- subiquity/controllers/welcome.py | 21 +++++++++++++++++---- subiquity/core.py | 6 +++++- subiquity/models/locale.py | 13 ++----------- subiquity/models/subiquity.py | 16 +++++++--------- subiquity/ui/views/tests/test_welcome.py | 3 +-- subiquity/ui/views/welcome.py | 5 ++--- subiquitycore/core.py | 2 +- subiquitycore/i18n.py | 1 + 9 files changed, 37 insertions(+), 32 deletions(-) diff --git a/console_conf/core.py b/console_conf/core.py index 3db4ce5b..8897fcc0 100644 --- a/console_conf/core.py +++ b/console_conf/core.py @@ -28,7 +28,7 @@ class ConsoleConf(Application): project = "console_conf" - model_class = ConsoleConfModel + make_model = ConsoleConfModel controllers = [ "Welcome", diff --git a/subiquity/controllers/welcome.py b/subiquity/controllers/welcome.py index eaa55c31..7862864c 100644 --- a/subiquity/controllers/welcome.py +++ b/subiquity/controllers/welcome.py @@ -14,9 +14,13 @@ # along with this program. If not, see . import logging +import os + from subiquitycore.controller import BaseController + from subiquity.ui.views import WelcomeView + log = logging.getLogger('subiquity.controllers.welcome') @@ -28,15 +32,24 @@ class WelcomeController(BaseController): self.answers = self.all_answers.get("Welcome", {}) log.debug("Welcome: answers=%s", self.answers) + def start(self): + lang = os.environ.get("LANG") + if lang.endswith(".UTF-8"): + lang = lang.rsplit('.', 1)[0] + for code, name in self.model.supported_languages: + if code == lang: + self.model.switch_language(code) + def default(self): view = WelcomeView(self.model, self) self.ui.set_body(view) if 'lang' in self.answers: - self.model.switch_language(self.answers['lang']) - self.done() + self.done(self.answers['lang']) - def done(self): - log.debug("WelcomeController.done next-screen") + def done(self, code): + log.debug("WelcomeController.done %s next-screen") + self.signal.emit_signal('l10n:language-selected', code) + self.model.switch_language(code) self.signal.emit_signal('next-screen') def cancel(self): diff --git a/subiquity/core.py b/subiquity/core.py index 5f0d4edd..a3bb5b7f 100644 --- a/subiquity/core.py +++ b/subiquity/core.py @@ -36,7 +36,11 @@ class Subiquity(Application): project = "subiquity" - model_class = SubiquityModel + def make_model(self, common): + root = '/' + if common['opts'].dry_run: + root = os.path.abspath('.subiquity') + return SubiquityModel(root, common['opts'].sources) controllers = [ "Welcome", diff --git a/subiquity/models/locale.py b/subiquity/models/locale.py index efe157d5..57c17824 100644 --- a/subiquity/models/locale.py +++ b/subiquity/models/locale.py @@ -15,9 +15,10 @@ import gettext import logging -import os + from subiquitycore import i18n + log = logging.getLogger('subiquity.models.locale') @@ -48,15 +49,6 @@ class LocaleModel(object): ] selected_language = None - def __init__(self, signal): - self.signal = signal - lang = os.environ.get("LANG") - if lang.endswith(".UTF-8"): - lang = lang.rsplit('.', 1)[0] - for code, name in self.supported_languages: - if code == lang: - self.switch_language(code) - def get_languages(self): languages = [] for code, name in self.supported_languages: @@ -70,7 +62,6 @@ class LocaleModel(object): def switch_language(self, code): self.selected_language = code - self.signal.emit_signal('l10n:language-selected', code) i18n.switch_language(code) def __repr__(self): diff --git a/subiquity/models/subiquity.py b/subiquity/models/subiquity.py index 05f8fc66..d4766f5f 100644 --- a/subiquity/models/subiquity.py +++ b/subiquity/models/subiquity.py @@ -68,18 +68,16 @@ class SubiquityModel: target = '/target' - def __init__(self, common): - self.root = '/' - self.opts = common['opts'] - if self.opts.dry_run: - self.root = os.path.abspath(".subiquity") - self.target = self.root + def __init__(self, root, sources=()): + self.root = root + if root != '/': + self.target = root - self.locale = LocaleModel(common['signal']) + self.locale = LocaleModel() self.keyboard = KeyboardModel(self.root) self.installpath = InstallpathModel( target=self.target, - sources=common['opts'].sources) + sources=sources) self.network = NetworkModel(support_wlan=False) self.proxy = ProxyModel() self.mirror = MirrorModel() @@ -101,7 +99,7 @@ class SubiquityModel: def get_target_groups(self): command = ['chroot', self.target, 'getent', 'group'] - if self.opts.dry_run: + if self.root != '/': del command[:2] cp = run_command(command, check=True) groups = set() diff --git a/subiquity/ui/views/tests/test_welcome.py b/subiquity/ui/views/tests/test_welcome.py index db4c3450..adc28059 100644 --- a/subiquity/ui/views/tests/test_welcome.py +++ b/subiquity/ui/views/tests/test_welcome.py @@ -24,8 +24,7 @@ class WelcomeViewTests(unittest.TestCase): view = self.make_view_with_languages([('code', 'native')]) but = view_helpers.find_button_matching(view, "^native$") view_helpers.click(but) - view.model.switch_language.assert_called_once_with("code") - view.controller.done.assert_called_once_with() + view.controller.done.assert_called_once_with('code') def test_initial_focus(self): # The initial focus for the view is the button for the first diff --git a/subiquity/ui/views/welcome.py b/subiquity/ui/views/welcome.py index bf10462f..67d2a599 100644 --- a/subiquity/ui/views/welcome.py +++ b/subiquity/ui/views/welcome.py @@ -56,6 +56,5 @@ class WelcomeView(BaseView): return lb def confirm(self, sender, code): - self.model.switch_language(code) - log.debug('calling installpath') - self.controller.done() + log.debug('WelcomeController %s', code) + self.controller.done(code) diff --git a/subiquitycore/core.py b/subiquitycore/core.py index b8ed3652..f095174a 100644 --- a/subiquitycore/core.py +++ b/subiquitycore/core.py @@ -477,7 +477,7 @@ class Application: log.debug("Running event loop: {}".format( self.common['loop'].event_loop)) - self.common['base_model'] = self.model_class(self.common) + self.common['base_model'] = self.make_model(self.common) try: if self.common['opts'].scripts: self.run_scripts(self.common['opts'].scripts) diff --git a/subiquitycore/i18n.py b/subiquitycore/i18n.py index b9740423..ed4f6643 100644 --- a/subiquitycore/i18n.py +++ b/subiquitycore/i18n.py @@ -29,6 +29,7 @@ syslog.syslog('Final localedir is ' + localedir) def switch_language(code='en_US'): + syslog.syslog('switch_language ' + code) fake_trans = os.environ.get("FAKE_TRANSLATE", "0") if code != 'en_US' and fake_trans == "mangle": def my_gettext(message):