Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
S
setuptools
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jérome Perrin
setuptools
Commits
65014624
Commit
65014624
authored
May 11, 2008
by
Andrew M. Kuchling
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
#1858: re-apply patch for this, adding the missing files
parent
a76f1b75
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
251 additions
and
80 deletions
+251
-80
command/register.py
command/register.py
+49
-48
command/upload.py
command/upload.py
+13
-28
core.py
core.py
+1
-0
dist.py
dist.py
+3
-4
tests/test_config.py
tests/test_config.py
+105
-0
tests/test_dist.py
tests/test_dist.py
+46
-0
tests/test_upload.py
tests/test_upload.py
+34
-0
No files found.
command/register.py
View file @
65014624
...
...
@@ -8,37 +8,29 @@ Implements the Distutils 'register' command (register with the repository).
__revision__
=
"$Id$"
import
os
,
string
,
urllib2
,
getpass
,
urlparse
import
StringIO
,
ConfigParser
import
StringIO
from
distutils.core
import
Command
from
distutils.core
import
PyPIRC
Command
from
distutils.errors
import
*
from
distutils
import
log
class
register
(
Command
):
class
register
(
PyPIRC
Command
):
description
=
(
"register the distribution with the Python package index"
)
DEFAULT_REPOSITORY
=
'http://pypi.python.org/pypi'
user_options
=
[
(
'repository='
,
'r'
,
"url of repository [default: %s]"
%
DEFAULT_REPOSITORY
),
user_options
=
PyPIRCCommand
.
user_options
+
[
(
'list-classifiers'
,
None
,
'list the valid Trove classifiers'
),
(
'show-response'
,
None
,
'display full response text from server'
),
]
boolean_options
=
[
'verify'
,
'show-response'
,
'list-classifiers'
]
boolean_options
=
PyPIRCCommand
.
boolean_options
+
[
'verify'
,
'list-classifiers'
]
def
initialize_options
(
self
):
self
.
repository
=
None
self
.
show_response
=
0
PyPIRCCommand
.
initialize_options
(
self
)
self
.
list_classifiers
=
0
def
finalize_options
(
self
):
if
self
.
repository
is
None
:
self
.
repository
=
self
.
DEFAULT_REPOSITORY
def
run
(
self
):
self
.
finalize_options
()
self
.
_set_config
()
self
.
check_metadata
()
if
self
.
dry_run
:
self
.
verify_metadata
()
...
...
@@ -77,6 +69,23 @@ class register(Command):
"or (maintainer and maintainer_email) "
+
"must be supplied"
)
def
_set_config
(
self
):
''' Reads the configuration file and set attributes.
'''
config
=
self
.
_read_pypirc
()
if
config
!=
{}:
self
.
username
=
config
[
'username'
]
self
.
password
=
config
[
'password'
]
self
.
repository
=
config
[
'repository'
]
self
.
realm
=
config
[
'realm'
]
self
.
has_config
=
True
else
:
if
self
.
repository
not
in
(
'pypi'
,
self
.
DEFAULT_REPOSITORY
):
raise
ValueError
(
'%s not found in .pypirc'
%
self
.
repository
)
if
self
.
repository
==
'pypi'
:
self
.
repository
=
self
.
DEFAULT_REPOSITORY
self
.
has_config
=
False
def
classifiers
(
self
):
''' Fetch the list of classifiers from the server.
'''
...
...
@@ -90,6 +99,7 @@ class register(Command):
(
code
,
result
)
=
self
.
post_to_server
(
self
.
build_post_data
(
'verify'
))
print
'Server response (%s): %s'
%
(
code
,
result
)
def
send_metadata
(
self
):
''' Send the metadata to the package index server.
...
...
@@ -99,10 +109,14 @@ class register(Command):
First we try to read the username/password from $HOME/.pypirc,
which is a ConfigParser-formatted file with a section
[
server-login
] containing username and password entries (both
[
distutils
] containing username and password entries (both
in clear text). Eg:
[server-login]
[distutils]
index-servers =
pypi
[pypi]
username: fred
password: sekrit
...
...
@@ -114,21 +128,15 @@ class register(Command):
3. set the password to a random string and email the user.
'''
choice
=
'x'
username
=
password
=
''
# see if we can short-cut and get the username/password from the
# config
config
=
None
if
'HOME'
in
os
.
environ
:
rc
=
os
.
path
.
join
(
os
.
environ
[
'HOME'
],
'.pypirc'
)
if
os
.
path
.
exists
(
rc
):
print
'Using PyPI login from %s'
%
rc
config
=
ConfigParser
.
ConfigParser
()
config
.
read
(
rc
)
username
=
config
.
get
(
'server-login'
,
'username'
)
password
=
config
.
get
(
'server-login'
,
'password'
)
choice
=
'1'
if
self
.
has_config
:
choice
=
'1'
username
=
self
.
username
password
=
self
.
password
else
:
choice
=
'x'
username
=
password
=
''
# get the user's login info
choices
=
'1 2 3 4'
.
split
()
...
...
@@ -155,32 +163,24 @@ Your selection [default 1]: ''',
# set up the authentication
auth
=
urllib2
.
HTTPPasswordMgr
()
host
=
urlparse
.
urlparse
(
self
.
repository
)[
1
]
auth
.
add_password
(
'pypi'
,
host
,
username
,
password
)
auth
.
add_password
(
self
.
realm
,
host
,
username
,
password
)
# send the info to the server and report the result
code
,
result
=
self
.
post_to_server
(
self
.
build_post_data
(
'submit'
),
auth
)
print
'Server response (%s): %s'
%
(
code
,
result
)
print
'Server response (%s): %s'
%
(
code
,
result
)
# possibly save the login
if
'HOME'
in
os
.
environ
and
config
is
None
and
code
==
200
:
rc
=
os
.
path
.
join
(
os
.
environ
[
'HOME'
],
'.pypirc'
)
if
not
self
.
has_config
and
code
==
200
:
print
'I can store your PyPI login so future submissions will be faster.'
print
'(the login will be stored in %s)'
%
rc
print
'(the login will be stored in %s)'
%
self
.
_get_rc_file
()
choice
=
'X'
while
choice
.
lower
()
not
in
'yn'
:
choice
=
raw_input
(
'Save your login (y/N)?'
)
if
not
choice
:
choice
=
'n'
if
choice
.
lower
()
==
'y'
:
f
=
open
(
rc
,
'w'
)
f
.
write
(
'[server-login]
\
n
username:%s
\
n
password:%s
\
n
'
%
(
username
,
password
))
f
.
close
()
try
:
os
.
chmod
(
rc
,
0600
)
except
:
pass
self
.
_store_pypirc
(
username
,
password
)
elif
choice
==
'2'
:
data
=
{
':action'
:
'user'
}
data
[
'name'
]
=
data
[
'password'
]
=
data
[
'email'
]
=
''
...
...
@@ -243,7 +243,8 @@ Your selection [default 1]: ''',
def
post_to_server
(
self
,
data
,
auth
=
None
):
''' Post a query to the server, and return a string response.
'''
self
.
announce
(
'Registering %s to %s'
%
(
data
[
'name'
],
self
.
repository
),
log
.
INFO
)
# Build up the MIME payload for the urllib2 POST data
boundary
=
'--------------GHSKFJDLGDS7543FJKLFHRE75642756743254'
sep_boundary
=
'
\
n
--'
+
boundary
...
...
command/upload.py
View file @
65014624
...
...
@@ -3,7 +3,7 @@
Implements the Distutils 'upload' subcommand (upload package to PyPI)."""
from
distutils.errors
import
*
from
distutils.core
import
Command
from
distutils.core
import
PyPIRC
Command
from
distutils.spawn
import
spawn
from
distutils
import
log
from
hashlib
import
md5
...
...
@@ -16,53 +16,38 @@ import base64
import
urlparse
import
cStringIO
as
StringIO
class
upload
(
Command
):
class
upload
(
PyPIRC
Command
):
description
=
"upload binary package to PyPI"
DEFAULT_REPOSITORY
=
'http://pypi.python.org/pypi'
user_options
=
[
(
'repository='
,
'r'
,
"url of repository [default: %s]"
%
DEFAULT_REPOSITORY
),
(
'show-response'
,
None
,
'display full response text from server'
),
user_options
=
PyPIRCCommand
.
user_options
+
[
(
'sign'
,
's'
,
'sign files to upload using gpg'
),
(
'identity='
,
'i'
,
'GPG identity used to sign files'
),
]
boolean_options
=
[
'show-response'
,
'sign'
]
boolean_options
=
PyPIRCCommand
.
boolean_options
+
[
'sign'
]
def
initialize_options
(
self
):
PyPIRCCommand
.
initialize_options
(
self
)
self
.
username
=
''
self
.
password
=
''
self
.
repository
=
''
self
.
show_response
=
0
self
.
sign
=
False
self
.
identity
=
None
def
finalize_options
(
self
):
PyPIRCCommand
.
finalize_options
(
self
)
if
self
.
identity
and
not
self
.
sign
:
raise
DistutilsOptionError
(
"Must use --sign for --identity to have meaning"
)
if
'HOME'
in
os
.
environ
:
rc
=
os
.
path
.
join
(
os
.
environ
[
'HOME'
],
'.pypirc'
)
if
os
.
path
.
exists
(
rc
):
self
.
announce
(
'Using PyPI login from %s'
%
rc
)
config
=
ConfigParser
.
ConfigParser
({
'username'
:
''
,
'password'
:
''
,
'repository'
:
''
})
config
.
read
(
rc
)
if
not
self
.
repository
:
self
.
repository
=
config
.
get
(
'server-login'
,
'repository'
)
if
not
self
.
username
:
self
.
username
=
config
.
get
(
'server-login'
,
'username'
)
if
not
self
.
password
:
self
.
password
=
config
.
get
(
'server-login'
,
'password'
)
if
not
self
.
repository
:
self
.
repository
=
self
.
DEFAULT_REPOSITORY
config
=
self
.
_read_pypirc
()
if
config
!=
{}:
self
.
username
=
config
[
'username'
]
self
.
password
=
config
[
'password'
]
self
.
repository
=
config
[
'repository'
]
self
.
realm
=
config
[
'realm'
]
def
run
(
self
):
if
not
self
.
distribution
.
dist_files
:
...
...
core.py
View file @
65014624
...
...
@@ -20,6 +20,7 @@ from distutils.util import grok_environment_error
# Mainly import these so setup scripts can "from distutils.core import" them.
from
distutils.dist
import
Distribution
from
distutils.cmd
import
Command
from
distutils.config
import
PyPIRCCommand
from
distutils.extension
import
Extension
# This is a barebones help message generated displayed when the user
...
...
dist.py
View file @
65014624
...
...
@@ -343,10 +343,9 @@ Common commands: (see '--help-commands' for more)
user_filename
=
"pydistutils.cfg"
# And look for the user config file
if
'HOME'
in
os
.
environ
:
user_file
=
os
.
path
.
join
(
os
.
environ
.
get
(
'HOME'
),
user_filename
)
if
os
.
path
.
isfile
(
user_file
):
files
.
append
(
user_file
)
user_file
=
os
.
path
.
join
(
os
.
path
.
expanduser
(
'~'
),
user_filename
)
if
os
.
path
.
isfile
(
user_file
):
files
.
append
(
user_file
)
# All platforms support local setup.cfg
local_file
=
"setup.cfg"
...
...
tests/test_config.py
0 → 100644
View file @
65014624
"""Tests for distutils.pypirc.pypirc."""
import
sys
import
os
import
unittest
from
distutils.core
import
PyPIRCCommand
from
distutils.core
import
Distribution
from
distutils.tests
import
support
PYPIRC
=
"""
\
[distutils]
index-servers =
server1
server2
[server1]
username:me
password:secret
[server2]
username:meagain
password: secret
realm:acme
repository:http://another.pypi/
"""
PYPIRC_OLD
=
"""
\
[server-login]
username:tarek
password:secret
"""
class
PyPIRCCommandTestCase
(
support
.
TempdirManager
,
unittest
.
TestCase
):
def
setUp
(
self
):
"""Patches the environment."""
if
os
.
environ
.
has_key
(
'HOME'
):
self
.
_old_home
=
os
.
environ
[
'HOME'
]
else
:
self
.
_old_home
=
None
curdir
=
os
.
path
.
dirname
(
__file__
)
os
.
environ
[
'HOME'
]
=
curdir
self
.
rc
=
os
.
path
.
join
(
curdir
,
'.pypirc'
)
self
.
dist
=
Distribution
()
class
command
(
PyPIRCCommand
):
def
__init__
(
self
,
dist
):
PyPIRCCommand
.
__init__
(
self
,
dist
)
def
initialize_options
(
self
):
pass
finalize_options
=
initialize_options
self
.
_cmd
=
command
def
tearDown
(
self
):
"""Removes the patch."""
if
self
.
_old_home
is
None
:
del
os
.
environ
[
'HOME'
]
else
:
os
.
environ
[
'HOME'
]
=
self
.
_old_home
if
os
.
path
.
exists
(
self
.
rc
):
os
.
remove
(
self
.
rc
)
def
test_server_registration
(
self
):
# This test makes sure PyPIRCCommand knows how to:
# 1. handle several sections in .pypirc
# 2. handle the old format
# new format
f
=
open
(
self
.
rc
,
'w'
)
try
:
f
.
write
(
PYPIRC
)
finally
:
f
.
close
()
cmd
=
self
.
_cmd
(
self
.
dist
)
config
=
cmd
.
_read_pypirc
()
config
=
config
.
items
()
config
.
sort
()
waited
=
[(
'password'
,
'secret'
),
(
'realm'
,
'pypi'
),
(
'repository'
,
'http://pypi.python.org/pypi'
),
(
'server'
,
'server1'
),
(
'username'
,
'me'
)]
self
.
assertEquals
(
config
,
waited
)
# old format
f
=
open
(
self
.
rc
,
'w'
)
f
.
write
(
PYPIRC_OLD
)
f
.
close
()
config
=
cmd
.
_read_pypirc
()
config
=
config
.
items
()
config
.
sort
()
waited
=
[(
'password'
,
'secret'
),
(
'realm'
,
'pypi'
),
(
'repository'
,
'http://pypi.python.org/pypi'
),
(
'server'
,
'server-login'
),
(
'username'
,
'tarek'
)]
self
.
assertEquals
(
config
,
waited
)
def
test_suite
():
return
unittest
.
makeSuite
(
PyPIRCCommandTestCase
)
if
__name__
==
"__main__"
:
unittest
.
main
(
defaultTest
=
"test_suite"
)
tests/test_dist.py
View file @
65014624
...
...
@@ -55,6 +55,7 @@ class DistributionTestCase(unittest.TestCase):
self
.
assertEqual
(
d
.
get_command_packages
(),
[
"distutils.command"
])
def
test_command_packages_cmdline
(
self
):
from
distutils.tests.test_dist
import
test_dist
sys
.
argv
.
extend
([
"--command-packages"
,
"foo.bar,distutils.tests"
,
"test_dist"
,
...
...
@@ -179,9 +180,54 @@ class MetadataTestCase(unittest.TestCase):
dist
.
metadata
.
write_pkg_file
(
sio
)
return
sio
.
getvalue
()
def
test_custom_pydistutils
(
self
):
# fixes #2166
# make sure pydistutils.cfg is found
old
=
{}
for
env
in
(
'HOME'
,
'HOMEPATH'
,
'HOMEDRIVE'
):
value
=
os
.
environ
.
get
(
env
)
old
[
env
]
=
value
if
value
is
not
None
:
del
os
.
environ
[
env
]
if
os
.
name
==
'posix'
:
user_filename
=
".pydistutils.cfg"
else
:
user_filename
=
"pydistutils.cfg"
curdir
=
os
.
path
.
dirname
(
__file__
)
user_filename
=
os
.
path
.
join
(
curdir
,
user_filename
)
f
=
open
(
user_filename
,
'w'
)
f
.
write
(
'.'
)
f
.
close
()
try
:
dist
=
distutils
.
dist
.
Distribution
()
# linux-style
if
sys
.
platform
in
(
'linux'
,
'darwin'
):
os
.
environ
[
'HOME'
]
=
curdir
files
=
dist
.
find_config_files
()
self
.
assert_
(
user_filename
in
files
)
# win32-style
if
sys
.
platform
==
'win32'
:
# home drive should be found
os
.
environ
[
'HOMEPATH'
]
=
curdir
files
=
dist
.
find_config_files
()
self
.
assert_
(
user_filename
in
files
)
finally
:
for
key
,
value
in
old
.
items
():
if
value
is
None
:
continue
os
.
environ
[
key
]
=
value
os
.
remove
(
user_filename
)
def
test_suite
():
suite
=
unittest
.
TestSuite
()
suite
.
addTest
(
unittest
.
makeSuite
(
DistributionTestCase
))
suite
.
addTest
(
unittest
.
makeSuite
(
MetadataTestCase
))
return
suite
if
__name__
==
"__main__"
:
unittest
.
main
(
defaultTest
=
"test_suite"
)
tests/test_upload.py
0 → 100644
View file @
65014624
"""Tests for distutils.command.upload."""
import
sys
import
os
import
unittest
from
distutils.command.upload
import
upload
from
distutils.core
import
Distribution
from
distutils.tests
import
support
from
distutils.tests.test_config
import
PYPIRC
,
PyPIRCCommandTestCase
class
uploadTestCase
(
PyPIRCCommandTestCase
):
def
test_finalize_options
(
self
):
# new format
f
=
open
(
self
.
rc
,
'w'
)
f
.
write
(
PYPIRC
)
f
.
close
()
dist
=
Distribution
()
cmd
=
upload
(
dist
)
cmd
.
finalize_options
()
for
attr
,
waited
in
((
'username'
,
'me'
),
(
'password'
,
'secret'
),
(
'realm'
,
'pypi'
),
(
'repository'
,
'http://pypi.python.org/pypi'
)):
self
.
assertEquals
(
getattr
(
cmd
,
attr
),
waited
)
def
test_suite
():
return
unittest
.
makeSuite
(
uploadTestCase
)
if
__name__
==
"__main__"
:
unittest
.
main
(
defaultTest
=
"test_suite"
)
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment