py-lamina


Namepy-lamina JSON
Version 3.0.0 PyPI version JSON
download
home_pagehttps://github.com/megalus/lamina
SummaryAdd a new layer ("lâmina") to AWS lambda functions
upload_time2024-10-09 22:09:29
maintainerNone
docs_urlNone
authorChris Maillefaud
requires_python<4,>=3.11
licenseMIT
keywords aws lambda decorator
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Welcome to Lamina

<p align="center">
<a href="https://pypi.org/project/py-lamina/" target="_blank">
<img alt="PyPI" src="https://img.shields.io/pypi/v/py-lamina"/></a>
<a href="https://www.python.org" target="_blank">
<img alt="PyPI - Python Version" src="https://img.shields.io/pypi/pyversions/py-lamina"/>
</a>
</p>

This library adds a new layer ("lâmina") to AWS lambda functions, integrating synchronous and asynchronous code in a
single function, which use Pydantic models to validate input and output data.

---

### Install

```shell
$ pip install py-lamina
```

This library is compatible with Python 3.9, 3.10 and 3.11.

---

### Usage

Create the models for Input and Output data:

```python
# schemas.py

from pydantic import BaseModel

class ExampleInput(BaseModel):
    name: str
    age: int

class ExampleOutput(BaseModel):
    message: str
```

Create your AWS Lambda handler:

```python
# main.py
from typing import Any, Dict, Tuple, Union
from lamina import lamina, Request
from .schemas import ExampleInput, ExampleOutput

@lamina(schema=ExampleInput, schema_out=ExampleOutput)
def handler(request: Request) -> Dict[str, Any]:
    response = {"message": f"Hello {request.data.name}, you are {request.data.age} years old!"}
    return response
```

You can also use an async handler:

```python
# main.py
import asyncio

@lamina(schema=ExampleInput, schema_out=ExampleOutput)
async def handler(request: Request) -> Dict[str, Any]:
    await asyncio.sleep(1)
    response = {"message": f"Hello {request.data.name}, you are {request.data.age} years old!"}
    return response
```

### The Response Status Code
Default value is 200. You can change it by returning a tuple with the response and the status code:

```python
@lamina(schema=ExampleInput, schema_out=ExampleOutput)
def handler(request: Request) -> Tuple[Dict[str, Any], int]:
    response = {"message": f"Hello {request.data.name}, you are {request.data.age} years old!"}
    return response, 201
```

### The Response Content Type
Default content type is `application/json; charset=utf-8`. You can change it by defining the `content_type` parameter:

```python
@lamina(schema=ExampleInput, content_type=Lamina.HTML)
def handler(request: Request) -> Tuple[str, int]:
    html_404 = """
        <html>
            <head><title>404 Not Found</title></head>
            <body>
                <h1>404 Not Found</h1>
            </body>
        </html>
    """
    return html_404, 404
```

### The Response Headers
Default header contains the Content Type defined in decorator or `{"Content-Type": "application/json; charset=utf-8"}`
by default.
You can add more headers it by returning a dict in the function return tuple:

```python
@lamina(schema=ExampleInput, content_type=Lamina.HTML)
def handler(request: Request) -> str:
    return None, 403, {"Location": "https://www.example.com"}
```

This dict will be merged with the default header.

### The Request object

The `Request` object has the following attributes:
* `data`: The input data, already validated by the schema.
* `event`: The original event received by the lambda function.
* `context`: The original context received by the lambda function.

You can use lamina without one or both schemas, if you like:

```python
# main.py
import json
from typing import Any, Dict

from lamina import lamina, Request


@lamina()
def handler(request: Request) -> Dict[str, Any]:
    body = request.event["body"]
    data = json.loads(body)
    response = {"message": f"Hello {data.name}, you are {data.age} years old!"}
    return response
```

Please note, if you do not define a SchemaIn, the `data` attribute will contain the **original** body from event. You
need to validate it yourself and convert it to a dict, bytes, etc... you need before using the data received.

---

## License

