From a4f8eb1afeea16aaf5fde665fac53bede2684add Mon Sep 17 00:00:00 2001 From: David Beniamine <david.beniamine@tetras-libre.fr> Date: Sat, 8 Sep 2018 20:11:26 +0200 Subject: [PATCH] Pytests and gitlab-ci --- .gitignore | 5 ++++ .gitlab-ci.yml | 19 ++++++++++++++ parallelRunAndWrite.py | 32 ++--------------------- setup.cfg | 2 ++ setup.py | 8 ++++++ test_prw.py | 59 ++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 95 insertions(+), 30 deletions(-) create mode 100644 .gitignore create mode 100644 .gitlab-ci.yml create mode 100644 setup.cfg create mode 100644 setup.py create mode 100644 test_prw.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7728b7e --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +*.egg-info +.eggs +__pycache__ +.ropeproject +.pytest_cache diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..c104926 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,19 @@ +image: python:3.6 + +stages: + - build + - test + - deploy + + +installSetupTools: + stage: build + script: pip install setuptools + +installPackage: + stage: build + script: pip install -e . + +simpleTest: + stage: test + script: python setup.py test diff --git a/parallelRunAndWrite.py b/parallelRunAndWrite.py index 7601e8b..76b2ffa 100644 --- a/parallelRunAndWrite.py +++ b/parallelRunAndWrite.py @@ -17,13 +17,11 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. import multiprocessing as mp -import os import traceback from pyprind import ProgBar -from time import sleep, time -from random import randint from contextlib import ExitStack from sys import stderr +from time import time MAX_PROC = int(mp.cpu_count()) @@ -68,7 +66,7 @@ def parallelRunAndWrite(func, tasks, outFileName, bar=True, errFileName=None, nu f.write(message + '\n') f.flush() - progressBar.update() + if(bar): progressBar.update() # Report status errmsg= '{} errors / {} tasks written to file "{}" \n'.format(numErrors, len(tasks), errFileName) if(errFileName) else '' @@ -83,29 +81,3 @@ def worker(args): if(handleErrors): return (False,traceback.format_exc()) raise - -# Testing - -def testFunc(arg): - if(randint(0,100)%2 ==0): - raise Exception("COUCOU"+ret) - return testFunc2(arg) - -def testFunc2(arg): - ret=str(arg)+str(os.getpid()) - sleep(randint(0,3)) - return ret - - -def test(): - print("Error file + debug") - parallelRunAndWrite(testFunc, range(10), "testplop", numProc=2, errFileName="errors", debug=True) - print("Error file") - parallelRunAndWrite(testFunc, range(10), "testplop", numProc=2, errFileName="errors") - print("No error file/ no rror") - parallelRunAndWrite(testFunc2, range(10), "testplop", numProc=2) - print("No error file") - parallelRunAndWrite(testFunc, range(10), "testplop", numProc=2) - -if __name__ == "__main__": - test() diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..b7e4789 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,2 @@ +[aliases] +test=pytest diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..2dc47a3 --- /dev/null +++ b/setup.py @@ -0,0 +1,8 @@ +from setuptools import setup, find_packages + +setup( + name="pyParallelRunAndWrite", + packages=find_packages(), + setup_requires=["pytest-runner"], + tests_require=["pytest"], +) diff --git a/test_prw.py b/test_prw.py new file mode 100644 index 0000000..be6c14d --- /dev/null +++ b/test_prw.py @@ -0,0 +1,59 @@ +from pyParallelRunAndWrite import parallelRunAndWrite as prw +from time import sleep, time +import os +from random import randint +import re + +rangeSize = 10 +outFname = "output.txt" +errFname = "err.txt" +errRegex='prw arg \d+ pid \d+' + + +def raiseOrWork(arg): + if(randint(0,100)%2 ==0): + raise Exception("prw arg {} pid {} ".format(arg, os.getpid())) + return work(arg) + +def work(arg): + ret=str(arg)+str(os.getpid()) + sleep(randint(0,3)) + return ret + +def verifyOutput(): + ok=True + with open(outFname, 'r') as f: + for line in f.read(): + if(re.match('\d*',line) is None) : + ok=False + assert ok + +def verifyErrFile(): + found=False + with open(errFname, 'r') as f: + for line in f.read(): + if(re.match('Exception: '+errRegex,line) is None) : + found=True + assert found + +def verifyFiles(): + verifyOutput() + verifyErrFile() + +def testErrFileDebug(): + prw.parallelRunAndWrite(raiseOrWork, range(rangeSize), outFname, errFileName=errFname, debug=True, bar=False) + verifyFiles() + +def testErrFile(): + prw.parallelRunAndWrite(raiseOrWork, range(rangeSize), outFname, errFileName=errFname) + verifyFiles() + +def testNoErrFile(): + prw.parallelRunAndWrite(work, range(rangeSize), outFname) + verifyOutput() + +def testRaise(): + from pytest import raises + with raises(Exception, match=r''+errRegex): + prw.parallelRunAndWrite(raiseOrWork, range(rangeSize), outFname) + verifyFiles() -- GitLab