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 SDK

Installation

Add loops-sdk to your project. pip install loops-sdk

Dependencies

The SDK requires the following Python packages:

  • requests (for HTTP API calls)

Quick Start

from loops_sdk import LoopsClient, send_transactional_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_transactional_email(
    client=client,
    email="newuser@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]
)

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

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.2.tar.gz (9.1 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.2-py3-none-any.whl (7.6 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: loops_sdk-0.3.2.tar.gz
  • Upload date:
  • Size: 9.1 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.2.tar.gz
Algorithm Hash digest
SHA256 3222600ec14e0bf2792d8c04736665a5c990a89a1952b3e5df5e260dbedec2c4
MD5 1d7773063db607be91ae93e80422ea50
BLAKE2b-256 f42816cb8269d60ba1104a5cf95d68cb83792ef5ec0d28ec356a4b55ddcdea3e

See more details on using hashes here.

Provenance

The following attestation bundles were made for loops_sdk-0.3.2.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.2-py3-none-any.whl.

File metadata

  • Download URL: loops_sdk-0.3.2-py3-none-any.whl
  • Upload date:
  • Size: 7.6 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.2-py3-none-any.whl
Algorithm Hash digest
SHA256 52ded73626695071d86eaf0ef0b35209682d6affa281c917b8fba05d70f0a940
MD5 e2f13d6eff9177deed3941e38acf35df
BLAKE2b-256 c2126ea1c03e20e9db047e91b62d20df649c34235d8b07642fc094cacfdab50c

See more details on using hashes here.

Provenance

The following attestation bundles were made for loops_sdk-0.3.2-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