Usando o TestPyPI antes do PyPI

Jessica Temporal
4 min readNov 6, 2016

--

Nós estamos acostumados a rodar um pip install nome_do_pacote e instalar módulos Python disponíveis no PyPI. Pra quem não conhece, o PyPI é o index de pacotes Python. É lá que os pacotes desenvolvidos ficam disponíveis para serem baixados e instalados. Eventualmente desenvolvedores chegam num momento que possuem um projeto que pode ser empacotado e distribuído.

Então, você desenvolveu o seu pacote e o configurou para distribuição seguindo as instruções encontradas aqui no guia de distribuição de pacotes do Python. Agora, como uma opção, antes de fazer o upload direto para o PyPI, você pode usar o TestPyPI, que nada mais é do que o site de teste do PyPI.

O processo de upload é semelhante ao que você faria para liberar seu pacote no PyPI, mas é necessário usar alguns argumentos diferentes.

Por onde começar

  • Registre-se no site do TestPyPI. O TestPyPI usa uma base de usuários diferente da base do PyPI então é necessário fazer o novo registro.
  • Confirme o seu email. Se você não tiver confirmado o seu email, ao tentar fazer o upload do pacote para o TestPyPI, você encontrará o seguinte erro:
Submitting dist/meu-pacote-0.1.0.tar.gz to https://pypi.python.org/pypi
Upload failed (401): You must be identified to edit package information
error: Upload failed (401): You must be identified to edit package information
  • Instale o Twine. Existem outras formas de fazer o upload, porém o Twine irá facilitar muito uma parte do processo. Eu usei o pip install twine num virtualenv que criei pro projeto.
  • Se já não possui um, crie o seu arquivo .pypirc na sua home. Assim como o .bashrc e o .vimrc, esse arquivo irá conter algumas configurações que alguns comandos irão usar. O meu .pypirc está assim no momento:
[distutils]
index-servers=
pypitest

[pypitest]
repository = https://testpypi.python.org/pypi
username = <username>
password = <password>

você pode também usar o exemplo encontrado aqui.

Para demonstrar, vamos usar a publicação do módulo Caipyra.

Criando o resgistro do pacote

O comando register irá criar o registro da distribuição com o módulo Python. O resultado disso é um diretório caipyra.egg-info/ que contém vários arquivos com essas informações de registro.

$ python setup.py register -r https://testpypi.python.org/pypirunning register
running egg_info
creating caipyra.egg-info
writing caipyra.egg-info/PKG-INFO
writing top-level names to caipyra.egg-info/top_level.txt
writing dependency_links to caipyra.egg-info/dependency_links.txt
writing manifest file 'caipyra.egg-info/SOURCES.txt'
reading manifest file 'caipyra.egg-info/SOURCES.txt'
writing manifest file 'caipyra.egg-info/SOURCES.txt'
running check
Registering caipyra to https://testpypi.python.org/pypi
Server response (200): OK

Criando o dist

O comando sdist vai criar a fonte de distribuição do seu módulo, nada mais é que um arquivo compactado do módulo. Quando o comando terminar sua execução, você poderá encontrar seu arquivo de distribuição dentro de uma pasta dist/ no seu diretório.

$ python setup.py sdist

running sdist
running egg_info
writing caipyra.egg-info/PKG-INFO
writing top-level names to caipyra.egg-info/top_level.txt
writing dependency_links to caipyra.egg-info/dependency_links.txt
reading manifest file 'caipyra.egg-info/SOURCES.txt'
writing manifest file 'caipyra.egg-info/SOURCES.txt'
warning: sdist: standard file not found: should have one of README, README.rst, README.txt

running check
creating caipyra-0.1
creating caipyra-0.1/caipyra
creating caipyra-0.1/caipyra.egg-info
copying files to caipyra-0.1...
copying setup.py -> caipyra-0.1
copying caipyra/__init__.py -> caipyra-0.1/caipyra
copying caipyra.egg-info/PKG-INFO -> caipyra-0.1/caipyra.egg-info
copying caipyra.egg-info/SOURCES.txt -> caipyra-0.1/caipyra.egg-info
copying caipyra.egg-info/dependency_links.txt -> caipyra-0.1/caipyra.egg-info
copying caipyra.egg-info/not-zip-safe -> caipyra-0.1/caipyra.egg-info
copying caipyra.egg-info/top_level.txt -> caipyra-0.1/caipyra.egg-info
Writing caipyra-0.1/setup.cfg
creating dist
Creating tar archive
removing 'caipyra-0.1' (and everything under it)

Teste localmente

