[MERGE] Add get_username() call to the UIFactory.

Vincent Ladeuil v.ladeuil+lp at free.fr
Tue Apr 7 11:25:22 BST 2009


>>>>> "Jelmer" == Jelmer Vernooij <jelmer at samba.org> writes:

<snip/>

    Jelmer> === modified file 'bzrlib/tests/test_ui.py'
    Jelmer> --- bzrlib/tests/test_ui.py	2009-03-23 14:59:43 +0000
    Jelmer> +++ bzrlib/tests/test_ui.py	2009-04-02 13:36:58 +0000
    Jelmer> @@ -254,6 +254,44 @@
    Jelmer>          finally:
    Jelmer>              pb.finished()
 
    Jelmer> +    def test_silent_ui_getusername(self):
    Jelmer> +        factory = SilentUIFactory()
    Jelmer> +        factory.stdin = StringIO("someuser\n\n")
    Jelmer> +        factory.stdout = StringIO()
    Jelmer> +        self.assertEquals(None, 
    Jelmer> +            factory.get_username(u'Hello\u1234 %(host)s', host=u'some\u1234'))
    Jelmer> +        self.assertEquals("", factory.stdout.getvalue())
    Jelmer> +        self.assertEquals("someuser\n\n", factory.stdin.getvalue())
    Jelmer> +
    Jelmer> +    def test_text_ui_getusername(self):
    Jelmer> +        factory = TextUIFactory(None, None, None)
    Jelmer> +        factory.stdin = StringIO("someuser\n\n")
    Jelmer> +        factory.stdout = StringIO()
    Jelmer> +        factory.stdout.encoding = "utf8"
    Jelmer> +        # there is no output from the base factory
    Jelmer> +        self.assertEqual("someuser", 
    Jelmer> +            factory.get_username('Hello %(host)s', host='some'))
    Jelmer> +        self.assertEquals("Hello some: ", factory.stdout.getvalue())
    Jelmer> +        self.assertEqual("", factory.get_username("Gebruiker"))
    Jelmer> +        # stdin should be empty
    Jelmer> +        self.assertEqual('', factory.stdin.readline())

Any reason to *not* use stdin.getvalue() here ? Using readline()
introduces some fuzzy feeling (did we already reach EOF or not ?)
I'd prefer to avoid.

    Jelmer> +
    Jelmer> +    def test_text_ui_getusername_utf8(self):
    Jelmer> +        ui = TestUIFactory(stdin=u'someuser\u1234'.encode('utf8'),
    Jelmer> +                           stdout=StringIOWrapper())
    Jelmer> +        ui.stdin.encoding = "utf8"
    Jelmer> +        ui.stdout.encoding = ui.stdin.encoding
    Jelmer> +        pb = ui.nested_progress_bar()
    Jelmer> +        try:
    Jelmer> +            # there is no output from the base factory
    Jelmer> +            username = ui.get_username(u'Hello\u1234 %(host)s',
    Jelmer> +                host=u'some\u1234')
    Jelmer> +            self.assertEquals(u"someuser\u1234", username.decode('utf8'))
    Jelmer> +            self.assertEquals(ui.stdout.getvalue().decode("utf8"),
    Jelmer> +              u"Hello\u1234 some\u1234: ")

Use assert(expected, actual) consistently please.

    Jelmer> === modified file 'bzrlib/ui/__init__.py'
    Jelmer> --- bzrlib/ui/__init__.py	2009-04-02 17:41:41 +0000
    Jelmer> +++ bzrlib/ui/__init__.py	2009-04-03 17:19:39 +0000
    Jelmer> @@ -197,6 +197,20 @@
    Jelmer>          # as opposed to 'my password is empty' -- does it matter?
    Jelmer>          return self.get_non_echoed_password()
 
    Jelmer> +    def get_username(self, prompt, **kwargs):
    Jelmer> +        """Prompt the user for a password.
    Jelmer> +
    Jelmer> +        :param prompt: The prompt to present the user
    Jelmer> +        :param kwargs: Arguments which will be expanded into the prompt.
    Jelmer> +                       This lets front ends display different things if
    Jelmer> +                       they so choose.
    Jelmer> +        :return: The username string, return None if the user
    Jelmer> +                 canceled the request.

I'm afraid you can't return None with that implementation.

    Jelmer> +        """
    Jelmer> +        prompt += ': '
    Jelmer> +        self.prompt(prompt, **kwargs)
    Jelmer> +        return self.stdin.readline().rstrip("\n")
    Jelmer> +

... or rstrip will barf.

See get_non_echoed_password() for an alternate implementation.

Those remarks are minor enough to get addressed without
resubmitting, so:

BB:tweak

Feel free to resubmit if you have concerns,

     Vincent



More information about the bazaar mailing list