From 4db81cf00d4f0b6ba522244f69fa5878d15b07cc Mon Sep 17 00:00:00 2001 From: Joshua Harlow Date: Wed, 18 Mar 2015 13:57:10 -0700 Subject: [PATCH] Add tox.ini for using tox for testing Refactor parts of the makefile and testing to support the currently standard tox command to test various environments. This also moves most of the zookeeper setup and teardown logic out of the makefile and into a specific script file that just does this setup/teardown. --- .travis.yml | 30 ++++++++--------- Makefile | 37 +++++---------------- requirements.txt | 1 + setup-zookeeper-env.sh | 74 ++++++++++++++++++++++++++++++++++++++++++ setup.py | 1 + tox.ini | 34 +++++++++++++++++++ 6 files changed, 134 insertions(+), 43 deletions(-) create mode 100755 setup-zookeeper-env.sh create mode 100644 tox.ini diff --git a/.travis.yml b/.travis.yml index 7ce7984..2fe661a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,35 +6,35 @@ matrix: - python: "2.7" include: - python: "2.6" - env: GEVENT_VERSION=0.13.8 ZOOKEEPER_VERSION=3.3.6 + env: GEVENT_VERSION=0.13.8 ZOOKEEPER_VERSION=3.3.6 TOX_VENV=py26 - python: "2.6" - env: GEVENT_VERSION=0.13.8 ZOOKEEPER_VERSION=3.4.6 + env: GEVENT_VERSION=0.13.8 ZOOKEEPER_VERSION=3.4.6 TOX_VENV=py26 - python: "2.6" - env: GEVENT_VERSION=1.0.1 ZOOKEEPER_VERSION=3.3.6 + env: GEVENT_VERSION=1.0.1 ZOOKEEPER_VERSION=3.3.6 TOX_VENV=py26 - python: "2.6" - env: GEVENT_VERSION=1.0.1 ZOOKEEPER_VERSION=3.4.6 + env: GEVENT_VERSION=1.0.1 ZOOKEEPER_VERSION=3.4.6 TOX_VENV=py26 - python: "2.7" - env: GEVENT_VERSION=0.13.8 ZOOKEEPER_VERSION=3.3.6 + env: GEVENT_VERSION=0.13.8 ZOOKEEPER_VERSION=3.3.6 TOX_VENV=py27 - python: "2.7" - env: GEVENT_VERSION=0.13.8 ZOOKEEPER_VERSION=3.4.6 + env: GEVENT_VERSION=0.13.8 ZOOKEEPER_VERSION=3.4.6 TOX_VENV=py27 - python: "2.7" - env: GEVENT_VERSION=1.0.1 ZOOKEEPER_VERSION=3.3.6 + env: GEVENT_VERSION=1.0.1 ZOOKEEPER_VERSION=3.3.6 TOX_VENV=py27 - python: "2.7" - env: GEVENT_VERSION=1.0.1 ZOOKEEPER_VERSION=3.4.6 + env: GEVENT_VERSION=1.0.1 ZOOKEEPER_VERSION=3.4.6 TOX_VENV=py27 - python: "2.7" - env: GEVENT_VERSION=1.0.1 ZOOKEEPER_VERSION=3.5.0-alpha + env: GEVENT_VERSION=1.0.1 ZOOKEEPER_VERSION=3.5.0-alpha TOX_VENV=py27 - python: "3.3" - env: ZOOKEEPER_VERSION=3.3.6 + env: ZOOKEEPER_VERSION=3.3.6 TOX_VENV=py33 - python: "3.3" - env: ZOOKEEPER_VERSION=3.4.6 + env: ZOOKEEPER_VERSION=3.4.6 TOX_VENV=py33 - python: "3.4" - env: ZOOKEEPER_VERSION=3.3.6 + env: ZOOKEEPER_VERSION=3.3.6 TOX_VENV=py34 - python: "3.4" - env: ZOOKEEPER_VERSION=3.4.6 + env: ZOOKEEPER_VERSION=3.4.6 TOX_VENV=py34 - python: "pypy" - env: ZOOKEEPER_VERSION=3.3.6 + env: ZOOKEEPER_VERSION=3.3.6 TOX_VENV=pypy - python: "pypy" - env: ZOOKEEPER_VERSION=3.4.6 + env: ZOOKEEPER_VERSION=3.4.6 TOX_VENV=pypy notifications: email: false diff --git a/Makefile b/Makefile index a1f5dcd..a4224b6 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,10 @@ HERE = $(shell pwd) BIN = $(HERE)/bin PYTHON = $(BIN)/python - PIP_DOWNLOAD_CACHE ?= $(HERE)/.pip_cache INSTALL = $(BIN)/pip install INSTALL += --download-cache $(PIP_DOWNLOAD_CACHE) - +TOX_VENV ?= py27 BUILD_DIRS = bin build include lib lib64 man share GEVENT_VERSION ?= 1.0.1 @@ -14,19 +13,15 @@ PYPY = $(shell $(PYTHON_EXE) -c "import sys; print(getattr(sys, 'pypy_version_in TRAVIS ?= false TRAVIS_PYTHON_VERSION ?= $(shell $(PYTHON_EXE) -c "import sys; print('.'.join([str(s) for s in sys.version_info][:2]))") -ZOOKEEPER = $(BIN)/zookeeper -ZOOKEEPER_VERSION ?= 3.4.6 -ZOOKEEPER_PATH ?= $(ZOOKEEPER) - -GEVENT_SUPPORTED = yes +GREENLET_SUPPORTED = yes ifeq ($(findstring 3.,$(TRAVIS_PYTHON_VERSION)), 3.) - GEVENT_SUPPORTED = no + GREENLET_SUPPORTED = no endif ifeq ($(PYPY),yes) - GEVENT_SUPPORTED = no + GREENLET_SUPPORTED = no endif -.PHONY: all build clean test zookeeper clean-zookeeper +.PHONY: all build clean test all: build @@ -34,7 +29,8 @@ $(PYTHON): python sw/virtualenv.py . build: $(PYTHON) -ifeq ($(GEVENT_SUPPORTED),yes) +ifeq ($(GREENLET_SUPPORTED),yes) + $(INSTALL) -U -r requirements_eventlet.txt $(INSTALL) -U -r requirements_gevent.txt $(INSTALL) -f https://github.com/surfly/gevent/releases gevent==$(GEVENT_VERSION) endif @@ -48,24 +44,9 @@ endif clean: rm -rf $(BUILD_DIRS) -test: - ZOOKEEPER_PATH=$(ZOOKEEPER_PATH) NOSE_LOGFORMAT='%(thread)d:%(filename)s: %(levelname)s: %(message)s' \ - $(BIN)/nosetests -d -v --with-coverage kazoo.tests +test: $(PYTHON) + tox -e$(TOX_VENV) html: cd docs && \ make html - -$(ZOOKEEPER): - @echo "Installing Zookeeper" - mkdir -p $(BIN) - cd $(BIN) && \ - curl -C - http://apache.osuosl.org/zookeeper/zookeeper-$(ZOOKEEPER_VERSION)/zookeeper-$(ZOOKEEPER_VERSION).tar.gz | tar -zx - mv $(BIN)/zookeeper-$(ZOOKEEPER_VERSION) $(ZOOKEEPER_PATH) - chmod a+x $(ZOOKEEPER_PATH)/bin/zkServer.sh - @echo "Finished installing Zookeeper" - -zookeeper: $(ZOOKEEPER) - -clean-zookeeper: - rm -rf zookeeper $(ZOOKEEPER_PATH) diff --git a/requirements.txt b/requirements.txt index 064f072..87f71c2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ coverage==3.7.1 mock==1.0.1 nose==1.3.3 +flake8==2.3.0 diff --git a/setup-zookeeper-env.sh b/setup-zookeeper-env.sh new file mode 100755 index 0000000..5eae2d6 --- /dev/null +++ b/setup-zookeeper-env.sh @@ -0,0 +1,74 @@ +#!/bin/bash + +set -x -e + +HERE=`pwd` +ZOO_TMP_DIR=$(mktemp -d /tmp/ZOO-TMP-XXXXX) +mkdir -p $ZOO_TMP_DIR/bin +mkdir -p $ZOO_TMP_DIR/log + +ZOOKEEPER_STARTED=0 +ZOOKEEPER_VERSION=${ZOOKEEPER_VERSION:-3.4.6} +ZOO_BASE_DIR="$PWD/bin/" +ZOOKEEPER_PATH="$ZOO_BASE_DIR/zookeeper-$ZOOKEEPER_VERSION" + + +function download_zookeeper(){ + mkdir -p $ZOO_BASE_DIR + cd $ZOO_BASE_DIR && \ + curl -C - http://apache.osuosl.org/zookeeper/zookeeper-$ZOOKEEPER_VERSION/zookeeper-$ZOOKEEPER_VERSION.tar.gz | tar -zx + chmod a+x $ZOOKEEPER_PATH/bin/zkServer.sh +} + + +function stop_zookeeper_server(){ + $ZOO_TMP_DIR/bin/zkServer.sh stop +} + + +function clean_exit(){ + local error_code="$?" + if [ $ZOOKEEPER_STARTED -eq 1 ]; then + stop_zookeeper_server + fi + rm -rf ${ZOO_TMP_DIR} + return $error_code +} + + +function start_zookeeper_server(){ + # Copy zookeeper scripts in temporary directory + cp $ZOOKEEPER_PATH/bin/* $ZOO_TMP_DIR/bin + + # Copy zookeeper conf and set dataDir variable to the zookeeper temporary + # directory + cp "$ZOOKEEPER_PATH/conf/zoo_sample.cfg" "$ZOO_TMP_DIR/zoo.cfg" + + sed -i -r "s@(dataDir *= *).*@\1$ZOO_TMP_DIR@" $ZOO_TMP_DIR/zoo.cfg + + # Replace some variables by the zookeeper temporary directory + sed -i -r "s@(ZOOCFGDIR *= *).*@\1$ZOO_TMP_DIR@" $ZOO_TMP_DIR/bin/zkEnv.sh + + sed -i -r "s@(ZOO_LOG_DIR *= *).*@\1$ZOO_TMP_DIR/log@" $ZOO_TMP_DIR/bin/zkEnv.sh + + $ZOO_TMP_DIR/bin/zkServer.sh start +} + + +if [ ! -d "$ZOOKEEPER_PATH" ]; then + download_zookeeper +fi + +trap "clean_exit" EXIT + +start_zookeeper_server +if [ $? -eq 0 ]; then + ZOOKEEPER_STARTED=1 +fi + +export ZOOKEEPER_PATH +cd $HERE + +# Yield execution to venv command +$* + diff --git a/setup.py b/setup.py index d094aeb..3af11ce 100644 --- a/setup.py +++ b/setup.py @@ -20,6 +20,7 @@ tests_require = install_requires + [ 'coverage', 'mock', 'nose', + 'flake8', ] if not (PYTHON3 or PYPY): diff --git a/tox.ini b/tox.ini new file mode 100644 index 0000000..c72e3aa --- /dev/null +++ b/tox.ini @@ -0,0 +1,34 @@ +[tox] +minversion = 1.6 +skipsdist = True +envlist = pep8, + py26, + py27, + py33, + py34, + pypy + +[testenv:pep8] +commands = flake8 {posargs} + +[testenv] +usedevelop = True +install_command = pip install {opts} {packages} +setenv = VIRTUAL_ENV={envdir} +deps = -r{toxinidir}/requirements.txt + -r{toxinidir}/requirements_sphinx.txt +commands = {toxinidir}/setup-zookeeper-env.sh nosetests {posargs} -d -v --with-coverage kazoo.tests + +[testenv:py27] +deps = {[testenv]deps} + -r{toxinidir}/requirements_gevent.txt + -r{toxinidir}/requirements_eventlet.txt + +[testenv:py26] +deps = {[testenv]deps} + -r{toxinidir}/requirements_gevent.txt + -r{toxinidir}/requirements_eventlet.txt + +[flake8] +builtins = _ +exclude = .venv,.tox,dist,doc,*egg,.git,build,tools