SDK for the Seam API written in Python.
Project description
SDK for the Seam API written in Python.
Description
Seam makes it easy to integrate IoT devices with your applications. This is an official SDK for the Seam API. Please refer to the official Seam Docs to get started.
Parts of this SDK are generated from always up-to-date type information provided by @seamapi/types node package. This ensures all API methods, request shapes, and response shapes are accurate and fully typed.
Contents
Installation
This package is registered on the Python Package Index (PyPI) as seam.
Install it with:
$ pip install seam
Usage
Examples
Note: These examples assume `SEAM_API_KEY` is set in your environment.
List devices
from seam import Seam
seam = Seam()
devices = seam.devices.list()
Unlock a door
from seam import Seam
seam = Seam()
lock = seam.locks.get(name="Front Door")
seam.locks.unlock_door(device_id=lock.device_id)
Authentication Method
The SDK supports API key and personal access token authentication mechanisms. Authentication may be configured by passing the corresponding options directly to the Seam constructor, or with the more ergonomic static factory methods.
API Key
An API key is scoped to a single workspace and should only be used on the server. Obtain one from the Seam Console.
# Set the `SEAM_API_KEY` environment variable
seam = Seam()
# Pass as the first argument to the constructor
seam = Seam("your-api-key")
# Pass as a keyword argument to the constructor
seam = Seam(api_key="your-api-key")
# Use the factory method
seam = Seam.from_api_key("your-api-key")
Personal Access Token
A Personal Access Token is scoped to a Seam Console user. Obtain one from the Seam Console. A workspace ID must be provided when using this method and all requests will be scoped to that workspace.
# Pass as an option to the constructor
seam = Seam(
personal_access_token="your-personal-access-token",
workspace_id="your-workspace-id",
)
# Use the factory method
seam = Seam.from_personal_access_token(
"your-personal-access-token",
"your-workspace-id",
)
Action Attempts
Some asynchronous operations, e.g., unlocking a door, return an action attempt. Seam tracks the progress of the requested operation and updates the action attempt when it succeeds or fails.
To make working with action attempts more convenient for applications, this library provides the wait_for_action_attempt option and enables it by default.
When the wait_for_action_attempt option is enabled, the SDK:
Polls the action attempt up to the timeout at the polling_interval (both in seconds).
Resolves with a fresh copy of the successful action attempt.
Raises a SeamActionAttemptFailedError if the action attempt is unsuccessful.
Raises a SeamActionAttemptTimeoutError if the action attempt is still pending when the timeout is reached.
Both errors expose an action_attempt property.
If you already have an action attempt ID and want to wait for it to resolve, simply use
seam.action_attempts.get(action_attempt_id=action_attempt_id)
Or, to get the current state of an action attempt by ID without waiting,
seam.action_attempts.get(
action_attempt_id=action_attempt_id,
wait_for_action_attempt=False,
)
To disable this behavior, set the default option for the client:
seam = Seam(
api_key="your-api-key",
wait_for_action_attempt=False,
)
seam.locks.unlock_door(device_id=device_id)
or the behavior may be configured per-request:
seam.locks.unlock_door(
device_id=device_id,
wait_for_action_attempt=False,
)
The polling_interval and timeout may be configured for the client or per-request. For example:
from seam import Seam, SeamActionAttemptFailedError, SeamActionAttemptTimeoutError
seam = Seam("your-api-key")
lock = seam.locks.list()
if len(locks) == 0:
raise Exception("No locks in this workspace")
lock = locks[0]
try:
seam.locks.unlock_door(
device_id=lock.device_id,
wait_for_action_attempt={
"timeout": 5.0,
"polling_interval": 1.0,
},
)
print("Door unlocked")
except SeamActionAttemptFailedError as e:
print("Could not unlock the door")
except SeamActionAttemptTimeoutError as e:
print("Door took too long to unlock")
Interacting with Multiple Workspaces
Some Seam API endpoints interact with multiple workspaces. The SeamMultiWorkspace client is not bound to a specific workspace and may use those endpoints with a personal access token authentication method.
A Personal Access Token is scoped to a Seam Console user. Obtain one from the Seam Console.
# Pass as an option to the constructor
seam = SeamMultiWorkspace(personal_access_token="your-personal-access-token")
# Use the factory method
seam = SeamMultiWorkspace.from_personal_access_token("your-personal-access-token")
# List workspaces authorized for this Personal Access Token
workspaces = seam.workspaces.list()
Webhooks
The Seam API implements webhooks using Svix. This SDK exports a thin wrapper SeamWebhook around the svix package. Use it to parse and validate Seam webhook events.
Refer to the Svix docs on Consuming Webhooks for an in-depth guide on best-practices for handling webhooks in your application.
This example is for Flask, see the Svix docs for more examples in specific frameworks.
import os
from flask import Flask, request
from seam import SeamWebhook
app = Flask(__name__)
webhook = SeamWebhook(os.getenv('SEAM_WEBHOOK_SECRET'))
@app.route('/webhook', methods=['POST'])
def handle_webhook():
try:
data = webhook.verify(request.get_data(), request.headers)
except Exception:
return 'Bad Request', 400
try:
store_event(data)
except Exception:
return 'Internal Server Error', 500
return '', 204
def store_event(data):
print(data)
if __name__ == '__main__':
app.run(port=8080)
Advanced Usage
Setting the endpoint
Some contexts may need to override the API endpoint, e.g., testing or proxy setups.
Either pass the endpoint option to the constructor, or set the SEAM_ENDPOINT environment variable.
Development and Testing
Quickstart
$ git clone https://github.com/seamapi/python.git $ cd pypackage $ poetry install
Run each command below in a separate terminal window:
$ make watch
Primary development tasks are defined in the Makefile.
Source Code
The source code is hosted on GitHub. Clone the project with
$ git clone https://github.com/seamapi/python.git
Requirements
You will need Python 3 and Poetry and Node.js with npm.
Install the development dependencies with
$ poetry install $ npm install
Tests
Lint code with
$ make lint
Run tests with
$ make test
Run tests on changes with
$ make watch
Publishing
New versions are created with poetry version.
Automatic
New versions are released automatically with semantic-release as long as commits follow the Angular Commit Message Conventions.
Manual
Publish a new version by triggering a version workflow_dispatch on GitHub Actions. The version input will be passed as the first argument to poetry version.
This may be done on the web or using the GitHub CLI with
$ gh workflow run version.yml --raw-field version=<version>
GitHub Actions
GitHub Actions should already be configured: this section is for reference only.
The following repository secrets must be set on GitHub Actions.
PYPI_API_TOKEN: API token for publishing on PyPI.
These must be set manually.
Secrets for Optional GitHub Actions
The version, format, generate, and semantic-release GitHub actions require a user with write access to the repository including access to read and write packages. Set these additional secrets to enable the action:
GH_TOKEN: A personal access token for the user.
GIT_USER_NAME: The name to set for Git commits.
GIT_USER_EMAIL: The email to set for Git commits.
GPG_PRIVATE_KEY: The GPG private key.
GPG_PASSPHRASE: The GPG key passphrase.
Contributing
Please submit and comment on bug reports and feature requests.
To submit a patch:
Fork it (https://github.com/seamapi/python/fork).
Create your feature branch (git checkout -b my-new-feature).
Make changes.
Commit your changes (git commit -am ‘Add some feature’).
Push to the branch (git push origin my-new-feature).
Create a new Pull Request.
License
This Python package is licensed under the MIT license.
Warranty
This software is provided by the copyright holders and contributors “as is” and any express or implied warranties, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose are disclaimed. In no event shall the copyright holder or contributors be liable for any direct, indirect, incidental, special, exemplary, or consequential damages (including, but not limited to, procurement of substitute goods or services; loss of use, data, or profits; or business interruption) however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence or otherwise) arising in any way out of the use of this software, even if advised of the possibility of such damage.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file seam-1.48.0.tar.gz
.
File metadata
- Download URL: seam-1.48.0.tar.gz
- Upload date:
- Size: 35.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.2 CPython/3.12.7 Linux/6.5.0-1025-azure
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 2f5b7cc5c60cbbd8190cd164f325ba13710f8f93560e29f53c84704be4fd8a20 |
|
MD5 | 6fe477d2d981dd2e96efc116ae5d47e5 |
|
BLAKE2b-256 | 5e58810b12b6bc2630f0a67537d166f406db6a88a2a709b60995950df5297a43 |
File details
Details for the file seam-1.48.0-py3-none-any.whl
.
File metadata
- Download URL: seam-1.48.0-py3-none-any.whl
- Upload date:
- Size: 54.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.2 CPython/3.12.7 Linux/6.5.0-1025-azure
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | a98f5ea4f25169a22b48c4edbc169eb4e37f7fa4a819e427aa2c087bff275742 |
|
MD5 | 605359478130392f2199a02a9573a202 |
|
BLAKE2b-256 | 437403423248ad403006e27fc69c022fa0b8750be354e77bb979a6bbe5e4e063 |