add proper my_configuration demo and use it in readme

This commit is contained in:
Dima Gerasimov 2019-10-12 00:38:47 +01:00
parent 676ffdd35d
commit 2752bd6fd1
5 changed files with 81 additions and 71 deletions

View file

@ -8,11 +8,10 @@ jobs:
steps: steps:
- checkout - checkout
# TODO FIXME switch to tox?
- run: pip3 install --user mypy pylint
- run: ./demo.py - run: ./demo.py
# TODO FIXME switch to tox?
# - run: pip3 install --user mypy pylint
# - run: python3 -m mypy --namespace-packages my # - run: python3 -m mypy --namespace-packages my
# - run: python3 -m pylint -E my # - run: python3 -m pylint -E my

View file

@ -8,61 +8,66 @@ 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! But it works for me so hopefully that would help you if you're struggling!
* Setting up * Setting up
** =my_configuration= package for private paths/repositores
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~. 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~.
In the simplest case it can be just a single file named ~my_configuration.py~, e.g.: You can see example in ~my_configuration_template~. You can copy it somewhere else and modify to your needs.
# TODO eh, perhaps
# TODO prepare private my_configuration package???
#+begin_src python Some explanations:
class paths:
class stexport:
repo = /path/repos/stackexchange_export_repo
export_dir = /path/to/backups/stackexchange
class ghexport: #+begin_src bash :exports results :results output
repo = /path/repos/github_export_repo for x in $(find my_configuration_template/ | grep -v -E 'mypy_cache|.git|__pycache__'); do
export_dir = /path/to/backups/github if [[ -L "$x" ]]; then
#+end_src echo "l $x -> $(readlink $x)"
elif [[ -d "$x" ]]; then
echo "d $x"
else
echo "f $x"
#+begin_src bash :results drawer (echo "---"; cat "$x"; echo "---" ) | sed 's/^/ /'
find my_configuration/ | grep -v -E 'mypy_cache|.git|__pycache__' fi
done
#+end_src #+end_src
#+RESULTS: #+RESULTS:
:results: #+begin_example
my_configuration/ d my_configuration_template/
my_configuration/my_configuration d my_configuration_template/my_configuration
my_configuration/my_configuration/__init__.py f my_configuration_template/my_configuration/__init__.py
my_configuration/my_configuration/repos ---
my_configuration/my_configuration/repos/kobuddy class paths:
my_configuration/my_configuration/repos/rexport """
my_configuration/my_configuration/repos/hypexport Feel free to remore hypexport if you don't need it/add your own custom settings and use them
my_configuration/my_configuration/pdf_configuration.py """
:end: class hypexport:
export_dir = '/tmp/my_demo/backups/hypothesis'
---
d my_configuration_template/my_configuration/repos
l my_configuration_template/my_configuration/repos/hypexport -> /tmp/my_demo/hypothesis_repo
#+end_example
and pass the filename to the package: As you can see, generally you specify fixed paths (e.g. to backup directory) in ~__init__.py~.
# TODO FIXME not filename? Feel free to add other files as well though to organize better, it's a real python package after all!
Some things (e.g. links to external packages like [[https://github.com/karlicoss/hypexport][hypexport]]) are specified as normal symlinks in ~repos~ directory.
That way you get easy imports (e.g. =import my_configuration.repos.hypexport.model=) and proper IDE integration.
# TODO link to post about exports?
** =with_my= helper script
Next, point =with_my= script to your private configuration:
#+begin_src bash #+begin_src bash
cp with_my.example with_my cp with_my.example with_my
vim with_my # specify path to your my_configuration:
# specify path to your my_configuration:
vim with_my
#+end_src #+end_src
** Dependencies ** Dependencies
They depend on specific modules you're planning to use, so it's hard to specify. 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. Generally you can just try and then install missing packages via ~pip install --user~, should be fairly straighforward.
* Usage example * Usage example
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. 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.
#+begin_src bash #+begin_src bash
with_my python3 -c 'import my.books.kobo as kobo; print(kobo.get_todos())' with_my python3 -c 'import my.books.kobo as kobo; print(kobo.get_todos())'
#+end_src #+end_src
@ -83,3 +88,6 @@ or, set up as ~mypy.ini~ file:
[mypy] [mypy]
mypy_path=/path/to/my_configuration_dir mypy_path=/path/to/my_configuration_dir
#+end_src #+end_src
# TODO hmm, if package isn't using my_configuration then we don't really need it?

60
demo.py
View file

@ -2,24 +2,26 @@
from subprocess import check_call, DEVNULL from subprocess import check_call, DEVNULL
from shutil import copy, copytree from shutil import copy, copytree
import os import os
import tempfile from os.path import abspath
from pathlib import Path from pathlib import Path
my_repo = Path(__file__).absolute().parent my_repo = Path(__file__).absolute().parent
def run(): def run():
# clone git@github.com:karlicoss/my.git # uses fixed paths; worth it for the sake of demonstration
copytree(my_repo, 'my_repo') # assumes we're in /tmp/my_demo now
# prepare repositories you'd be using. For this demo we only set up Hypothesis # 1. clone git@github.com:karlicoss/my.git
hypothesis_repo = os.path.abspath('hypothesis_repo') copytree(my_repo, 'my_repo', symlinks=True)
# 2. prepare repositories you'd be using. For this demo we only set up Hypothesis
hypothesis_repo = abspath('hypothesis_repo')
check_call(['git', 'clone', 'https://github.com/karlicoss/hypexport.git', hypothesis_repo]) check_call(['git', 'clone', 'https://github.com/karlicoss/hypexport.git', hypothesis_repo])
# #
# 3. prepare some demo Hypothesis data
# prepare some demo Hypothesis data hypothesis_backups = abspath('backups/hypothesis')
hypothesis_backups = os.path.abspath('backups/hypothesis')
Path(hypothesis_backups).mkdir(exist_ok=True, parents=True) Path(hypothesis_backups).mkdir(exist_ok=True, parents=True)
check_call([ check_call([
'curl', 'curl',
@ -29,36 +31,17 @@ def run():
# #
# create private configuration and set necessary paths # 4. create private with_my file and set path to private configuration
with_my = 'my_repo/with_my' with_my = 'my_repo/with_my'
copy('my_repo/with_my.example', with_my) copy('my_repo/with_my.example', with_my)
private_config = Path('my_configuration').absolute() my_configuration_root = abspath('my_repo/my_configuration_template')
private_config.mkdir()
my_configuration = private_config / 'my_configuration'
my_configuration.mkdir()
repos = my_configuration / 'repos'
repos.mkdir()
(repos / 'hypexport').symlink_to(hypothesis_repo)
Path(my_configuration / '__init__.py').write_text("""
class paths:
class hypexport:
export_dir = '{hypothesis_backups}'
""".format(**locals()))
#
# edit the config and set path to private configuration # edit the config and set path to private configuration
my = Path(with_my).read_text().replace('MY_CONFIGURATION_DIR=', 'MY_CONFIGURATION_DIR=' + str(private_config)) my = Path(with_my).read_text().replace('MY_CONFIGURATION_DIR=', 'MY_CONFIGURATION_DIR=' + str(my_configuration_root))
Path(with_my).write_text(my) Path(with_my).write_text(my)
# #
# 5. now we can use it!
# now we can use it!
check_call(['my_repo/with_my', 'python3', '-c', ''' check_call(['my_repo/with_my', 'python3', '-c', '''
import my.hypothesis import my.hypothesis
@ -106,10 +89,23 @@ for page in my.hypothesis.get_pages()[:8]:
# Title: BBC Documentaries 2016: The Joy of Data [FULL BBC SCIENCE DOCUMENTARY] # Title: BBC Documentaries 2016: The Joy of Data [FULL BBC SCIENCE DOCUMENTARY]
# 1 annotations # 1 annotations
from contextlib import contextmanager
@contextmanager
def named_temp_dir(name: str):
"""
Fixed name tmp dir
"""
td = (Path('/tmp') / name)
try:
td.mkdir(exist_ok=False)
yield td
finally:
import shutil
shutil.rmtree(str(td))
def main(): def main():
with tempfile.TemporaryDirectory() as tdir: with named_temp_dir('my_demo') as tdir:
os.chdir(tdir) os.chdir(tdir)
run() run()

View file

@ -0,0 +1,6 @@
class paths:
"""
Feel free to remore hypexport if you don't need it/add your own custom settings and use them
"""
class hypexport:
export_dir = '/tmp/my_demo/backups/hypothesis'

View file

@ -0,0 +1 @@
/tmp/my_demo/hypothesis_repo