cshelve


Namecshelve JSON
Version 0.8.0 PyPI version JSON
download
home_pageNone
SummaryPropulsing the shelve module to the cloud
upload_time2024-12-17 03:11:10
maintainerNone
docs_urlNone
authorNone
requires_python>=3.9
licenseNone
keywords azure azure-storage-account cloud database shelve
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Cloud Shelve
`Cloud Shelve (cshelve)` is a Python package that provides a seamless way to store and manage data in the cloud using the familiar [Python Shelve interface](https://docs.python.org/3/library/shelve.html). It is designed for efficient and scalable storage solutions, allowing you to leverage cloud providers for persistent storage while keeping the simplicity of the `shelve` API.

## Features

- Supports large file storage in the cloud
- Secure data in-transit encryption when using cloud storage
- Fully compatible with Python's `shelve` API
- Cross-platform compatibility for local and remote storage

## Installation

Install `cshelve` via pip:

```bash
pip install cshelve
```

## Usage

The `cshelve` module strictly follows the official `shelve` API. Consequently, you can refer to the [Python official documentation](https://docs.python.org/3/library/shelve.html) for general usage examples. Simply replace the `shelve` import with `cshelve`, and you're good to go.

### Local Storage

Here is an example, adapted from the [official shelve documentation](https://docs.python.org/3/library/shelve.html#example), demonstrating local storage usage. Just replace `shelve` with `cshelve`:

```python
import cshelve

d = cshelve.open('local.db')  # Open the local database file

key = 'key'
data = 'data'

d[key] = data                 # Store data at the key (overwrites existing data)
data = d[key]                 # Retrieve a copy of data (raises KeyError if not found)
del d[key]                    # Delete data at the key (raises KeyError if not found)

flag = key in d               # Check if the key exists in the database
klist = list(d.keys())        # List all existing keys (could be slow for large datasets)

# Note: Since writeback=True is not used, handle data carefully:
d['xx'] = [0, 1, 2]           # Store a list
d['xx'].append(3)             # This won't persist since writeback=True is not used

# Correct approach:
temp = d['xx']                # Extract the stored list
temp.append(5)                # Modify the list
d['xx'] = temp                # Store it back to persist changes

d.close()                     # Close the database
```

### Debug/test Storage

For testing purposes, it is possible to use an in-memory provider that can:
- Persist the data during all the program execution.
- Remove the data object is deleted.

Here is a configuration example:
```bash
$ cat in-memory.ini
[default]
provider    = in-memory
# If set, open twice the same database during the program execution will lead to open twice the same database.
persist-key = standard
```

A common use case for this provider is to simplify mocking.

Example:
```bash
$ cat persist.ini
[default]
provider    = in-memory
# If set, open twice the same database during the program execution will lead to open twice the same database.
persist-key = my-db

$ cat do-not-persist.ini
[default]
provider = in-memory
```

```python
import cshelve

with cshelve.open('persist.ini') as db:
    db["Asterix"] = "Gaulois"

with cshelve.open('persist.ini') as db:
    assert db["Asterix"] == "Gaulois"

with cshelve.open('do-not-persist.ini') as db:
    db["Obelix"] = "Gaulois"

with cshelve.open('do-not-persist.ini') as db:
    assert "Obelix" not in db
```

### Remote Storage (e.g., Azure)

To configure remote cloud storage, you need to provide an INI file containing your cloud provider's configuration. The file should have a `.ini` extension. Remote storage also requires the installation of optional dependencies for the cloud provider you want to use.

#### Example Azure Blob Configuration

First, install the Azure Blob Storage provider:
```bash
pip install cshelve[azure-blob]
```

Then, create an INI file with the following configuration:
```bash
$ cat azure-blob.ini
[default]
provider        = azure-blob
account_url     = https://myaccount.blob.core.windows.net
# Note: The auth_type can be access_key, passwordless, connection_string, or anonymous.
# The passwordless authentication method is recommended, but the Azure CLI must be installed (https://learn.microsoft.com/en-us/cli/azure/install-azure-cli).
auth_type       = passwordless
container_name  = mycontainer
```

Once the INI file is ready, you can interact with remote storage the same way as with local storage. Here's an example using Azure:

```python
import cshelve

d = cshelve.open('azure-blob.ini')  # Open using the remote storage configuration

key = 'key'
data = 'data'

d[key] = data                  # Store data at the key on the remote storage
data = d[key]                  # Retrieve the data from the remote storage
del d[key]                     # Delete the data from the remote storage

flag = key in d                # Check if the key exists in the cloud storage
klist = list(d.keys())         # List all keys present in the remote storage

# Note: Since writeback=True is not used, handle data carefully:
d['xx'] = [0, 1, 2]            # Store a list on the remote storage
d['xx'].append(3)              # This won't persist since writeback=True is not used

# Correct approach:
temp = d['xx']                 # Extract the stored list from the remote storage
temp.append(5)                 # Modify the list locally
d['xx'] = temp                 # Store it back on the remote storage to persist changes

d.close()                      # Close the connection to the remote storage
```

More configuration examples for other cloud providers can be found [here](./tests/configurations/).

### Providers configuration

#### In Memory

Provider: `in-memory`
Installation: No additional installation required.

The In Memory provider uses an in-memory data structure to simulate storage. This is useful for testing and development purposes.

| Option         | Description                                                                  | Required | Default Value |
|----------------|------------------------------------------------------------------------------|----------|---------------|
| `persist-key`  | If set, its value will be conserved and reused during the program execution. | :x:      | None          |
| `exists`       | If True, the database exists; otherwise, it will be created.                 | :x:      | False         |


#### Azure Blob

Provider: `azure-blob`
Installation: `pip install cshelve[azure-blob]`

The Azure provider uses [Azure Blob Storage](https://learn.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction) as remote storage.
The module considers the provided container as dedicated to the application. The impact might be significant. For example, if the flag `n` is provided to the `open` function, the entire container will be purged, aligning with the [official interface](https://docs.python.org/3/library/shelve.html#shelve.open).

| Option                           | Description                                                                                                                                                  | Required           | Default Value |
|----------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------|---------------|
| `account_url`                    | The URL of your Azure storage account.                                                                                                                       | :x:                |               |
| `auth_type`                      | The authentication method to use: `access_key`, `passwordless`, `connection_string` or `anonymous`.                                                                               | :white_check_mark:                |               |
| `container_name`                 | The name of the container in your Azure storage account.                                                                                                     | :white_check_mark:                |               |

Depending on the `open` flag, the permissions required by `cshelve` for blob storage vary.

| Flag | Description | Permissions Needed |
|------|-------------|--------------------|
| `r`  | Open an existing blob storage container for reading only. | [Storage Blob Data Reader](https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles#storage-blob-data-reader) |
| `w`  | Open an existing blob storage container for reading and writing. | [Storage Blob Data Contributor](https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles#storage-blob-data-contributor) |
| `c`  | Open a blob storage container for reading and writing, creating it if it doesn't exist. | [Storage Blob Data Contributor](https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles#storage-blob-data-contributor) |
| `n`  | Purge the blob storage container before using it. | [Storage Blob Data Contributor](https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles#storage-blob-data-contributor) |


Authentication type supported:

| Auth Type         | Description                                                                                     | Advantage                                                                 | Disadvantage                          | Example Configuration |
|-------------------|-------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------|---------------------------------------|-----------------------|
| Access Key       | Uses an Access Key or a Shared Access Signature for authentication. | Fast startup as no additional credential retrieval is needed. | Credentials need to be securely managed and provided. | [Example](./tests/configurations/azure-integration/access-key.ini) |
| Anonymous         | No authentication for anonymous access on public blob storage. | No configuration or credentials needed. | Read-only access. | [Example](./tests/configurations/azure-integration/anonymous.ini) |
| Connection String | Uses a connection string for authentication. Credentials are provided directly in the string. | Fast startup as no additional credential retrieval is needed. | Credentials need to be securely managed and provided. | [Example](./tests/configurations/azure-integration/connection-string.ini) |
| Passwordless      | Uses passwordless authentication methods such as Managed Identity. | Recommended for better security and easier credential management. | May impact startup time due to the need to retrieve authentication credentials. | [Example](./tests/configurations/azure-integration/standard.ini) |


## Contributing

We welcome contributions from the community! Have a look at our [issues](https://github.com/Standard-Cloud/cshelve/issues).

## License

This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for more details.

## Contact

If you have any questions, issues, or feedback, feel free to [open an issue]https://github.com/Standard-Cloud/cshelve/issues).

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "cshelve",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": null,
    "keywords": "azure, azure-storage-account, cloud, database, shelve",
    "author": null,
    "author_email": null,
    "download_url": "https://files.pythonhosted.org/packages/5e/a1/e867f5cfa149b4cd7e37b428a2f678747d64760d886fa6a85bb3861a1e07/cshelve-0.8.0.tar.gz",
    "platform": null,
    "description": "# Cloud Shelve\n`Cloud Shelve (cshelve)` is a Python package that provides a seamless way to store and manage data in the cloud using the familiar [Python Shelve interface](https://docs.python.org/3/library/shelve.html). It is designed for efficient and scalable storage solutions, allowing you to leverage cloud providers for persistent storage while keeping the simplicity of the `shelve` API.\n\n## Features\n\n- Supports large file storage in the cloud\n- Secure data in-transit encryption when using cloud storage\n- Fully compatible with Python's `shelve` API\n- Cross-platform compatibility for local and remote storage\n\n## Installation\n\nInstall `cshelve` via pip:\n\n```bash\npip install cshelve\n```\n\n## Usage\n\nThe `cshelve` module strictly follows the official `shelve` API. Consequently, you can refer to the [Python official documentation](https://docs.python.org/3/library/shelve.html) for general usage examples. Simply replace the `shelve` import with `cshelve`, and you're good to go.\n\n### Local Storage\n\nHere is an example, adapted from the [official shelve documentation](https://docs.python.org/3/library/shelve.html#example), demonstrating local storage usage. Just replace `shelve` with `cshelve`:\n\n```python\nimport cshelve\n\nd = cshelve.open('local.db')  # Open the local database file\n\nkey = 'key'\ndata = 'data'\n\nd[key] = data                 # Store data at the key (overwrites existing data)\ndata = d[key]                 # Retrieve a copy of data (raises KeyError if not found)\ndel d[key]                    # Delete data at the key (raises KeyError if not found)\n\nflag = key in d               # Check if the key exists in the database\nklist = list(d.keys())        # List all existing keys (could be slow for large datasets)\n\n# Note: Since writeback=True is not used, handle data carefully:\nd['xx'] = [0, 1, 2]           # Store a list\nd['xx'].append(3)             # This won't persist since writeback=True is not used\n\n# Correct approach:\ntemp = d['xx']                # Extract the stored list\ntemp.append(5)                # Modify the list\nd['xx'] = temp                # Store it back to persist changes\n\nd.close()                     # Close the database\n```\n\n### Debug/test Storage\n\nFor testing purposes, it is possible to use an in-memory provider that can:\n- Persist the data during all the program execution.\n- Remove the data object is deleted.\n\nHere is a configuration example:\n```bash\n$ cat in-memory.ini\n[default]\nprovider    = in-memory\n# If set, open twice the same database during the program execution will lead to open twice the same database.\npersist-key = standard\n```\n\nA common use case for this provider is to simplify mocking.\n\nExample:\n```bash\n$ cat persist.ini\n[default]\nprovider    = in-memory\n# If set, open twice the same database during the program execution will lead to open twice the same database.\npersist-key = my-db\n\n$ cat do-not-persist.ini\n[default]\nprovider = in-memory\n```\n\n```python\nimport cshelve\n\nwith cshelve.open('persist.ini') as db:\n    db[\"Asterix\"] = \"Gaulois\"\n\nwith cshelve.open('persist.ini') as db:\n    assert db[\"Asterix\"] == \"Gaulois\"\n\nwith cshelve.open('do-not-persist.ini') as db:\n    db[\"Obelix\"] = \"Gaulois\"\n\nwith cshelve.open('do-not-persist.ini') as db:\n    assert \"Obelix\" not in db\n```\n\n### Remote Storage (e.g., Azure)\n\nTo configure remote cloud storage, you need to provide an INI file containing your cloud provider's configuration. The file should have a `.ini` extension. Remote storage also requires the installation of optional dependencies for the cloud provider you want to use.\n\n#### Example Azure Blob Configuration\n\nFirst, install the Azure Blob Storage provider:\n```bash\npip install cshelve[azure-blob]\n```\n\nThen, create an INI file with the following configuration:\n```bash\n$ cat azure-blob.ini\n[default]\nprovider        = azure-blob\naccount_url     = https://myaccount.blob.core.windows.net\n# Note: The auth_type can be access_key, passwordless, connection_string, or anonymous.\n# The passwordless authentication method is recommended, but the Azure CLI must be installed (https://learn.microsoft.com/en-us/cli/azure/install-azure-cli).\nauth_type       = passwordless\ncontainer_name  = mycontainer\n```\n\nOnce the INI file is ready, you can interact with remote storage the same way as with local storage. Here's an example using Azure:\n\n```python\nimport cshelve\n\nd = cshelve.open('azure-blob.ini')  # Open using the remote storage configuration\n\nkey = 'key'\ndata = 'data'\n\nd[key] = data                  # Store data at the key on the remote storage\ndata = d[key]                  # Retrieve the data from the remote storage\ndel d[key]                     # Delete the data from the remote storage\n\nflag = key in d                # Check if the key exists in the cloud storage\nklist = list(d.keys())         # List all keys present in the remote storage\n\n# Note: Since writeback=True is not used, handle data carefully:\nd['xx'] = [0, 1, 2]            # Store a list on the remote storage\nd['xx'].append(3)              # This won't persist since writeback=True is not used\n\n# Correct approach:\ntemp = d['xx']                 # Extract the stored list from the remote storage\ntemp.append(5)                 # Modify the list locally\nd['xx'] = temp                 # Store it back on the remote storage to persist changes\n\nd.close()                      # Close the connection to the remote storage\n```\n\nMore configuration examples for other cloud providers can be found [here](./tests/configurations/).\n\n### Providers configuration\n\n#### In Memory\n\nProvider: `in-memory`\nInstallation: No additional installation required.\n\nThe In Memory provider uses an in-memory data structure to simulate storage. This is useful for testing and development purposes.\n\n| Option         | Description                                                                  | Required | Default Value |\n|----------------|------------------------------------------------------------------------------|----------|---------------|\n| `persist-key`  | If set, its value will be conserved and reused during the program execution. | :x:      | None          |\n| `exists`       | If True, the database exists; otherwise, it will be created.                 | :x:      | False         |\n\n\n#### Azure Blob\n\nProvider: `azure-blob`\nInstallation: `pip install cshelve[azure-blob]`\n\nThe Azure provider uses [Azure Blob Storage](https://learn.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction) as remote storage.\nThe module considers the provided container as dedicated to the application. The impact might be significant. For example, if the flag `n` is provided to the `open` function, the entire container will be purged, aligning with the [official interface](https://docs.python.org/3/library/shelve.html#shelve.open).\n\n| Option                           | Description                                                                                                                                                  | Required           | Default Value |\n|----------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------|---------------|\n| `account_url`                    | The URL of your Azure storage account.                                                                                                                       | :x:                |               |\n| `auth_type`                      | The authentication method to use: `access_key`, `passwordless`, `connection_string` or `anonymous`.                                                                               | :white_check_mark:                |               |\n| `container_name`                 | The name of the container in your Azure storage account.                                                                                                     | :white_check_mark:                |               |\n\nDepending on the `open` flag, the permissions required by `cshelve` for blob storage vary.\n\n| Flag | Description | Permissions Needed |\n|------|-------------|--------------------|\n| `r`  | Open an existing blob storage container for reading only. | [Storage Blob Data Reader](https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles#storage-blob-data-reader) |\n| `w`  | Open an existing blob storage container for reading and writing. | [Storage Blob Data Contributor](https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles#storage-blob-data-contributor) |\n| `c`  | Open a blob storage container for reading and writing, creating it if it doesn't exist. | [Storage Blob Data Contributor](https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles#storage-blob-data-contributor) |\n| `n`  | Purge the blob storage container before using it. | [Storage Blob Data Contributor](https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles#storage-blob-data-contributor) |\n\n\nAuthentication type supported:\n\n| Auth Type         | Description                                                                                     | Advantage                                                                 | Disadvantage                          | Example Configuration |\n|-------------------|-------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------|---------------------------------------|-----------------------|\n| Access Key       | Uses an Access Key or a Shared Access Signature for authentication. | Fast startup as no additional credential retrieval is needed. | Credentials need to be securely managed and provided. | [Example](./tests/configurations/azure-integration/access-key.ini) |\n| Anonymous         | No authentication for anonymous access on public blob storage. | No configuration or credentials needed. | Read-only access. | [Example](./tests/configurations/azure-integration/anonymous.ini) |\n| Connection String | Uses a connection string for authentication. Credentials are provided directly in the string. | Fast startup as no additional credential retrieval is needed. | Credentials need to be securely managed and provided. | [Example](./tests/configurations/azure-integration/connection-string.ini) |\n| Passwordless      | Uses passwordless authentication methods such as Managed Identity. | Recommended for better security and easier credential management. | May impact startup time due to the need to retrieve authentication credentials. | [Example](./tests/configurations/azure-integration/standard.ini) |\n\n\n## Contributing\n\nWe welcome contributions from the community! Have a look at our [issues](https://github.com/Standard-Cloud/cshelve/issues).\n\n## License\n\nThis project is licensed under the MIT License. See the [LICENSE](LICENSE) file for more details.\n\n## Contact\n\nIf you have any questions, issues, or feedback, feel free to [open an issue]https://github.com/Standard-Cloud/cshelve/issues).\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "Propulsing the shelve module to the cloud",
    "version": "0.8.0",
    "project_urls": {
        "documentation": "https://github.com/Standard-Cloud/cshelve",
        "homepage": "https://github.com/Standard-Cloud/cshelve",
        "repository": "https://github.com/Standard-Cloud/cshelve"
    },
    "split_keywords": [
        "azure",
        " azure-storage-account",
        " cloud",
        " database",
        " shelve"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "18197bd58749a346ed683d13e2189b696830407ff55c98d4322e299792948897",
                "md5": "7776cacf50789807a9e9eb7d269ee24c",
                "sha256": "475bbb6c520ee76e8abaa54845d442c381813d6816d80ff049eb3bcee7e4280a"
            },
            "downloads": -1,
            "filename": "cshelve-0.8.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "7776cacf50789807a9e9eb7d269ee24c",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9",
            "size": 18583,
            "upload_time": "2024-12-17T03:11:09",
            "upload_time_iso_8601": "2024-12-17T03:11:09.591549Z",
            "url": "https://files.pythonhosted.org/packages/18/19/7bd58749a346ed683d13e2189b696830407ff55c98d4322e299792948897/cshelve-0.8.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "5ea1e867f5cfa149b4cd7e37b428a2f678747d64760d886fa6a85bb3861a1e07",
                "md5": "05853e4c44ab89f67227559f4701f7ec",
                "sha256": "3b4171cc95d07c95fc6c06a6a79aa186106e1f89e29217b7fd65df46a77cf064"
            },
            "downloads": -1,
            "filename": "cshelve-0.8.0.tar.gz",
            "has_sig": false,
            "md5_digest": "05853e4c44ab89f67227559f4701f7ec",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 120478,
            "upload_time": "2024-12-17T03:11:10",
            "upload_time_iso_8601": "2024-12-17T03:11:10.656585Z",
            "url": "https://files.pythonhosted.org/packages/5e/a1/e867f5cfa149b4cd7e37b428a2f678747d64760d886fa6a85bb3861a1e07/cshelve-0.8.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-12-17 03:11:10",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "Standard-Cloud",
    "github_project": "cshelve",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "cshelve"
}
        
Elapsed time: 0.42869s