summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Schwarz <michi.schwarz@gmail.com>2015-09-11 21:55:58 +0200
committerMichael Schwarz <michi.schwarz@gmail.com>2015-09-16 01:50:23 +0200
commit096db19a9a465cc667aa5d0ef92df2eeac5955b2 (patch)
treeeba053a06141adb569d6f33fb9e28675faecc0a6
parent93f96964914ae30686d30e5667bff92f2d17b791 (diff)
downloadpogojig-096db19a9a465cc667aa5d0ef92df2eeac5955b2.tar.gz
pogojig-096db19a9a465cc667aa5d0ef92df2eeac5955b2.tar.bz2
pogojig-096db19a9a465cc667aa5d0ef92df2eeac5955b2.zip
Wrap all Python main functions with decorator.
This decorator check if a module was called as the main module and catches exceptions.
-rw-r--r--support/asymptote/__main__.py12
-rw-r--r--support/inkscape/__main__.py12
-rw-r--r--support/lib/util.py23
-rw-r--r--support/openscad/__main__.py12
4 files changed, 28 insertions, 31 deletions
diff --git a/support/asymptote/__main__.py b/support/asymptote/__main__.py
index 91902dd..238332f 100644
--- a/support/asymptote/__main__.py
+++ b/support/asymptote/__main__.py
@@ -1,4 +1,4 @@
-import os, sys, shutil
+import os, shutil
from lib import util
@@ -6,6 +6,7 @@ def _asymptote(in_path, out_path, asymptote_dir, working_dir):
util.command([os.environ['ASYMPTOTE'], '-f', 'pdf', '-o', out_path, in_path], set_env = { 'ASYMPTOTE_DIR': asymptote_dir }, working_dir = working_dir)
+@util.main
def main(in_path, out_path):
_, out_suffix = os.path.splitext(out_path)
@@ -23,12 +24,3 @@ def main(in_path, out_path):
shutil.copyfile(temp_out_path, out_path)
else:
raise Exception('Unknown file type: {}'.format(out_suffix))
-
-
-try:
- main(*sys.argv[1:])
-except util.UserError as e:
- print 'Error:', e
- sys.exit(1)
-except KeyboardInterrupt:
- sys.exit(2)
diff --git a/support/inkscape/__main__.py b/support/inkscape/__main__.py
index 03f6689..a2c9341 100644
--- a/support/inkscape/__main__.py
+++ b/support/inkscape/__main__.py
@@ -1,4 +1,4 @@
-import sys, os, shutil
+import os, shutil
from lib import util
from . import effect, inkscape
@@ -36,6 +36,7 @@ def _unfuck_svg_document(temp_svg_path):
command_line.run()
+@util.main
def main(in_path, out_path):
_, out_suffix = os.path.splitext(out_path)
@@ -56,12 +57,3 @@ def main(in_path, out_path):
export_effect.write_asy(file)
else:
raise Exception('Unknown file type: {}'.format(out_suffix))
-
-
-try:
- main(*sys.argv[1:])
-except util.UserError as e:
- print 'Error:', e
- sys.exit(1)
-except KeyboardInterrupt:
- sys.exit(2)
diff --git a/support/lib/util.py b/support/lib/util.py
index e343b73..d14b342 100644
--- a/support/lib/util.py
+++ b/support/lib/util.py
@@ -1,4 +1,4 @@
-import contextlib, subprocess, tempfile, shutil, re, os
+import sys, contextlib, subprocess, tempfile, shutil, re, os, inspect
class UserError(Exception):
@@ -6,6 +6,27 @@ class UserError(Exception):
super(UserError, self).__init__(message.format(*args))
+def main(fn):
+ """Decorator for "main" functions. Decorates a function that should be called when the containing module is run as a script (e.g. via python -m <module>)."""
+
+ frame = inspect.currentframe().f_back
+
+ def wrapped_fn(*args, **kwargs):
+ try:
+ fn(*args, **kwargs)
+ except UserError as e:
+ print >> sys.stderr, 'Error:', e
+ sys.exit(1)
+ except KeyboardInterrupt:
+ sys.exit(2)
+
+ if frame.f_globals['__name__'] == '__main__':
+ wrapped_fn(*sys.argv[1:])
+
+ # Allow the main function also to be called explicitly
+ return wrapped_fn
+
+
def rename_atomic(source_path, target_path):
"""
Move the file at source_path to target_path.
diff --git a/support/openscad/__main__.py b/support/openscad/__main__.py
index 28de2cf..0eae27e 100644
--- a/support/openscad/__main__.py
+++ b/support/openscad/__main__.py
@@ -1,4 +1,4 @@
-import os, sys
+import os
from lib import util
@@ -10,6 +10,7 @@ def _write_dependencies(path, target, dependencies):
util.write_file(path, '{}: {}\n'.format(target, ' '.join(dependencies)).encode())
+@util.main
def main(in_path, out_path, deps_path):
cwd = os.getcwd()
@@ -43,12 +44,3 @@ def main(in_path, out_path, deps_path):
# Write output files.
_write_dependencies(deps_path, relpath(out_path), deps - ignored_files)
util.rename_atomic(temp_out_path, out_path)
-
-
-try:
- main(*sys.argv[1:])
-except util.UserError as e:
- print 'Error:', e
- sys.exit(1)
-except KeyboardInterrupt:
- sys.exit(2)