Removed BaseCommand.stdin introduced in 116d39842d.

This option is not actually very useful in the general case
because it doesn't override sys.stdin.

It's still marginally useful for testing some features of
the createsuperuser command so it was moved there.
This commit also makes the detection of a TTY in createsuperuser
a bit more robust, after a suggestion of appolo13.
This commit is contained in:
Baptiste Mispelon 2014-02-18 00:01:03 +01:00
parent b78f9a12c8
commit 2a9ee49f3c
4 changed files with 34 additions and 28 deletions

View File

@ -50,6 +50,10 @@ class Command(BaseCommand):
option_list = BaseCommand.option_list option_list = BaseCommand.option_list
help = 'Used to create a superuser.' help = 'Used to create a superuser.'
def execute(self, *args, **options):
self.stdin = options.get('stdin', sys.stdin) # Used for testing
return super(Command, self).execute(*args, **options)
def handle(self, *args, **options): def handle(self, *args, **options):
username = options.get(self.UserModel.USERNAME_FIELD, None) username = options.get(self.UserModel.USERNAME_FIELD, None)
interactive = options.get('interactive') interactive = options.get('interactive')
@ -84,7 +88,7 @@ class Command(BaseCommand):
default_username = get_default_username() default_username = get_default_username()
try: try:
if not self.stdin.isatty(): if hasattr(self.stdin, 'isatty') and not self.stdin.isatty():
raise NotRunningInTTYException("Not running in a TTY") raise NotRunningInTTYException("Not running in a TTY")
# Get a username # Get a username

View File

@ -2,6 +2,7 @@ from __future__ import unicode_literals
from datetime import date from datetime import date
import locale import locale
import sys
from django.apps import apps from django.apps import apps
from django.contrib.auth import models, management from django.contrib.auth import models, management
@ -309,6 +310,34 @@ class CreatesuperuserManagementCommandTestCase(TestCase):
self.assertEqual(User._default_manager.count(), 0) self.assertEqual(User._default_manager.count(), 0)
self.assertIn("Superuser creation skipped", out.getvalue()) self.assertIn("Superuser creation skipped", out.getvalue())
def test_passing_stdin(self):
"""
You can pass a stdin object as an option and it should be
available on self.stdin.
If no such option is passed, it defaults to sys.stdin.
"""
user_data = {'username': 'foo', 'email': 'foo@example.com'}
sentinel = object()
command = createsuperuser.Command()
command.execute(
stdin=sentinel,
stdout=six.StringIO(),
interactive=False,
username='janet',
email='janet@example.com',
)
self.assertIs(command.stdin, sentinel)
command = createsuperuser.Command()
command.execute(
stdout=six.StringIO(),
interactive=False,
username='joe',
email='joe@example.com',
)
self.assertIs(command.stdin, sys.stdin)
class CustomUserModelValidationTestCase(TestCase): class CustomUserModelValidationTestCase(TestCase):
@override_settings(AUTH_USER_MODEL='auth.CustomUserNonListRequiredFields') @override_settings(AUTH_USER_MODEL='auth.CustomUserNonListRequiredFields')

View File

@ -306,7 +306,6 @@ class BaseCommand(object):
self.stderr = OutputWrapper(options.get('stderr', sys.stderr)) self.stderr = OutputWrapper(options.get('stderr', sys.stderr))
else: else:
self.stderr = OutputWrapper(options.get('stderr', sys.stderr), self.style.ERROR) self.stderr = OutputWrapper(options.get('stderr', sys.stderr), self.style.ERROR)
self.stdin = options.get('stdin', sys.stdin) # Useful for testing
if self.can_import_settings: if self.can_import_settings:
from django.conf import settings # NOQA from django.conf import settings # NOQA

View File

@ -61,32 +61,6 @@ class CommandTests(SimpleTestCase):
management.call_command('leave_locale_alone_true', stdout=out) management.call_command('leave_locale_alone_true', stdout=out)
self.assertEqual(out.getvalue(), "pl\n") self.assertEqual(out.getvalue(), "pl\n")
def test_passing_stdin(self):
"""
You can pass a stdin object to a command's options and it should be
available on self.stdin.
"""
class CustomCommand(BaseCommand):
def handle(self, *args, **kwargs):
pass
sentinel = object()
command = CustomCommand()
command.execute(stdin=sentinel, stdout=StringIO())
self.assertIs(command.stdin, sentinel)
def test_passing_stdin_default(self):
"""
If stdin is not passed as an option, the default should be sys.stdin.
"""
class CustomCommand(BaseCommand):
def handle(self, *args, **kwargs):
return 'OK'
command = CustomCommand()
command.execute(stdout=StringIO())
self.assertIs(command.stdin, sys.stdin)
class UtilsTests(SimpleTestCase): class UtilsTests(SimpleTestCase):