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
[email protected]
https://mail.python.org/mailman/listinfo/pytest-commit