Support dynamic configuration

This commit is contained in:
Dima Gerasimov 2020-04-12 16:39:45 +01:00
parent 6b6020598b
commit c29408ae6c
4 changed files with 53 additions and 4 deletions

View file

@ -20,6 +20,13 @@ or your target capture file is just not there, you can selfhost the server part
That's it! If you're using custom port make sure it's the same as in the extension settings (default is `12212`). That's it! If you're using custom port make sure it's the same as in the extension settings (default is `12212`).
## Configuration
[Here](https://github.com/karlicoss/grasp/blob/af24c991579986cec73695daa8318e7831049305/server/org_tools.py#L91-L109) you can find some references for the `--template` syntax.
If you are looking for more flexible formatting that's not supported by template syntax, see [config.py.example](misc/config.py.example).
You can modify it to your liking and pass as `--config` to `grasp_server/setup` scripts.
# Motivation # Motivation
Why use org-capture? Well, it's hard to explain, maybe some other time... However, if you do know you want to use it instead of/alongside your browser bookmarks, by default Why use org-capture? Well, it's hard to explain, maybe some other time... However, if you do know you want to use it instead of/alongside your browser bookmarks, by default
you don't have much choice and have to copy everything manually. For an experienced enough org-mode user it's no less than a torture. you don't have much choice and have to copy everything manually. For an experienced enough org-mode user it's no less than a torture.

20
misc/config.py.example Normal file
View file

@ -0,0 +1,20 @@
from typing import List
class Config:
@staticmethod
def format_selection(selection: str) -> List[str]:
return [
'#+begin_quote',
selection,
'#+end_quote',
]
@staticmethod
def format_comment(comment: str) -> List[str]:
return [
'- comment:'
] + [
# colon is a quck way to define blocks of code/preformatted stuff: https://orgmode.org/manual/Literal-Examples.html
' : ' + s
for s in comment.splitlines()
]

View file

@ -6,17 +6,19 @@ import os
import logging import logging
from pathlib import Path from pathlib import Path
import re import re
from typing import List, Optional from typing import List, Optional, Dict, Any
from org_tools import as_org, empty, DEFAULT_TEMPLATE, Config from org_tools import as_org, empty, DEFAULT_TEMPLATE, Config
CAPTURE_PATH_VAR = 'GRASP_CAPTURE_PATH' CAPTURE_PATH_VAR = 'GRASP_CAPTURE_PATH'
CAPTURE_TEMPLATE_VAR = 'GRASP_CAPTURE_TEMPLATE' CAPTURE_TEMPLATE_VAR = 'GRASP_CAPTURE_TEMPLATE'
CAPTURE_CONFIG_VAR = 'GRASP_CAPTURE_CONFIG'
def get_logger(): def get_logger():
return logging.getLogger('grasp-server') return logging.getLogger('grasp-server')
def append_org( def append_org(
path: Path, path: Path,
org: str org: str
@ -32,6 +34,19 @@ def append_org(
fo.write(org) fo.write(org)
from functools import lru_cache
@lru_cache(1)
def capture_config() -> Optional[Config]:
cvar = os.environ.get(CAPTURE_CONFIG_VAR)
if cvar is None:
return None
globs: Dict[str, Any] = {}
exec(Path(cvar).read_text(), globs)
ConfigClass = globs['Config']
return ConfigClass()
def capture( def capture(
url: str, url: str,
title, title,
@ -48,6 +63,7 @@ def capture(
return s return s
capture_path = Path(os.environ[CAPTURE_PATH_VAR]).expanduser() capture_path = Path(os.environ[CAPTURE_PATH_VAR]).expanduser()
org_template = os.environ[CAPTURE_TEMPLATE_VAR] org_template = os.environ[CAPTURE_TEMPLATE_VAR]
config = capture_config()
logger.info('capturing %s to %s', (url, title, selection, comment, tag_str), capture_path) logger.info('capturing %s to %s', (url, title, selection, comment, tag_str), capture_path)
url = safe(url) url = safe(url)
@ -68,6 +84,7 @@ def capture(
comment=comment, comment=comment,
tags=tags, tags=tags,
org_template=org_template, org_template=org_template,
config=config,
) )
append_org( append_org(
path=capture_path, path=capture_path,
@ -111,13 +128,15 @@ class GraspRequestHandler(BaseHTTPRequestHandler):
self.respond_error(message=str(e)) self.respond_error(message=str(e))
def run(port: str, capture_path: str, template: str): def run(port: str, capture_path: str, template: str, config: Optional[Path]):
logger = get_logger() logger = get_logger()
logger.info("Using template %s", template) logger.info("Using template %s", template)
# not sure if there is a simpler way to communicate with the server... # not sure if there is a simpler way to communicate with the server...
os.environ[CAPTURE_PATH_VAR] = capture_path os.environ[CAPTURE_PATH_VAR] = capture_path
os.environ[CAPTURE_TEMPLATE_VAR] = template os.environ[CAPTURE_TEMPLATE_VAR] = template
if config is not None:
os.environ[CAPTURE_CONFIG_VAR] = str(config)
httpd = HTTPServer(('', int(port)), GraspRequestHandler) httpd = HTTPServer(('', int(port)), GraspRequestHandler)
logger.info(f"Starting httpd on port {port}") logger.info(f"Starting httpd on port {port}")
httpd.serve_forever() httpd.serve_forever()
@ -129,6 +148,8 @@ def setup_parser(p):
p.add_argument('--template', type=str, default=DEFAULT_TEMPLATE, help=f""" p.add_argument('--template', type=str, default=DEFAULT_TEMPLATE, help=f"""
{as_org.__doc__} {as_org.__doc__}
""") """)
abspath = lambda p: str(Path(p).absolute())
p.add_argument('--config', type=abspath, required=False, help='Optional dynamic config')
def main(): def main():
@ -137,7 +158,7 @@ def main():
p = argparse.ArgumentParser('grasp server', formatter_class=lambda prog: argparse.ArgumentDefaultsHelpFormatter(prog, width=100)) # type: ignore p = argparse.ArgumentParser('grasp server', formatter_class=lambda prog: argparse.ArgumentDefaultsHelpFormatter(prog, width=100)) # type: ignore
setup_parser(p) setup_parser(p)
args = p.parse_args() args = p.parse_args()
run(args.port, args.path, args.template) run(args.port, args.path, args.template, args.config)
if __name__ == '__main__': if __name__ == '__main__':
main() main()

View file

@ -41,6 +41,7 @@ def setup(args):
'--port', args.port, '--port', args.port,
'--path', args.path, '--path', args.path,
'--template', template, '--template', template,
*([] if args.config is None else ['--config' , args.config]),
] ]
extra_args = ' '.join(map(shlex.quote, args)) extra_args = ' '.join(map(shlex.quote, args))