Source code for doitpy.package
"""tasks to create python distribution packages (distutils/setuptools)
Example:
- create a `MANIFEST.in` file with all tracked files in a git repo
- upload an `sdist` package
::
from doitpy.package import Package
def task_package():
pkg = Package()
yield pkg.manifest_git() # package:manifest
yield pkg.sdist() # package:sdist
yield pkg.sdist_upload() # pypi:sdist_upload
"""
import subprocess
[docs]class Package(object):
"""helper to create tasks to upload a python package to PyPi"""
def __init__(self):
self.revision_file = None
[docs] def revision_git(self, file_name='revision.txt'):
"""create file with repo rev number"""
cmd = "git rev-list --branches=master --max-count=1 HEAD > {}"
self.revision_file = file_name
return {
'basename': 'package',
'name': 'revision',
'actions': [cmd.format(file_name)],
'targets': [file_name],
}
def _create_manifest_git(self):
cmd = "git ls-tree --name-only -r HEAD"
file_list = subprocess.check_output(cmd, shell=True, )
with open('MANIFEST.in', 'w') as manifest:
for filename in file_list.decode('utf-8').splitlines():
manifest.write('include {}\n'.format(filename))
[docs] def manifest_git(self):
"""create MANIFEST.in file for distutils/setuptools
Put all files being tracked by git into the manifest
"""
actions = [self._create_manifest_git]
file_dep = []
if self.revision_file:
file_dep.append(self.revision_file)
cmd = "echo 'include {}' >> MANIFEST.in"
actions.append(cmd.format(self.revision_file))
return {
'basename': 'package',
'name': 'manifest',
'actions': actions,
'file_dep': file_dep,
'targets': ['MANIFEST.in'],
'uptodate': [False],
}
[docs] def sdist(self):
"""create sdist package"""
return {
'basename': 'package',
'name': 'sdist',
'actions': ["python setup.py sdist"],
'file_dep': ['MANIFEST.in'],
'uptodate': [False],
'verbosity': 2,
}
[docs] def sdist_upload(self):
"""upload sdist package to pypi"""
return {
'basename': 'pypi',
'name': 'sdist_upload',
'actions': ["python setup.py sdist upload"],
'file_dep': ['MANIFEST.in', 'setup.py'],
'verbosity': 2,
}