.\" Man page generated from reStructuredText. . .TH "TWINE" "1" "Feb 25, 2019" "1.13" "twine" .SH NAME twine \- twine Documentation . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .SS Table of Contents .INDENT 0.0 .IP \(bu 2 \fI\%Twine user documentation\fP .IP \(bu 2 \fI\%Why Should I Use This?\fP .IP \(bu 2 \fI\%Features\fP .IP \(bu 2 \fI\%Installation\fP .IP \(bu 2 \fI\%Using Twine\fP .IP \(bu 2 \fI\%Keyring Support\fP .INDENT 2.0 .IP \(bu 2 \fI\%Disabling Keyring\fP .UNINDENT .IP \(bu 2 \fI\%Options\fP .INDENT 2.0 .IP \(bu 2 \fI\%twine upload\fP .IP \(bu 2 \fI\%twine check\fP .IP \(bu 2 \fI\%twine register\fP .IP \(bu 2 \fI\%Environment Variables\fP .UNINDENT .IP \(bu 2 \fI\%Resources\fP .IP \(bu 2 \fI\%Contributing\fP .IP \(bu 2 \fI\%Code of Conduct\fP .UNINDENT .SH TWINE USER DOCUMENTATION .sp Twine is \fI\%a utility\fP for \fI\%publishing\fP Python packages on \fI\%PyPI\fP\&. .sp It provides build system independent uploads of source and binary \fI\%distribution artifacts\fP for both new and existing \fI\%projects\fP\&. .SH WHY SHOULD I USE THIS? .sp The goal of \fBtwine\fP is to improve PyPI interaction by improving security and testability. .sp The biggest reason to use \fBtwine\fP is that it securely authenticates you to \fI\%PyPI\fP over HTTPS using a verified connection regardless of the underlying Python version, while whether or not \fBpython setup.py upload\fP will work correctly and securely depends on your build system, your Python version and the underlying operating system. .sp Secondly, it allows you to precreate your distribution files. \fBpython setup.py upload\fP only allows you to upload something that you’re building with \fBdistutils\fP or \fBsetuptools\fP, and created in the same command invocation. This means that you cannot test the exact file you’re going to upload to PyPI to ensure that it works before uploading it. .sp Finally, \fBtwine\fP allows you to pre\-sign your files and pass the \fB\&.asc\fP files into the command line invocation (\fBtwine upload myproject\-1.0.1.tar.gz myproject\-1.0.1.tar.gz.asc\fP). This enables you to be assured that you’re typing your \fBgpg\fP passphrase into \fBgpg\fP itself and not anything else, since \fIyou\fP will be the one directly executing \fBgpg \-\-detach\-sign \-a \fP\&. .SH FEATURES .INDENT 0.0 .IP \(bu 2 Verified HTTPS connections .IP \(bu 2 Uploading doesn’t require executing \fBsetup.py\fP .IP \(bu 2 Uploading files that have already been created, allowing testing of distributions before release .IP \(bu 2 Supports uploading any packaging format (including \fI\%wheels\fP) .UNINDENT .SH INSTALLATION .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C $ pip install twine .ft P .fi .UNINDENT .UNINDENT .SH USING TWINE .INDENT 0.0 .IP 1. 3 Create some distributions in the normal way: .INDENT 3.0 .INDENT 3.5 .sp .nf .ft C $ python setup.py sdist bdist_wheel .ft P .fi .UNINDENT .UNINDENT .IP 2. 3 Upload with \fBtwine\fP to \fI\%Test PyPI\fP and verify things look right. Twine will automatically prompt for your username and password: .INDENT 3.0 .INDENT 3.5 .sp .nf .ft C $ twine upload \-\-repository\-url https://test.pypi.org/legacy/ dist/* username: ... password: \&... .ft P .fi .UNINDENT .UNINDENT .IP 3. 3 Upload to \fI\%PyPI\fP: .INDENT 3.0 .INDENT 3.5 .sp .nf .ft C $ twine upload dist/* .ft P .fi .UNINDENT .UNINDENT .IP 4. 3 Done! .UNINDENT .sp More documentation on using \fBtwine\fP to upload packages to PyPI is in the \fI\%Python Packaging User Guide\fP\&. .SH KEYRING SUPPORT .sp Instead of typing in your password every time you upload a distribution, Twine allows you to store your username and password securely using \fI\%keyring\fP\&. .sp To use the keyring, you must first install the keyring packages: .INDENT 0.0 .IP \(bu 2 On Windows and MacOS you just need to install \fBkeyring\fP, for example, \fBpip install \-\-user keyring\fP\&. .IP \(bu 2 On Linux, in addition to the \fBkeyring\fP package you also need to ensure the \fBpython3\-dbus\fP system package is installed. For example, \fBapt install python3\-dbus\fP\&. See \fI\%Keyring’s installation instructions\fP for more details. .UNINDENT .sp Once keyring is installed you can use the \fBkeyring\fP program to set your username and password to use for each package index (repository) you want to upload to using Twine. .sp To set your username and password for test PyPI run the following command. \fBkeyring\fP will prompt you for your password: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C $ keyring set https://test.pypi.org/legacy/ your\-username # or $ python3 \-m keyring set https://test.pypi.org/legacy/ your\-username .ft P .fi .UNINDENT .UNINDENT .sp To set your username and password for PyPI run this command, again, \fBkeyring\fP will prompt for the password: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C $ keyring set https://upload.pypi.org/legacy/ your\-username # or $ python3 \-m keyring set https://upload.pypi.org/legacy/ your\-username .ft P .fi .UNINDENT .UNINDENT .sp The next time you run \fBtwine\fP it will prompt you for a username and will grab the appropriate password from the keyring. .sp \fBNOTE:\fP .INDENT 0.0 .INDENT 3.5 If you are using Linux in a headless environment (such as on a server) you’ll need to do some additional steps to ensure that Keyring can store secrets securely. See \fI\%Using Keyring on headless systems\fP\&. .UNINDENT .UNINDENT .SS Disabling Keyring .sp In some cases, the presence of keyring may be problematic. To disable keyring and defer to a prompt for passwords, uninstall \fBkeyring\fP or if that’s not an option, you can also configure keyring to be disabled. .sp See \fI\%twine 338\fP for a discussion on ways to do that. .SH OPTIONS .SS \fBtwine upload\fP .sp Uploads one or more distributions to a repository. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C $ twine upload \-h usage: twine upload [\-h] [\-r REPOSITORY] [\-\-repository\-url REPOSITORY_URL] [\-s] [\-\-sign\-with SIGN_WITH] [\-i IDENTITY] [\-u USERNAME] [\-p PASSWORD] [\-c COMMENT] [\-\-config\-file CONFIG_FILE] [\-\-skip\-existing] [\-\-cert path] [\-\-client\-cert path] [\-\-verbose] [\-\-disable\-progress\-bar] dist [dist ...] positional arguments: dist The distribution files to upload to the repository (package index). Usually dist/* . May additionally contain a .asc file to include an existing signature with the file upload. optional arguments: \-h, \-\-help show this help message and exit \-r REPOSITORY, \-\-repository REPOSITORY The repository (package index) to upload the package to. Should be a section in the config file (default: pypi). (Can also be set via TWINE_REPOSITORY environment variable.) \-\-repository\-url REPOSITORY_URL The repository (package index) URL to upload the package to. This overrides \-\-repository. (Can also be set via TWINE_REPOSITORY_URL environment variable.) \-s, \-\-sign Sign files to upload using GPG. \-\-sign\-with SIGN_WITH GPG program used to sign uploads (default: gpg). \-i IDENTITY, \-\-identity IDENTITY GPG identity used to sign files. \-u USERNAME, \-\-username USERNAME The username to authenticate to the repository (package index) as. (Can also be set via TWINE_USERNAME environment variable.) \-p PASSWORD, \-\-password PASSWORD The password to authenticate to the repository (package index) with. (Can also be set via TWINE_PASSWORD environment variable.) \-c COMMENT, \-\-comment COMMENT The comment to include with the distribution file. \-\-config\-file CONFIG_FILE The .pypirc config file to use. \-\-skip\-existing Continue uploading files if one already exists. (Only valid when uploading to PyPI. Other implementations may not support this.) \-\-cert path Path to alternate CA bundle (can also be set via TWINE_CERT environment variable). \-\-client\-cert path Path to SSL client certificate, a single file containing the private key and the certificate in PEM format. \-\-verbose Show verbose output. \-\-disable\-progress\-bar Disable the progress bar. .ft P .fi .UNINDENT .UNINDENT .SS \fBtwine check\fP .sp Checks whether your distributions long description will render correctly on PyPI. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C $ twine check \-h usage: twine check [\-h] dist [dist ...] positional arguments: dist The distribution files to check, usually dist/* optional arguments: \-h, \-\-help show this help message and exit .ft P .fi .UNINDENT .UNINDENT .SS \fBtwine register\fP .sp \fBWARNING\fP: The \fBregister\fP command is \fI\%no longer necessary if you are uploading to pypi.org\fP\&. As such, it is \fI\%no longer supported\fP in \fI\%Warehouse\fP (the new PyPI software running on pypi.org). However, you may need this if you are using a different package index. .sp For completeness, its usage: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C $ twine register \-h usage: twine register [\-h] \-r REPOSITORY [\-\-repository\-url REPOSITORY_URL] [\-u USERNAME] [\-p PASSWORD] [\-c COMMENT] [\-\-config\-file CONFIG_FILE] [\-\-cert path] [\-\-client\-cert path] package positional arguments: package File from which we read the package metadata. optional arguments: \-h, \-\-help show this help message and exit \-r REPOSITORY, \-\-repository REPOSITORY The repository (package index) to register the package to. Should be a section in the config file. (Can also be set via TWINE_REPOSITORY environment variable.) Initial package registration no longer necessary on pypi.org: https://packaging.python.org/guides/migrating\-to\-pypi\- org/ \-\-repository\-url REPOSITORY_URL The repository (package index) URL to register the package to. This overrides \-\-repository. (Can also be set via TWINE_REPOSITORY_URL environment variable.) \-u USERNAME, \-\-username USERNAME The username to authenticate to the repository (package index) as. (Can also be set via TWINE_USERNAME environment variable.) \-p PASSWORD, \-\-password PASSWORD The password to authenticate to the repository (package index) with. (Can also be set via TWINE_PASSWORD environment variable.) \-c COMMENT, \-\-comment COMMENT The comment to include with the distribution file. \-\-config\-file CONFIG_FILE The .pypirc config file to use. \-\-cert path Path to alternate CA bundle (can also be set via TWINE_CERT environment variable). \-\-client\-cert path Path to SSL client certificate, a single file containing the private key and the certificate in PEM format. .ft P .fi .UNINDENT .UNINDENT .SS Environment Variables .sp Twine also supports configuration via environment variables. Options passed on the command line will take precedence over options set via environment variables. Definition via environment variable is helpful in environments where it is not convenient to create a \fI\&.pypirc\fP file, such as a CI/build server, for example. .INDENT 0.0 .IP \(bu 2 \fBTWINE_USERNAME\fP \- the username to use for authentication to the repository. .IP \(bu 2 \fBTWINE_PASSWORD\fP \- the password to use for authentication to the repository. .IP \(bu 2 \fBTWINE_REPOSITORY\fP \- the repository configuration, either defined as a section in \fI\&.pypirc\fP or provided as a full URL. .IP \(bu 2 \fBTWINE_REPOSITORY_URL\fP \- the repository URL to use. .IP \(bu 2 \fBTWINE_CERT\fP \- custom CA certificate to use for repositories with self\-signed or untrusted certificates. .UNINDENT .SH RESOURCES .INDENT 0.0 .IP \(bu 2 \fI\%IRC\fP (\fB#pypa\fP \- irc.freenode.net) .IP \(bu 2 \fI\%GitHub repository\fP .IP \(bu 2 User and developer \fI\%documentation\fP .IP \(bu 2 \fI\%Python Packaging User Guide\fP .UNINDENT .SH CONTRIBUTING .sp See our \fI\%developer documentation\fP for how to get started, an architectural overview, and our future development plans. .SH CODE OF CONDUCT .sp Everyone interacting in the \fBtwine\fP project’s codebases, issue trackers, chat rooms, and mailing lists is expected to follow the \fI\%PyPA Code of Conduct\fP\&. .SS Contributing .sp We are happy you have decided to contribute to \fBtwine\fP\&. .sp Please see \fI\%the GitHub repository\fP for code and more documentation, and the \fI\%official Python Packaging User Guide\fP for user documentation. You can also join \fB#pypa\fP or \fB#pypa\-dev\fP \fI\%on Freenode\fP, or the \fI\%pypa\-dev mailing list\fP, to ask questions or get involved. .SS Getting started .sp We recommend you use a development environment. Using a \fBvirtualenv\fP keeps your development environment isolated, so \fBtwine\fP and its dependencies do not interfere with other packages installed on your machine. You can use \fI\%virtualenv\fP or \fI\%pipenv\fP to isolate your development environment. .sp Clone the twine repository from GitHub, and then make and activate a virtual environment that uses Python 3.6 as the default Python. Example: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C mkvirtualenv \-p /usr/bin/python3.6 twine .ft P .fi .UNINDENT .UNINDENT .sp Then, run the following command: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C pip install \-e /path/to/your/local/twine .ft P .fi .UNINDENT .UNINDENT .sp Now, in your virtual environment, \fBtwine\fP is pointing at your local copy, so when you make changes, you can easily see their effect. .SS Building the documentation .sp Additions and edits to twine’s documentation are welcome and appreciated. .sp We use \fBtox\fP to build docs. Activate your virtual environment, then install \fBtox\fP\&. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C pip install tox .ft P .fi .UNINDENT .UNINDENT .sp If you are using \fBpipenv\fP to manage your virtual environment, you may need the \fI\%tox\-pipenv\fP plugin so that tox can use pipenv environments instead of virtualenvs. .sp After making docs changes, lint and build the docs locally, using \fBtox\fP, before making a pull request. Activate your virtual environment, then, in the root directory, run: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C tox \-e docs .ft P .fi .UNINDENT .UNINDENT .sp The HTML of the docs will be visible in \fBtwine/docs/_build/\fP\&. .SS Testing .sp Tests with twine are run using \fI\%tox\fP, and tested against the following Python versions: 2.7, 3.4, 3,5, and 3.6. To run these tests locally, you will need to have these versions of Python installed on your machine. .sp Either use \fBtox\fP to build against all supported Python versions (if you have them installed) or use \fBtox \-e py{version}\fP to test against a specific version, e.g., \fBtox \-e py27\fP or \fBtox \-e py34\fP\&. .sp Also, always run \fBtox \-e lint\fP before submitting a pull request. .SS Submitting changes .INDENT 0.0 .IP 1. 3 Fork \fI\%the GitHub repository\fP\&. .IP 2. 3 Make a branch off of \fBmaster\fP and commit your changes to it. .IP 3. 3 Run the tests with \fBtox\fP and lint any docs changes with \fBtox \-e docs\fP\&. .IP 4. 3 Ensure that your name is added to the end of the \fBAUTHORS\fP file using the format \fBName (url)\fP, where the \fB(url)\fP portion is optional. .IP 5. 3 Submit a pull request to the \fBmaster\fP branch on GitHub. .UNINDENT .SS Architectural overview .sp Twine is a command\-line tool for interacting with PyPI securely over HTTPS. Its three purposes are to be: .INDENT 0.0 .IP 1. 3 A user\-facing tool for publishing on pypi.org .IP 2. 3 A user\-facing tool for publishing on other Python package indexes (e.g., \fBdevpi\fP instances) .IP 3. 3 A useful API for other programs (e.g., \fBzest.releaser\fP) to call for publishing on any Python package index .UNINDENT .sp Currently, twine has two principal functions: uploading new packages and registering new \fI\%projects\fP (\fBregister\fP is no longer supported on PyPI, and is in Twine for use with other package indexes). .sp Its command line arguments are parsed in \fBtwine/cli.py\fP\&. The code for registering new projects is in \fBtwine/commands/register.py\fP, and the code for uploading is in \fBtwine/commands/upload.py\fP\&. The file \fBtwine/package.py\fP contains a single class, \fBPackageFile\fP, which hashes the project files and extracts their metadata. The file \fBtwine/repository.py\fP contains the \fBRepository\fP class, whose methods control the URL the package is uploaded to (which the user can specify either as a default, in the \fB\&.pypirc\fP file, or pass on the command line), and the methods that upload the package securely to a URL. .SS Where Twine gets configuration and credentials .sp A user can set the repository URL, username, and/or password via command line, \fB\&.pypirc\fP files, environment variables, and \fBkeyring\fP\&. .SS Adding a maintainer .sp A checklist for adding a new maintainer to the project. .INDENT 0.0 .IP 1. 3 Add her as a Member in the GitHub repo settings. (This will also give her privileges on the \fI\%Travis CI project\fP\&.) .IP 2. 3 Get her Test PyPI and canon PyPI usernames and add her as a Maintainer on \fI\%our Test PyPI project\fP and \fI\%canon PyPI\fP\&. .UNINDENT .SS Making a new release .sp A checklist for creating, testing, and distributing a new version. .INDENT 0.0 .IP 1. 4 Choose a version number, e.g., “1.15.” .IP 2. 4 Merge the last planned PR before the new release: .INDENT 4.0 .IP 1. 3 Add new changes to \fBdocs/changelog.rst\fP\&. .IP 2. 3 Update the \fB__version__\fP string in \fBtwine/__init__.py\fP, which is where \fBsetup.py\fP pulls it from, with \fB{number}rc1\fP for “release candidate 1”. .IP 3. 3 Update copyright dates. .UNINDENT .IP 3. 4 Run Twine tests: .INDENT 4.0 .IP 1. 3 \fBtox \-e py{27,34,35,36,py}\fP .IP 2. 3 \fBtox \-e lint\fP for the linter .IP 3. 3 \fBtox \-e docs\fP (this checks the Sphinx docs and uses \fBreadme_renderer\fP to check that the \fBlong_description\fP and other metadata will render fine on the PyPI description) .UNINDENT .IP 4. 4 Run integration tests with downstreams: .INDENT 4.0 .IP 1. 3 Test \fBpypiserver\fP support: .INDENT 4.0 .INDENT 3.5 .sp .nf .ft C git clone git@github.com:pypiserver/pypiserver cd pypiserver tox \-e pre_twine .ft P .fi .UNINDENT .UNINDENT .IP 2. 3 Create a test package to upload to Test PyPI, version\-control it with git, and test \fBzest.releaser\fP per directions in \fI\%this comment\fP\&. .IP 3. 3 Test \fBdevpi\fP support: .INDENT 4.0 .INDENT 3.5 .sp .nf .ft C pip install devpi\-client devpi use https://m.devpi.net devpi user \-c {username} password={password} devpi login {username} \-\-password={password} devpi index \-c testpypi type=mirror mirror_url=https://test.pypi.org/simple/ devpi use {username}/testpypi python setup.py sdist twine upload \-\-repository\-url https://m.devpi.net/{username}/testpypi/ dist/{testpackage}.tar.gz .ft P .fi .UNINDENT .UNINDENT .UNINDENT .IP 5. 4 Create a git tag with \fBgit tag \-sam \(aqRelease v{number}\(aq {number}\fP\&. .INDENT 4.0 .IP \(bu 2 \fB{number}\fP, such as \fB1.15.1rc1\fP .IP \(bu 2 \fB\-s\fP signs it with your PGP key .IP \(bu 2 \fB\-a\fP creates an annotated tag for GitHub .IP \(bu 2 \fB\-m\fP adds the message; optional if you want to compose a longer message .UNINDENT .IP 6. 4 View your tag: \fBgit tag \-v {number}\fP .IP 7. 4 Push your tag: \fBgit push upstream {number}\fP\&. .IP 8. 4 Delete old distributions: \fBrm dist/*\fP\&. .IP 9. 4 Create distributions with \fBpython setup.py sdist bdist_wheel\fP\&. .IP 10. 4 Set your TestPyPI and canon PyPI credentials in your session with \fBkeyring\fP (docs forthcoming). .IP 11. 4 Upload to Test PyPI: \fBtwine upload \-\-repository\-url https://test.pypi.org/legacy/ \-\-skip\-existing dist/*\fP .IP 12. 4 Verify that everything looks good, downloads ok, etc. Make needed fixes. .IP 13. 4 Merge the last PR before the new release: .INDENT 4.0 .IP 1. 3 Add new changes and new release to \fBdocs/changelog.rst\fP, with the new version \fB{number}\fP, this time without the \fBrc1\fP suffix. .IP 2. 3 Update the \fB__version__\fP string in \fBtwine/__init__.py\fP with \fB{number}\fP\&. .UNINDENT .IP 14. 4 Run tests again. Check the changelog to verify that it looks right. .IP 15. 4 Create a new git tag with \fBgit tag \-sam \(aqRelease v{number}\(aq {number}\fP\&. .IP 16. 4 View your tag: \fBgit tag \-v {number}\fP .IP 17. 4 Push your tag: \fBgit push upstream {number}\fP\&. .IP 18. 4 Delete old distributions: \fBrm dist/*\fP\&. .IP 19. 4 Create distributions with \fBpython setup.py sdist bdist_wheel\fP\&. .IP 20. 4 On a Monday or Tuesday, upload to canon PyPI: \fBtwine upload \-\-skip\-existing dist/*\fP .sp \fBNOTE:\fP .INDENT 4.0 .INDENT 3.5 Will be replaced by \fBtox \-e release\fP at some point. .UNINDENT .UNINDENT .IP 21. 4 Send announcement email to \fI\%pypa\-dev mailing list\fP and celebrate. .UNINDENT .SS Future development .sp See our \fI\%open issues\fP\&. .sp In the future, \fBpip\fP and \fBtwine\fP may merge into a single tool; see \fI\%ongoing discussion\fP\&. .SS Changelog .INDENT 0.0 .IP \(bu 2 \fI\%#367\fP: Avoid MD5 when Python is compiled in FIPS mode .IP \(bu 2 \fI\%#408\fP: Fix keyring support. .IP \(bu 2 \fI\%#412\fP: Don’t crash if there’s no package description. .IP \(bu 2 : :feature:\(ga\(ga Add Python 3.7 to classifiers. .IP \(bu 2 \fI\%#421\fP: Remove unnecessary usage of readme_render.markdown. .IP \(bu 2 \fI\%#428\fP: Fix –skip\-existing for Nexus Repos. .IP \(bu 2 \fI\%#432\fP: Use https URLs everywhere. .IP \(bu 2 \fI\%#435\fP: Specify python_requires in setup.py .IP \(bu 2 \fI\%#436\fP: Use modern Python language features. .IP \(bu 2 \fI\%#444\fP: Use io.StringIO instead of StringIO. .IP \(bu 2 \fI\%#441\fP: Only install pyblake2 if needed. .IP \(bu 2 \fI\%#447\fP: Avoid requests\-toolbelt to 0.9.0 to prevent attempting to use openssl when it isn’t available. .IP \(bu 2 \fI\%#452\fP: Restore prompts while retaining support for suppressing prompts. .UNINDENT .INDENT 0.0 .IP \(bu 2 \fI\%#418\fP: Support keyring.get_username_and_password. .IP \(bu 2 \fI\%#419\fP: Support keyring.get_credential. .IP \(bu 2 \fI\%#426\fP: Allow defining an empty username and password in .pypirc. .IP \(bu 2 \fI\%#427\fP: Add disable_progress_bar option to disable tqdm. .IP \(bu 2 \fI\%#439\fP: Refactor tox env and travis config. .UNINDENT .INDENT 0.0 .IP \(bu 2 \fI\%#404\fP: Fix regression with upload exit code .UNINDENT .INDENT 0.0 .IP \(bu 2 \fI\%#363\fP: Empower \fB\-\-skip\-existing\fP for Artifactory repositories .IP \(bu 2 \fI\%#392\fP: Drop support for Python 3.3 .IP \(bu 2 \fI\%#395\fP: Add \fBtwine check\fP command to check long description .UNINDENT .INDENT 0.0 .IP \(bu 2 \fI\%#319\fP: Support Metadata 2.1 (\fI\%PEP 566\fP), including Markdown for \fBdescription\fP fields. .IP \(bu 2 \fI\%#320\fP: Remove PyPI as default \fBregister\fP package index. .IP \(bu 2 \fI\%#322\fP: Raise exception if attempting upload to deprecated legacy PyPI URLs. .IP \(bu 2 \fI\%#269\fP: Avoid uploading to PyPI when given alternate repository URL, and require \fBhttp://\fP or \fBhttps://\fP in \fBrepository_url\fP\&. .IP \(bu 2 \fI\%#318\fP: \fI\%Update PyPI URLs\fP\&. .IP \(bu 2 \fI\%#314\fP: Add new maintainer, release checklists. .IP \(bu 2 \fI\%#277\fP: Add instructions on how to use keyring. .UNINDENT .INDENT 0.0 .IP \(bu 2 \fI\%#256\fP: Improve progressbar .IP \(bu 2 \fI\%#257\fP: Declare support for Python 3.6 .IP \(bu 2 \fI\%#303\fP: Revise docs predicting future of \fBtwine\fP .IP \(bu 2 \fI\%#296\fP: Add architecture overview to docs .IP \(bu 2 \fI\%#295\fP: Add doc building instructions .IP \(bu 2 \fI\%#46\fP: Link to changelog from \fBREADME\fP .IP \(bu 2 \fI\%#304\fP: Reorganize & improve user & developer documentation. .IP \(bu 2 \fI\%#265\fP: Fix \fB\-\-repository[\-url]\fP help text .IP \(bu 2 \fI\%#268\fP: Print progress to \fBstdout\fP, not \fBstderr\fP .IP \(bu 2 \fI\%#297\fP: Fix Read the Docs, tox, Travis configuration .IP \(bu 2 \fI\%#286\fP: Fix Travis CI and test configuration .IP \(bu 2 \fI\%#200\fP: Remove obsolete registration guidance .IP \(bu 2 \fI\%#299\fP: Fix changelog formatting .IP \(bu 2 \fI\%#298\fP: Fix syntax highlighting in \fBREADME\fP .IP \(bu 2 \fI\%#315\fP: Degrade gracefully when keyring is unavailable .UNINDENT .INDENT 0.0 .IP \(bu 2 : Blacklist known bad versions of Requests. See also \fI\%#253\fP: .UNINDENT .INDENT 0.0 .IP \(bu 2 : Check if a package exists if the URL is one of: .INDENT 2.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fBhttps://pypi.python.org/pypi/\fP .IP \(bu 2 \fBhttps://upload.pypi.org/\fP .IP \(bu 2 \fBhttps://upload.pypi.io/\fP .UNINDENT .sp This helps people with \fBhttps://upload.pypi.io\fP still in their \fB\&.pypirc\fP file. .UNINDENT .UNINDENT .IP \(bu 2 : Fix precedence of \fB\-\-repository\-url\fP over \fB\-\-repository\fP\&. See also \fI\%#206\fP: .IP \(bu 2 : Fix \fB\-\-skip\-existing\fP when used to upload a package for the first time. See also \fI\%#220\fP: .IP \(bu 2 : Twine sends less information about the user’s system in the User\-Agent string. See also \fI\%#229\fP: .IP \(bu 2 : Twine will use \fBhashlib.blake2b\fP on Python 3.6+ instead of using pyblake2 for Blake2 hashes 256 bit hashes. .IP \(bu 2 : Twine will now resolve passwords using the \fI\%keyring\fP if available. Module can be required with the \fBkeyring\fP extra. .UNINDENT .INDENT 0.0 .IP \(bu 2 \fI\%#171\fP: Generate Blake2b 256 digests for packages \fIif\fP \fBpyblake2\fP is installed. Users can use \fBpython \-m pip install twine[with\-blake2]\fP to have \fBpyblake2\fP installed with Twine. .IP \(bu 2 \fI\%#166\fP: Allow the Repository URL to be provided on the command\-line (\fB\-\-repository\-url\fP) or via an environment variable (\fBTWINE_REPOSITORY_URL\fP). .IP \(bu 2 \fI\%#144\fP: Retrieve configuration from the environment as a default. .INDENT 2.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 Repository URL will default to \fBTWINE_REPOSITORY\fP .IP \(bu 2 Username will default to \fBTWINE_USERNAME\fP .IP \(bu 2 Password will default to \fBTWINE_PASSWORD\fP .UNINDENT .UNINDENT .UNINDENT .IP \(bu 2 \fI\%#201\fP: Switch from upload.pypi.io to upload.pypi.org. .IP \(bu 2 : Do not generate traffic to Legacy PyPI unless we’re uploading to it or uploading to Warehouse (e.g., pypi.io). This avoids the attempt to upload a package to the index if we can find it on Legacy PyPI already. .IP \(bu 2 : Warn users if they receive a 500 error when uploading to \fB*pypi.python.org\fP .IP \(bu 2 : Stop testing on Python 2.6. 2.6 support will be “best effort” until 2.0.0 .IP \(bu 2 : Generate SHA256 digest for all packages by default. .UNINDENT .INDENT 0.0 .IP \(bu 2 : Correct a packaging error. .UNINDENT .INDENT 0.0 .IP \(bu 2 \fI\%#195\fP: Fix uploads to instances of pypiserver using \fB\-\-skip\-existing\fP\&. We were not properly checking the return status code on the response after attempting an upload. .UNINDENT .INDENT 0.0 .IP \(bu 2 \fI\%#189\fP:, \fI\%#191\fP: Fix issue where we were checking the existence of packages even if the user didn’t specify \fB\-\-skip\-existing\fP\&. .UNINDENT .INDENT 0.0 .IP \(bu 2 \fI\%#187\fP: Clint was not specified in the wheel metadata as a dependency. .UNINDENT .INDENT 0.0 .IP \(bu 2 \fI\%#177\fP: Switch Twine to upload to pypi.io instead of pypi.python.org. .IP \(bu 2 \fI\%#167\fP: Implement retries when the CDN in front of PyPI gives us a 5xx error. .IP \(bu 2 \fI\%#162\fP: Allow \fB\-\-skip\-existing\fP to work for 409 status codes. .IP \(bu 2 \fI\%#152\fP: Add progress bar to uploads. .IP \(bu 2 \fI\%#142\fP: Support \fB\-\-cert\fP and \fB\-\-client\-cert\fP command\-line flags and config file options for feature parity with pip. This allows users to verify connections to servers other than PyPI (e.g., local package repositories) with different certificates. .IP \(bu 2 \fI\%#186\fP: Allow passwords to have \fB%\fPs in them. .UNINDENT .INDENT 0.0 .IP \(bu 2 \fI\%#155\fP: Bump requests\-toolbelt version to ensure we avoid ConnectionErrors .UNINDENT .INDENT 0.0 .IP \(bu 2 \fI\%#146\fP: Exception while accessing the \fBrespository\fP key (sic) when raising a redirect exception. .IP \(bu 2 \fI\%#145\fP: Paths with hyphens in them break the Wheel regular expression. .UNINDENT .INDENT 0.0 .IP \(bu 2 \fI\%#137\fP:, \fI\%#140\fP: Uploading signatures was broken due to the pull request that added large file support via \fBrequests\-toolbelt\fP\&. This caused a 500 error on PyPI and prevented package and signature upload in twine 1.6.0 .UNINDENT .INDENT 0.0 .IP \(bu 2 \fI\%#132\fP: Upload signatures with packages appropriately .INDENT 2.0 .INDENT 3.5 As part of the refactor for the 1.6.0 release, we were using the wrong name to find the signature file. .sp This also uncovered a bug where if you’re using twine in a situation where \fB*\fP is not expanded by your shell, we might also miss uploading signatures to PyPI. Both were fixed as part of this. .UNINDENT .UNINDENT .UNINDENT .INDENT 0.0 .IP \(bu 2 \fI\%#130\fP: Fix signing support for uploads .UNINDENT .INDENT 0.0 .IP \(bu 2 \fI\%#8\fP: Support registering new packages with \fBtwine register\fP .IP \(bu 2 \fI\%#115\fP: Add the \fB\-\-skip\-existing\fP flag to \fBtwine upload\fP to allow users to skip releases that already exist on PyPI. .IP \(bu 2 \fI\%#97\fP: Allow the user to specify the location of their \fB\&.pypirc\fP .IP \(bu 2 \fI\%#104\fP: Large file support via the \fBrequests\-toolbelt\fP .IP \(bu 2 \fI\%#106\fP: Upload wheels first to PyPI .IP \(bu 2 \fI\%#111\fP: Provide more helpful messages if \fB\&.pypirc\fP is out of date. .IP \(bu 2 \fI\%#116\fP: Work around problems with Windows when using \fBgetpass.getpass\fP .IP \(bu 2 \fI\%#114\fP: Warnings triggered by pkginfo searching for \fBPKG\-INFO\fP files should no longer be user visible. .IP \(bu 2 \fI\%#92\fP: Raise an exception on redirects .UNINDENT .INDENT 0.0 .IP \(bu 2 \fI\%#29\fP: Support commands not named “gpg” for signing .IP \(bu 2 \fI\%#61\fP: Support deprecated pypirc file format .IP \(bu 2 \fI\%#85\fP: Display information about the version of setuptools installed .IP \(bu 2 : Add lower\-limit to requests dependency .UNINDENT .INDENT 0.0 .IP \(bu 2 \fI\%#6\fP: Switch to a git style dispatching for the commands to enable simpler commands and programmatic invocation. .IP \(bu 2 \fI\%#13\fP: Parse \fB~/.pypirc\fP ourselves and use \fBsubprocess\fP instead of the \fBdistutils.spawn\fP module. .IP \(bu 2 \fI\%#65\fP: Expand globs and check for existence of dists to upload .IP \(bu 2 \fI\%#26\fP: Add support for uploading Windows installers .IP \(bu 2 \fI\%#47\fP: Fix issue uploading packages with \fB_\fPs in the name .IP \(bu 2 \fI\%#32\fP: Use \fBpkg_resources\fP to load registered commands .IP \(bu 2 \fI\%#34\fP: List registered commands in help text .IP \(bu 2 \fI\%#28\fP: Prevent ResourceWarning from being shown .UNINDENT .INDENT 0.0 .IP \(bu 2 : Additional functionality. .UNINDENT .INDENT 0.0 .IP \(bu 2 : Basic functionality. .UNINDENT .INDENT 0.0 .IP \(bu 2 search .UNINDENT .SH AUTHOR Donald Stufft, Individual contributors .SH COPYRIGHT 2019, Donald Stufft and individual contributors .\" Generated by docutils manpage writer. .