laneful


Namelaneful JSON
Version 1.0.4 PyPI version JSON
download
home_pageNone
SummaryPython client library for the Laneful API
upload_time2025-09-02 09:19:16
maintainerNone
docs_urlNone
authorNone
requires_python>=3.9
licenseMIT
keywords api client email laneful
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Laneful Python Client

A Python client library for the [Laneful API](https://app.laneful.com/docs/sending-email), providing easy email sending capabilities with support for templates, attachments, tracking, and webhooks. 

[![Python Version](https://img.shields.io/badge/python-3.9%2B-blue.svg)](https://python.org)
[![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)

## Installation

The library supports flexible installation options:

```bash
# Default installation (sync client only)
pip install laneful

# Add async support to existing sync installation
pip install laneful[async] 

# Async-only (no sync dependencies)
pip install laneful[async-only]

# Explicit sync support (same as default)
pip install laneful[sync]

# Full support (both sync and async)
pip install laneful[all]
```

## Quick Start

### Synchronous Usage

```bash
pip install laneful  # Default installation
```

```python
from laneful import LanefulClient, Email, Address

# Initialize the sync client
client = LanefulClient(
    base_url="https://custom-endpoint.send.laneful.net",
    auth_token="your-auth-token"
)

# Create an email
email = Email(
    from_address=Address(email="sender@example.com", name="Your Name"),
    to=[Address(email="recipient@example.com", name="Recipient Name")],
    subject="Hello from Laneful",
    text_content="This is a test email.",
    html_content="<h1>This is a test email.</h1>",
)

# Send the email
response = client.send_email(email)
print(f"Email sent successfully: {response.status}")
```

### Asynchronous Usage

```bash
pip install laneful[async]  # Add async to sync
# OR
pip install laneful[async-only]  # Pure async, no sync deps
```

```python
import asyncio
from laneful import AsyncLanefulClient, Email, Address

async def send_email_async():
    # Initialize the async client
    async with AsyncLanefulClient(
        base_url="https://custom-endpoint.send.laneful.net",
        auth_token="your-auth-token"
    ) as client:
        # Create an email
        email = Email(
            from_address=Address(email="sender@example.com", name="Your Name"),
            to=[Address(email="recipient@example.com", name="Recipient Name")],
            subject="Hello from Laneful (Async)",
            text_content="This is an async test email.",
            html_content="<h1>This is an async test email.</h1>",
        )
        
        # Send the email
        response = await client.send_email(email)
        print(f"Email sent successfully: {response.status}")

# Run the async function
asyncio.run(send_email_async())
```

## Features

- ✅ Send single or multiple emails
- ✅ Support for plain text and HTML content  
- ✅ Email templates with dynamic data
- ✅ File attachments
- ✅ Email tracking (opens, clicks, unsubscribes)
- ✅ Custom headers
- ✅ Scheduled sending
- ✅ Webhook handling
- ✅ Reply-to addresses
- ✅ Context manager support
- ✅ Type hints and mypy support
- ✅ Comprehensive error handling

## API Reference

### Creating Clients

#### Synchronous Client

```python
from laneful import LanefulClient

client = LanefulClient(
    base_url="https://custom-endpoint.laneful.net",
    auth_token="your-auth-token",
    timeout=30.0,  # Optional: request timeout in seconds
    verify_ssl=True  # Optional: SSL verification
)
```

#### Asynchronous Client

```python
from laneful import AsyncLanefulClient

# Method 1: Using async context manager (recommended)
async with AsyncLanefulClient(
    base_url="https://custom-endpoint.laneful.net",
    auth_token="your-auth-token",
    timeout=30.0,  # Optional: request timeout in seconds
    verify_ssl=True  # Optional: SSL verification
) as client:
    # Use client here
    pass

# Method 2: Manual session management
client = AsyncLanefulClient(base_url, auth_token)
try:
    # Use client here
    pass
finally:
    await client.close()
```

#### Email

```python
from laneful import Email, Address, Attachment, TrackingSettings

email = Email(
    from_address=Address(email="sender@example.com", name="Sender"),
    to=[Address(email="recipient@example.com", name="Recipient")],
    subject="Email Subject",
    text_content="Plain text content",  # Optional
    html_content="<h1>HTML content</h1>",  # Optional
    cc=[Address(email="cc@example.com")],  # Optional
    bcc=[Address(email="bcc@example.com")],  # Optional
    reply_to=Address(email="reply@example.com"),  # Optional
    attachments=[],  # Optional: List of Attachment objects
    headers={"X-Custom": "value"},  # Optional
    template_id="template-123",  # Optional: for template emails
    template_data={"name": "John"},  # Optional: template variables
    send_time=1640995200,  # Optional: Unix timestamp for scheduling
    tracking=TrackingSettings(opens=True, clicks=True),  # Optional
    webhook_data={"user_id": "123"}  # Optional: custom webhook data
)
```

### Sending Emails

#### Single Email (Sync)

```python
response = client.send_email(email)
print(f"Status: {response.status}")
print(f"Message ID: {response.message_id}")
```

#### Single Email (Async)

```python
response = await client.send_email(email)
print(f"Status: {response.status}")
print(f"Message ID: {response.message_id}")
```

#### Multiple Emails (Sync)

```python
emails = [email1, email2, email3]
responses = client.send_emails(emails)

for i, response in enumerate(responses):
    print(f"Email {i+1} status: {response.status}")
```

#### Multiple Emails (Async)

```python
emails = [email1, email2, email3]
responses = await client.send_emails(emails)

for i, response in enumerate(responses):
    print(f"Email {i+1} status: {response.status}")
```

### Bulk Email Sending

For sending multiple emails at once, use the `send_emails` method:

```python
from laneful import LanefulClient, Email, Address

client = LanefulClient("https://custom-endpoint.send.laneful.net", "your-auth-token")

emails = [
    Email(from_address=Address(email="sender@example.com"), 
          to=[Address(email="user1@example.com")], subject="Hello User 1"),
    Email(from_address=Address(email="sender@example.com"), 
          to=[Address(email="user2@example.com")], subject="Hello User 2"),
]

responses = client.send_emails(emails)
```

#### Concurrent Email Sending (Async Only)

```python
import asyncio

async with AsyncLanefulClient(base_url, auth_token) as client:
    # Send multiple emails concurrently
    tasks = [client.send_email(email) for email in emails]
    responses = await asyncio.gather(*tasks)
    
    print(f"Sent {len(responses)} emails concurrently!")
```

#### Context Managers

```python
# Sync context manager
with LanefulClient(base_url, auth_token) as client:
    response = client.send_email(email)
    print(f"Email sent: {response.status}")
# Client session automatically closed

# Async context manager  
async with AsyncLanefulClient(base_url, auth_token) as client:
    response = await client.send_email(email)
    print(f"Email sent: {response.status}")
# Client session automatically closed
```

## Examples

### Template Email

```python
from laneful import Email, Address, LanefulClient

client = LanefulClient("https://custom-endpoint.send.laneful.net", "your-auth-token")

email = Email(
    from_address=Address(email="sender@example.com"),
    to=[Address(email="user@example.com")],
    subject="Welcome!",
    template_id="11",
    template_data={
        "name": "John Doe",
        "company": "Acme Corp",
        "activation_link": "https://example.com/activate?token=abc123"
    },
)

response = client.send_email(email)
```

### Email with Attachments

```python
import base64
from laneful import Attachment, Email, Address, LanefulClient

client = LanefulClient("https://custom-endpoint.send.laneful.net", "your-auth-token")

# Prepare attachment (base64 encoded content)
with open("document.pdf", "rb") as f:
    content = base64.b64encode(f.read()).decode()

email = Email(
    from_address=Address(email="sender@example.com"),
    to=[Address(email="user@example.com")],
    subject="Document Attached",
    text_content="Please find the document attached.",
    attachments=[
        Attachment(
            file_name="document.pdf",
            content=content,
            content_type="application/pdf",
            inline_id="123",
        )
    ],
)

response = client.send_email(email)
```

### Scheduled Email

```python
import time

from laneful import Email, Address, LanefulClient

client = LanefulClient("https://custom-endpoint.send.laneful.net", "your-auth-token")

# Schedule email to be sent 1 hour from now
send_time = int(time.time()) + 3600

email = Email(
    from_address=Address(email="sender@example.com"),
    to=[Address(email="user@example.com")],
    subject="Scheduled Email",
    text_content="This email was scheduled.",
    send_time=send_time,
)

response = client.send_email(email)
```

### Email with Tracking

```python
from laneful import TrackingSettings, Address, LanefulClient, Email

client = LanefulClient("https://custom-endpoint.send.laneful.net", "your-auth-token")

email = Email(
    from_address=Address(email="sender@example.com"),
    to=[Address(email="user@example.com")],
    subject="Tracked Email",
    html_content='<h1>Tracked Email</h1><a href="https://example.com">Click me</a>',
    tracking=TrackingSettings(
        opens=True,
        clicks=True,
        unsubscribes=True
    ),
)

# Sync
response = client.send_email(email)
```

### AsyncIO support

```python
import asyncio
from laneful import AsyncLanefulClient
  
async def send_emails_async(emails):
    async with AsyncLanefulClient("https://custom-endpoint.send.laneful.net", "your-auth-token") as client:
        tasks = [client.send_email(email) for email in emails]
        return await asyncio.gather(*tasks)

```

## Webhook Handling

The library provides comprehensive webhook handling for email events:

```python
from laneful.webhooks import WebhookHandler, WebhookEvent

webhook_payload = dict()

# Initialize webhook handler
handler = WebhookHandler(webhook_secret="your-webhook-secret")

# Register event handlers
@handler.on("email.delivered")
def handle_delivered(event: WebhookEvent):
    print(f"Email {event.message_id} delivered to {event.email}")

@handler.on("email.opened")  
def handle_opened(event: WebhookEvent):
    print(f"Email {event.message_id} opened by {event.email}")

@handler.on("email.clicked")
def handle_clicked(event: WebhookEvent):
    url = event.data.get("url")
    print(f"Link clicked: {url}")

# Process webhook payload
handler.process_webhook(webhook_payload)
```

## Error Handling

The library provides specific exception types:

```python
from laneful.exceptions import LanefulError, LanefulAPIError, LanefulAuthError

try:
    response = client.send_email(email)
except LanefulAuthError:
    print("Authentication failed - check your token")
except LanefulAPIError as e:
    print(f"API error: {e.message} (status: {e.status_code})")
except LanefulError as e:
    print(f"Client error: {e.message}")
```

## Development
### Running Tests

```bash
# Run tests
pytest

# Run tests with coverage
pytest --cov=laneful

# Run type checking
mypy laneful/

# Run linting
ruff check laneful/
black --check laneful/
```

### Code Formatting

```bash
# Format code
black laneful/ tests/
isort laneful/ tests/

# Check formatting
ruff check laneful/
```

## Contributing

1. Fork the repository
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
3. Commit your changes (`git commit -m 'Add amazing feature'`)
4. Push to the branch (`git push origin feature/amazing-feature`)
5. Open a Pull Request

## Support

- 📖 [Documentation](https://github.com/lanefulhq/laneful-python#readme)
- 🐛 [Bug Reports](https://github.com/lanefulhq/laneful-python/issues)

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "laneful",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": null,
    "keywords": "api, client, email, laneful",
    "author": null,
    "author_email": "Laneful <support@laneful.com>",
    "download_url": "https://files.pythonhosted.org/packages/ea/12/0e017a784d44805a376b8ed319ae87610cd59f25a2ac66332786c29a1da5/laneful-1.0.4.tar.gz",
    "platform": null,
    "description": "# Laneful Python Client\n\nA Python client library for the [Laneful API](https://app.laneful.com/docs/sending-email), providing easy email sending capabilities with support for templates, attachments, tracking, and webhooks. \n\n[![Python Version](https://img.shields.io/badge/python-3.9%2B-blue.svg)](https://python.org)\n[![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)\n\n## Installation\n\nThe library supports flexible installation options:\n\n```bash\n# Default installation (sync client only)\npip install laneful\n\n# Add async support to existing sync installation\npip install laneful[async] \n\n# Async-only (no sync dependencies)\npip install laneful[async-only]\n\n# Explicit sync support (same as default)\npip install laneful[sync]\n\n# Full support (both sync and async)\npip install laneful[all]\n```\n\n## Quick Start\n\n### Synchronous Usage\n\n```bash\npip install laneful  # Default installation\n```\n\n```python\nfrom laneful import LanefulClient, Email, Address\n\n# Initialize the sync client\nclient = LanefulClient(\n    base_url=\"https://custom-endpoint.send.laneful.net\",\n    auth_token=\"your-auth-token\"\n)\n\n# Create an email\nemail = Email(\n    from_address=Address(email=\"sender@example.com\", name=\"Your Name\"),\n    to=[Address(email=\"recipient@example.com\", name=\"Recipient Name\")],\n    subject=\"Hello from Laneful\",\n    text_content=\"This is a test email.\",\n    html_content=\"<h1>This is a test email.</h1>\",\n)\n\n# Send the email\nresponse = client.send_email(email)\nprint(f\"Email sent successfully: {response.status}\")\n```\n\n### Asynchronous Usage\n\n```bash\npip install laneful[async]  # Add async to sync\n# OR\npip install laneful[async-only]  # Pure async, no sync deps\n```\n\n```python\nimport asyncio\nfrom laneful import AsyncLanefulClient, Email, Address\n\nasync def send_email_async():\n    # Initialize the async client\n    async with AsyncLanefulClient(\n        base_url=\"https://custom-endpoint.send.laneful.net\",\n        auth_token=\"your-auth-token\"\n    ) as client:\n        # Create an email\n        email = Email(\n            from_address=Address(email=\"sender@example.com\", name=\"Your Name\"),\n            to=[Address(email=\"recipient@example.com\", name=\"Recipient Name\")],\n            subject=\"Hello from Laneful (Async)\",\n            text_content=\"This is an async test email.\",\n            html_content=\"<h1>This is an async test email.</h1>\",\n        )\n        \n        # Send the email\n        response = await client.send_email(email)\n        print(f\"Email sent successfully: {response.status}\")\n\n# Run the async function\nasyncio.run(send_email_async())\n```\n\n## Features\n\n- \u2705 Send single or multiple emails\n- \u2705 Support for plain text and HTML content  \n- \u2705 Email templates with dynamic data\n- \u2705 File attachments\n- \u2705 Email tracking (opens, clicks, unsubscribes)\n- \u2705 Custom headers\n- \u2705 Scheduled sending\n- \u2705 Webhook handling\n- \u2705 Reply-to addresses\n- \u2705 Context manager support\n- \u2705 Type hints and mypy support\n- \u2705 Comprehensive error handling\n\n## API Reference\n\n### Creating Clients\n\n#### Synchronous Client\n\n```python\nfrom laneful import LanefulClient\n\nclient = LanefulClient(\n    base_url=\"https://custom-endpoint.laneful.net\",\n    auth_token=\"your-auth-token\",\n    timeout=30.0,  # Optional: request timeout in seconds\n    verify_ssl=True  # Optional: SSL verification\n)\n```\n\n#### Asynchronous Client\n\n```python\nfrom laneful import AsyncLanefulClient\n\n# Method 1: Using async context manager (recommended)\nasync with AsyncLanefulClient(\n    base_url=\"https://custom-endpoint.laneful.net\",\n    auth_token=\"your-auth-token\",\n    timeout=30.0,  # Optional: request timeout in seconds\n    verify_ssl=True  # Optional: SSL verification\n) as client:\n    # Use client here\n    pass\n\n# Method 2: Manual session management\nclient = AsyncLanefulClient(base_url, auth_token)\ntry:\n    # Use client here\n    pass\nfinally:\n    await client.close()\n```\n\n#### Email\n\n```python\nfrom laneful import Email, Address, Attachment, TrackingSettings\n\nemail = Email(\n    from_address=Address(email=\"sender@example.com\", name=\"Sender\"),\n    to=[Address(email=\"recipient@example.com\", name=\"Recipient\")],\n    subject=\"Email Subject\",\n    text_content=\"Plain text content\",  # Optional\n    html_content=\"<h1>HTML content</h1>\",  # Optional\n    cc=[Address(email=\"cc@example.com\")],  # Optional\n    bcc=[Address(email=\"bcc@example.com\")],  # Optional\n    reply_to=Address(email=\"reply@example.com\"),  # Optional\n    attachments=[],  # Optional: List of Attachment objects\n    headers={\"X-Custom\": \"value\"},  # Optional\n    template_id=\"template-123\",  # Optional: for template emails\n    template_data={\"name\": \"John\"},  # Optional: template variables\n    send_time=1640995200,  # Optional: Unix timestamp for scheduling\n    tracking=TrackingSettings(opens=True, clicks=True),  # Optional\n    webhook_data={\"user_id\": \"123\"}  # Optional: custom webhook data\n)\n```\n\n### Sending Emails\n\n#### Single Email (Sync)\n\n```python\nresponse = client.send_email(email)\nprint(f\"Status: {response.status}\")\nprint(f\"Message ID: {response.message_id}\")\n```\n\n#### Single Email (Async)\n\n```python\nresponse = await client.send_email(email)\nprint(f\"Status: {response.status}\")\nprint(f\"Message ID: {response.message_id}\")\n```\n\n#### Multiple Emails (Sync)\n\n```python\nemails = [email1, email2, email3]\nresponses = client.send_emails(emails)\n\nfor i, response in enumerate(responses):\n    print(f\"Email {i+1} status: {response.status}\")\n```\n\n#### Multiple Emails (Async)\n\n```python\nemails = [email1, email2, email3]\nresponses = await client.send_emails(emails)\n\nfor i, response in enumerate(responses):\n    print(f\"Email {i+1} status: {response.status}\")\n```\n\n### Bulk Email Sending\n\nFor sending multiple emails at once, use the `send_emails` method:\n\n```python\nfrom laneful import LanefulClient, Email, Address\n\nclient = LanefulClient(\"https://custom-endpoint.send.laneful.net\", \"your-auth-token\")\n\nemails = [\n    Email(from_address=Address(email=\"sender@example.com\"), \n          to=[Address(email=\"user1@example.com\")], subject=\"Hello User 1\"),\n    Email(from_address=Address(email=\"sender@example.com\"), \n          to=[Address(email=\"user2@example.com\")], subject=\"Hello User 2\"),\n]\n\nresponses = client.send_emails(emails)\n```\n\n#### Concurrent Email Sending (Async Only)\n\n```python\nimport asyncio\n\nasync with AsyncLanefulClient(base_url, auth_token) as client:\n    # Send multiple emails concurrently\n    tasks = [client.send_email(email) for email in emails]\n    responses = await asyncio.gather(*tasks)\n    \n    print(f\"Sent {len(responses)} emails concurrently!\")\n```\n\n#### Context Managers\n\n```python\n# Sync context manager\nwith LanefulClient(base_url, auth_token) as client:\n    response = client.send_email(email)\n    print(f\"Email sent: {response.status}\")\n# Client session automatically closed\n\n# Async context manager  \nasync with AsyncLanefulClient(base_url, auth_token) as client:\n    response = await client.send_email(email)\n    print(f\"Email sent: {response.status}\")\n# Client session automatically closed\n```\n\n## Examples\n\n### Template Email\n\n```python\nfrom laneful import Email, Address, LanefulClient\n\nclient = LanefulClient(\"https://custom-endpoint.send.laneful.net\", \"your-auth-token\")\n\nemail = Email(\n    from_address=Address(email=\"sender@example.com\"),\n    to=[Address(email=\"user@example.com\")],\n    subject=\"Welcome!\",\n    template_id=\"11\",\n    template_data={\n        \"name\": \"John Doe\",\n        \"company\": \"Acme Corp\",\n        \"activation_link\": \"https://example.com/activate?token=abc123\"\n    },\n)\n\nresponse = client.send_email(email)\n```\n\n### Email with Attachments\n\n```python\nimport base64\nfrom laneful import Attachment, Email, Address, LanefulClient\n\nclient = LanefulClient(\"https://custom-endpoint.send.laneful.net\", \"your-auth-token\")\n\n# Prepare attachment (base64 encoded content)\nwith open(\"document.pdf\", \"rb\") as f:\n    content = base64.b64encode(f.read()).decode()\n\nemail = Email(\n    from_address=Address(email=\"sender@example.com\"),\n    to=[Address(email=\"user@example.com\")],\n    subject=\"Document Attached\",\n    text_content=\"Please find the document attached.\",\n    attachments=[\n        Attachment(\n            file_name=\"document.pdf\",\n            content=content,\n            content_type=\"application/pdf\",\n            inline_id=\"123\",\n        )\n    ],\n)\n\nresponse = client.send_email(email)\n```\n\n### Scheduled Email\n\n```python\nimport time\n\nfrom laneful import Email, Address, LanefulClient\n\nclient = LanefulClient(\"https://custom-endpoint.send.laneful.net\", \"your-auth-token\")\n\n# Schedule email to be sent 1 hour from now\nsend_time = int(time.time()) + 3600\n\nemail = Email(\n    from_address=Address(email=\"sender@example.com\"),\n    to=[Address(email=\"user@example.com\")],\n    subject=\"Scheduled Email\",\n    text_content=\"This email was scheduled.\",\n    send_time=send_time,\n)\n\nresponse = client.send_email(email)\n```\n\n### Email with Tracking\n\n```python\nfrom laneful import TrackingSettings, Address, LanefulClient, Email\n\nclient = LanefulClient(\"https://custom-endpoint.send.laneful.net\", \"your-auth-token\")\n\nemail = Email(\n    from_address=Address(email=\"sender@example.com\"),\n    to=[Address(email=\"user@example.com\")],\n    subject=\"Tracked Email\",\n    html_content='<h1>Tracked Email</h1><a href=\"https://example.com\">Click me</a>',\n    tracking=TrackingSettings(\n        opens=True,\n        clicks=True,\n        unsubscribes=True\n    ),\n)\n\n# Sync\nresponse = client.send_email(email)\n```\n\n### AsyncIO support\n\n```python\nimport asyncio\nfrom laneful import AsyncLanefulClient\n  \nasync def send_emails_async(emails):\n    async with AsyncLanefulClient(\"https://custom-endpoint.send.laneful.net\", \"your-auth-token\") as client:\n        tasks = [client.send_email(email) for email in emails]\n        return await asyncio.gather(*tasks)\n\n```\n\n## Webhook Handling\n\nThe library provides comprehensive webhook handling for email events:\n\n```python\nfrom laneful.webhooks import WebhookHandler, WebhookEvent\n\nwebhook_payload = dict()\n\n# Initialize webhook handler\nhandler = WebhookHandler(webhook_secret=\"your-webhook-secret\")\n\n# Register event handlers\n@handler.on(\"email.delivered\")\ndef handle_delivered(event: WebhookEvent):\n    print(f\"Email {event.message_id} delivered to {event.email}\")\n\n@handler.on(\"email.opened\")  \ndef handle_opened(event: WebhookEvent):\n    print(f\"Email {event.message_id} opened by {event.email}\")\n\n@handler.on(\"email.clicked\")\ndef handle_clicked(event: WebhookEvent):\n    url = event.data.get(\"url\")\n    print(f\"Link clicked: {url}\")\n\n# Process webhook payload\nhandler.process_webhook(webhook_payload)\n```\n\n## Error Handling\n\nThe library provides specific exception types:\n\n```python\nfrom laneful.exceptions import LanefulError, LanefulAPIError, LanefulAuthError\n\ntry:\n    response = client.send_email(email)\nexcept LanefulAuthError:\n    print(\"Authentication failed - check your token\")\nexcept LanefulAPIError as e:\n    print(f\"API error: {e.message} (status: {e.status_code})\")\nexcept LanefulError as e:\n    print(f\"Client error: {e.message}\")\n```\n\n## Development\n### Running Tests\n\n```bash\n# Run tests\npytest\n\n# Run tests with coverage\npytest --cov=laneful\n\n# Run type checking\nmypy laneful/\n\n# Run linting\nruff check laneful/\nblack --check laneful/\n```\n\n### Code Formatting\n\n```bash\n# Format code\nblack laneful/ tests/\nisort laneful/ tests/\n\n# Check formatting\nruff check laneful/\n```\n\n## Contributing\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes (`git commit -m 'Add amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\n## Support\n\n- \ud83d\udcd6 [Documentation](https://github.com/lanefulhq/laneful-python#readme)\n- \ud83d\udc1b [Bug Reports](https://github.com/lanefulhq/laneful-python/issues)\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Python client library for the Laneful API",
    "version": "1.0.4",
    "project_urls": {
        "Bug Tracker": "https://github.com/lanefulhq/laneful-python/issues",
        "Documentation": "https://github.com/lanefulhq/laneful-python#readme",
        "Homepage": "https://github.com/lanefulhq/laneful-python",
        "Repository": "https://github.com/lanefulhq/laneful-python"
    },
    "split_keywords": [
        "api",
        " client",
        " email",
        " laneful"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "6f885660a652f296f4d55fb0e93a762a0026c3741f76a2a0df8691fc6706a814",
                "md5": "b80366ef2fe13d7921edb0e2a514f673",
                "sha256": "1aaf9f3c855ffc3bd08d1eaac71708b1c06cdbf709848f02c2fde0cc0fb2241b"
            },
            "downloads": -1,
            "filename": "laneful-1.0.4-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "b80366ef2fe13d7921edb0e2a514f673",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9",
            "size": 15140,
            "upload_time": "2025-09-02T09:19:15",
            "upload_time_iso_8601": "2025-09-02T09:19:15.641559Z",
            "url": "https://files.pythonhosted.org/packages/6f/88/5660a652f296f4d55fb0e93a762a0026c3741f76a2a0df8691fc6706a814/laneful-1.0.4-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "ea120e017a784d44805a376b8ed319ae87610cd59f25a2ac66332786c29a1da5",
                "md5": "fea7b6c2927cd6aeccc5f2eb608c0436",
                "sha256": "719ba0cb57210755cbe5d5d3251c34c3cba42f9acf51c89ea38c8c85873c8a65"
            },
            "downloads": -1,
            "filename": "laneful-1.0.4.tar.gz",
            "has_sig": false,
            "md5_digest": "fea7b6c2927cd6aeccc5f2eb608c0436",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 104396,
            "upload_time": "2025-09-02T09:19:16",
            "upload_time_iso_8601": "2025-09-02T09:19:16.886826Z",
            "url": "https://files.pythonhosted.org/packages/ea/12/0e017a784d44805a376b8ed319ae87610cd59f25a2ac66332786c29a1da5/laneful-1.0.4.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-09-02 09:19:16",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "lanefulhq",
    "github_project": "laneful-python",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "laneful"
}
        
Elapsed time: 1.57563s