Packaging updates in preparation for next release.

- `make test` runs tox against Python 2.7/3.3/3.4/3.5 and Django
  1.8/1.9.
- Building universal wheels with PEP-0496 Environment Markers.
- Build wheel from tox environment to ensure consistency.
- Consistent layout for setup and requirements files, now using PEP-0409
  Environment Markers.
- Dropping support for Django 1.7 (didn't work anyway).
- Moving repository to https://github.com/django-ddp/django-ddp (new
  Github organisation).
- Update changelog.
This commit is contained in:
Tyson Clugg 2015-12-14 12:45:20 +11:00
parent c8e4600419
commit d7dde53bdc
13 changed files with 250 additions and 81 deletions

View file

@ -1,3 +0,0 @@
[run]
branch=True
source=dddp

View file

@ -6,6 +6,11 @@ This project adheres to `Semantic Versioning <http://semver.org/>`_.
develop
-------
* Dropped support for Django 1.7 (didn't work anyway).
* Require `setuptools>=18.5` at install time due to use of
`python_platform_implementation` environment marker.
* Moved repository to https://github.com/django-ddp/django-ddp (new
Github organisation).
* Add missing versions and dates to the change log, and note on Semantic
Versioning.
* Back to universal wheels, thanks to PEP-0496 environment markers.
@ -13,6 +18,9 @@ develop
* Set `application_name` on PostgreSQL async connection.
* Send `django.core.signals.request_finished` when closing WebSocket.
* Don't require `DJANGO_SETTINGS_MODULE` to import API.
* Tox test suite updated to runs against Python 2.7/3.3/3.4/3.5 and
Django 1.8/1.9.
* Build wheels from tox environment to ensure consistency.
0.18.1 (2015-11-06)
-------------------

View file

@ -2,49 +2,53 @@ NAME := $(shell python setup.py --name)
VERSION := $(shell python setup.py --version)
SDIST := dist/${NAME}-${VERSION}.tar.gz
WHEEL_PY2 := dist/$(subst -,_,${NAME})-${VERSION}-py2-none-any.whl
WHEEL_PY3 := dist/$(subst -,_,${NAME})-${VERSION}-py3-none-any.whl
WHEEL_PYPY := dist/$(subst -,_,${NAME})-${VERSION}-pypy-none-any.whl
WHEEL := dist/$(subst -,_,${NAME})-${VERSION}-py2.py3-none-any.whl
.PHONY: all test clean clean-docs clean-dist upload-docs upload-pypi dist
.INTERMEDIATE: dist.intermediate docs
all: docs dist
all: .travis.yml docs dist
test:
tox -vvv
clean: clean-docs clean-dist
clean: clean-docs clean-dist clean-pyc
clean-docs:
$(MAKE) -C docs/ clean
clean-dist:
rm -f "${SDIST}" "${WHEEL_PY2}" "${WHEEL_PY3}"
rm -f "${SDIST}" "${WHEEL}"
clean-pyc:
find . -type f -name \*.pyc -print0 | xargs -0 rm
docs: $(shell find docs/ -type f -name \*.rst) docs/conf.py docs/Makefile $(shell find docs/_static/ -type f) $(shell find docs/_templates/ -type f) README.rst CHANGES.rst
$(MAKE) -C docs/ clean html
touch "$@"
dist: ${SDIST} ${WHEEL_PY2} ${WHEEL_PY3}
dist: ${SDIST} ${WHEEL}
@echo 'Build successful, `${MAKE} upload` when ready to release.'
${SDIST}: dist.intermediate
@echo "Testing ${SDIST}..."
tox --installpkg ${SDIST}
${WHEEL_PY2}: dist.intermediate
${WHEEL_PY3}: dist.intermediate
${WHEEL_PYPY}:
tox -e pypy-test-dist
${WHEEL}: dist.intermediate
@echo "Testing ${WHEEL}..."
tox --installpkg ${WHEEL}
dist.intermediate: $(shell find dddp -type f)
tox -e py27-test-dist,py34-test-dist
tox -e dist
upload: upload-pypi upload-docs
upload-pypi: ${SDIST} ${WHEEL_PY2} ${WHEEL_PY3}
twine upload "${WHEEL_PY2}" "${WHEEL_PY3}" "${SDIST}"
upload-pypi: ${SDIST} ${WHEEL}
twine upload "${WHEEL}" "${SDIST}"
upload-docs: docs/_build/
python setup.py upload_sphinx --upload-dir="$<html"
.travis.yml: tox.ini .travis.yml.sh
sh .travis.yml.sh > "$@"