Com o arquivo .tar.gz que foi criado anteriormente, podemos testar localmente a instalação do nosso pacote, ative um ambiente virtual (ou crie caso ainda não tenha) e instale o seu pacote usando pip. Depois abra o console Python e divirta-se um pouco.

$ pip install dist/caipyra-0.1.tar.gz
$ python
>>> from caipyra import java()
É mentiiiira!!!
>>>

Funciona \o/

Criando wheels

Agora vamos criar wheels. Wheels são um pacote que já teve o seu build feito. Então você não precisa passar pelo processo de build novamente para realizar a instalação daquele pacote. Se quiser você pode ler mais sobre o wheels aqui.

$ python setup.py bdist_wheel

running bdist_wheel
running build
running build_py
creating build
creating build/lib.linux-x86_64-2.7
creating build/lib.linux-x86_64-2.7/caipyra
copying caipyra/__init__.py -> build/lib.linux-x86_64-2.7/caipyra
installing to build/bdist.linux-x86_64/wheel
running install
running install_lib
creating build/bdist.linux-x86_64
creating build/bdist.linux-x86_64/wheel
creating build/bdist.linux-x86_64/wheel/caipyra
copying build/lib.linux-x86_64-2.7/caipyra/__init__.py -> build/bdist.linux-x86_64/wheel/caipyra
running install_egg_info
running egg_info
writing caipyra.egg-info/PKG-INFO
writing top-level names to caipyra.egg-info/top_level.txt
writing dependency_links to caipyra.egg-info/dependency_links.txt
reading manifest file 'caipyra.egg-info/SOURCES.txt'
writing manifest file 'caipyra.egg-info/SOURCES.txt'
Copying caipyra.egg-info to build/bdist.linux-x86_64/wheel/caipyra-0.1-py2.7.egg-info
running install_scripts
creating build/bdist.linux-x86_64/wheel/caipyra-0.1.dist-info/WHEEL

Fazendo o primeiro release

A etapa anterior, gerou dentro do diretório dist/ um arquivo .whl. É esse arquivo que vamos utilizar para registrar o módulo no TestPyPI e fazer o primeiro release. Agora vamos usar o Twine, é importante lembrar de informar o caminho para repositório da seguinte forma:

$ twine register --repository pypitest dist/caipyra-0.1-py2-none-any.whl

Registering package to https://testpypi.python.org/pypi
Enter your username: jessicatemporal
Enter your password:
Registering caipyra-0.1-py2-none-any.whl

Upload

Agora o passo final, que é fazer o upload do binário para o TestPyPI

$ python setup.py sdist upload -r https://testpypi.python.org/pypi

running sdist
running egg_info
writing caipyra.egg-info/PKG-INFO
writing top-level names to caipyra.egg-info/top_level.txt
writing dependency_links to caipyra.egg-info/dependency_links.txt
reading manifest file 'caipyra.egg-info/SOURCES.txt'
writing manifest file 'caipyra.egg-info/SOURCES.txt'
warning: sdist: standard file not found: should have one of README, README.rst, README.txt

running check
creating caipyra-0.1
creating caipyra-0.1/caipyra
creating caipyra-0.1/caipyra.egg-info
copying files to caipyra-0.1...
copying setup.py -> caipyra-0.1
copying caipyra/__init__.py -> caipyra-0.1/caipyra
copying caipyra.egg-info/PKG-INFO -> caipyra-0.1/caipyra.egg-info
copying caipyra.egg-info/SOURCES.txt -> caipyra-0.1/caipyra.egg-info
copying caipyra.egg-info/dependency_links.txt -> caipyra-0.1/caipyra.egg-info
copying caipyra.egg-info/not-zip-safe -> caipyra-0.1/caipyra.egg-info
copying caipyra.egg-info/top_level.txt -> caipyra-0.1/caipyra.egg-info
Writing caipyra-0.1/setup.cfg
Creating tar archive
removing 'caipyra-0.1' (and everything under it)
running upload
Submitting dist/caipyra-0.1.tar.gz to https://testpypi.python.org/pypi
Server response (200): OK

Depois disso, você pode testar a instalação usando:


pip install -i https://testpypi.python.org/pypi caipyra

Próximos passos: Fazer o mesmo processo e liberar seu projeto no PyPI e mandar o aviso pros amiguinhos rodarem o pip install =P

--

--

Jessica Temporal

DevRel 🥑 • Author • 🎙Podcaster @pizzadedados • Creator of GitStudyCards.com • GitHub ⭐️ • cross-stitcher & knitter • 🇧🇷 & 🇨🇦 • she/her