2 new commits in py:

https://bitbucket.org/hpk42/py/commits/7358b67ed02d/
Changeset:   7358b67ed02d
User:        schlamar
Date:        2014-06-05 11:12:16
Summary:     add start and exit hooks to ForkedFunc
Affected #:  2 files

diff -r dda77653de9d9aa84bfb9ca0e1a59498863563d1 -r 
7358b67ed02d8f0be0a74531f4ef5fe961d091cc py/_process/forkedfunc.py
--- a/py/_process/forkedfunc.py
+++ b/py/_process/forkedfunc.py
@@ -11,9 +11,34 @@
 import marshal
 
 
-class ForkedFunc(object):
+
+class HookMixin(object):
+    _on_start = list()
+    _on_exit = list()
+
+    @classmethod
+    def register_on_start(cls, callback):
+        cls._on_start.append(callback)
+
+    @classmethod
+    def register_on_exit(self, callback):
+        self._on_exit.append(callback)
+
+    def _run_on_start(self):
+        self._run_callbacks(self._on_start)
+
+    def _run_on_exit(self):
+        self._run_callbacks(self._on_exit)
+
+    def _run_callbacks(self, callbacks):
+        for callback in callbacks:
+            callback(self)
+
+
+class ForkedFunc(HookMixin):
     EXITSTATUS_EXCEPTION = 3
 
+
     def __init__(self, fun, args=None, kwargs=None, nice_level=0):
         if args is None:
             args = []
@@ -51,8 +76,10 @@
             if nice_level:
                 os.nice(nice_level)
             try:
+                self._run_on_start()
                 retval = self.fun(*self.args, **self.kwargs)
                 retvalf.write(marshal.dumps(retval))
+                self._run_on_exit()
             except:
                 excinfo = py.code.ExceptionInfo()
                 stderr.write(excinfo.exconly())
@@ -98,6 +125,7 @@
             self._removetemp()
 
 
+
 class Result(object):
     def __init__(self, exitstatus, signal, retval, stdout, stderr):
         self.exitstatus = exitstatus

diff -r dda77653de9d9aa84bfb9ca0e1a59498863563d1 -r 
7358b67ed02d8f0be0a74531f4ef5fe961d091cc testing/process/test_forkedfunc.py
--- a/testing/process/test_forkedfunc.py
+++ b/testing/process/test_forkedfunc.py
@@ -110,6 +110,25 @@
     assert result.signal == 15
 
 
+def test_hooks():
+    def _boxed():
+        return 1
+
+    def _on_start(proc):
+        sys.stdout.write("some out\n")
+
+    def _on_exit(proc):
+        sys.stderr.write("some err\n")
+
+    py.process.ForkedFunc.register_on_start(_on_start)
+    py.process.ForkedFunc.register_on_exit(_on_exit)
+    result = py.process.ForkedFunc(_boxed).waitfinish()
+    assert result.out == "some out\n"
+    assert result.err == "some err\n"
+    assert result.exitstatus == 0
+    assert result.signal == 0
+    assert result.retval == 1
+
 
 # ======================================================================
 # examples


https://bitbucket.org/hpk42/py/commits/af768db52bd0/
Changeset:   af768db52bd0
User:        schlamar
Date:        2014-06-05 11:39:27
Summary:     fix unbuffered I/O on Python 3
Affected #:  1 file

diff -r 7358b67ed02d8f0be0a74531f4ef5fe961d091cc -r 
af768db52bd077d1688f27794042cf353e21086a py/_process/forkedfunc.py
--- a/py/_process/forkedfunc.py
+++ b/py/_process/forkedfunc.py
@@ -11,7 +11,6 @@
 import marshal
 
 
-
 class HookMixin(object):
     _on_start = list()
     _on_exit = list()
@@ -62,11 +61,11 @@
     def _child(self, nice_level):
         # right now we need to call a function, but first we need to
         # map all IO that might happen
-        sys.stdout = stdout = open(str(self.STDOUT), "w", 0)
+        sys.stdout = stdout = open(str(self.STDOUT), "wb", 0)
         fdstdout = stdout.fileno()
         if fdstdout != 1:
             os.dup2(fdstdout, 1)
-        sys.stderr = stderr = open(str(self.STDERR), "w", 0)
+        sys.stderr = stderr = open(str(self.STDERR), "wb", 0)
         fdstderr = stderr.fileno()
         if fdstderr != 2:
             os.dup2(fdstderr, 2)
@@ -125,7 +124,6 @@
             self._removetemp()
 
 
-
 class Result(object):
     def __init__(self, exitstatus, signal, retval, stdout, stderr):
         self.exitstatus = exitstatus

Repository URL: https://bitbucket.org/hpk42/py/

--

This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
_______________________________________________
pytest-commit mailing list
pytest-commit@python.org
https://mail.python.org/mailman/listinfo/pytest-commit

Reply via email to