View file

@ -1,3 +1,4 @@
==========
Django DDP
==========
@ -259,6 +260,7 @@ Contributors
This project is forever grateful for the love, support and respect given
by the awesome team at `Common Code`_.
.. _Django DDP: https://github.com/django-ddp/django-ddp
.. _Django: https://www.djangoproject.com/
.. _Django signals: https://docs.djangoproject.com/en/stable/topics/signals/
.. _Common Code: https://commoncode.com.au/

View file

@ -1,11 +1,11 @@
"""Django/PostgreSQL implementation of the Meteor DDP service."""
"""Django/PostgreSQL implementation of the Meteor server."""
from __future__ import unicode_literals
import os.path
import sys
from gevent.local import local
from dddp import alea
__version__ = '0.18.1'
__url__ = 'https://github.com/django-ddp/django-ddp'
default_app_config = 'dddp.apps.DjangoDDPConfig'

View file

@ -1,5 +0,0 @@
-r requirements.txt
Sphinx==1.3.1
Sphinx-PyPI-upload==0.2.1
cloud_sptheme==1.7
twine==1.6.4

5
requirements-dev.txt Normal file
View file

@ -0,0 +1,5 @@
# things you need to build from source and distribute a release
Sphinx==1.3.3
Sphinx-PyPI-upload==0.2.1
twine==1.6.4
sphinxcontrib-dashbuilder==0.1.0

2
requirements-test.txt Normal file
View file

@ -0,0 +1,2 @@
# things required to run test suite
# (nothing required! we use unittest from stdlib...)

View file

@ -1,5 +1,7 @@
Django==1.8.5
gevent==1.0.2
Django>=1.7
gevent==1.0.2 ; platform_python_implementation == "CPython" and python_version < "3.0"
gevent==1.1rc2 ; platform_python_implementation != "CPython" or python_version >= "3.0"
gevent-websocket==0.9.5
psycopg2==2.6.1
psycopg2==2.6.1 ; platform_python_implementation == "CPython"
psycopg2cffi>=2.7.2 ; platform_python_implementation != "CPython"
six==1.10.0

View file

