# persidict
Simple persistent dictionaries for distributed applications in Python.
## 1. What Is It?
`persidict` is a lightweight persistent key-value store for Python.
It saves a dictionary to either a local directory or an AWS S3 bucket,
storing each value as its own file or S3 object. Keys are limited to
text strings or sequences of strings.
In contrast to traditional persistent dictionaries (e.g., Python’s `shelve)`,
`persidict` is designed for distributed environments where multiple processes
on different machines concurrently work with the same store.
## 2. Why Use It?
## 2.1 Features
* **Persistent Storage**: Save dictionaries to the local filesystem
(`FileDirDict`) or AWS S3 (`S3Dict`).
* **Standard Dictionary API**: Use persidict objects like standard
Python dictionaries with methods like `__getitem__`, `__setitem__`,
`__delitem__`, `keys`, `values`, `items`, etc.
* **Distributed Computing Ready**: Designed for concurrent access
in distributed environments.
* **Flexible Serialization**: Store values as pickles (`pkl`),
JSON (`json`), or plain text.
* **Type Safety**: Optionally enforce that all values in a dictionary are
instances of a specific class.
* **Advanced Functionality**: Includes features like write-once dictionaries,
timestamping of entries, and tools for handling file-system-safe keys.
* **Hierarchical Keys**: Keys can be sequences of strings,
creating a directory-like structure within the storage backend.
## 2.2 Use Cases
`persidict` is well-suited for a variety of applications, including:
* **Caching**: Store results of expensive computations and retrieve them later,
even across different machines.
* **Configuration Management**: Manage application settings
in a distributed environment, allowing for easy updates and access.
* **Data Pipelines**: Share data between different stages
of a data processing pipeline.
* **Distributed Task Queues**: Store task definitions and results
in a shared location.
* **Memoization**: Cache function call results
in a persistent and distributed manner.
## 3. Usage
### 3.1 Storing Data on a Local Disk
The `FileDirDict` class saves your dictionary to a local folder.
Each key-value pair is stored as a separate file.
```python
from persidict import FileDirDict
# Create a dictionary that will be stored in the "my_app_data" folder.
# The folder will be created automatically if it doesn't exist.
app_settings = FileDirDict(base_dir="my_app_data")
# Add and update items just like a regular dictionary.
app_settings["username"] = "alex"
app_settings["theme"] = "dark"
app_settings["notifications_enabled"] = True
# Values can be any pickleable Python object.
app_settings["recent_projects"] = ["project_a", "project_b"]
print(f"Current theme is: {app_settings['theme']}")
# >>> Current theme is: dark
# The data persists!
# If you run the script again or create a new dictionary object
# pointing to the same folder, the data will be there.
reloaded_settings = FileDirDict(base_dir="my_app_data")
print(f"Number of settings: {len(reloaded_settings)}")
# >>> Number of settings: 4
print("username" in reloaded_settings)
# >>> True
```
### 3.2 Storing Data in the Cloud (AWS S3)
For distributed applications, you can use **`S3Dict`** to store data in
an AWS S3 bucket. The usage is identical, allowing you to switch
between local and cloud storage with minimal code changes.
```python
from persidict import S3Dict
# Create a dictionary that will be stored in an S3 bucket.
# The bucket will be created if it doesn't exist.
cloud_config = S3Dict(bucket_name="my-app-config-bucket")
# Use it just like a FileDirDict.
cloud_config["api_key"] = "ABC-123-XYZ"
cloud_config["timeout_seconds"] = 30
print(f"API Key: {cloud_config['api_key']}")
# >>> API Key: ABC-123-XYZ
```
## 4. Comparison With Python Built-in Dictionaries
### 4.1 Similarities
`PersiDict` subclasses can be used like regular Python dictionaries, supporting:
* Get, set, and delete operations with square brackets (`[]`).
* Iteration over keys, values, and items.
* Membership testing with `in`.
* Length checking with `len()`.
* Standard methods like `keys()`, `values()`, `items()`, `get()`, `clear()`
, `setdefault()`, and `update()`.
### 4.2 Differences
* **Persistence**: Data is saved between program executions.
* **Keys**: Keys must be URL/filename-safe strings or their sequences.
* **Values**: Values must be pickleable.
You can also constrain values to a specific class.
* **Order**: Insertion order is not preserved.
* **Additional Methods**: `PersiDict` provides extra methods not in the standard
dict API, such as `timestamp()`, `random_key()`, `newest_keys()`, `subdicts()`
, `delete_if_exists()`, `get_params()` and more.
* **Special Values**: Use `KEEP_CURRENT` to avoid updating a value
and `DELETE_CURRENT` to delete a value during an assignment.
## 5. Glossary
### 5.1 Core Concepts
* **`PersiDict`**: The abstract base class that defines the common interface
for all persistent dictionaries in the package. It's the foundation
upon which everything else is built.
* **`PersiDictKey`**: A type hint that specifies what can be used
as a key in any `PersiDict`. It can be a `SafeStrTuple`, a single string,
or a sequence of strings. When a `PesiDict` method requires a key as an input,
it will accept any of these types and convert them to a `SafeStrTuple` internally.
* **`SafeStrTuple`**: The core data structure for keys. It's an immutable,
flat tuple of non-empty, URL/filename-safe strings, ensuring that
keys are consistent and safe for various storage backends.
When a `PersiDict` method returns a key, it will always be in this format.
### 5.2 Main Implementations
* **`FileDirDict`**: A primary, concrete implementation of `PersiDict`
that stores each key-value pair as a separate file in a local directory.
* **`S3Dict`**: The other primary implementation of `PersiDict`,
which stores each key-value pair as an object in an AWS S3 bucket,
suitable for distributed environments.
### 5.3 Key Parameters
* **`file_type`**: A key parameter for `FileDirDict` and `S3Dict` that
determines the serialization format for values.
Common options are `"pkl"` (pickle) and `"json"`.
Any other value is treated as plain text for string storage.
* **`base_class_for_values`**: An optional parameter for any `PersiDict`
that enforces type checking on all stored values, ensuring they are
instances of a specific class.
* **`immutable_items`**: A boolean parameter that can make a `PersiDict`
"write-once," preventing any modification or deletion of existing items.
* **`digest_len`**: An integer that specifies the length of a hash suffix
added to key components to prevent collisions on case-insensitive file systems.
* **`base_dir`**: A string specifying the directory path where a `FileDirDict`
stores its files. For `S3Dict`, this directory is used to cache files locally.
* **`bucket_name`**: A string specifying the name of the S3 bucket where
an `S3Dict` stores its objects.
* **`region`**: An optional string specifying the AWS region for the S3 bucket.
### 5.4 Advanced Classes
* **`WriteOnceDict`**: A wrapper that enforces write-once behavior
on any `PersiDict`, ignoring subsequent writes to the same key.
It also allows for random consistency checks to ensure subsequent
writes to the same key always match the original value.
* **`OverlappingMultiDict`**: An advanced container that holds
multiple `PersiDict` instances sharing the same storage
but with different `file_type`s.
### 5.5 Special "Joker" Values
* **`Joker`**: The base class for special command-like values that
can be assigned to a key to trigger an action instead of storing a value.
* **`KEEP_CURRENT`**: A "joker" value that, when assigned to a key,
ensures the existing value is not changed.
* **`DELETE_CURRENT`**: A "joker" value that deletes the key-value pair
from the dictionary when assigned to a key.
## 6. API Highlights
`PersiDict` subclasses support the standard Python dictionary API, plus these additional methods for advanced functionality:
| Method | Return Type | Description |
| :--- | :--- | :--- |
| `timestamp(key)` | `float` | Returns the POSIX timestamp (seconds since epoch) of a key's last modification. |
| `random_key()` | `SafeStrTuple \| None` | Selects and returns a single random key, useful for sampling from the dataset. |
| `oldest_keys(max_n=None)` | `list[SafeStrTuple]` | Returns a list of keys sorted by their modification time, from oldest to newest. |
| `newest_keys(max_n=None)` | `list[SafeStrTuple]` | Returns a list of keys sorted by their modification time, from newest to oldest. |
| `oldest_values(max_n=None)` | `list[Any]` | Returns a list of values corresponding to the oldest keys. |
| `newest_values(max_n=None)` | `list[Any]` | Returns a list of values corresponding to the newest keys. |
| `get_subdict(prefix_key)` | `PersiDict` | Returns a new `PersiDict` instance that provides a view into a subset of keys sharing a common prefix. |
| `subdicts()` | `dict[str, PersiDict]` | Returns a dictionary mapping all first-level key prefixes to their corresponding sub-dictionary views. |
| `delete_if_exists(key)` | `bool` | Deletes a key-value pair if it exists and returns `True`; otherwise, returns `False`. |
| `get_params()` | `dict` | Returns a dictionary of the instance's configuration parameters, supporting the `parameterizable` API. |
## 7. Installation
The source code is hosted on GitHub at:
[https://github.com/pythagoras-dev/persidict](https://github.com/pythagoras-dev/persidict)
Binary installers for the latest released version are available at the Python package index at:
[https://pypi.org/project/persidict](https://pypi.org/project/persidict)
You can install `persidict` using `pip` or your favorite package manager:
```bash
pip install persidict
```
To include the AWS S3 extra dependencies:
```bash
pip install persidict[aws]
```
For development, including test dependencies:
```bash
pip install persidict[dev]
```
## 8. Dependencies
`persidict` has the following core dependencies:
* [parameterizable](https://pypi.org/project/parameterizable/)
* [jsonpickle](https://jsonpickle.github.io)
* [joblib](https://joblib.readthedocs.io)
* [lz4](https://python-lz4.readthedocs.io)
* [pandas](https://pandas.pydata.org)
* [numpy](https://numpy.org)
* [deepdiff](https://zepworks.com/deepdiff)
For AWS S3 support (`S3Dict`), you will also need:
* [boto3](https://boto3.readthedocs.io)
For development and testing, the following packages are used:
* [pytest](https://pytest.org)
* [moto](http://getmoto.org)
## 9. Contributing
Contributions are welcome! Please see the contributing [guide](https://github.com/pythagoras-dev/persidict?tab=contributing-ov-file) for more details
on how to get started, run tests, and submit pull requests.
## 10. License
`persidict` is licensed under the MIT License. See the [LICENSE](https://github.com/pythagoras-dev/persidict?tab=MIT-1-ov-file) file for more details.
## 11. Key Contacts
* [Vlad (Volodymyr) Pavlov](https://www.linkedin.com/in/vlpavlov/)
Raw data
{
"_id": null,
"home_page": null,
"name": "persidict",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.10",
"maintainer_email": null,
"keywords": "persistence, dicts, distributed, parallel",
"author": "Vlad (Volodymyr) Pavlov",
"author_email": "Vlad (Volodymyr) Pavlov <vlpavlov@ieee.org>",
"download_url": "https://files.pythonhosted.org/packages/b2/b9/c3ffb55aceab179ede9395dcd3a33d359248fde1f4091a09fed95a2d5bc1/persidict-0.38.0.tar.gz",
"platform": null,
"description": "# persidict\n\nSimple persistent dictionaries for distributed applications in Python.\n\n## 1. What Is It?\n\n`persidict` is a lightweight persistent key-value store for Python. \nIt saves a dictionary to either a local directory or an AWS S3 bucket, \nstoring each value as its own file or S3 object. Keys are limited to \ntext strings or sequences of strings.\n\nIn contrast to traditional persistent dictionaries (e.g., Python\u2019s `shelve)`, \n`persidict` is designed for distributed environments where multiple processes \non different machines concurrently work with the same store.\n\n## 2. Why Use It?\n\n## 2.1 Features\n\n* **Persistent Storage**: Save dictionaries to the local filesystem \n(`FileDirDict`) or AWS S3 (`S3Dict`).\n* **Standard Dictionary API**: Use persidict objects like standard \nPython dictionaries with methods like `__getitem__`, `__setitem__`, \n`__delitem__`, `keys`, `values`, `items`, etc.\n* **Distributed Computing Ready**: Designed for concurrent access \nin distributed environments.\n* **Flexible Serialization**: Store values as pickles (`pkl`), \nJSON (`json`), or plain text.\n* **Type Safety**: Optionally enforce that all values in a dictionary are \ninstances of a specific class.\n* **Advanced Functionality**: Includes features like write-once dictionaries, \ntimestamping of entries, and tools for handling file-system-safe keys.\n* **Hierarchical Keys**: Keys can be sequences of strings, \ncreating a directory-like structure within the storage backend.\n\n## 2.2 Use Cases\n\n`persidict` is well-suited for a variety of applications, including:\n\n* **Caching**: Store results of expensive computations and retrieve them later, \neven across different machines.\n* **Configuration Management**: Manage application settings \nin a distributed environment, allowing for easy updates and access.\n* **Data Pipelines**: Share data between different stages \nof a data processing pipeline.\n* **Distributed Task Queues**: Store task definitions and results \nin a shared location.\n* **Memoization**: Cache function call results \nin a persistent and distributed manner.\n\n## 3. Usage\n\n### 3.1 Storing Data on a Local Disk\n\nThe `FileDirDict` class saves your dictionary to a local folder. \nEach key-value pair is stored as a separate file.\n\n```python\nfrom persidict import FileDirDict\n\n# Create a dictionary that will be stored in the \"my_app_data\" folder.\n# The folder will be created automatically if it doesn't exist.\napp_settings = FileDirDict(base_dir=\"my_app_data\")\n\n# Add and update items just like a regular dictionary.\napp_settings[\"username\"] = \"alex\"\napp_settings[\"theme\"] = \"dark\"\napp_settings[\"notifications_enabled\"] = True\n\n# Values can be any pickleable Python object.\napp_settings[\"recent_projects\"] = [\"project_a\", \"project_b\"]\n\nprint(f\"Current theme is: {app_settings['theme']}\")\n# >>> Current theme is: dark\n\n# The data persists!\n# If you run the script again or create a new dictionary object\n# pointing to the same folder, the data will be there.\nreloaded_settings = FileDirDict(base_dir=\"my_app_data\")\n\nprint(f\"Number of settings: {len(reloaded_settings)}\")\n# >>> Number of settings: 4\n\nprint(\"username\" in reloaded_settings)\n# >>> True\n```\n### 3.2 Storing Data in the Cloud (AWS S3)\n\nFor distributed applications, you can use **`S3Dict`** to store data in \nan AWS S3 bucket. The usage is identical, allowing you to switch \nbetween local and cloud storage with minimal code changes.\n\n```python\nfrom persidict import S3Dict\n\n# Create a dictionary that will be stored in an S3 bucket.\n# The bucket will be created if it doesn't exist.\ncloud_config = S3Dict(bucket_name=\"my-app-config-bucket\")\n\n# Use it just like a FileDirDict.\ncloud_config[\"api_key\"] = \"ABC-123-XYZ\"\ncloud_config[\"timeout_seconds\"] = 30\n\nprint(f\"API Key: {cloud_config['api_key']}\")\n# >>> API Key: ABC-123-XYZ\n```\n\n## 4. Comparison With Python Built-in Dictionaries\n\n### 4.1 Similarities \n\n`PersiDict` subclasses can be used like regular Python dictionaries, supporting: \n\n* Get, set, and delete operations with square brackets (`[]`).\n* Iteration over keys, values, and items.\n* Membership testing with `in`.\n* Length checking with `len()`.\n* Standard methods like `keys()`, `values()`, `items()`, `get()`, `clear()`\n, `setdefault()`, and `update()`.\n\n### 4.2 Differences \n\n* **Persistence**: Data is saved between program executions.\n* **Keys**: Keys must be URL/filename-safe strings or their sequences.\n* **Values**: Values must be pickleable. \nYou can also constrain values to a specific class.\n* **Order**: Insertion order is not preserved.\n* **Additional Methods**: `PersiDict` provides extra methods not in the standard \ndict API, such as `timestamp()`, `random_key()`, `newest_keys()`, `subdicts()`\n, `delete_if_exists()`, `get_params()` and more.\n* **Special Values**: Use `KEEP_CURRENT` to avoid updating a value \nand `DELETE_CURRENT` to delete a value during an assignment.\n\n## 5. Glossary\n\n### 5.1 Core Concepts\n\n* **`PersiDict`**: The abstract base class that defines the common interface \nfor all persistent dictionaries in the package. It's the foundation \nupon which everything else is built.\n* **`PersiDictKey`**: A type hint that specifies what can be used\nas a key in any `PersiDict`. It can be a `SafeStrTuple`, a single string, \nor a sequence of strings. When a `PesiDict` method requires a key as an input,\nit will accept any of these types and convert them to a `SafeStrTuple` internally.\n* **`SafeStrTuple`**: The core data structure for keys. It's an immutable, \nflat tuple of non-empty, URL/filename-safe strings, ensuring that \nkeys are consistent and safe for various storage backends. \nWhen a `PersiDict` method returns a key, it will always be in this format.\n\n### 5.2 Main Implementations\n\n* **`FileDirDict`**: A primary, concrete implementation of `PersiDict` \nthat stores each key-value pair as a separate file in a local directory.\n* **`S3Dict`**: The other primary implementation of `PersiDict`, \nwhich stores each key-value pair as an object in an AWS S3 bucket, \nsuitable for distributed environments.\n\n### 5.3 Key Parameters\n\n* **`file_type`**: A key parameter for `FileDirDict` and `S3Dict` that \ndetermines the serialization format for values. \nCommon options are `\"pkl\"` (pickle) and `\"json\"`. \nAny other value is treated as plain text for string storage.\n* **`base_class_for_values`**: An optional parameter for any `PersiDict` \nthat enforces type checking on all stored values, ensuring they are \ninstances of a specific class.\n* **`immutable_items`**: A boolean parameter that can make a `PersiDict` \n\"write-once,\" preventing any modification or deletion of existing items.\n* **`digest_len`**: An integer that specifies the length of a hash suffix \nadded to key components to prevent collisions on case-insensitive file systems.\n* **`base_dir`**: A string specifying the directory path where a `FileDirDict`\nstores its files. For `S3Dict`, this directory is used to cache files locally.\n* **`bucket_name`**: A string specifying the name of the S3 bucket where\nan `S3Dict` stores its objects.\n* **`region`**: An optional string specifying the AWS region for the S3 bucket.\n\n### 5.4 Advanced Classes\n\n* **`WriteOnceDict`**: A wrapper that enforces write-once behavior \non any `PersiDict`, ignoring subsequent writes to the same key. \nIt also allows for random consistency checks to ensure subsequent \nwrites to the same key always match the original value.\n* **`OverlappingMultiDict`**: An advanced container that holds \nmultiple `PersiDict` instances sharing the same storage \nbut with different `file_type`s.\n\n### 5.5 Special \"Joker\" Values\n\n* **`Joker`**: The base class for special command-like values that \ncan be assigned to a key to trigger an action instead of storing a value.\n* **`KEEP_CURRENT`**: A \"joker\" value that, when assigned to a key, \nensures the existing value is not changed.\n* **`DELETE_CURRENT`**: A \"joker\" value that deletes the key-value pair \nfrom the dictionary when assigned to a key.\n\n## 6. API Highlights\n\n`PersiDict` subclasses support the standard Python dictionary API, plus these additional methods for advanced functionality:\n\n| Method | Return Type | Description |\n| :--- | :--- | :--- |\n| `timestamp(key)` | `float` | Returns the POSIX timestamp (seconds since epoch) of a key's last modification. |\n| `random_key()` | `SafeStrTuple \\| None` | Selects and returns a single random key, useful for sampling from the dataset. |\n| `oldest_keys(max_n=None)` | `list[SafeStrTuple]` | Returns a list of keys sorted by their modification time, from oldest to newest. |\n| `newest_keys(max_n=None)` | `list[SafeStrTuple]` | Returns a list of keys sorted by their modification time, from newest to oldest. |\n| `oldest_values(max_n=None)` | `list[Any]` | Returns a list of values corresponding to the oldest keys. |\n| `newest_values(max_n=None)` | `list[Any]` | Returns a list of values corresponding to the newest keys. |\n| `get_subdict(prefix_key)` | `PersiDict` | Returns a new `PersiDict` instance that provides a view into a subset of keys sharing a common prefix. |\n| `subdicts()` | `dict[str, PersiDict]` | Returns a dictionary mapping all first-level key prefixes to their corresponding sub-dictionary views. |\n| `delete_if_exists(key)` | `bool` | Deletes a key-value pair if it exists and returns `True`; otherwise, returns `False`. |\n| `get_params()` | `dict` | Returns a dictionary of the instance's configuration parameters, supporting the `parameterizable` API. |\n\n## 7. Installation\n\nThe source code is hosted on GitHub at:\n[https://github.com/pythagoras-dev/persidict](https://github.com/pythagoras-dev/persidict) \n\nBinary installers for the latest released version are available at the Python package index at:\n[https://pypi.org/project/persidict](https://pypi.org/project/persidict)\n\nYou can install `persidict` using `pip` or your favorite package manager:\n\n```bash\npip install persidict\n```\n\nTo include the AWS S3 extra dependencies:\n\n```bash\npip install persidict[aws]\n```\n\nFor development, including test dependencies:\n\n```bash\npip install persidict[dev]\n```\n\n## 8. Dependencies\n\n`persidict` has the following core dependencies:\n\n* [parameterizable](https://pypi.org/project/parameterizable/)\n* [jsonpickle](https://jsonpickle.github.io)\n* [joblib](https://joblib.readthedocs.io)\n* [lz4](https://python-lz4.readthedocs.io)\n* [pandas](https://pandas.pydata.org)\n* [numpy](https://numpy.org)\n* [deepdiff](https://zepworks.com/deepdiff)\n\nFor AWS S3 support (`S3Dict`), you will also need:\n* [boto3](https://boto3.readthedocs.io)\n\nFor development and testing, the following packages are used:\n* [pytest](https://pytest.org)\n* [moto](http://getmoto.org)\n\n## 9. Contributing\nContributions are welcome! Please see the contributing [guide](https://github.com/pythagoras-dev/persidict?tab=contributing-ov-file) for more details \non how to get started, run tests, and submit pull requests.\n\n## 10. License\n`persidict` is licensed under the MIT License. See the [LICENSE](https://github.com/pythagoras-dev/persidict?tab=MIT-1-ov-file) file for more details.\n\n## 11. Key Contacts\n\n* [Vlad (Volodymyr) Pavlov](https://www.linkedin.com/in/vlpavlov/)",
"bugtrack_url": null,
"license": "MIT",
"summary": "Simple persistent key-value store for Python. Values are stored as files on a disk or as S3 objects on AWS cloud.",
"version": "0.38.0",
"project_urls": {
"Homepage": "https://github.com/pythagoras-dev/persidict"
},
"split_keywords": [
"persistence",
" dicts",
" distributed",
" parallel"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "04cd81176a63231b19999d24983d201e611b2c41b544de63cbe377fe5de06a37",
"md5": "1fdc6e01bed31cb682a8c218433f4518",
"sha256": "c2379579255a5bd1ebcedbd85e1d8a9211ced40b9d1e709f1feef17b5f229d89"
},
"downloads": -1,
"filename": "persidict-0.38.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "1fdc6e01bed31cb682a8c218433f4518",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 37273,
"upload_time": "2025-09-15T03:35:13",
"upload_time_iso_8601": "2025-09-15T03:35:13.635956Z",
"url": "https://files.pythonhosted.org/packages/04/cd/81176a63231b19999d24983d201e611b2c41b544de63cbe377fe5de06a37/persidict-0.38.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b2b9c3ffb55aceab179ede9395dcd3a33d359248fde1f4091a09fed95a2d5bc1",
"md5": "0a404c59765fa24805fab05e2bd512aa",
"sha256": "fcd7f4b69668bb0c5f77c6bd5cc15e40420da81a002161541b74f816753731f6"
},
"downloads": -1,
"filename": "persidict-0.38.0.tar.gz",
"has_sig": false,
"md5_digest": "0a404c59765fa24805fab05e2bd512aa",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.10",
"size": 31040,
"upload_time": "2025-09-15T03:35:14",
"upload_time_iso_8601": "2025-09-15T03:35:14.869845Z",
"url": "https://files.pythonhosted.org/packages/b2/b9/c3ffb55aceab179ede9395dcd3a33d359248fde1f4091a09fed95a2d5bc1/persidict-0.38.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-09-15 03:35:14",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "pythagoras-dev",
"github_project": "persidict",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "persidict"
}