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