@ -1,22 +1,43 @@
#!/usr/bin/env python
"""Django/PostgreSQL implementation of the Meteor server."""
from distutils.version import StrictVersion
import os.path
import setuptools
import sys
import subprocess
from distutils import log
from distutils.version import StrictVersion
from distutils.command.build import build
# setuptools 18.5 introduces support for the `platform_python_implementation`
# environment marker: https://github.com/jaraco/setuptools/pull/28
__requires__ = 'setuptools>=18.5'
assert StrictVersion(setuptools.__version__) >= StrictVersion('18.5'), \
'Installation from source requires setuptools>=18.5.'
class Build(build):
"""Build all files of a package."""
def run(self):
"""Build our package."""
cmdline = [
'meteor',
'build',
'--directory',
'../build',
]
meteor_dir = os.path.join(
os.path.dirname(__file__),
'dddp',
'test',
'meteor_todos',
)
log.info('Building meteor app %r (%s)', meteor_dir, ' '.join(cmdline))
subprocess.check_call(cmdline, cwd=meteor_dir)
return build.run(self)
if not StrictVersion(setuptools.__version__) >= StrictVersion('18.5'):
# TODO: Is there an official way to upgrade setuptools in-place?
import subprocess
subprocess.check_call(['pip', 'install', '-U', 'setuptools>=18.5'])
sys.stderr.write(
'Your setuptools has been upgraded, '
'please re-run setup to continue.'
)
sys.exit(1)
CLASSIFIERS = [
# Beta status until 1.0 is released
@ -54,8 +75,8 @@ CLASSIFIERS = [
"Programming Language :: Python :: 3.2",
"Programming Language :: Python :: 3.3",
"Programming Language :: Python :: 3.4",
"Framework :: Django :: 1.7",
"Framework :: Django :: 1.8",
"Framework :: Django :: 1.9",
]
setuptools.setup(
@ -65,41 +86,62 @@ setuptools.setup(
long_description=open('README.rst').read(),
author='Tyson Clugg',
author_email='tyson@clugg.net',
url='https://github.com/commoncode/django-ddp',
url='https://github.com/django-ddp/django-ddp',
keywords=[
'django ddp meteor websocket websockets realtime real-time live '
'liveupdate live-update livequery live-query'
],
license='MIT',
packages=setuptools.find_packages(),
include_package_data=True,
include_package_data=True, # install data files specified in MANIFEST.in
zip_safe=False, # TODO: Move dddp.test into it's own package.
setup_requires=[
'setuptools>=18.5',
# packages required to run the setup script
__requires__,
],
install_requires=[
'Django>=1.7',
'Django>=1.8',
'django-dbarray>=0.2',
'gevent-websocket>=0.9,!=0.9.4',
'meteor-ejson>=1.0',
'psycogreen>=1.0',
'pybars3>=0.9.1',
'six>=1.10.0',
],
extras_require={
# We need gevent version dependent upon environment markers, but the
# extras_require seem to be a separate phase from setup/install of
# install_requires. So we specify gevent-websocket (which depends on
# gevent) here in order to honour environment markers.
'': [
'gevent-websocket>=0.9,!=0.9.4',
],
# Django 1.9 doesn't support Python 3.3
':python_version=="3.3"': [
'Django<1.9',
],
# CPython < 3.0 can use gevent 1.0
':platform_python_implementation == "CPython" '
'and python_version < "3.0"': [
':platform_python_implementation=="CPython" and python_version<"3.0"': [
'gevent>=1.0',
],
# everything else needs gevent 1.1
':platform_python_implementation != "CPython" '
'or python_version >= "3.0"': [
'gevent>=1.1rc1',
':platform_python_implementation!="CPython" or python_version>="3.0"': [
'gevent>=1.1rc2',
],
# CPython can use plain old psycopg2
':platform_python_implementation == "CPython"': [
':platform_python_implementation=="CPython"': [
'psycopg2>=2.5.4',
],
# everything else must use psycopg2cffi
':platform_python_implementation != "CPython"': [
'psycopg2cffi>=2.7.2',
],
'develop': [
# things you need to distribute a wheel from source (`make dist`)
'Sphinx>=1.3.3',
'Sphinx-PyPI-upload>=0.2.1',
'twine>=1.6.4',
'sphinxcontrib-dashbuilder>=0.1.0',
],
},
entry_points={
'console_scripts': [
@ -107,4 +149,8 @@ setuptools.setup(
],
},
classifiers=CLASSIFIERS,
test_suite='dddp.test.run_tests',
cmdclass={
'build': Build,
},
)

View file

@ -1 +0,0 @@
-r requirements.txt

165
tox.ini
View file

@ -4,45 +4,154 @@
# and then run "tox" from this directory.
[tox]
# require tox>=2.1.1 or refuse to run the tests.
# require tox 2.1.1 or later
minversion=2.1.1
# return success even if some of the specified environments are missing
# don't fail if missing a python version specified in envlist
skip_missing_interpreters=True
# "envlist" is a comma separated list of environments, each environment name
# contains factors separated by hyphens. For example, "py27-unittest" has 2
# factors: "py27" and "unittest". Other settings such as "setenv" accept the
# factor names as a prefixes (eg: "unittest: ...") so that prefixed settings
# only apply if the environment being run contains that factor.
# list of environments to run by default
envlist =
py27-test,
py33-test,
py34-test,
py35-test,
pypy-test,
lint
clean
py33-django{1.8}
{py27,py34,py35,pypy,pypy3}-django{1.8,1.9}
report
[testenv]
# virtualenv only installs setuptools==0.18.2 but we need 0.18.5:
# - https://github.com/pypa/virtualenv/issues/807
# - https://github.com/pypa/virtualenv/issues/801
# - https://github.com/pypa/virtualenv/issues/717
# - https://github.com/pypa/virtualenv/issues/781
# - https://github.com/pypa/virtualenv/issues/580
# - https://github.com/pypa/virtualenv/issues/563
# - https://github.com/pypa/virtualenv/issues/491
# wheel 0.25.0 needed for Python 3.5:
# - https://bitbucket.org/pypa/wheel/issues/146/wheel-building-fails-on-cpython-350b3
install_command=sh -c 'pip install -U "setuptools>=18.5" "wheel>=0.25.0" "pip>=7.1.2" && pip install "$@" && sync' sh {opts} {packages}
whitelist_externals=sh
# force clean environment each time
recreate=True
usedevelop=True
# build sdist from setup.py and install from that (validate setup.py)
usedevelop=False
# list of environment variables passed through to commands
passenv=
BUILD_NUMBER
BUILD_URL
XDG_CACHE_HOME
; https://help.ubuntu.com/community/EnvironmentVariables#Other_environment_variables
USER
LOGNAME
HOME
TERM
TERMCAP
# stop running commands if previous commands fail
ignore_errors = False
; https://help.ubuntu.com/community/EnvironmentVariables#Graphical_desktop-related_variables
DISPLAY
XDG_CACHE_HOME
C_INCLUDE_PATH
CFLAGS
; https://wiki.jenkins-ci.org/display/JENKINS/Building+a+software+project
BUILD_NUMBER
BUILD_ID
BUILD_URL
NODE_NAME
JOB_NAME
BUILD_TAG
JENKINS_URL
EXECUTOR_NUMBER
JAVA_HOME
WORKSPACE
GIT_COMMIT
GIT_URL
GIT_BRANCH
; http://www.postgresql.org/docs/current/static/libpq-envars.html
PGHOST
PGHOSTADDR
PGPORT
PGDATABASE
PGUSER
PGPASSWORD
PGPASSFILE
PGSERVICE
PGSERVICEFILE
PGREALM
PGOPTIONS
PGAPPNAME
PGSSLMODE
PGREQUIRESSL
PGSSLCOMPRESSION
PGSSLCERT
PGSSLKEY
PGSSLROOTCERT
PGSSLCRL
PGREQUIREPEER
PGKRBSRVNAME
PGSSLLIB
PGCONNECT_TIMEOUT
PGCLIENTENCODING
PGDATESTYLE
PGTZ
PGGEQO
PGSYSCONFDIR
PGLOCALEDIR
# `pip install -rrequierements.txt` <-- tox doesn't understand PEP-0496 Environment Markers.
# pypy coverage fails with --concurrency set to `gevent`
# pypy install gevent fails building wheel
commands =
dist: check-manifest
py{27,33,34,35}-test: coverage run --concurrency=gevent {toxinidir}/dddp/test/manage.py test -v3 --noinput
pypy-test: coverage run {toxinidir}/dddp/test/manage.py test -v3 --noinput
test: coverage report
dist: {envpython} setup.py --quiet --no-user-cfg sdist --dist-dir={toxinidir}/dist/
dist: {envpython} setup.py --quiet --no-user-cfg bdist_wheel --dist-dir={toxinidir}/dist/
{py27,py33,py34,py35}: pip install -rrequirements.txt
{pypy,pypy3}: pip install --no-binary gevent -rrequirements.txt
{py27,py33,py34,py35}: coverage run --append --concurrency=gevent --source=dddp setup.py test
{pypy,pypy3}: coverage run --append --source=dddp setup.py test
deps =
test: coverage
dist: check-manifest
dist: wheel
#-rrequirements.txt
django1.8: Django>=1.8,<1.9
django1.9: Django>=1.9,<1.10
coverage
[testenv:dist]
commands =
check-manifest --ignore "dddp/test/build*,dddp/test/meteor_todos/.meteor/local*"
{envpython} setup.py --quiet --no-user-cfg sdist --dist-dir={toxinidir}/dist/
{envpython} setup.py --quiet --no-user-cfg bdist_wheel --dist-dir={toxinidir}/dist/
# the `dist` environment doesn't need our package installed
skip_install=True
deps =
-rrequirements-dev.txt
check-manifest
wheel
[testenv:clean]
skip_install=True
deps=coverage
commands=
coverage erase
[testenv:report]
skip_install=True
deps=coverage
commands=
coverage report
coverage html
[testenv:lint]
usedevelop=True
commands=
pip install -rrequirements.txt
prospector --doc-warnings --zero-exit {toxinidir}/dddp/
deps =
prospector==0.10.2
pylint==1.4.5