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
loggereach time - Send/receive mail using
cabinet.Cabinet().mail()
Structure
- Data is stored in a
settings.jsonfile in the location of your choice - Logs are written to
{/path/to/cabinet}/log/LOG_DAILY_YYYY-MM-DDby 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 shoppingfrom 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 theemailobject 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", log_name="LOG_TEMPERATURE")
# writes to a file named LOG_TEMPERATURE in /home/{username}/weather
cab.log("30", log_name="LOG_TEMPERATURE", file_path="/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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file cabinet-2023.6.10.2.tar.gz.
File metadata
- Download URL: cabinet-2023.6.10.2.tar.gz
- Upload date:
- Size: 19.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.10.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4687d9505c3fa4524ecad4b87ba80a9d13e59dad504ea90496471ee9dc916c44
|
|
| MD5 |
3772de46eaad0d3ec46191581b8d1f28
|
|
| BLAKE2b-256 |
27c4984200f62081b7feb94bea1de9a6ceb445923ace3f5a3d21c3496106473a
|
File details
Details for the file cabinet-2023.6.10.2-py3-none-any.whl.
File metadata
- Download URL: cabinet-2023.6.10.2-py3-none-any.whl
- Upload date:
- Size: 17.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.10.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a38d72d9a82862e3973c44429441f88b3d9f9c8f4424ab40e3cce216bc061a97
|
|
| MD5 |
3d6a1bda90e5233d88a5a2d197296b1a
|
|
| BLAKE2b-256 |
edeadb1cd4cbcf2a2a2309ccf960d1884579a0ee63deb01a2d1fac4c094f2426
|