Skip to main content

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 with cabinet --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"
    • or cabinet.Cabinet().edit("shopping")
      • rather than cabinet.Cabinet().edit("/home/{username}/path/to/whatever.md")

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"

mail

  • 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 the email 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", 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/; use pytest 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.6.10.2.tar.gz (19.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

cabinet-2023.6.10.2-py3-none-any.whl (17.0 kB view details)

Uploaded Python 3

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

Hashes for cabinet-2023.6.10.2.tar.gz
Algorithm Hash digest
SHA256 4687d9505c3fa4524ecad4b87ba80a9d13e59dad504ea90496471ee9dc916c44
MD5 3772de46eaad0d3ec46191581b8d1f28
BLAKE2b-256 27c4984200f62081b7feb94bea1de9a6ceb445923ace3f5a3d21c3496106473a

See more details on using hashes here.

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

Hashes for cabinet-2023.6.10.2-py3-none-any.whl
Algorithm Hash digest
SHA256 a38d72d9a82862e3973c44429441f88b3d9f9c8f4424ab40e3cce216bc061a97
MD5 3d6a1bda90e5233d88a5a2d197296b1a
BLAKE2b-256 edeadb1cd4cbcf2a2a2309ccf960d1884579a0ee63deb01a2d1fac4c094f2426

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page