Tiny library for key-value single-file application data storage
Project description
Summary
Library for application data storage. It is:
- tiny
- key-value
- single-file
- YAML based
Example
from tiny_storage import Unit, Type
import sys
# matches the file /etc/example-app/yaml or %PROGRAMDATA%\example-app\config.yaml
config = Unit('example-app', Type.global_config)
if sys.argv[1] == 'set-greeting':
# changes greeting only if does not exist
if not config('lines.greeting').try_put(sys.argv[2]):
print('Greeting already exists. It should not be changed.')
else:
# prints greeting if it exists or given string
print(config('lines.greeting').pull('Hello, world!'))
Installation
pip install tiny_storage
Full guide as a tiny_storage iceberg
1. Hello world
Suppose you want to store a configuration of your application between sessions.
from tiny_storage import Unit
# create a storage unit
config = Unit('application-name')
# write the data
config('the-best-number-ever').push(42)
The code above will create a YAML configuration file in the appropriate place and save the number 42 as the-best-number-ever
entry.
2. Accessing data
Syntax for accessing data is the following:
config('<dot separated path in config>').<access method>(<alternative value>)
There are 5 access methods in total, but the get/set functionality is realized in pull/push methods.
config('essential.greeting').pull('hello') # get a greeting from config or 'hello'
config('essential.greeting').push('hi') # set a greeting as 'hi'
3. Storing config in different places
You can define what type of config do you need and tiny_storage will choose the place according to standard of your OS. For example, to store data in global configuration file you pass Type.global_config
to your storage unit definition, and it will go to /etc
in linux and to %PROGRAM_DATA%
in windows.
from tiny_storage import Unit, Type
config = Unit('application-name', Type.global_config)
The list of all config types:
Data type | Windows | Linux |
---|---|---|
Type.local |
{name}.yaml |
{name}.yaml |
Type.user |
%APPDATA%/{name}/{name}.yaml |
$HOME/.{name}.yaml |
Type.user_config |
%APPDATA%/{name}/config.yaml |
$HOME/.config/{name}.yaml |
Type.global_data |
%PROGRAMDATA%/{name}/data.yaml |
/var/lib/{name}.yaml |
Type.global_config |
%PROGRAMDATA%/{name}/config.yaml |
/etc/{name}.yaml |
You can also pass your own config type as a (str) -> Path
function that constructs a path to config from the name.
config = Unit('application-name', lambda name: Path(f"/root/.{name}.yaml"))
4. Access methods
There are 5 most common cases of configuration data access and they are encapsulated into 5 access methods.
.push(value)
to forcefully set an entry
print(f'Greeting was updated to {config("greeting").push("hi")}')
.pull(value)
to get an entry or default value
print(f'Current greeting is {config("greeting").pull("<none>")}')
.put(value)
to get the value or set it if it doesn't exist
print(f'{config("greeting").put("Hello")}, world')
.try_push(value)
to push and know whether something changes
if not config("greeting").try_push(input()):
print("You input the same greeting. Why are you doing that?")
.try_put(value)
to put and know whether something changes
if config("greeting").try_put("Hello"):
print("There was no greeting, so I put hello as one.")
5. Laziness
You can also pass a callable with no arguments as a value and it will be interpreted as a lazy value and be called only if it was used. For example, this hello world program will ask for a greeting only on the first launch:
print(config('greeting').put(input("greeting: ")), "world!")
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
File details
Details for the file tiny_storage-1.1.0.tar.gz
.
File metadata
- Download URL: tiny_storage-1.1.0.tar.gz
- Upload date:
- Size: 4.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.10.5
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 67b79ec221b7bfac1023c722dc8176bb6223c91257c1b9280c45d142f00c9232 |
|
MD5 | 476fdba8f560e4a0b93e7c955bb4b754 |
|
BLAKE2b-256 | fe7b5053e8d13465eb560f67a3c028c32d351609322c1940fbf58838237fb9f1 |
File details
Details for the file tiny_storage-1.1.0-py3-none-any.whl
.
File metadata
- Download URL: tiny_storage-1.1.0-py3-none-any.whl
- Upload date:
- Size: 4.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.10.5
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 742eaa9bec9a3793a11cd88ec5080ac9717d016d84a9c91cc918ddff3d7fd5fa |
|
MD5 | ee09345790a2d12a1c2ade008bb4725e |
|
BLAKE2b-256 | aaac2f35c5d96514e3848c501ca7384ff59b9ccf9e19ecbe0cda0e1e1fe0d602 |