# 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"
}