Commit 5b32d845 authored by Tarek Ziadé's avatar Tarek Ziadé

Merged revisions 68415 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/trunk

........
  r68415 | tarek.ziade | 2009-01-09 00:56:31 +0100 (Fri, 09 Jan 2009) | 1 line

  fixed #4394 make the storage of the password optional in .pypirc
........
parent 7da96ed6
...@@ -174,19 +174,23 @@ Your selection [default 1]: ''', log.INFO) ...@@ -174,19 +174,23 @@ Your selection [default 1]: ''', log.INFO)
log.INFO) log.INFO)
# possibly save the login # possibly save the login
if not self.has_config and code == 200: if code == 200:
self.announce(('I can store your PyPI login so future ' if self.has_config:
'submissions will be faster.'), log.INFO) # sharing the password in the distribution instance
self.announce('(the login will be stored in %s)' % \ # so the upload command can reuse it
self._get_rc_file(), log.INFO) self.distribution.password = password
else:
choice = 'X' self.announce(('I can store your PyPI login so future '
while choice.lower() not in 'yn': 'submissions will be faster.'), log.INFO)
choice = input('Save your login (y/N)?') self.announce('(the login will be stored in %s)' % \
if not choice: self._get_rc_file(), log.INFO)
choice = 'n' choice = 'X'
if choice.lower() == 'y': while choice.lower() not in 'yn':
self._store_pypirc(username, password) choice = input('Save your login (y/N)?')
if not choice:
choice = 'n'
if choice.lower() == 'y':
self._store_pypirc(username, password)
elif choice == '2': elif choice == '2':
data = {':action': 'user'} data = {':action': 'user'}
......
...@@ -48,6 +48,11 @@ class upload(PyPIRCCommand): ...@@ -48,6 +48,11 @@ class upload(PyPIRCCommand):
self.repository = config['repository'] self.repository = config['repository']
self.realm = config['realm'] self.realm = config['realm']
# getting the password from the distribution
# if previously set by the register command
if not self.password and self.distribution.password:
self.password = self.distribution.password
def run(self): def run(self):
if not self.distribution.dist_files: if not self.distribution.dist_files:
raise DistutilsOptionError("No dist file created in earlier command") raise DistutilsOptionError("No dist file created in earlier command")
......
...@@ -82,12 +82,12 @@ class PyPIRCCommand(Command): ...@@ -82,12 +82,12 @@ class PyPIRCCommand(Command):
for server in _servers: for server in _servers:
current = {'server': server} current = {'server': server}
current['username'] = config.get(server, 'username') current['username'] = config.get(server, 'username')
current['password'] = config.get(server, 'password')
# optional params # optional params
for key, default in (('repository', for key, default in (('repository',
self.DEFAULT_REPOSITORY), self.DEFAULT_REPOSITORY),
('realm', self.DEFAULT_REALM)): ('realm', self.DEFAULT_REALM),
('password', None)):
if config.has_option(server, key): if config.has_option(server, key):
current[key] = config.get(server, key) current[key] = config.get(server, key)
else: else:
......
...@@ -199,6 +199,7 @@ Common commands: (see '--help-commands' for more) ...@@ -199,6 +199,7 @@ Common commands: (see '--help-commands' for more)
self.extra_path = None self.extra_path = None
self.scripts = None self.scripts = None
self.data_files = None self.data_files = None
self.password = ''
# And now initialize bookkeeping stuff that can't be supplied by # And now initialize bookkeeping stuff that can't be supplied by
# the caller at all. 'command_obj' maps command names to # the caller at all. 'command_obj' maps command names to
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
import sys import sys
import os import os
import unittest import unittest
import getpass
from distutils.command.register import register from distutils.command.register import register
from distutils.core import Distribution from distutils.core import Distribution
...@@ -9,7 +10,27 @@ from distutils.core import Distribution ...@@ -9,7 +10,27 @@ from distutils.core import Distribution
from distutils.tests import support from distutils.tests import support
from distutils.tests.test_config import PYPIRC, PyPIRCCommandTestCase from distutils.tests.test_config import PYPIRC, PyPIRCCommandTestCase
class RawInputs(object): PYPIRC_NOPASSWORD = """\
[distutils]
index-servers =
server1
[server1]
username:me
"""
WANTED_PYPIRC = """\
[distutils]
index-servers =
pypi
[pypi]
username:tarek
password:password
"""
class Inputs(object):
"""Fakes user inputs.""" """Fakes user inputs."""
def __init__(self, *answers): def __init__(self, *answers):
self.answers = answers self.answers = answers
...@@ -21,18 +42,33 @@ class RawInputs(object): ...@@ -21,18 +42,33 @@ class RawInputs(object):
finally: finally:
self.index += 1 self.index += 1
WANTED_PYPIRC = """\ class FakeServer(object):
[distutils] """Fakes a PyPI server"""
index-servers = def __init__(self):
pypi self.calls = []
[pypi] def __call__(self, *args):
username:tarek # we want to compare them, so let's store
password:xxx # something comparable
""" els = list(args[0].items())
els.sort()
self.calls.append(tuple(els))
return 200, 'OK'
class registerTestCase(PyPIRCCommandTestCase): class registerTestCase(PyPIRCCommandTestCase):
def setUp(self):
PyPIRCCommandTestCase.setUp(self)
# patching the password prompt
self._old_getpass = getpass.getpass
def _getpass(prompt):
return 'password'
getpass.getpass = _getpass
def tearDown(self):
getpass.getpass = self._old_getpass
PyPIRCCommandTestCase.tearDown(self)
def test_create_pypirc(self): def test_create_pypirc(self):
# this test makes sure a .pypirc file # this test makes sure a .pypirc file
# is created when requested. # is created when requested.
...@@ -50,30 +86,17 @@ class registerTestCase(PyPIRCCommandTestCase): ...@@ -50,30 +86,17 @@ class registerTestCase(PyPIRCCommandTestCase):
# we shouldn't have a .pypirc file yet # we shouldn't have a .pypirc file yet
self.assert_(not os.path.exists(self.rc)) self.assert_(not os.path.exists(self.rc))
# patching raw_input and getpass.getpass # patching input and getpass.getpass
# so register gets happy # so register gets happy
# #
# Here's what we are faking : # Here's what we are faking :
# use your existing login (choice 1.) # use your existing login (choice 1.)
# Username : 'tarek' # Username : 'tarek'
# Password : 'xxx' # Password : 'password'
# Save your login (y/N)? : 'y' # Save your login (y/N)? : 'y'
inputs = RawInputs('1', 'tarek', 'y') inputs = Inputs('1', 'tarek', 'y')
from distutils.command import register as register_module from distutils.command import register as register_module
register_module.input = inputs.__call__ register_module.input = inputs.__call__
def _getpass(prompt):
return 'xxx'
register_module.getpass.getpass = _getpass
class FakeServer(object):
def __init__(self):
self.calls = []
def __call__(self, *args):
# we want to compare them, so let's store
# something comparable
els = sorted(args[0].items())
self.calls.append(tuple(els))
return 200, 'OK'
cmd.post_to_server = pypi_server = FakeServer() cmd.post_to_server = pypi_server = FakeServer()
...@@ -101,6 +124,24 @@ class registerTestCase(PyPIRCCommandTestCase): ...@@ -101,6 +124,24 @@ class registerTestCase(PyPIRCCommandTestCase):
self.assert_(len(pypi_server.calls), 2) self.assert_(len(pypi_server.calls), 2)
self.assert_(pypi_server.calls[0], pypi_server.calls[1]) self.assert_(pypi_server.calls[0], pypi_server.calls[1])
def test_password_not_in_file(self):
f = open(self.rc, 'w')
f.write(PYPIRC_NOPASSWORD)
f.close()
dist = Distribution()
cmd = register(dist)
cmd.post_to_server = FakeServer()
cmd._set_config()
cmd.finalize_options()
cmd.send_metadata()
# dist.password should be set
# therefore used afterwards by other commands
self.assertEquals(dist.password, 'password')
def test_suite(): def test_suite():
return unittest.makeSuite(registerTestCase) return unittest.makeSuite(registerTestCase)
......
...@@ -9,6 +9,17 @@ from distutils.core import Distribution ...@@ -9,6 +9,17 @@ from distutils.core import Distribution
from distutils.tests import support from distutils.tests import support
from distutils.tests.test_config import PYPIRC, PyPIRCCommandTestCase from distutils.tests.test_config import PYPIRC, PyPIRCCommandTestCase
PYPIRC_NOPASSWORD = """\
[distutils]
index-servers =
server1
[server1]
username:me
"""
class uploadTestCase(PyPIRCCommandTestCase): class uploadTestCase(PyPIRCCommandTestCase):
def test_finalize_options(self): def test_finalize_options(self):
...@@ -26,6 +37,24 @@ class uploadTestCase(PyPIRCCommandTestCase): ...@@ -26,6 +37,24 @@ class uploadTestCase(PyPIRCCommandTestCase):
('repository', 'http://pypi.python.org/pypi')): ('repository', 'http://pypi.python.org/pypi')):
self.assertEquals(getattr(cmd, attr), waited) self.assertEquals(getattr(cmd, attr), waited)
def test_saved_password(self):
# file with no password
f = open(self.rc, 'w')
f.write(PYPIRC_NOPASSWORD)
f.close()
# make sure it passes
dist = Distribution()
cmd = upload(dist)
cmd.finalize_options()
self.assertEquals(cmd.password, None)
# make sure we get it as well, if another command
# initialized it at the dist level
dist.password = 'xxx'
cmd = upload(dist)
cmd.finalize_options()
self.assertEquals(cmd.password, 'xxx')
def test_suite(): def test_suite():
return unittest.makeSuite(uploadTestCase) return unittest.makeSuite(uploadTestCase)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment