# cabinet
A CLI and Python library to easily manage data and logging.
Supports email and event logging.
## Features
- More easily access your data across multiple projects
- More easily log messages to the file of your choice
- Edit MongoDB as though it were a JSON file
- Log to a file/directory of your choice without having to configure `logger` each time
- Easily send mail from the terminal
## Dependencies
- Python >= 3.6
- MongoDB (optional)
- Pymongo (`pip install pymongo`)
- Prompt_toolkit (`pip install prompt_toolkit`)
- smtplib
## Structure
- Data is stored in `~/.cabinet/data.json` or MongoDB
- data from MongoDB is interacted with as if it were a JSON file
- cache is written when retrieving data.
- if cache is older than 1 hour, it is refreshed; otherwise, data is pulled from cache by default
- Logs are written to `~/.cabinet/log/LOG_DAILY_YYYY-MM-DD` by default
- You can change this to something other than `~/.cabinet/log` as needed by setting/modifying `~/.config/cabinet/config.json` -> `path_dir_log`
## Installation and Setup
```bash
pip install cabinet
pip install pymongo
pip install prompt_toolkit
cabinet --config
```
## CLI usage
```
Usage: cabinet [OPTIONS]
Options:
-h, --help Show this help message and exit
--configure, -config Configure
--export Export the data in MongoDB to a JSON file
--edit, -e Edit MongoDB in the default editor as a 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 a property from MongoDB (nesting supported)
--put, -p Put a property into MongoDB (nesting supported)
--remove, -rm Removes a property from MongoDB
--get-file Returns the file specified
--strip (for --get-file) Whether to strip file content whitespace
--log, -l Log a message to the default location
--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, the tool will prompt you to enter your MongoDB credentials, as well as
the cluster name and Database name. These are stored in `~/.config/cabinet/config.json`.
- You will be asked to configure your default editor from the list of available editors on
your system. If this step is skipped, or an error occurs, `nano` will be used.
You can change this with `cabinet --config` and modifying the `editor` attribute.
### 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 openly either locally or in MongoDB; for this reason, I recommend a "throwaway" account that is only used for sending emails, such as a custom domain email.
- Gmail and most other mainstream email providers won't work with this; for support, search for sending mail from your email provider with `smtplib`.
- In Cabinet (`cabinet -e`), add the `email` object to make your settings file look like this example:
file:
```
{
"email": {
"from": "throwaway@example.com",
"from_pw": "example",
"from_name": "Cabinet (or other name of your choice)",
"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:
```
cabinet -p employee Tyler salary 7.25
```
results in this structure in MongoDB:
```
{
"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 cab.get("employee", "Tyler", "salary", is_print = True)
```
or terminal:
```
cabinet -g employee Tyler salary
```
- optional: `--force-cache-update` to force a cache update
results in:
```
7.25
```
### `remove`
python:
```
from cabinet import Cabinet
cab = Cabinet()
cab.remove("employee", "Tyler", "salary")
```
or terminal:
```
cabinet -rm employee Tyler salary
```
results in this structure in MongoDB:
```
{
"employee": {
"tyler": {}
}
}
```
### `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 the default editor (`cabinet --config` -> 'editor'), 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 `~/.cabinet/log` inside a YYYY-MM-DD folder
# writes somewhere other than `~/.cabinet/log`, if `~/.config/cabinet/config.json` has `path_dir_log` set
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 in the default log directory
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", log_folder_path="/home/{username}/weather")
# format
# 2021-12-29 19:29:27,896 — INFO — 30
```
terminal:
```
# defaults to 'info' if no level is set
cabinet -l "Connection timed out"
# -l and --log are interchangeable
cabinet --log "Connection timed out"
# change levels with --level
cabinet --log "Server is on fire" --level "critical"
```
## 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!
## Author
- Tyler Woodfin
- [GitHub](https://www.github.com/tylerjwoodfin)
- [LinkedIn](https://www.linkedin.com/in/tylerjwoodfin)
- [Website](http://tyler.cloud)
Raw data
{
"_id": null,
"home_page": "https://github.com/tylerjwoodfin/cabinet",
"name": "cabinet",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.6",
"maintainer_email": null,
"keywords": null,
"author": "Tyler Woodfin",
"author_email": "feedback@tyler.cloud",
"download_url": "https://files.pythonhosted.org/packages/bf/e6/7a9fa5e7c121e698b7ee2c3f00c6ae69c36958b8d680dad871ce443ceac9/cabinet-1!1.0.2.tar.gz",
"platform": null,
"description": "# cabinet\nA CLI and Python library to easily manage data and logging.\nSupports email and event logging.\n\n## Features\n\n- More easily access your data across multiple projects\n- More easily log messages to the file of your choice\n- Edit MongoDB as though it were a JSON file\n- Log to a file/directory of your choice without having to configure `logger` each time\n- Easily send mail from the terminal\n\n## Dependencies\n\n- Python >= 3.6\n- MongoDB (optional)\n- Pymongo (`pip install pymongo`)\n- Prompt_toolkit (`pip install prompt_toolkit`)\n- smtplib\n\n## Structure\n\n- Data is stored in `~/.cabinet/data.json` or MongoDB\n - data from MongoDB is interacted with as if it were a JSON file\n - cache is written when retrieving data.\n - if cache is older than 1 hour, it is refreshed; otherwise, data is pulled from cache by default\n- Logs are written to `~/.cabinet/log/LOG_DAILY_YYYY-MM-DD` by default\n - You can change this to something other than `~/.cabinet/log` as needed by setting/modifying `~/.config/cabinet/config.json` -> `path_dir_log`\n\n## Installation and Setup\n\n```bash\n pip install cabinet\n pip install pymongo\n pip install prompt_toolkit\n cabinet --config\n```\n\n## CLI usage\n```\nUsage: cabinet [OPTIONS]\n\nOptions:\n -h, --help Show this help message and exit\n --configure, -config Configure\n --export Export the data in MongoDB to a JSON file\n --edit, -e Edit MongoDB in the default editor as a JSON file\n --edit-file, -ef Edit a specific file\n --no-create (for -ef) Do not create file if it does not exist\n --get, -g Get a property from MongoDB (nesting supported)\n --put, -p Put a property into MongoDB (nesting supported)\n --remove, -rm Removes a property from MongoDB\n --get-file Returns the file specified\n --strip (for --get-file) Whether to strip file content whitespace\n --log, -l Log a message to the default location\n --level (for -l) Log level [debug, info, warn, error, critical]\n -v, --version show version number and exit\n\nMail:\n --mail Sends an email\n --subject SUBJECT, -s SUBJECT\n Email subject\n --body BODY, -b BODY Email body\n --to TO_ADDR, -t TO_ADDR\n```\n\n## Configuration\n\n- Upon first launch, the tool will prompt you to enter your MongoDB credentials, as well as\n the cluster name and Database name. These are stored in `~/.config/cabinet/config.json`.\n\n- You will be asked to configure your default editor from the list of available editors on\n your system. If this step is skipped, or an error occurs, `nano` will be used.\n\n You can change this with `cabinet --config` and modifying the `editor` attribute.\n\n### edit_file() shortcuts\n- see example below to enable something like\n - `cabinet -ef shopping` from the terminal\n - rather than `cabinet -ef \"/home/{username}/path/to/shopping_list.md\"`\n - or `cabinet.Cabinet().edit(\"shopping\")`\n - rather than `cabinet.Cabinet().edit(\"/home/{username}/path/to/whatever.md\")`\n\nfile:\n```\n# example only; these commands will be unique to your setup\n\n{\n \"path\": {\n \"edit\": {\n \"shopping\": {\n \"value\": \"/home/{username}/path/to/whatever.md\",\n },\n \"todo\": {\n \"value\": \"/home/{username}/path/to/whatever.md\",\n }\n }\n }\n}\n```\n\nset from terminal:\n```\ncabinet -p edit shopping value \"/home/{username}/path/to/whatever.md\"\ncabinet -p edit todo value \"/home/{username}/path/to/whatever.md\"\n```\n\n### mail\n\n- It is NEVER a good idea to store your password openly either locally or in MongoDB; for this reason, I recommend a \"throwaway\" account that is only used for sending emails, such as a custom domain email.\n- Gmail and most other mainstream email providers won't work with this; for support, search for sending mail from your email provider with `smtplib`.\n- In Cabinet (`cabinet -e`), add the `email` object to make your settings file look like this example:\n\nfile:\n```\n{\n \"email\": {\n \"from\": \"throwaway@example.com\",\n \"from_pw\": \"example\",\n \"from_name\": \"Cabinet (or other name of your choice)\",\n \"to\": \"destination@protonmail.com\",\n \"smtp_server\": \"example.com\",\n \"imap_server\": \"example.com\",\n \"port\": 123\n }\n}\n```\n\nset from terminal:\n```\ncabinet -p email from throwaway@example.com\ncabinet -p email from_pw example\n...\n```\n\n## Examples\n\n### `put`\n\npython:\n```\nfrom cabinet import Cabinet\n\ncab = Cabinet()\n\ncab.put(\"employee\", \"Tyler\", \"salary\", 7.25)\n```\n\nor terminal:\n```\ncabinet -p employee Tyler salary 7.25\n```\n\nresults in this structure in MongoDB:\n```\n{\n \"employee\": {\n \"Tyler\": {\n \"salary\": 7.25 # or \"7.25\" if done from terminal\n }\n }\n}\n```\n\n### `get`\n\npython:\n```\nfrom cabinet import Cabinet\n\ncab = Cabinet()\n\nprint(cab.get(\"employee\", \"Tyler\", \"salary\"))\n\n# or cab.get(\"employee\", \"Tyler\", \"salary\", is_print = True)\n```\n\nor terminal:\n```\ncabinet -g employee Tyler salary\n```\n- optional: `--force-cache-update` to force a cache update\n\nresults in:\n```\n7.25\n```\n\n### `remove`\n\npython:\n```\nfrom cabinet import Cabinet\n\ncab = Cabinet()\n\ncab.remove(\"employee\", \"Tyler\", \"salary\")\n```\n\nor terminal:\n```\ncabinet -rm employee Tyler salary\n```\n\nresults in this structure in MongoDB:\n```\n{\n \"employee\": {\n \"tyler\": {}\n }\n}\n```\n\n### `edit_file`\n\npython:\n```\nfrom cabinet import Cabinet\n\ncab = Cabinet()\n\n# if put(\"path\", \"edit\", \"shopping\", \"/path/to/shopping.md\") has been called, this will edit the file assigned to that shortcut.\n\n# opens file in the default editor (`cabinet --config` -> 'editor'), saves upon exit\ncab.edit(\"shopping\")\n\n# or you can edit a file directly...\ncab.edit(\"/path/to/shopping.md\")\n```\n\nterminal:\n```\n# assumes path -> edit -> shopping -> path/to/shopping.md has been set\ncabinet -ef shoppping\n\nor\n\ncabinet -ef \"/path/to/shopping.md\"\n```\n\n### `mail`\n\npython:\n```\n\nfrom cabinet import Mail\n\nmail = Mail()\n\nmail.send('Test Subject', 'Test Body')\n\n```\n\nterminal:\n```\ncabinet --mail --subject \"Test Subject\" --body \"Test Body\"\n\n# or\n\ncabinet --mail -s \"Test Subject\" -b \"Test Body\"\n```\n\n### `log`\n\npython:\n```\nfrom cabinet import Cabinet\n\ncab = Cabinet()\n\n# writes to a file named LOG_DAILY_YYYY-MM-DD in `~/.cabinet/log` inside a YYYY-MM-DD folder\n# writes somewhere other than `~/.cabinet/log`, if `~/.config/cabinet/config.json` has `path_dir_log` set\n\ncab.log(\"Connection timed out\") # defaults to 'info' if no level is set\ncab.log(\"This function hit a breakpoint\", level=\"debug\")\ncab.log(\"Looks like the server is on fire\", level=\"critical\")\ncab.log(\"This is fine\", level=\"info\")\n\n# writes to a file named LOG_TEMPERATURE in the default log directory\ncab.log(\"30\", log_name=\"LOG_TEMPERATURE\")\n\n# writes to a file named LOG_TEMPERATURE in /home/{username}/weather\ncab.log(\"30\", log_name=\"LOG_TEMPERATURE\", log_folder_path=\"/home/{username}/weather\")\n\n # format\n # 2021-12-29 19:29:27,896 \u2014 INFO \u2014 30\n\n```\n\nterminal:\n```\n# defaults to 'info' if no level is set\ncabinet -l \"Connection timed out\"\n\n# -l and --log are interchangeable\ncabinet --log \"Connection timed out\"\n\n# change levels with --level\ncabinet --log \"Server is on fire\" --level \"critical\"\n```\n\n## Disclaimers\n\n- 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.\n- If you find any issues, please contact me... or get your hands dirty and raise a PR!\n\n## Author\n\n- Tyler Woodfin\n - [GitHub](https://www.github.com/tylerjwoodfin)\n - [LinkedIn](https://www.linkedin.com/in/tylerjwoodfin)\n - [Website](http://tyler.cloud)\n",
"bugtrack_url": null,
"license": ": OSI Approved :: MIT License",
"summary": "Easily manage data storage and logging across repos",
"version": "1!1.0.2",
"project_urls": {
"Homepage": "https://github.com/tylerjwoodfin/cabinet"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "dfd1c16272c9ced09c3ce464f4e0ff7d4d72bf0e4eca12f1326a7e4d9d0ecf4a",
"md5": "775db16e3c2c0a4d760322b87cae7cb1",
"sha256": "bfa48a66ee010a44f96f411dd2780575f723214d2b8d7f6a5ecb60d44c8d547e"
},
"downloads": -1,
"filename": "cabinet-1!1.0.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "775db16e3c2c0a4d760322b87cae7cb1",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.6",
"size": 20935,
"upload_time": "2024-11-01T21:08:12",
"upload_time_iso_8601": "2024-11-01T21:08:12.969047Z",
"url": "https://files.pythonhosted.org/packages/df/d1/c16272c9ced09c3ce464f4e0ff7d4d72bf0e4eca12f1326a7e4d9d0ecf4a/cabinet-1!1.0.2-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "bfe67a9fa5e7c121e698b7ee2c3f00c6ae69c36958b8d680dad871ce443ceac9",
"md5": "e1b411a9271bd782d794f886eb0a10cf",
"sha256": "05f94facb01d6e1bdef45bd7e6d3063f35361408af7897fd0a412a2b67567e30"
},
"downloads": -1,
"filename": "cabinet-1!1.0.2.tar.gz",
"has_sig": false,
"md5_digest": "e1b411a9271bd782d794f886eb0a10cf",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.6",
"size": 22093,
"upload_time": "2024-11-01T21:08:14",
"upload_time_iso_8601": "2024-11-01T21:08:14.552999Z",
"url": "https://files.pythonhosted.org/packages/bf/e6/7a9fa5e7c121e698b7ee2c3f00c6ae69c36958b8d680dad871ce443ceac9/cabinet-1!1.0.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-11-01 21:08:14",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "tylerjwoodfin",
"github_project": "cabinet",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "cabinet"
}