Skip to main content

Loops SDK for Python

Project description

Loops SDK for Python

A self-contained Python module that acts as a Loops.so SDK, providing the same interfaces as the existing Loops SDKs for sending transactional emails.

Features

  • Complete API Coverage: Supports all transactional email types (invite, validation, password reset)
  • Type Safety: Uses Python dataclasses and type hints for better development experience
  • Error Handling: Comprehensive error handling with meaningful error messages
  • Testing: Extensive test suite with mocking for external API calls
  • Easy Integration: Simple, intuitive API that mirrors other Loops SDKs

Development

Pre-commit hooks

Install and run hooks automatically on commit:

pip install pre-commit
pre-commit install

Installation

Since this is a self-contained module, simply copy the loops_sdk.py file to your project directory.

Dependencies

The SDK requires the following Python packages:

  • requests (for HTTP API calls)
  • dataclasses (built-in for Python 3.7+)
  • typing (built-in for Python 3.5+)

Install dependencies:

pip install requests

Quick Start

from loops_sdk import LoopsClient, send_invite_email

# Initialize the client
client = LoopsClient(api_key="your-loops-api-key")

# Or use environment variable LOOPS_TOKEN
client = LoopsClient()

# Send an invite email
response = send_invite_email(
    client=client,
    email="newuser@example.com",
    inviter_name="Alice Smith",
    invite_url="https://myapp.com/join/abc123"
)

print(f"Email sent successfully: {response}")

API Reference

LoopsClient

The main client class for interacting with the Loops API.

client = LoopsClient(api_key="your-api-key")

Parameters:

  • api_key (optional): Your Loops API key. If not provided, will use the LOOPS_TOKEN environment variable.

Email Constructor Functions

mk_invite_email(email, inviter_name, invite_url)

Creates an invite email object.

Parameters:

  • email: Recipient's email address
  • inviter_name: Name of the person sending the invite
  • invite_url: URL for the invitation

Returns: LoopsEmail object

mk_validation_email(email, name, verification_url)

Creates a validation email object.

Parameters:

  • email: Recipient's email address
  • name: Recipient's name
  • verification_url: URL for email verification

Returns: LoopsEmail object

mk_password_reset_email(email, name, reset_url)

Creates a password reset email object.

Parameters:

  • email: Recipient's email address
  • name: Recipient's name
  • reset_url: URL for password reset

Returns: LoopsEmail object

Convenience Functions

send_invite_email(client, email, inviter_name, invite_url)

Sends an invite email directly.

send_validation_email(client, email, name, verification_url)

Sends a validation email directly.

send_password_reset_email(client, email, name, reset_url)

Sends a password reset email directly.

Usage Examples

Basic Usage

from loops_sdk import LoopsClient, mk_invite_email

# Initialize client
client = LoopsClient(api_key="your-api-key")

# Create and send an invite email
invite_email = mk_invite_email(
    email="user@example.com",
    inviter_name="John Doe",
    invite_url="https://example.com/invite/123"
)

response = client.send_transactional_email(invite_email)

Using Environment Variables

import os
from loops_sdk import LoopsClient, send_validation_email

# Set environment variable
os.environ["LOOPS_TOKEN"] = "your-api-key"

# Client will automatically use the environment variable
client = LoopsClient()

# Send validation email
response = send_validation_email(
    client=client,
    email="user@example.com",
    name="Jane Smith",
    verification_url="https://example.com/verify/abc123"
)

Error Handling

import requests
from loops_sdk import LoopsClient, send_password_reset_email

client = LoopsClient(api_key="your-api-key")

try:
    response = send_password_reset_email(
        client=client,
        email="user@example.com",
        name="Bob Johnson",
        reset_url="https://example.com/reset/xyz789"
    )
    print("Email sent successfully!")
except requests.HTTPError as e:
    print(f"Failed to send email: {e}")
except ValueError as e:
    print(f"Configuration error: {e}")

Custom Email with Attachments

from loops_sdk import LoopsClient, LoopsEmail, Attachment

client = LoopsClient(api_key="your-api-key")

# Create an attachment
attachment = Attachment(
    filename="invoice.pdf",
    content_type="application/pdf",
    data="base64-encoded-data-here"
)

# Create custom email
custom_email = LoopsEmail(
    email="customer@example.com",
    transactional_id="your-custom-template-id",
    add_to_audience=True,
    data_variables={
        "customerName": "Alice Johnson",
        "invoiceNumber": "INV-001",
        "amount": "$99.99"
    },
    attachments=[attachment]
)

response = client.send_transactional_email(custom_email)

Testing

The SDK includes a comprehensive test suite. To run the tests:

python test_loops_sdk.py

Test Coverage

The test suite covers:

  • Email object creation and serialization
  • API client initialization and configuration
  • Successful API calls with mocked responses
  • Error handling for failed API calls
  • All convenience functions
  • Integration workflows
  • Edge cases and error conditions

Running Tests with Coverage

pip install coverage
coverage run test_loops_sdk.py
coverage report -m

Compatibility

This SDK is designed to be compatible with the existing Loops SDKs and follows the same patterns:

  • Haskell SDK: Mirrors the data structures and function names
  • JavaScript SDK: Similar API design and error handling
  • PHP SDK: Comparable class structure and method signatures

Error Handling

The SDK provides comprehensive error handling:

  • ValueError: Raised when API key is missing or invalid configuration
  • requests.HTTPError: Raised when API calls fail with detailed error messages
  • JSON Errors: Handled gracefully with fallback to empty responses

Environment Variables

  • LOOPS_TOKEN: Your Loops API key (alternative to passing it directly)

Contributing

This is a self-contained module designed to be copied into projects. If you need to modify it:

  1. Update the loops_sdk.py file
  2. Add corresponding tests in test_loops_sdk.py
  3. Update this README with any new features or changes

License

This SDK is provided as-is for integration with Loops.so. Please refer to Loops.so's terms of service for API usage guidelines.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

loops_sdk-0.3.0.tar.gz (9.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

loops_sdk-0.3.0-py3-none-any.whl (8.0 kB view details)

Uploaded Python 3

File details

Details for the file loops_sdk-0.3.0.tar.gz.

File metadata

  • Download URL: loops_sdk-0.3.0.tar.gz
  • Upload date:
  • Size: 9.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for loops_sdk-0.3.0.tar.gz
Algorithm Hash digest
SHA256 2d48eb4fccc893693f388386555d8e612df11dabd1ff57be322ab785cf20a620
MD5 19fd382fd78c9caabe86d04a945c524b
BLAKE2b-256 8efa064e8ecff9e80ac314285a4e2b0c6ab4599dda6f602e93837f1274146a82

See more details on using hashes here.

Provenance

The following attestation bundles were made for loops_sdk-0.3.0.tar.gz:

Publisher: publish.yml on infernal-moose/loops-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loops_sdk-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: loops_sdk-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 8.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for loops_sdk-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6979586d44ec0ff6df975d7709e167d5515a16aa5f64e8474a175f81eb7e05ac
MD5 fec937e01eac81e8fa52c073462d7884
BLAKE2b-256 29cdd998b80b030441401998fec4e85813992d1054b3f8a09b3c5bbde5a516ce

See more details on using hashes here.

Provenance

The following attestation bundles were made for loops_sdk-0.3.0-py3-none-any.whl:

Publisher: publish.yml on infernal-moose/loops-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page