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