Make it possible to run custom kittens via kitty +kitten

Should help reduce confusion about how kittens work. Fixes #1712
This commit is contained in:
Kovid Goyal 2019-06-14 09:05:03 +05:30
parent 83e6b75872
commit 2e99259589
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C

View File

@ -6,6 +6,7 @@
import importlib import importlib
import os import os
import sys import sys
from contextlib import suppress
from functools import partial from functools import partial
aliases = {'url_hints': 'hints'} aliases = {'url_hints': 'hints'}
@ -15,13 +16,18 @@ def resolved_kitten(k):
return aliases.get(k, k).replace('-', '_') return aliases.get(k, k).replace('-', '_')
def path_to_custom_kitten(config_dir, kitten):
path = os.path.expanduser(kitten)
if not os.path.isabs(path):
path = os.path.join(config_dir, path)
path = os.path.abspath(path)
return path
def import_kitten_main_module(config_dir, kitten): def import_kitten_main_module(config_dir, kitten):
if kitten.endswith('.py'): if kitten.endswith('.py'):
path_modified = False path_modified = False
path = os.path.expanduser(kitten) path = path_to_custom_kitten(config_dir, kitten)
if not os.path.isabs(path):
path = os.path.join(config_dir, path)
path = os.path.abspath(path)
if os.path.dirname(path): if os.path.dirname(path):
sys.path.insert(0, os.path.dirname(path)) sys.path.insert(0, os.path.dirname(path))
path_modified = True path_modified = True
@ -90,16 +96,24 @@ def deserialize(output):
def run_kitten(kitten, run_name='__main__'): def run_kitten(kitten, run_name='__main__'):
import runpy import runpy
original_kitten_name = kitten
kitten = resolved_kitten(kitten) kitten = resolved_kitten(kitten)
set_debug(kitten) set_debug(kitten)
try: with suppress(ImportError):
runpy.run_module('kittens.{}.main'.format(kitten), run_name=run_name) runpy.run_module('kittens.{}.main'.format(kitten), run_name=run_name)
except ImportError: return
raise SystemExit(( # Look for a custom kitten
'No kitten named {}. If you are trying to run a custom kitten,' if not kitten.endswith('.py'):
' you have to do so via a mapping in kitty.conf, see' kitten += '.py'
' https://sw.kovidgoyal.net/kitty/kittens/custom.html' from kitty.constants import config_dir
).format(kitten)) path = path_to_custom_kitten(config_dir, kitten)
if not os.path.exists(path):
print('Available builtin kittens:', file=sys.stderr)
for kitten in all_kitten_names():
print(kitten, file=sys.stderr)
raise SystemExit('No kitten named {}'.format(original_kitten_name))
m = runpy.run_path(path, init_globals={'sys': sys, 'os': os}, run_name='__run_kitten__')
m['main'](sys.argv)
def all_kitten_names(): def all_kitten_names():