aboutsummaryrefslogtreecommitdiffstats
path: root/wkhtmltopdf/process.py
diff options
context:
space:
mode:
authorFilipp Lepalaan <filipp@mac.com>2017-01-27 15:46:51 +0200
committerFilipp Lepalaan <filipp@mac.com>2017-01-27 15:46:51 +0200
commitf857631011e4ef0642647b44623ffc8bc138d2cc (patch)
treeb7d9af37dd44a00cdf17cb7c0ead0b410213f6fb /wkhtmltopdf/process.py
parente7aa62484a6cbe89a3eeb155fcc8aef31d615cff (diff)
downloaddjango-wkhtmltopdf-f857631011e4ef0642647b44623ffc8bc138d2cc.tar.gz
django-wkhtmltopdf-f857631011e4ef0642647b44623ffc8bc138d2cc.tar.bz2
django-wkhtmltopdf-f857631011e4ef0642647b44623ffc8bc138d2cc.zip
Make ContentNotFoundError optional
Diffstat (limited to 'wkhtmltopdf/process.py')
-rw-r--r--wkhtmltopdf/process.py88
1 files changed, 88 insertions, 0 deletions
diff --git a/wkhtmltopdf/process.py b/wkhtmltopdf/process.py
new file mode 100644
index 0000000..d36aacb
--- /dev/null
+++ b/wkhtmltopdf/process.py
@@ -0,0 +1,88 @@
+import os
+from subprocess import Popen, PIPE, STDOUT, CalledProcessError
+
+
+def check_output(*popenargs, **kwargs):
+ r"""Run command with arguments and return its output as a byte string.
+
+ If the exit code was non-zero it raises a CalledProcessError. The
+ CalledProcessError object will have the return code in the returncode
+ attribute and output in the output attribute.
+
+ The arguments are the same as for the Popen constructor. Example:
+
+ >>> check_output(["ls", "-l", "/dev/null"]) #doctest: +ELLIPSIS
+ 'crw-rw-rw- 1 root wheel 3...
+
+ The stdout argument is not allowed as it is used internally.
+ To capture standard error in the result, use stderr=STDOUT.
+
+ >>> check_output(["/bin/sh", "-c",
+ ... "ls -l non_existent_file ; exit 0"],
+ ... stderr=STDOUT)
+ 'ls: non_existent_file: No such file or directory\n'
+
+ Calling check_output without the ignore_404 keyword argument
+ will raise a CalledProcessError if wkhtmltopdf exits with a non-zero code
+
+ >>> check_output(['wkhtmltopdf', #doctest: +ELLIPSIS
+ ... '--quiet',
+ ... '--encoding', 'utf8',
+ ... os.getenv('WKHTML_IN'), os.getenv('WKHTML_OUT')])
+ Traceback (most recent call last):
+ ...
+ CalledProcessError...
+
+ Calling check_output WITH the ignore_404 keyword will not raise
+ the CalledProcessError, but only if the error == ContentNotFoundError
+
+ >>> check_output(['wkhtmltopdf',
+ ... '--quiet',
+ ... '--encoding', 'utf8',
+ ... os.getenv('WKHTML_IN'), os.getenv('WKHTML_OUT')],
+ ... ignore_404=True)
+ ''
+
+ Calling check_output WITH the ignore_404 keyword should still
+ raise a CalledProcessError if the error != ContentNotFoundError
+
+ >>> check_output(['wkhtmltopdf', #doctest: +ELLIPSIS
+ ... '--blaa',
+ ... '--encoding', 'utf8',
+ ... os.getenv('WKHTML_IN'), os.getenv('WKHTML_OUT')],
+ ... ignore_404=True)
+ Traceback (most recent call last):
+ ...
+ CalledProcessError...
+ """
+ if 'stdout' in kwargs:
+ raise ValueError('stdout argument not allowed, it will be overridden.')
+
+ ignore_404 = kwargs.pop('ignore_404', False)
+
+ if not kwargs.get('stderr'):
+ kwargs['stderr'] = PIPE
+
+ process = Popen(stdout=PIPE, *popenargs, **kwargs)
+ output, error_message = process.communicate()
+ retcode = process.poll()
+
+ if retcode:
+ if ignore_404:
+ if 'ContentNotFoundError' in error_message:
+ return output
+ cmd = kwargs.get("args")
+ if cmd is None:
+ cmd = popenargs[0]
+ error = CalledProcessError(retcode, cmd)
+ # Add the output attribute to CalledProcessError, which
+ # doesn't exist until Python 2.7.
+ error.output = output
+ raise error
+
+ return output
+
+
+if __name__ == "__main__":
+ import doctest
+ doctest.testmod()