Permalink
Fetching contributors…
Cannot retrieve contributors at this time
executable file 245 lines (209 sloc) 8.34 KB
#!/usr/bin/env python
# coding: utf-8
"""
distutils setup
~~~~~~~~~~~~~~~
:copyleft: 2009-2015 by the python-creole team, see AUTHORS for more details.
:license: GNU GPL v3 or above, see LICENSE for more details.
"""
from __future__ import division, absolute_import, print_function, unicode_literals
import os
import sys
import subprocess
import shutil
from setuptools import setup, find_packages, Command
from creole import __version__
from creole.setup_utils import get_long_description
PACKAGE_ROOT = os.path.dirname(os.path.abspath(__file__))
if "test" in sys.argv or "nosetests" in sys.argv:
"""
nose is a optional dependency, so test import.
Otherwise the user get only the error:
error: invalid command 'nosetests'
"""
try:
import nose
except ImportError as err:
print("\nError: Can't import 'nose': %s" % err)
print("\nMaybe 'nose' is not installed or virtualenv not activated?!?")
print("e.g.:")
print(" ~/your/env/$ source bin/activate")
print(" ~/your/env/$ pip install nose")
print(" ~/your/env/$ ./setup.py nosetests\n")
sys.exit(-1)
else:
if "test" in sys.argv:
print("\nPlease use 'nosetests' instead of 'test' to cover all tests!\n")
print("e.g.:")
print(" $ ./setup.py nosetests\n")
sys.exit(-1)
def get_authors():
try:
with open(os.path.join(PACKAGE_ROOT, "AUTHORS"), "r") as f:
authors = [l.strip(" *\r\n") for l in f if l.strip().startswith("*")]
except Exception:
evalue = sys.exc_info()[1]
authors = "[Error: %s]" % evalue
return authors
if "publish" in sys.argv:
"""
'publish' helper for setup.py
Build and upload to PyPi, if...
... __version__ doesn't contains "dev"
... we are on git 'master' branch
... git repository is 'clean' (no changed files)
Upload with "twine", git tag the current version and git push --tag
The cli arguments will be pass to 'twine'. So this is possible:
* Display 'twine' help page...: ./setup.py publish --help
* use testpypi................: ./setup.py publish --repository=test
TODO: Look at: https://github.com/zestsoftware/zest.releaser
Source: https://github.com/jedie/python-code-snippets/blob/master/CodeSnippets/setup_publish.py
copyleft 2015 Jens Diemer - GNU GPL v2+
"""
if sys.version_info[0] == 2:
input = raw_input
try:
# Test if wheel is installed, otherwise the user will only see:
# error: invalid command 'bdist_wheel'
import wheel
except ImportError as err:
print("\nError: %s" % err)
print("\nMaybe https://pypi.python.org/pypi/wheel is not installed or virtualenv not activated?!?")
print("e.g.:")
print(" ~/your/env/$ source bin/activate")
print(" ~/your/env/$ pip install wheel")
sys.exit(-1)
try:
import twine
except ImportError as err:
print("\nError: %s" % err)
print("\nMaybe https://pypi.python.org/pypi/twine is not installed or virtualenv not activated?!?")
print("e.g.:")
print(" ~/your/env/$ source bin/activate")
print(" ~/your/env/$ pip install twine")
sys.exit(-1)
def verbose_check_output(*args):
""" 'verbose' version of subprocess.check_output() """
call_info = "Call: %r" % " ".join(args)
try:
output = subprocess.check_output(args, universal_newlines=True, stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as err:
print("\n***ERROR:")
print(err.output)
raise
return call_info, output
def verbose_check_call(*args):
""" 'verbose' version of subprocess.check_call() """
print("\tCall: %r\n" % " ".join(args))
subprocess.check_call(args, universal_newlines=True)
if "dev" in __version__:
print("\nERROR: Version contains 'dev': v%s\n" % __version__)
sys.exit(-1)
print("\nCheck if we are on 'master' branch:")
call_info, output = verbose_check_output("git", "branch", "--no-color")
print("\t%s" % call_info)
if "* master" in output:
print("OK")
else:
print("\nNOTE: It seems you are not on 'master':")
print(output)
if input("\nPublish anyhow? (Y/N)").lower() not in ("y", "j"):
print("Bye.")
sys.exit(-1)
print("\ncheck if if git repro is clean:")
call_info, output = verbose_check_output("git", "status", "--porcelain")
print("\t%s" % call_info)
if output == "":
print("OK")
else:
print("\n *** ERROR: git repro not clean:")
print(output)
sys.exit(-1)
print("\ncheck if pull is needed")
verbose_check_call("git", "fetch", "--all")
call_info, output = verbose_check_output("git", "log", "HEAD..origin/master", "--oneline")
print("\t%s" % call_info)
if output == "":
print("OK")
else:
print("\n *** ERROR: git repro is not up-to-date:")
print(output)
sys.exit(-1)
verbose_check_call("git", "push")
print("\nCleanup old builds:")
def rmtree(path):
path = os.path.abspath(path)
if os.path.isdir(path):
print("\tremove tree:", path)
shutil.rmtree(path)
rmtree("./dist")
rmtree("./build")
print("\nbuild but don't upload...")
log_filename="build.log"
with open(log_filename, "a") as log:
call_info, output = verbose_check_output(
sys.executable or "python",
"setup.py", "sdist", "bdist_wheel", "bdist_egg"
)
print("\t%s" % call_info)
log.write(call_info)
log.write(output)
print("Build output is in log file: %r" % log_filename)
print("\ngit tag version (will raise a error of tag already exists)")
verbose_check_call("git", "tag", "v%s" % __version__)
print("\nUpload with twine:")
twine_args = sys.argv[1:]
twine_args.remove("publish")
twine_args.insert(1, "dist/*")
print("\ttwine upload command args: %r" % " ".join(twine_args))
from twine.commands.upload import main as twine_upload
twine_upload(twine_args)
print("\ngit push tag to server")
verbose_check_call("git", "push", "--tags")
sys.exit(0)
setup(
name='python-creole',
version=__version__,
description='python-creole is an open-source (GPL) markup converter in pure Python for: creole2html, html2creole, html2ReSt, html2textile',
long_description=get_long_description(PACKAGE_ROOT),
author=get_authors(),
author_email="python-creole@jensdiemer.de",
maintainer="Jens Diemer",
url='https://github.com/jedie/python-creole/',
packages=find_packages(),
include_package_data=True, # include package data under svn source control
data_files=[("", ["README.creole"])], # README used in unittest test_setup_utils.py
entry_points={
"console_scripts": [
"creole2html = creole.cmdline:cli_creole2html",
"html2creole = creole.cmdline:cli_html2creole",
"html2rest = creole.cmdline:cli_html2rest",
"html2textile = creole.cmdline:cli_html2textile",
],
},
tests_require=[
"nose", # https://pypi.python.org/pypi/nose
],
zip_safe=True, # http://packages.python.org/distribute/setuptools.html#setting-the-zip-safe-flag
keywords="creole markup creole2html html2creole rest2html html2rest html2textile",
classifiers=[
# http://pypi.python.org/pypi?%3Aaction=list_classifiers
"Development Status :: 5 - Production/Stable",
"Environment :: Web Environment",
"Intended Audience :: Developers",
"License :: OSI Approved :: GNU General Public License (GPL)",
"Programming Language :: Python",
"Programming Language :: Python :: 2.6",
"Programming Language :: Python :: 2.7",
"Programming Language :: Python :: 3.2",
"Programming Language :: Python :: Implementation :: PyPy",
"Operating System :: OS Independent",
"Topic :: Documentation",
"Topic :: Internet :: WWW/HTTP :: Dynamic Content",
"Topic :: Software Development :: Libraries :: Python Modules",
"Topic :: Text Processing :: Markup",
"Topic :: Text Processing :: Markup :: HTML",
"Topic :: Utilities",
],
test_suite="nose.collector",
)