finalsa-common-lambdas


Namefinalsa-common-lambdas JSON
Version 2.2.1 PyPI version JSON
download
home_pageNone
SummaryCommon utilities for Finalsa's AWS Lambda functions
upload_time2025-08-19 02:23:52
maintainerNone
docs_urlNone
authorNone
requires_python>=3.10
licenseMIT License Copyright (c) 2025 Luis Diego JimΓ©nez Delgado Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
keywords aws common finalsa lambda utilities
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Finalsa Common Lambda

[![Version](https://img.shields.io/badge/version-2.0.4-blue.svg)](https://pypi.org/project/finalsa-common-lambdas/)
[![Python](https://img.shields.io/badge/python-3.10+-blue.svg)](https://python.org)
[![Type Hints](https://img.shields.io/badge/typing-fully%20typed-green.svg)](https://docs.python.org/3/library/typing.html)
[![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE.md)

A comprehensive, **type-safe** Python library for building AWS Lambda functions with common patterns, utilities, and best practices for the Finalsa ecosystem.

## πŸš€ Features

- **πŸ”’ Full Type Safety**: Comprehensive type hints for better IDE support and error detection
- **🌐 Unified Lambda Framework**: Simple, decorator-based approach for handling both HTTP and SQS events
- **🎯 Type Safety**: Full type hints and Pydantic model integration with protocols and generics
- **πŸ“Š Built-in Traceability**: Automatic correlation ID and trace management
- **⚑ Error Handling**: Robust exception handling with retries and logging
- **πŸ§ͺ Test Support**: Built-in test mode with mocking capabilities and type-safe testing
- **πŸ”§ Modular Design**: Composable handlers for different event types
- **πŸ’‘ Developer Experience**: Excellent IDE support with auto-completion and type checking

## πŸ“¦ Installation

```bash
pip install finalsa-common-lambdas
```

## πŸ—οΈ Quick Start

### Basic Lambda Function with Type Safety

```python
from finalsa.common.lambdas.app import App
from typing import Dict, Any, Union
from finalsa.common.lambdas.http.HttpResponse import HttpResponse

# Create your lambda handler
class MyLambda(AppEntry):
    pass

# Create app instance
app = App("my-lambda-function")

# Register SQS handlers
@app.sqs.default()
def handle_default_sqs(message: dict):
    print(f"Processing message: {message}")
    return {"status": "processed"}

@app.sqs.handler("user-events")
def handle_user_events(message: dict, meta: dict):
    print(f"User event: {message}")
    return {"status": "success"}

# Register HTTP handlers
@app.http.post("/users")
def create_user(body: dict):
    return {"message": "User created", "id": 123}

@app.http.get("/users/{user_id}")
def get_user(user_id: str):
    return {"user_id": user_id, "name": "John Doe"}

# Lambda entry point
def lambda_handler(event, context):
    return app.execute(event, context)
```

### Using AppEntry for Modular Design

```python
from finalsa.common.lambdas.app import App, AppEntry

# Create modular app entries
user_service = AppEntry("user-service")
notification_service = AppEntry("notification-service")

# Define handlers in user service
@user_service.http.post("/users")
def create_user(body: dict):
    return {"message": "User created"}

@user_service.sqs.handler("user-created")
def handle_user_created(message: dict):
    print("User created event processed")

# Define handlers in notification service
@notification_service.sqs.handler("send-email")
def send_email(message: dict):
    print("Sending email...")

# Combine into main app
app = App("main-app")
app.register(user_service)
app.register(notification_service)

def lambda_handler(event, context):
    return app.execute(event, context)
```

## πŸ“– Documentation

### Core Components

#### App Class

The main application container that manages multiple `AppEntry` instances.

```python
from finalsa.common.lambdas.app import App

app = App(
    app_name="my-lambda",           # Optional: name for logging
    logger=custom_logger,           # Optional: custom logger
    test_mode=False                 # Optional: enable test mode
)
```

**Methods:**
- `register(app_entry)`: Register an AppEntry with the app
- `execute(event, context)`: Main entry point for Lambda execution

#### AppEntry Class

Base class for creating modular Lambda handlers.

```python
from finalsa.common.lambdas.app import AppEntry

entry = AppEntry(
    app_name="my-service",         # Optional: service name
    logger=custom_logger           # Optional: custom logger
)
```

**Properties:**
- `sqs`: SQS handler instance
- `http`: HTTP handler instance

### SQS Handler

Handle SQS events with automatic message parsing and error handling.

#### Basic Usage

```python
# Default handler (catches all unmatched topics)
@app.sqs.default()
def handle_default(message: dict):
    return {"status": "processed"}

# Topic-specific handler
@app.sqs.handler("user-events")
def handle_user_events(message: dict):
    return {"status": "success"}

# Handler with metadata
@app.sqs.handler("orders", retries=3)
def handle_orders(message: dict, meta: dict):
    correlation_id = meta.get("correlation_id")
    return {"order_id": message["id"]}
```

#### Available Parameters

Your SQS handler functions can accept these parameters:

- `message: dict` - Parsed message body
- `meta: dict` - Message metadata (correlation_id, trace_id, etc.)
- `event: SqsEvent` - Raw SQS event object
- `context` - Lambda context object

#### Error Handling and Retries

```python
@app.sqs.handler("critical-process", retries=5)
def handle_critical(message: dict):
    # This will retry up to 5 times on failure
    if not process_critical_data(message):
        raise Exception("Processing failed")
    return {"status": "success"}
```

### HTTP Handler

Handle HTTP API Gateway events with automatic routing and parameter extraction.

#### HTTP Methods

```python
# Basic routes
@app.http.get("/health")
def health_check():
    return {"status": "healthy"}

@app.http.post("/users")
def create_user(body: dict):
    return {"user_id": 123}

@app.http.put("/users/{user_id}")
def update_user(user_id: str, body: dict):
    return {"user_id": user_id, "updated": True}

@app.http.delete("/users/{user_id}")
def delete_user(user_id: str):
    return {"deleted": True}
```

#### Path Parameters

```python
# Single path parameter
@app.http.get("/users/{user_id}")
def get_user(user_id: str):
    return {"user_id": user_id}

# Multiple path parameters
@app.http.get("/users/{user_id}/posts/{post_id}")
def get_user_post(user_id: str, post_id: str):
    return {"user_id": user_id, "post_id": post_id}
```

#### Available Parameters

Your HTTP handler functions can accept these parameters:

- `body: dict` - Parsed request body
- `headers: dict` - Request headers
- `query: dict` - Query string parameters
- `path_params: dict` - Path parameters
- `meta: dict` - Request metadata
- `event: dict` - Raw API Gateway event
- `context` - Lambda context object

#### Custom Response Codes

```python
from finalsa.common.lambdas.http.HttpResponse import HttpResponse

@app.http.post("/users")
def create_user(body: dict):
    # Custom status code
    return HttpResponse(
        status_code=201,
        body={"user_id": 123},
        headers={"Location": "/users/123"}
    )

@app.http.get("/users/{user_id}")
def get_user(user_id: str):
    if not user_exists(user_id):
        return HttpResponse(
            status_code=404,
            body={"error": "User not found"}
        )
    return {"user_id": user_id}
```

## πŸ§ͺ Testing

### Test Mode

Enable test mode to use mocked services:

```python
from finalsa.common.lambdas.app import App

# Enable test mode
app = App(test_mode=True)

# Or enable later
app.__set_test_mode__()

# Test your handlers
response = app.execute({
    "eventSource": "aws:sqs",
    "Records": [
        {
            "body": '{"test": "message"}',
            "messageAttributes": {
                "correlation_id": {
                    "stringValue": "test-correlation-id"
                }
            }
        }
    ]
})
```

### Example Test

```python
import pytest
from finalsa.common.lambdas.app import App, AppEntry

def test_sqs_handler():
    # Setup
    app_entry = AppEntry()
    
    @app_entry.sqs.default()
    def handle_message(message: dict):
        return {"processed": message["id"]}
    
    app = App(test_mode=True)
    app.register(app_entry)
    
    # Test
    event = {
        "eventSource": "aws:sqs",
        "Records": [
            {
                "body": '{"id": "123", "type": "test"}',
                "messageAttributes": {}
            }
        ]
    }
    
    result = app.execute(event)
    assert result[0]["processed"] == "123"

def test_http_handler():
    app_entry = AppEntry()
    
    @app_entry.http.get("/users/{user_id}")
    def get_user(user_id: str):
        return {"user_id": user_id}
    
    app = App(test_mode=True)
    app.register(app_entry)
    
    event = {
        "httpMethod": "GET",
        "path": "/users/123",
        "pathParameters": {"user_id": "123"}
    }
    
    result = app.execute(event)
    assert result["statusCode"] == 200
```

## πŸ—οΈ Architecture

### Event Flow

```
Lambda Event β†’ App.execute() β†’ Handler Detection β†’ Route to SQS/HTTP β†’ Handler Execution β†’ Response
```

### Component Structure

```
App
β”œβ”€β”€ AppEntry (modular services)
β”‚   β”œβ”€β”€ SqsHandler (message processing)
β”‚   └── HttpHandler (API routing)
β”œβ”€β”€ Traceability (correlation/trace IDs)
β”œβ”€β”€ Error Handling (retries, logging)
└── Test Support (mocking, fixtures)
```

## πŸ”§ Advanced Usage

### Custom Error Handling

```python
from finalsa.common.lambdas.common.exceptions import HandlerNotFoundError

@app.sqs.handler("critical-data")
def handle_critical(message: dict):
    try:
        process_data(message)
    except ValueError as e:
        # Log and re-raise for retry
        app.logger.error(f"Invalid data: {e}")
        raise
    except Exception as e:
        # Handle gracefully
        app.logger.warning(f"Processing failed: {e}")
        return {"status": "failed", "error": str(e)}
```

### Custom Logging

```python
import logging
from finalsa.common.lambdas.app import App

# Custom logger
logger = logging.getLogger("my-app")
logger.setLevel(logging.INFO)

app = App("my-lambda", logger=logger)
```

### Environment Configuration

```python
import os
from finalsa.common.lambdas.app import App

app = App(
    app_name=os.getenv("APP_NAME", "default-app"),
    test_mode=os.getenv("TEST_MODE", "false").lower() == "true"
)
```

## 🀝 Dependencies

This library depends on several Finalsa internal packages:

- `finalsa-common-logger` - Logging utilities
- `finalsa-common-models` - Pydantic models
- `finalsa-sqs-client` - SQS client implementation
- `finalsa-traceability` - Tracing and correlation
- `orjson` - Fast JSON parsing
- `pydantic` - Data validation

## πŸ“„ License

This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details.

## πŸ”— Links

- [Homepage](https://github.com/finalsa/finalsa-common-lambda)
- [PyPI Package](https://pypi.org/project/finalsa-common-lambdas/)
- [Documentation](https://github.com/finalsa/finalsa-common-lambda/wiki)

## πŸ“ž Support

For questions and support, please contact [luis@finalsa.com](mailto:luis@finalsa.com)

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "finalsa-common-lambdas",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.10",
    "maintainer_email": null,
    "keywords": "aws, common, finalsa, lambda, utilities",
    "author": null,
    "author_email": "Luis Jimenez <luis@finalsa.com>",
    "download_url": "https://files.pythonhosted.org/packages/ea/d1/d13aa6a398823ecf5990603758ceb7cbd4dba48bf333af7365a966eed7cd/finalsa_common_lambdas-2.2.1.tar.gz",
    "platform": null,
    "description": "# Finalsa Common Lambda\n\n[![Version](https://img.shields.io/badge/version-2.0.4-blue.svg)](https://pypi.org/project/finalsa-common-lambdas/)\n[![Python](https://img.shields.io/badge/python-3.10+-blue.svg)](https://python.org)\n[![Type Hints](https://img.shields.io/badge/typing-fully%20typed-green.svg)](https://docs.python.org/3/library/typing.html)\n[![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE.md)\n\nA comprehensive, **type-safe** Python library for building AWS Lambda functions with common patterns, utilities, and best practices for the Finalsa ecosystem.\n\n## \ud83d\ude80 Features\n\n- **\ud83d\udd12 Full Type Safety**: Comprehensive type hints for better IDE support and error detection\n- **\ud83c\udf10 Unified Lambda Framework**: Simple, decorator-based approach for handling both HTTP and SQS events\n- **\ud83c\udfaf Type Safety**: Full type hints and Pydantic model integration with protocols and generics\n- **\ud83d\udcca Built-in Traceability**: Automatic correlation ID and trace management\n- **\u26a1 Error Handling**: Robust exception handling with retries and logging\n- **\ud83e\uddea Test Support**: Built-in test mode with mocking capabilities and type-safe testing\n- **\ud83d\udd27 Modular Design**: Composable handlers for different event types\n- **\ud83d\udca1 Developer Experience**: Excellent IDE support with auto-completion and type checking\n\n## \ud83d\udce6 Installation\n\n```bash\npip install finalsa-common-lambdas\n```\n\n## \ud83c\udfd7\ufe0f Quick Start\n\n### Basic Lambda Function with Type Safety\n\n```python\nfrom finalsa.common.lambdas.app import App\nfrom typing import Dict, Any, Union\nfrom finalsa.common.lambdas.http.HttpResponse import HttpResponse\n\n# Create your lambda handler\nclass MyLambda(AppEntry):\n    pass\n\n# Create app instance\napp = App(\"my-lambda-function\")\n\n# Register SQS handlers\n@app.sqs.default()\ndef handle_default_sqs(message: dict):\n    print(f\"Processing message: {message}\")\n    return {\"status\": \"processed\"}\n\n@app.sqs.handler(\"user-events\")\ndef handle_user_events(message: dict, meta: dict):\n    print(f\"User event: {message}\")\n    return {\"status\": \"success\"}\n\n# Register HTTP handlers\n@app.http.post(\"/users\")\ndef create_user(body: dict):\n    return {\"message\": \"User created\", \"id\": 123}\n\n@app.http.get(\"/users/{user_id}\")\ndef get_user(user_id: str):\n    return {\"user_id\": user_id, \"name\": \"John Doe\"}\n\n# Lambda entry point\ndef lambda_handler(event, context):\n    return app.execute(event, context)\n```\n\n### Using AppEntry for Modular Design\n\n```python\nfrom finalsa.common.lambdas.app import App, AppEntry\n\n# Create modular app entries\nuser_service = AppEntry(\"user-service\")\nnotification_service = AppEntry(\"notification-service\")\n\n# Define handlers in user service\n@user_service.http.post(\"/users\")\ndef create_user(body: dict):\n    return {\"message\": \"User created\"}\n\n@user_service.sqs.handler(\"user-created\")\ndef handle_user_created(message: dict):\n    print(\"User created event processed\")\n\n# Define handlers in notification service\n@notification_service.sqs.handler(\"send-email\")\ndef send_email(message: dict):\n    print(\"Sending email...\")\n\n# Combine into main app\napp = App(\"main-app\")\napp.register(user_service)\napp.register(notification_service)\n\ndef lambda_handler(event, context):\n    return app.execute(event, context)\n```\n\n## \ud83d\udcd6 Documentation\n\n### Core Components\n\n#### App Class\n\nThe main application container that manages multiple `AppEntry` instances.\n\n```python\nfrom finalsa.common.lambdas.app import App\n\napp = App(\n    app_name=\"my-lambda\",           # Optional: name for logging\n    logger=custom_logger,           # Optional: custom logger\n    test_mode=False                 # Optional: enable test mode\n)\n```\n\n**Methods:**\n- `register(app_entry)`: Register an AppEntry with the app\n- `execute(event, context)`: Main entry point for Lambda execution\n\n#### AppEntry Class\n\nBase class for creating modular Lambda handlers.\n\n```python\nfrom finalsa.common.lambdas.app import AppEntry\n\nentry = AppEntry(\n    app_name=\"my-service\",         # Optional: service name\n    logger=custom_logger           # Optional: custom logger\n)\n```\n\n**Properties:**\n- `sqs`: SQS handler instance\n- `http`: HTTP handler instance\n\n### SQS Handler\n\nHandle SQS events with automatic message parsing and error handling.\n\n#### Basic Usage\n\n```python\n# Default handler (catches all unmatched topics)\n@app.sqs.default()\ndef handle_default(message: dict):\n    return {\"status\": \"processed\"}\n\n# Topic-specific handler\n@app.sqs.handler(\"user-events\")\ndef handle_user_events(message: dict):\n    return {\"status\": \"success\"}\n\n# Handler with metadata\n@app.sqs.handler(\"orders\", retries=3)\ndef handle_orders(message: dict, meta: dict):\n    correlation_id = meta.get(\"correlation_id\")\n    return {\"order_id\": message[\"id\"]}\n```\n\n#### Available Parameters\n\nYour SQS handler functions can accept these parameters:\n\n- `message: dict` - Parsed message body\n- `meta: dict` - Message metadata (correlation_id, trace_id, etc.)\n- `event: SqsEvent` - Raw SQS event object\n- `context` - Lambda context object\n\n#### Error Handling and Retries\n\n```python\n@app.sqs.handler(\"critical-process\", retries=5)\ndef handle_critical(message: dict):\n    # This will retry up to 5 times on failure\n    if not process_critical_data(message):\n        raise Exception(\"Processing failed\")\n    return {\"status\": \"success\"}\n```\n\n### HTTP Handler\n\nHandle HTTP API Gateway events with automatic routing and parameter extraction.\n\n#### HTTP Methods\n\n```python\n# Basic routes\n@app.http.get(\"/health\")\ndef health_check():\n    return {\"status\": \"healthy\"}\n\n@app.http.post(\"/users\")\ndef create_user(body: dict):\n    return {\"user_id\": 123}\n\n@app.http.put(\"/users/{user_id}\")\ndef update_user(user_id: str, body: dict):\n    return {\"user_id\": user_id, \"updated\": True}\n\n@app.http.delete(\"/users/{user_id}\")\ndef delete_user(user_id: str):\n    return {\"deleted\": True}\n```\n\n#### Path Parameters\n\n```python\n# Single path parameter\n@app.http.get(\"/users/{user_id}\")\ndef get_user(user_id: str):\n    return {\"user_id\": user_id}\n\n# Multiple path parameters\n@app.http.get(\"/users/{user_id}/posts/{post_id}\")\ndef get_user_post(user_id: str, post_id: str):\n    return {\"user_id\": user_id, \"post_id\": post_id}\n```\n\n#### Available Parameters\n\nYour HTTP handler functions can accept these parameters:\n\n- `body: dict` - Parsed request body\n- `headers: dict` - Request headers\n- `query: dict` - Query string parameters\n- `path_params: dict` - Path parameters\n- `meta: dict` - Request metadata\n- `event: dict` - Raw API Gateway event\n- `context` - Lambda context object\n\n#### Custom Response Codes\n\n```python\nfrom finalsa.common.lambdas.http.HttpResponse import HttpResponse\n\n@app.http.post(\"/users\")\ndef create_user(body: dict):\n    # Custom status code\n    return HttpResponse(\n        status_code=201,\n        body={\"user_id\": 123},\n        headers={\"Location\": \"/users/123\"}\n    )\n\n@app.http.get(\"/users/{user_id}\")\ndef get_user(user_id: str):\n    if not user_exists(user_id):\n        return HttpResponse(\n            status_code=404,\n            body={\"error\": \"User not found\"}\n        )\n    return {\"user_id\": user_id}\n```\n\n## \ud83e\uddea Testing\n\n### Test Mode\n\nEnable test mode to use mocked services:\n\n```python\nfrom finalsa.common.lambdas.app import App\n\n# Enable test mode\napp = App(test_mode=True)\n\n# Or enable later\napp.__set_test_mode__()\n\n# Test your handlers\nresponse = app.execute({\n    \"eventSource\": \"aws:sqs\",\n    \"Records\": [\n        {\n            \"body\": '{\"test\": \"message\"}',\n            \"messageAttributes\": {\n                \"correlation_id\": {\n                    \"stringValue\": \"test-correlation-id\"\n                }\n            }\n        }\n    ]\n})\n```\n\n### Example Test\n\n```python\nimport pytest\nfrom finalsa.common.lambdas.app import App, AppEntry\n\ndef test_sqs_handler():\n    # Setup\n    app_entry = AppEntry()\n    \n    @app_entry.sqs.default()\n    def handle_message(message: dict):\n        return {\"processed\": message[\"id\"]}\n    \n    app = App(test_mode=True)\n    app.register(app_entry)\n    \n    # Test\n    event = {\n        \"eventSource\": \"aws:sqs\",\n        \"Records\": [\n            {\n                \"body\": '{\"id\": \"123\", \"type\": \"test\"}',\n                \"messageAttributes\": {}\n            }\n        ]\n    }\n    \n    result = app.execute(event)\n    assert result[0][\"processed\"] == \"123\"\n\ndef test_http_handler():\n    app_entry = AppEntry()\n    \n    @app_entry.http.get(\"/users/{user_id}\")\n    def get_user(user_id: str):\n        return {\"user_id\": user_id}\n    \n    app = App(test_mode=True)\n    app.register(app_entry)\n    \n    event = {\n        \"httpMethod\": \"GET\",\n        \"path\": \"/users/123\",\n        \"pathParameters\": {\"user_id\": \"123\"}\n    }\n    \n    result = app.execute(event)\n    assert result[\"statusCode\"] == 200\n```\n\n## \ud83c\udfd7\ufe0f Architecture\n\n### Event Flow\n\n```\nLambda Event \u2192 App.execute() \u2192 Handler Detection \u2192 Route to SQS/HTTP \u2192 Handler Execution \u2192 Response\n```\n\n### Component Structure\n\n```\nApp\n\u251c\u2500\u2500 AppEntry (modular services)\n\u2502   \u251c\u2500\u2500 SqsHandler (message processing)\n\u2502   \u2514\u2500\u2500 HttpHandler (API routing)\n\u251c\u2500\u2500 Traceability (correlation/trace IDs)\n\u251c\u2500\u2500 Error Handling (retries, logging)\n\u2514\u2500\u2500 Test Support (mocking, fixtures)\n```\n\n## \ud83d\udd27 Advanced Usage\n\n### Custom Error Handling\n\n```python\nfrom finalsa.common.lambdas.common.exceptions import HandlerNotFoundError\n\n@app.sqs.handler(\"critical-data\")\ndef handle_critical(message: dict):\n    try:\n        process_data(message)\n    except ValueError as e:\n        # Log and re-raise for retry\n        app.logger.error(f\"Invalid data: {e}\")\n        raise\n    except Exception as e:\n        # Handle gracefully\n        app.logger.warning(f\"Processing failed: {e}\")\n        return {\"status\": \"failed\", \"error\": str(e)}\n```\n\n### Custom Logging\n\n```python\nimport logging\nfrom finalsa.common.lambdas.app import App\n\n# Custom logger\nlogger = logging.getLogger(\"my-app\")\nlogger.setLevel(logging.INFO)\n\napp = App(\"my-lambda\", logger=logger)\n```\n\n### Environment Configuration\n\n```python\nimport os\nfrom finalsa.common.lambdas.app import App\n\napp = App(\n    app_name=os.getenv(\"APP_NAME\", \"default-app\"),\n    test_mode=os.getenv(\"TEST_MODE\", \"false\").lower() == \"true\"\n)\n```\n\n## \ud83e\udd1d Dependencies\n\nThis library depends on several Finalsa internal packages:\n\n- `finalsa-common-logger` - Logging utilities\n- `finalsa-common-models` - Pydantic models\n- `finalsa-sqs-client` - SQS client implementation\n- `finalsa-traceability` - Tracing and correlation\n- `orjson` - Fast JSON parsing\n- `pydantic` - Data validation\n\n## \ud83d\udcc4 License\n\nThis project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details.\n\n## \ud83d\udd17 Links\n\n- [Homepage](https://github.com/finalsa/finalsa-common-lambda)\n- [PyPI Package](https://pypi.org/project/finalsa-common-lambdas/)\n- [Documentation](https://github.com/finalsa/finalsa-common-lambda/wiki)\n\n## \ud83d\udcde Support\n\nFor questions and support, please contact [luis@finalsa.com](mailto:luis@finalsa.com)\n",
    "bugtrack_url": null,
    "license": "MIT License  Copyright (c) 2025 Luis Diego Jim\u00e9nez Delgado  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.",
    "summary": "Common utilities for Finalsa's AWS Lambda functions",
    "version": "2.2.1",
    "project_urls": {
        "Homepage": "https://github.com/finalsa/finalsa-common-lambda"
    },
    "split_keywords": [
        "aws",
        " common",
        " finalsa",
        " lambda",
        " utilities"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "8bc4f622d8c1677727745171fd5e19de7b561fda5e836ff93277c4d361b7e1ed",
                "md5": "0ee824ffbb7d5b5fce743ad15f35829c",
                "sha256": "312057acbd94a7dc29314c42fe0c7064a21bf69bb3b6edbfcd6e5778d603fb81"
            },
            "downloads": -1,
            "filename": "finalsa_common_lambdas-2.2.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "0ee824ffbb7d5b5fce743ad15f35829c",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 24682,
            "upload_time": "2025-08-19T02:23:51",
            "upload_time_iso_8601": "2025-08-19T02:23:51.577874Z",
            "url": "https://files.pythonhosted.org/packages/8b/c4/f622d8c1677727745171fd5e19de7b561fda5e836ff93277c4d361b7e1ed/finalsa_common_lambdas-2.2.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "ead1d13aa6a398823ecf5990603758ceb7cbd4dba48bf333af7365a966eed7cd",
                "md5": "5607e013d7b6d49be844bf722e3e8a4d",
                "sha256": "7131ea68b434beef9bdb8cc553e947d230c50a518432e27ff9f5a651b7ecd50e"
            },
            "downloads": -1,
            "filename": "finalsa_common_lambdas-2.2.1.tar.gz",
            "has_sig": false,
            "md5_digest": "5607e013d7b6d49be844bf722e3e8a4d",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.10",
            "size": 17150,
            "upload_time": "2025-08-19T02:23:52",
            "upload_time_iso_8601": "2025-08-19T02:23:52.792622Z",
            "url": "https://files.pythonhosted.org/packages/ea/d1/d13aa6a398823ecf5990603758ceb7cbd4dba48bf333af7365a966eed7cd/finalsa_common_lambdas-2.2.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-19 02:23:52",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "finalsa",
    "github_project": "finalsa-common-lambda",
    "github_not_found": true,
    "lcname": "finalsa-common-lambdas"
}
        
Elapsed time: 2.80810s