Easily manage data storage and logging across repos
Project description
cabinet
A Python library to easily store data across multiple projects in one or more JSON files.
Supports a cli, email, and event logging.
Features
- Read and write data in the JSON files of your choice
- Log to a file/directory of your choice without having to configure
logger
each time - Send/receive mail using
cabinet.Cabinet().mail()
Structure
- Data is stored in a
settings.json
file in the location of your choice - Logs are written to
{/path/to/cabinet}/log/LOG_DAILY_YYYY-MM-DD
by default- this can be changed on a per-log basis
Installation and Setup
python3 -m pip install cabinet
cabinet --config
CLI usage
Usage: cabinet [OPTIONS]
Options:
-h, --help Show this help message and exit
--configure, -config Configure
--edit, -e Edit the settings.json file
--edit-file, -ef Edit a specific file
--no-create (for -ef) Do not create file if it does not exist
--get, -g [GET ...] Get a property from settings.json
--put PUT [PUT ...] Put a property into settings.json
--get-file GET_FILE Get file
--strip (for --get-file) Whether to strip file content whitespace
--log, -l Log a message to the default location
--level LOG_LEVEL (for -l) Log level [debug, info, warn, error, critical]
-v, --version show version number and exit
Mail:
--mail Sends an email
--subject SUBJECT, -s SUBJECT
Email subject
--body BODY, -b BODY Email body
--to TO_ADDR, -t TO_ADDR
Configuration
- Upon first launch, will prompt you to choose a location for
settings.json
. You can change this at any time withcabinet --config
.
edit_file() shortcuts
- see example below to enable something like
cabinet -ef shopping
from the terminal- rather than
cabinet -ef "/home/{username}/path/to/shopping_list.md"
- rather than
- or
cabinet.Cabinet().edit("shopping")
- rather than
cabinet.Cabinet().edit("/home/{username}/path/to/whatever.md")
- rather than
file:
# example only; these commands will be unique to your setup
{
"path": {
"edit": {
"shopping": {
"value": "/home/{username}/path/to/whatever.md",
},
"todo": {
"value": "/home/{username}/path/to/whatever.md",
}
}
}
}
set from terminal:
cabinet -p edit shopping value "/home/{username}/path/to/whatever.md"
cabinet -p edit todo value "/home/{username}/path/to/whatever.md"
- It is NEVER a good idea to store your password in plaintext; for this reason, I strongly recommend a "throwaway" account that is only used for sending emails
- Gmail (as of May 2022) and most other mainstream email providers won't work with this; for support, search for sending mail from your email provider with
smtplib
. - In
settings.json
, add theemail
object to make your settings file look like this example:
file:
{
"email": {
"from": "throwaway@example.com",
"from_pw": "example",
"from_name": "Raspberry Pi",
"to": "destination@protonmail.com",
"smtp_server": "example.com",
"imap_server": "example.com",
"port": 123
}
}
set from terminal:
cabinet -p email from throwaway@example.com
cabinet -p email from_pw example
...
Examples
put
python:
from cabinet import Cabinet
cab = Cabinet()
cab.put("employee", "Tyler", "salary", 7.25)
or terminal:
# warning - from the terminal, numeric values in cabinet are stored as strings
cabinet -p employer Tyler salary 7.25
results in this structure in settings.json:
{
"employee": {
"Tyler": {
"salary": 7.25 # or "7.25" if done from terminal
}
}
}
get
python:
from cabinet import Cabinet
cab = Cabinet()
print(cab.get("employee", "Tyler", "salary"))
or terminal:
cabinet -g employee Tyler salary
results in:
7.25
edit_file
python:
from cabinet import Cabinet
cab = Cabinet()
# if put("path", "edit", "shopping", "/path/to/shopping.md") has been called, this will edit the file assigned to that shortcut.
# opens file in Vim, saves upon exit
cab.edit("shopping")
# or you can edit a file directly...
cab.edit("/path/to/shopping.md")
terminal:
# assumes path -> edit -> shopping -> path/to/shopping.md has been set
cabinet -ef shoppping
or
cabinet -ef "/path/to/shopping.md"
mail
python:
from cabinet import Mail
mail = Mail()
mail.send('Test Subject', 'Test Body')
terminal:
cabinet --mail --subject "Test Subject" --body "Test Body"
# or
cabinet --mail -s "Test Subject" -b "Test Body"
log
python:
from cabinet import Cabinet
cab = Cabinet()
# writes to a file named LOG_DAILY_YYYY-MM-DD in the default log folder (or cab.get('path', 'log')) inside a YYYY-MM-DD folder
cab.log("Connection timed out") # defaults to 'info' if no level is set
cab.log("This function hit a breakpoint", level="debug")
cab.log("Looks like the server is on fire", level="critical")
cab.log("This is fine", level="info")
# writes to a file named LOG_TEMPERATURE
cab.log("30", logName="LOG_TEMPERATURE")
# writes to a file named LOG_TEMPERATURE in /home/{username}/weather
cab.log("30", logName="LOG_TEMPERATURE", filePath="/home/{username}/weather")
# format
# 2021-12-29 19:29:27,896 — INFO — 30
terminal:
# defaults to 'info' if no level is set
cab -l "Connection timed out"
# -l and --log are interchangeable
cab --log "Connection timed out"
# change levels with --level
cab --log "Server is on fire" --level "critical"
Dependencies
- Python >= 3.6
- smtplib
Disclaimers
- Although I've done quite a bit of testing, I can't guarantee everything that works on my machine will work on yours. Always back up your data to multiple places to avoid data loss.
- If you find any issues, please contact me... or get your hands dirty and raise a PR!
Unit Tests
- Unit tests are available in
test/
; usepytest test/
to run them.
Author
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
cabinet-2023.5.31.3.tar.gz
(19.1 kB
view hashes)
Built Distribution
Close
Hashes for cabinet-2023.5.31.3-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0d3a34083cd989a73e861a36f766e1cf85e40b25e56e51bf451ba9446febaebd |
|
MD5 | 93bb9a8ec964441391e57250c50dda15 |
|
BLAKE2b-256 | 2167f2de8918b861a331764abbb1f4b5b1c4653c888f052012cfe84d99b390b1 |