Schneider
4 years ago
commit
941acdc387
2 changed files with 246 additions and 0 deletions
-
139.gitignore
-
107dirbuild.py
@ -0,0 +1,139 @@ |
|||
# Byte-compiled / optimized / DLL files |
|||
__pycache__/ |
|||
*.py[cod] |
|||
*$py.class |
|||
|
|||
# C extensions |
|||
*.so |
|||
|
|||
# Distribution / packaging |
|||
.Python |
|||
build/ |
|||
develop-eggs/ |
|||
dist/ |
|||
downloads/ |
|||
eggs/ |
|||
.eggs/ |
|||
lib/ |
|||
lib64/ |
|||
parts/ |
|||
sdist/ |
|||
var/ |
|||
wheels/ |
|||
share/python-wheels/ |
|||
*.egg-info/ |
|||
.installed.cfg |
|||
*.egg |
|||
MANIFEST |
|||
|
|||
# PyInstaller |
|||
# Usually these files are written by a python script from a template |
|||
# before PyInstaller builds the exe, so as to inject date/other infos into it. |
|||
*.manifest |
|||
*.spec |
|||
|
|||
# Installer logs |
|||
pip-log.txt |
|||
pip-delete-this-directory.txt |
|||
|
|||
# Unit test / coverage reports |
|||
htmlcov/ |
|||
.tox/ |
|||
.nox/ |
|||
.coverage |
|||
.coverage.* |
|||
.cache |
|||
nosetests.xml |
|||
coverage.xml |
|||
*.cover |
|||
*.py,cover |
|||
.hypothesis/ |
|||
.pytest_cache/ |
|||
cover/ |
|||
|
|||
# Translations |
|||
*.mo |
|||
*.pot |
|||
|
|||
# Django stuff: |
|||
*.log |
|||
local_settings.py |
|||
db.sqlite3 |
|||
db.sqlite3-journal |
|||
|
|||
# Flask stuff: |
|||
instance/ |
|||
.webassets-cache |
|||
|
|||
# Scrapy stuff: |
|||
.scrapy |
|||
|
|||
# Sphinx documentation |
|||
docs/_build/ |
|||
|
|||
# PyBuilder |
|||
.pybuilder/ |
|||
target/ |
|||
|
|||
# Jupyter Notebook |
|||
.ipynb_checkpoints |
|||
|
|||
# IPython |
|||
profile_default/ |
|||
ipython_config.py |
|||
|
|||
# pyenv |
|||
# For a library or package, you might want to ignore these files since the code is |
|||
# intended to run in multiple environments; otherwise, check them in: |
|||
# .python-version |
|||
|
|||
# pipenv |
|||
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. |
|||
# However, in case of collaboration, if having platform-specific dependencies or dependencies |
|||
# having no cross-platform support, pipenv may install dependencies that don't work, or not |
|||
# install all needed dependencies. |
|||
#Pipfile.lock |
|||
|
|||
# PEP 582; used by e.g. github.com/David-OConnor/pyflow |
|||
__pypackages__/ |
|||
|
|||
# Celery stuff |
|||
celerybeat-schedule |
|||
celerybeat.pid |
|||
|
|||
# SageMath parsed files |
|||
*.sage.py |
|||
|
|||
# Environments |
|||
.env |
|||
.venv |
|||
env/ |
|||
venv/ |
|||
ENV/ |
|||
env.bak/ |
|||
venv.bak/ |
|||
|
|||
# Spyder project settings |
|||
.spyderproject |
|||
.spyproject |
|||
|
|||
# Rope project settings |
|||
.ropeproject |
|||
|
|||
# mkdocs documentation |
|||
/site |
|||
|
|||
# mypy |
|||
.mypy_cache/ |
|||
.dmypy.json |
|||
dmypy.json |
|||
|
|||
# Pyre type checker |
|||
.pyre/ |
|||
|
|||
# pytype static type analyzer |
|||
.pytype/ |
|||
|
|||
# Cython debug symbols |
|||
cython_debug/ |
|||
.idea |
@ -0,0 +1,107 @@ |
|||
#!/home/schneider/git/dirbuild/ |
|||
"""dirbuild |
|||
|
|||
Usage: |
|||
dirbuild |
|||
dirbuild set <command> |
|||
dirbuild get |
|||
dirbuild build |
|||
dirbuild dump |
|||
|
|||
Options: |
|||
-h --help Show this screen. |
|||
--version Show version. |
|||
|
|||
""" |
|||
import logging |
|||
import os |
|||
import sqlite3 |
|||
from sqlite3.dbapi2 import Cursor |
|||
|
|||
from docopt import docopt |
|||
from xdg import BaseDirectory |
|||
|
|||
logger: logging.Logger |
|||
|
|||
|
|||
def init_logger(): |
|||
"""Initializes the application logger. |
|||
|
|||
:returns: logger |
|||
|
|||
""" |
|||
global logger |
|||
logger = logging.getLogger() |
|||
handler = logging.StreamHandler() |
|||
formatter = logging.Formatter("%(asctime)s %(name)-12s %(levelname)-8s %(message)s") |
|||
handler.setFormatter(formatter) |
|||
logger.addHandler(handler) |
|||
logger.setLevel(logging.DEBUG) |
|||
|
|||
|
|||
def init_db() -> sqlite3.Connection: |
|||
path = BaseDirectory.save_data_path("dirbuild") |
|||
logging.debug("Using path for data: %s", path) |
|||
db_path = f"{path}/commands.db" |
|||
logging.debug("Using database %s", db_path) |
|||
conn = sqlite3.connect(db_path) |
|||
conn.cursor().execute( |
|||
"""CREATE TABLE IF NOT EXISTS commands (id INTEGER PRIMARY KEY AUTOINCREMENT, dir TEXT, cmd TEXT)""" |
|||
) |
|||
return conn |
|||
|
|||
|
|||
def set_command(cursor: Cursor, cwd: str, command: str): |
|||
"""Sets a command for the current directory |
|||
|
|||
:db: sqlite Cursor |
|||
:cwd: String |
|||
:returns: None |
|||
|
|||
""" |
|||
logger.debug("Setting command '%s' for directory %s", command, cwd) |
|||
cursor.execute( |
|||
"INSERT INTO commands (dir, cmd) VALUES (?, ?)", |
|||
( |
|||
cwd, |
|||
command, |
|||
), |
|||
) |
|||
|
|||
|
|||
def get_command(cursor: Cursor, cwd: str) -> str: |
|||
"""Get the command for the current directory""" |
|||
return cursor.execute( |
|||
"SELECT cmd FROM commands WHERE dir = ? ORDER BY id DESC LIMIT 1", (cwd,) |
|||
).fetchone()[0] |
|||
|
|||
|
|||
def dump_db(cursor: Cursor): |
|||
"""Dump all entries of the database""" |
|||
for row in cursor.execute("SELECT id, dir, cmd FROM commands"): |
|||
print(row) |
|||
|
|||
|
|||
def main(): |
|||
""" Main function """ |
|||
init_logger() |
|||
arguments = docopt(__doc__, version="dirbuild v0.1.0") |
|||
logger.debug("arguments: %s", arguments) |
|||
db = init_db() |
|||
if arguments["set"]: |
|||
set_command(db.cursor(), os.getcwd(), arguments["<command>"]) |
|||
elif arguments["get"]: |
|||
print(get_command(db.cursor(), os.getcwd())) |
|||
elif arguments["dump"]: |
|||
dump_db(db.cursor()) |
|||
else: |
|||
cmd = get_command(db.cursor(), str(os.getcwd())) |
|||
logger.debug("Executing '%s'", cmd) |
|||
os.system(cmd) |
|||
|
|||
db.commit() |
|||
db.close() |
|||
|
|||
|
|||
if __name__ == "__main__": |
|||
main() |
Write
Preview
Loading…
Cancel
Save
Reference in new issue