Name | laneful JSON |
Version |
1.0.4
JSON |
| download |
home_page | None |
Summary | Python client library for the Laneful API |
upload_time | 2025-09-02 09:19:16 |
maintainer | None |
docs_url | None |
author | None |
requires_python | >=3.9 |
license | MIT |
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.
[](https://python.org)
[](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[](https://python.org)\n[](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"
}