From e82f3a2ebab6f7f9b6bef26a18d04a27e26a88e1 Mon Sep 17 00:00:00 2001 From: Harshad Sharma Date: Fri, 16 Jun 2017 17:59:34 +0530 Subject: [PATCH] Add --install option to userscripts through decorator. --- examples/debug.py | 1 + src/qutescript/__init__.py | 2 +- src/qutescript/cli.py | 20 ++++++++++++++ src/qutescript/decorator.py | 52 ++++++++++++++++++++++++++++++++++++ src/qutescript/decorators.py | 33 ----------------------- src/qutescript/installer.py | 33 +++++++++++++++++++++++ src/qutescript/request.py | 2 ++ 7 files changed, 109 insertions(+), 34 deletions(-) mode change 100644 => 100755 src/qutescript/cli.py create mode 100644 src/qutescript/decorator.py delete mode 100644 src/qutescript/decorators.py create mode 100644 src/qutescript/installer.py diff --git a/examples/debug.py b/examples/debug.py index 7ff1742..a26ad28 100755 --- a/examples/debug.py +++ b/examples/debug.py @@ -11,5 +11,6 @@ def dump_to_log(request): line = json.dumps(request.dump()) logfile.writelines([line]) + if __name__ == '__main__': dump_to_log() diff --git a/src/qutescript/__init__.py b/src/qutescript/__init__.py index 07ba289..dfa5a3c 100644 --- a/src/qutescript/__init__.py +++ b/src/qutescript/__init__.py @@ -1,6 +1,6 @@ __version__ = "0.1.0" -from .decorators import qutescript +from .decorator import qutescript from .request import Request, build_request __all__ = [ diff --git a/src/qutescript/cli.py b/src/qutescript/cli.py old mode 100644 new mode 100755 index 8a58ffa..5b046f6 --- a/src/qutescript/cli.py +++ b/src/qutescript/cli.py @@ -16,6 +16,8 @@ Why does this file exist, and why not put this in __main__? """ import argparse +import os +import sys parser = argparse.ArgumentParser(description='Command description.') parser.add_argument('names', metavar='NAME', nargs=argparse.ZERO_OR_MORE, @@ -25,3 +27,21 @@ parser.add_argument('names', metavar='NAME', nargs=argparse.ZERO_OR_MORE, def main(args=None): args = parser.parse_args(args=args) print(args.names) + + +# --- + +script_cli_parser = argparse.ArgumentParser(description='Qutebrowser userscript.') +script_cli_parser.add_argument('--install', action='store_true', help='Setup permissions and show install instructions.') + + +def script_cli(args=None): + args = script_cli_parser.parse_args(args=args) + if not args.install: + return + from .installer import install + userscript_path = os.path.abspath(sys.argv[0]) + path = os.path.abspath(userscript_path) + name = os.path.basename(userscript_path) + print(install(path, name=name)) + sys.exit(0) diff --git a/src/qutescript/decorator.py b/src/qutescript/decorator.py new file mode 100644 index 0000000..b2cd812 --- /dev/null +++ b/src/qutescript/decorator.py @@ -0,0 +1,52 @@ +# coding=utf-8 + +import sys +import traceback + +import os +from .cli import script_cli + +from .request import build_request + +log_file_path = './qutescript.log' + + +def write_log(message, file_path=None): + print('***', message) + file_path = file_path or log_file_path + file_path = os.path.abspath(os.path.expanduser(file_path)) + record = [message, '\n', '\n'] + with open(file_path, 'a') as logfile: + logfile.writelines(record) + + +def qutescript(func): + def wrapper(): + script_cli(args=sys.argv[1:]) + try: + request = build_request() + except Exception as e: + write_log(traceback.format_exc()) + write_log('Cannot build request.') + sys.exit(1) + try: + command = func(request) + if not command: + return + except Exception as e: + write_log(traceback.format_exc()) + write_log('Userscript error.') + sys.exit(2) + if not request.fifo: + write_log('ERROR: userscript returned command: {}, ' + 'but QUTE_FIFO was not found in passed environment.\n' + 'Try: :spawn --userscript /path/to/script ?') + sys.exit(3) + try: + with open(request.fifo, 'w') as fifo: + fifo.write('{}\n'.format(command)) + except Exception as e: + write_log(traceback.format_exc()) + write_log('Cannot write to FIFO: {!r}'.format(request.fifo)) + sys.exit(4) + return wrapper diff --git a/src/qutescript/decorators.py b/src/qutescript/decorators.py deleted file mode 100644 index b6610e8..0000000 --- a/src/qutescript/decorators.py +++ /dev/null @@ -1,33 +0,0 @@ -# coding=utf-8 - -import sys - -import os - -from .request import build_request - -log_file_path = './qutescript.log' - - -def write_log(message, file_path=None): - file_path = file_path or log_file_path - file_path = os.path.abspath(os.path.expanduser(file_path)) - with open(file_path, 'a') as logfile: - logfile.writelines([message]) - - -def qutescript(func): - def wrapper(): - request = build_request() - command = func(request) - if not command: - return - if not request.fifo: - write_log('ERROR: userscript returned command: {}, ' - 'but QUTE_FIFO was not found in passed environment.\n' - 'Try: :spawn --userscript /path/to/script ?') - sys.exit(1) - with open(request.fifo, 'w') as fifo: - fifo.write('{}\n'.format(command)) - - return wrapper diff --git a/src/qutescript/installer.py b/src/qutescript/installer.py new file mode 100644 index 0000000..4e31fdc --- /dev/null +++ b/src/qutescript/installer.py @@ -0,0 +1,33 @@ +# coding=utf-8 +import os +import stat + +TEMPLATE = """\ +Qutebrowser userscript {name!r} was installed at: + + {path} + +You can try it out by running the command: + + :spawn --userscript {path} +""" + + +def setup_permissions(path): + file_stat = os.stat(path) + os.chmod(path, file_stat.st_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH) + + +def format_commands(path, name): + return TEMPLATE.format(path=path, name=name) + + +def install(path, name=None): + """ + Sets permissions for qutescript at path and returns + instructons and commands to integrate with qutebrowser. + """ + path = os.path.abspath(os.path.expanduser(path)) + name = name or os.path.basename(path) + setup_permissions(path) + return format_commands(path=path, name=name) diff --git a/src/qutescript/request.py b/src/qutescript/request.py index af96142..dbe8069 100644 --- a/src/qutescript/request.py +++ b/src/qutescript/request.py @@ -51,4 +51,6 @@ def build_request(): request.title = os.getenv('QUTE_TITLE') request.selected_text = os.getenv('QUTE_SELECTED_TEXT') request.selected_html = os.getenv('QUTE_SELECTED_HTML') + if not request.mode: + raise AssertionError('Unable to read environment variables, did you pass `:spawn --userscript` ?') return request