get rid of kython for server counterpart
This commit is contained in:
parent
39cffd7420
commit
51106465d3
25
TODO.org
25
TODO.org
|
@ -1,26 +1,18 @@
|
||||||
* TODO [#A] adjust permissions... I guess gonna have to make it include /capture endpoint?
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
* START [#B] release somewhere? not sure if necessary
|
* START [#B] release somewhere? not sure if necessary
|
||||||
* TODO [#B] get rid of kython, run ci for python too?
|
* START [#B] get rid of kython, run ci for python too?
|
||||||
|
|
||||||
* TODO [#B] doesn't look like hotkey working unless you manually rebind.. wtf?
|
* TODO [#B] doesn't look like hotkey working unless you manually rebind.. wtf?
|
||||||
|
|
||||||
|
|
||||||
* TODO [#C] how to test it? try on different pages?
|
* TODO [#C] how to test it? try on different pages?
|
||||||
* TODO [#C] some sort of append logic? e.g. don't dump immediately and add as subitems?
|
* TODO [#C] some sort of delayed append logic? e.g. don't dump immediately and add as subitems?
|
||||||
* TODO [#C] make notification configurable or only in case of errors
|
* TODO [#C] make notification configurable or only in case of errors
|
||||||
* TODO [#D] do not minfy for dev
|
|
||||||
* TODO not sure, maybe extension press should be default? control it via option?
|
|
||||||
* TODO [#C] or, add menu to extension?
|
* TODO [#C] or, add menu to extension?
|
||||||
|
|
||||||
* TODO unsafe-eval in content security policy??
|
* TODO [#D] do not minfy for dev
|
||||||
|
* TODO [#D] make manifest templated so we don't have to hardcode actions
|
||||||
* TODO make manifest templated so we don't have to hardcode actions
|
|
||||||
|
|
||||||
* TODO
|
* TODO [#D]
|
||||||
## Packing
|
## Packing
|
||||||
After the development of your extension run the command
|
After the development of your extension run the command
|
||||||
|
|
||||||
|
@ -30,6 +22,10 @@ $ NODE_ENV=production npm run build
|
||||||
Now, the content of `build` folder will be the extension ready to be submitted to the Chrome Web Store. Just take a look at the [official guide](https://developer.chrome.com/webstore/publish) to more infos about publishing.
|
Now, the content of `build` folder will be the extension ready to be submitted to the Chrome Web Store. Just take a look at the [official guide](https://developer.chrome.com/webstore/publish) to more infos about publishing.
|
||||||
|
|
||||||
|
|
||||||
|
* TODO not sure, maybe extension press should be default? control it via option?
|
||||||
|
* DONE [#A] adjust permissions... I guess gonna have to make it include /capture endpoint?
|
||||||
|
CLOSED: [2019-01-06 Sun 23:57]
|
||||||
|
|
||||||
* DONE [#A] move server to a separate folder, systemd install script
|
* DONE [#A] move server to a separate folder, systemd install script
|
||||||
CLOSED: [2019-01-05 Sat 14:38]
|
CLOSED: [2019-01-05 Sat 14:38]
|
||||||
|
|
||||||
|
@ -48,3 +44,6 @@ Now, the content of `build` folder will be the extension ready to be submitted t
|
||||||
* DONE [#D] nicer manifest?
|
* DONE [#D] nicer manifest?
|
||||||
CLOSED: [2019-01-06 Sun 13:43]
|
CLOSED: [2019-01-06 Sun 13:43]
|
||||||
|
|
||||||
|
* DONE unsafe-eval in content security policy??
|
||||||
|
CLOSED: [2019-01-06 Sun 23:36]
|
||||||
|
|
||||||
|
|
2
publish
2
publish
|
@ -1,5 +1,5 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
set -eu
|
set -eux
|
||||||
|
|
||||||
|
|
||||||
VERSION="$(git tag --points-at)"
|
VERSION="$(git tag --points-at)"
|
||||||
|
|
7
server/ci.sh
Executable file
7
server/ci.sh
Executable file
|
@ -0,0 +1,7 @@
|
||||||
|
#!/bin/bash
|
||||||
|
set -eux
|
||||||
|
# TODO add to proper ci pipeline
|
||||||
|
pylint -E server.py setup
|
||||||
|
|
||||||
|
# TODO ugh mypy complains at hug's annotations
|
||||||
|
mypy --check-untyped-defs server.py setup
|
75
server/org_tools.py
Normal file
75
server/org_tools.py
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
from datetime import datetime
|
||||||
|
import logging
|
||||||
|
from pathlib import Path
|
||||||
|
import re
|
||||||
|
from typing import List, Optional
|
||||||
|
|
||||||
|
def date2org(t: datetime) -> str:
|
||||||
|
return t.strftime("%Y-%m-%d %a")
|
||||||
|
|
||||||
|
def datetime2orgtime(t: datetime) -> str:
|
||||||
|
return t.strftime("%H:%M")
|
||||||
|
|
||||||
|
def datetime2org(t: datetime) -> str:
|
||||||
|
return date2org(t) + " " + datetime2orgtime(t)
|
||||||
|
|
||||||
|
# TODO priority maybe??
|
||||||
|
# TODO need to sanitize!
|
||||||
|
def as_org_entry(
|
||||||
|
heading: Optional[str] = None,
|
||||||
|
tags: List[str] = [],
|
||||||
|
body: Optional[str] = None,
|
||||||
|
created: Optional[datetime]=None,
|
||||||
|
todo=True,
|
||||||
|
):
|
||||||
|
if heading is None:
|
||||||
|
if body is None:
|
||||||
|
raise RuntimeError('Both heading and body are empty!!')
|
||||||
|
heading = body.splitlines()[0] # TODO ??
|
||||||
|
|
||||||
|
if body is None:
|
||||||
|
body = ''
|
||||||
|
|
||||||
|
# TODO FIXME escape everything properly!
|
||||||
|
heading = re.sub(r'\s', ' ', heading)
|
||||||
|
# TODO remove newlines from body
|
||||||
|
|
||||||
|
NOW = datetime.now() # TODO tz??
|
||||||
|
# appended only added if it's different from created
|
||||||
|
app = [f':APPENDED: [{datetime2org(NOW)}]'] if created is not None else []
|
||||||
|
if created is None:
|
||||||
|
created = NOW
|
||||||
|
|
||||||
|
|
||||||
|
todo_s = ' TODO' if todo else ''
|
||||||
|
tag_s = ':'.join(tags)
|
||||||
|
|
||||||
|
sch = [f' SCHEDULED: <{date2org(NOW)}>'] if todo else []
|
||||||
|
|
||||||
|
if len(tag_s) != 0:
|
||||||
|
tag_s = f':{tag_s}:'
|
||||||
|
lines = [
|
||||||
|
f"""*{todo_s} {heading} {tag_s}""",
|
||||||
|
*sch,
|
||||||
|
':PROPERTIES:',
|
||||||
|
*app,
|
||||||
|
f':CREATED: [{datetime2org(created)}]',
|
||||||
|
':END:',
|
||||||
|
body,
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
]
|
||||||
|
return '\n'.join(lines)
|
||||||
|
|
||||||
|
# TODO should we check if it exists first?
|
||||||
|
def append_org_entry(
|
||||||
|
path: Path,
|
||||||
|
*args,
|
||||||
|
**kwargs,
|
||||||
|
):
|
||||||
|
res = as_org_entry(*args, **kwargs)
|
||||||
|
# https://stackoverflow.com/a/13232181
|
||||||
|
if len(res.encode('utf8')) > 4096:
|
||||||
|
logging.warning("writing out %s might be non-atomic", res)
|
||||||
|
with path.open('a') as fo:
|
||||||
|
fo.write(res)
|
|
@ -5,9 +5,8 @@ import re
|
||||||
import hug # type: ignore
|
import hug # type: ignore
|
||||||
import hug.types as T # type: ignore
|
import hug.types as T # type: ignore
|
||||||
|
|
||||||
from kython.org import append_org_entry
|
from config import CAPTURE_PATH # TODO mm, maybe configure it during server setup?
|
||||||
|
from org_tools import append_org_entry
|
||||||
from config import CAPTURE_PATH
|
|
||||||
|
|
||||||
def empty(s) -> bool:
|
def empty(s) -> bool:
|
||||||
return s is None or len(s.strip()) == 0
|
return s is None or len(s.strip()) == 0
|
||||||
|
|
Loading…
Reference in a new issue