This project is licensed under the terms of the MIT license.

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/megalus/lamina",
    "name": "py-lamina",
    "maintainer": null,
    "docs_url": null,
    "requires_python": "<4,>=3.11",
    "maintainer_email": null,
    "keywords": "aws, lambda, decorator",
    "author": "Chris Maillefaud",
    "author_email": "chrismaille@users.noreply.github.com",
    "download_url": "https://files.pythonhosted.org/packages/44/ee/bed43bfa9a437e9ab322f9ea3f8d42582b9cb6954cae573853b21e12a361/py_lamina-3.0.0.tar.gz",
    "platform": null,
    "description": "# Welcome to Lamina\n\n<p align=\"center\">\n<a href=\"https://pypi.org/project/py-lamina/\" target=\"_blank\">\n<img alt=\"PyPI\" src=\"https://img.shields.io/pypi/v/py-lamina\"/></a>\n<a href=\"https://www.python.org\" target=\"_blank\">\n<img alt=\"PyPI - Python Version\" src=\"https://img.shields.io/pypi/pyversions/py-lamina\"/>\n</a>\n</p>\n\nThis library adds a new layer (\"l\u00e2mina\") to AWS lambda functions, integrating synchronous and asynchronous code in a\nsingle function, which use Pydantic models to validate input and output data.\n\n---\n\n### Install\n\n```shell\n$ pip install py-lamina\n```\n\nThis library is compatible with Python 3.9, 3.10 and 3.11.\n\n---\n\n### Usage\n\nCreate the models for Input and Output data:\n\n```python\n# schemas.py\n\nfrom pydantic import BaseModel\n\nclass ExampleInput(BaseModel):\n    name: str\n    age: int\n\nclass ExampleOutput(BaseModel):\n    message: str\n```\n\nCreate your AWS Lambda handler:\n\n```python\n# main.py\nfrom typing import Any, Dict, Tuple, Union\nfrom lamina import lamina, Request\nfrom .schemas import ExampleInput, ExampleOutput\n\n@lamina(schema=ExampleInput, schema_out=ExampleOutput)\ndef handler(request: Request) -> Dict[str, Any]:\n    response = {\"message\": f\"Hello {request.data.name}, you are {request.data.age} years old!\"}\n    return response\n```\n\nYou can also use an async handler:\n\n```python\n# main.py\nimport asyncio\n\n@lamina(schema=ExampleInput, schema_out=ExampleOutput)\nasync def handler(request: Request) -> Dict[str, Any]:\n    await asyncio.sleep(1)\n    response = {\"message\": f\"Hello {request.data.name}, you are {request.data.age} years old!\"}\n    return response\n```\n\n### The Response Status Code\nDefault value is 200. You can change it by returning a tuple with the response and the status code:\n\n```python\n@lamina(schema=ExampleInput, schema_out=ExampleOutput)\ndef handler(request: Request) -> Tuple[Dict[str, Any], int]:\n    response = {\"message\": f\"Hello {request.data.name}, you are {request.data.age} years old!\"}\n    return response, 201\n```\n\n### The Response Content Type\nDefault content type is `application/json; charset=utf-8`. You can change it by defining the `content_type` parameter:\n\n```python\n@lamina(schema=ExampleInput, content_type=Lamina.HTML)\ndef handler(request: Request) -> Tuple[str, int]:\n    html_404 = \"\"\"\n        <html>\n            <head><title>404 Not Found</title></head>\n            <body>\n                <h1>404 Not Found</h1>\n            </body>\n        </html>\n    \"\"\"\n    return html_404, 404\n```\n\n### The Response Headers\nDefault header contains the Content Type defined in decorator or `{\"Content-Type\": \"application/json; charset=utf-8\"}`\nby default.\nYou can add more headers it by returning a dict in the function return tuple:\n\n```python\n@lamina(schema=ExampleInput, content_type=Lamina.HTML)\ndef handler(request: Request) -> str:\n    return None, 403, {\"Location\": \"https://www.example.com\"}\n```\n\nThis dict will be merged with the default header.\n\n### The Request object\n\nThe `Request` object has the following attributes:\n* `data`: The input data, already validated by the schema.\n* `event`: The original event received by the lambda function.\n* `context`: The original context received by the lambda function.\n\nYou can use lamina without one or both schemas, if you like:\n\n```python\n# main.py\nimport json\nfrom typing import Any, Dict\n\nfrom lamina import lamina, Request\n\n\n@lamina()\ndef handler(request: Request) -> Dict[str, Any]:\n    body = request.event[\"body\"]\n    data = json.loads(body)\n    response = {\"message\": f\"Hello {data.name}, you are {data.age} years old!\"}\n    return response\n```\n\nPlease note, if you do not define a SchemaIn, the `data` attribute will contain the **original** body from event. You\nneed to validate it yourself and convert it to a dict, bytes, etc... you need before using the data received.\n\n---\n\n## License\n\nThis project is licensed under the terms of the MIT license.\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Add a new layer (\"l\u00e2mina\") to AWS lambda functions",
    "version": "3.0.0",
    "project_urls": {
        "Homepage": "https://github.com/megalus/lamina",
        "Repository": "https://github.com/megalus/lamina"
    },
    "split_keywords": [
        "aws",
        " lambda",
        " decorator"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "cf88940db94d9d1ae0f58111baa7e90edaad7660f4f130ea89601762e1e31eeb",
                "md5": "a884e74b240251ab73ab33c04b24586a",
                "sha256": "b7ed92e3c87713196093a1e1b6a24d4711d80c5c575b69be0e532b3cfd3560ad"
            },
            "downloads": -1,
            "filename": "py_lamina-3.0.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "a884e74b240251ab73ab33c04b24586a",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": "<4,>=3.11",
            "size": 5448,
            "upload_time": "2024-10-09T22:09:27",
            "upload_time_iso_8601": "2024-10-09T22:09:27.970792Z",
            "url": "https://files.pythonhosted.org/packages/cf/88/940db94d9d1ae0f58111baa7e90edaad7660f4f130ea89601762e1e31eeb/py_lamina-3.0.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "44eebed43bfa9a437e9ab322f9ea3f8d42582b9cb6954cae573853b21e12a361",
                "md5": "2f8f433f2dbb5770e457c6cbcb1bad2d",
                "sha256": "f146f6a4aa59b760af349f97358bd3d7e3c6baafac080352607cb293b0b59842"
            },
            "downloads": -1,
            "filename": "py_lamina-3.0.0.tar.gz",
            "has_sig": false,
            "md5_digest": "2f8f433f2dbb5770e457c6cbcb1bad2d",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": "<4,>=3.11",
            "size": 4995,
            "upload_time": "2024-10-09T22:09:29",
            "upload_time_iso_8601": "2024-10-09T22:09:29.548551Z",
            "url": "https://files.pythonhosted.org/packages/44/ee/bed43bfa9a437e9ab322f9ea3f8d42582b9cb6954cae573853b21e12a361/py_lamina-3.0.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-10-09 22:09:29",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "megalus",
    "github_project": "lamina",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "py-lamina"
}
        
Elapsed time: 0.38689s