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.
This commit is contained in:
Michael Hudson-Doyle 2019-05-10 09:43:58 +12:00
parent 03bf8d4b0a
commit bdf33a2adf
9 changed files with 37 additions and 32 deletions

View File

@ -28,7 +28,7 @@ class ConsoleConf(Application):
project = "console_conf"
model_class = ConsoleConfModel
make_model = ConsoleConfModel
controllers = [
"Welcome",

View File

@ -14,9 +14,13 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
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):

View File

@ -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",

View File

@ -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):

View File

@ -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()

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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):