From 1dda564a9e4e9bee0d40e8b351fdb909a851ef67 Mon Sep 17 00:00:00 2001 From: Dima Gerasimov Date: Sat, 12 Oct 2019 01:22:14 +0100 Subject: [PATCH] saner with_my script + more examples in readme --- README.org | 20 +++++++++++++----- demo.py | 2 +- my/__init__.py | 9 +++++--- with_my.example | 56 ++++++++++++++++++++++++++++++++++++------------- 4 files changed, 64 insertions(+), 23 deletions(-) diff --git a/README.org b/README.org index 142ef32..77354ac 100644 --- a/README.org +++ b/README.org @@ -8,7 +8,9 @@ This might not necessarily be convenient for you to use, perhaps it's more of a But it works for me so hopefully that would help you if you're struggling! * Setting up -** =my_configuration= package for private paths/repositores +** =my_configuration= package for private paths/repositores (optional) +If you're not planning to use private configuration (some modules don't need it) you can skip straight to the next step. Still, I'd recommend you to read anyway. + First you need to tell the package where to look for your data and external repositories, which is done though a separate (private) package named ~my_configuration~. You can see example in ~my_configuration_template~. You can copy it somewhere else and modify to your needs. @@ -55,24 +57,32 @@ That way you get easy imports (e.g. =import my_configuration.repos.hypexport.mod ** =with_my= helper script Next, point =with_my= script to your private configuration: - #+begin_src bash cp with_my.example with_my -vim with_my # specify path to your my_configuration: +vim with_my # specify path to your my_configuration (if you want to use it) #+end_src +It's also convenient to put =with_my= somewhere in your system path so you can run it from anywhere. + ** Dependencies Dependencies are different for specific modules you're planning to use, so it's hard to specify. Generally you can just try and then install missing packages via ~pip install --user~, should be fairly straighforward. -* Usage example +* Usage examples If you run your script with ~with_my~ wrapper, you'd have ~my~ in ~PYTHONPATH~ which gives you access to your data from within the script. +- accessing Kobo books + #+begin_src bash with_my python3 -c 'import my.books.kobo as kobo; print(kobo.get_todos())' #+end_src -Also read/run [[./demo.py][demo.py]] for a full demonstration of setting up Hypothesis. +- if you have [[https://github.com/karlicoss/orger][orger]] installed, you can use its Polar module to render all highlights as org-mode file as easy as: +#+begin_src bash +with_my orger/modules/polar.py --to polar.org +#+end_src + +- read/run [[./demo.py][demo.py]] for a full demonstration of setting up Hypothesis (it uses public annotations data from Github) * Linting diff --git a/demo.py b/demo.py index 267da0a..d0ad0ec 100755 --- a/demo.py +++ b/demo.py @@ -37,7 +37,7 @@ def run(): my_configuration_root = abspath('my_repo/my_configuration_template') # edit the config and set path to private configuration - my = Path(with_my).read_text().replace('MY_CONFIGURATION_DIR=', 'MY_CONFIGURATION_DIR=' + str(my_configuration_root)) + my = Path(with_my).read_text().replace("MY_CONFIGURATION_DIR = ''", "MY_CONFIGURATION_DIR = '{}'".format(my_configuration_root)) Path(with_my).write_text(my) # diff --git a/my/__init__.py b/my/__init__.py index fbab30e..65fafa4 100644 --- a/my/__init__.py +++ b/my/__init__.py @@ -1,9 +1,12 @@ # TODO just eval setup file to populate paths etc? # TODO note sure if it would -import my_configuration - # TODO maybe just import everything? # TODO how to make it mypy friendly? maybe defensive import? or mypy config? or interface file? -paths = my_configuration.paths # type: ignore +try: + import my_configuration + paths = my_configuration.paths # type: ignore +except ImportError: + import warnings + warnings.warn("my_configuration package isn't found! That might result in issues") diff --git a/with_my.example b/with_my.example index af5fc48..71b67b4 100755 --- a/with_my.example +++ b/with_my.example @@ -1,20 +1,48 @@ -#!/bin/bash -eu +#!/usr/bin/env python3 +""" +This file is used for specifying pathes for 'my' package and potentially private configuration. +E.g. so you can run something like: -# set path to directory containing my_configuration.py file here -# it can also be directory containing my_configuration package with __init__.py inside etc. -MY_CONFIGURATION_DIR= + with_my python3 -c 'import my.books.kobo as kobo; print(kobo.get_todos())' + +Feel free to use your preferred way of managing these packages otherwise. +""" -if [[ -n "${PYTHONPATH:=}" ]]; then - PREV=":$PYTHONPATH" -else - PREV="" -fi +###### set this v -MY_DIR="$(dirname "$(readlink -f "$0")")" -export PYTHONPATH="$MY_CONFIGURATION_DIR:$MY_DIR""$PREV" +# can be empty if you're not planning to use modules that use private configuration +# otherwise see readme to learn how to set it +MY_CONFIGURATION_DIR = '' -# TODO wonder why py.typed file in my_configuration didn't help? -export MYPYPATH="$MY_CONFIGURATION_DIR:$MY_DIR" +###### -exec "$@" +# you shouldn't have the need to modify rest; but let me know if you miss anything! + + +from pathlib import Path +# directory where 'my' package is present +MY_DIR = str(Path(__file__).absolute().parent) + +if __name__ == '__main__': + import os + import sys + + + def upd(envvar, path): + if len(path) == 0: + return + val = os.environ.get(envvar, '') + if val == '': + val = path + else: + val = val + ':' + path + os.environ[envvar] = val + + # TODO wonder why py.typed file in my_configuration didn't help? + for v in ['MYPYPATH', 'PYTHONPATH']: + upd(v, MY_DIR) + upd(v, MY_CONFIGURATION_DIR) + + rest = sys.argv[1:] + os.execvp(rest[0], rest)