Skip to content
This repository was archived by the owner on Jun 28, 2024. It is now read-only.

Commit df315f8

Browse files
committed
add generate script and .gitattributes
1 parent 82a7286 commit df315f8

39 files changed

+2199
-2
lines changed

.gitattributes

Whitespace-only changes.

generated/README.md

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# Seam for Python
2+
3+
Control locks, lights and other internet of things devices with Seam's simple API. Check out the [documentation](https://docs.getseam.com) or [some examples](examples)
4+
5+
## Setup
6+
7+
```bash
8+
pip install seamapi
9+
```
10+
11+
## Usage
12+
13+
```python
14+
from seamapi import Seam
15+
16+
# export SEAM_API_KEY=***
17+
seam = Seam()
18+
19+
some_lock = seam.locks.get(
20+
name="Front Door"
21+
)
22+
23+
seam.locks.lock_door(some_lock)
24+
```
25+
26+
## Development
27+
28+
This project uses [poetry](https://github.com/python-poetry/poetry)
29+
30+
- To setup the project and install dependencies run `poetry install`
31+
- To run tests, run `poetry run pytest -s`
32+
- To build the project for publishing, run `poetry build`
33+
34+
Commits to `main` following [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) will automatically be published to PyPI.
35+
36+
Our tests use a seam sandbox environment given by the environment
37+
variables `SEAM_SANDBOX_API_KEY`. If you want to run the tests, you should
38+
first create a sandbox workspace [on your Developer Console](https://console.getseam.com)
39+
then create a sandbox workspace.
40+
41+
> NOTE: For installation on m1 mac, you may need to export the following lines
42+
> prior to `poetry install`...
43+
>
44+
> `export CPPFLAGS="-I/opt/homebrew/opt/[email protected]/include"`
45+
>
46+
> `export LDFLAGS="-L/opt/homebrew/opt/[email protected]/lib -L${HOME}/.pyenv/versions/3.8.10/lib"`

generated/pyproject.toml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
[tool.poetry]
2+
name = "seamapi"
3+
version = "2.14.0"
4+
description = "A Python Library for Seam's API https://getseam.com"
5+
authors = ["Severin Ibarluzea <[email protected]>"]
6+
license = "MIT"
7+
8+
[tool.poetry.dependencies]
9+
python = "^3.7"
10+
requests = "^2.26.0"
11+
12+
[tool.poetry.dev-dependencies]
13+
pytest = "^6.2.5"
14+
python-dotenv = "^0.19.2"
15+
black = "^21.12b0"
16+
responses = "^0.22.0"
17+
18+
[build-system]
19+
requires = ["poetry-core>=1.0.0"]
20+
build-backend = "poetry.core.masonry.api"

generated/seamapi/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from seamapi.seam import Seam

generated/seamapi/access_codes.py

Lines changed: 209 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,209 @@
1+
from seamapi.types import (AbstractAccessCodes,AbstractSeam as Seam,AccessCode,ActionAttempt)
2+
from typing import (Optional, Any)
3+
4+
class AccessCodes(AbstractAccessCodes):
5+
seam: Seam
6+
7+
def __init__(self, seam: Seam):
8+
self.seam = seam
9+
10+
11+
12+
def create(self, device_id: Optional[Any] = None, name: Optional[Any] = None, starts_at: Optional[Any] = None, ends_at: Optional[Any] = None, code: Optional[Any] = None, sync: Optional[Any] = None, attempt_for_offline_device: Optional[Any] = None, common_code_key: Optional[Any] = None, prefer_native_scheduling: Optional[Any] = None, use_backup_access_code_pool: Optional[Any] = None, allow_external_modification: Optional[Any] = None, is_external_modification_allowed: Optional[Any] = None, use_offline_access_code: Optional[Any] = None, is_offline_access_code: Optional[Any] = None, is_one_time_use: Optional[Any] = None, max_time_rounding: Optional[Any] = None):
13+
json_payload = {}
14+
if device_id is not None:
15+
json_payload["device_id"] = device_id
16+
if name is not None:
17+
json_payload["name"] = name
18+
if starts_at is not None:
19+
json_payload["starts_at"] = starts_at
20+
if ends_at is not None:
21+
json_payload["ends_at"] = ends_at
22+
if code is not None:
23+
json_payload["code"] = code
24+
if sync is not None:
25+
json_payload["sync"] = sync
26+
if attempt_for_offline_device is not None:
27+
json_payload["attempt_for_offline_device"] = attempt_for_offline_device
28+
if common_code_key is not None:
29+
json_payload["common_code_key"] = common_code_key
30+
if prefer_native_scheduling is not None:
31+
json_payload["prefer_native_scheduling"] = prefer_native_scheduling
32+
if use_backup_access_code_pool is not None:
33+
json_payload["use_backup_access_code_pool"] = use_backup_access_code_pool
34+
if allow_external_modification is not None:
35+
json_payload["allow_external_modification"] = allow_external_modification
36+
if is_external_modification_allowed is not None:
37+
json_payload["is_external_modification_allowed"] = is_external_modification_allowed
38+
if use_offline_access_code is not None:
39+
json_payload["use_offline_access_code"] = use_offline_access_code
40+
if is_offline_access_code is not None:
41+
json_payload["is_offline_access_code"] = is_offline_access_code
42+
if is_one_time_use is not None:
43+
json_payload["is_one_time_use"] = is_one_time_use
44+
if max_time_rounding is not None:
45+
json_payload["max_time_rounding"] = max_time_rounding
46+
res = self.seam.make_request(
47+
"POST",
48+
"/access_codes/create",
49+
json=json_payload
50+
)
51+
return AccessCode.from_dict(res["access_code"])
52+
53+
54+
def create_multiple(self, device_ids: Optional[Any] = None, behavior_when_code_cannot_be_shared: Optional[Any] = None, name: Optional[Any] = None, starts_at: Optional[Any] = None, ends_at: Optional[Any] = None, code: Optional[Any] = None, attempt_for_offline_device: Optional[Any] = None, prefer_native_scheduling: Optional[Any] = None, use_backup_access_code_pool: Optional[Any] = None, allow_external_modification: Optional[Any] = None, is_external_modification_allowed: Optional[Any] = None, use_offline_access_code: Optional[Any] = None, is_offline_access_code: Optional[Any] = None, is_one_time_use: Optional[Any] = None, max_time_rounding: Optional[Any] = None):
55+
json_payload = {}
56+
if device_ids is not None:
57+
json_payload["device_ids"] = device_ids
58+
if behavior_when_code_cannot_be_shared is not None:
59+
json_payload["behavior_when_code_cannot_be_shared"] = behavior_when_code_cannot_be_shared
60+
if name is not None:
61+
json_payload["name"] = name
62+
if starts_at is not None:
63+
json_payload["starts_at"] = starts_at
64+
if ends_at is not None:
65+
json_payload["ends_at"] = ends_at
66+
if code is not None:
67+
json_payload["code"] = code
68+
if attempt_for_offline_device is not None:
69+
json_payload["attempt_for_offline_device"] = attempt_for_offline_device
70+
if prefer_native_scheduling is not None:
71+
json_payload["prefer_native_scheduling"] = prefer_native_scheduling
72+
if use_backup_access_code_pool is not None:
73+
json_payload["use_backup_access_code_pool"] = use_backup_access_code_pool
74+
if allow_external_modification is not None:
75+
json_payload["allow_external_modification"] = allow_external_modification
76+
if is_external_modification_allowed is not None:
77+
json_payload["is_external_modification_allowed"] = is_external_modification_allowed
78+
if use_offline_access_code is not None:
79+
json_payload["use_offline_access_code"] = use_offline_access_code
80+
if is_offline_access_code is not None:
81+
json_payload["is_offline_access_code"] = is_offline_access_code
82+
if is_one_time_use is not None:
83+
json_payload["is_one_time_use"] = is_one_time_use
84+
if max_time_rounding is not None:
85+
json_payload["max_time_rounding"] = max_time_rounding
86+
res = self.seam.make_request(
87+
"POST",
88+
"/access_codes/create_multiple",
89+
json=json_payload
90+
)
91+
return [AccessCode.from_dict(item) for item in res["access_codes"]]
92+
93+
94+
def delete(self, device_id: Optional[Any] = None, access_code_id: Optional[Any] = None, sync: Optional[Any] = None):
95+
json_payload = {}
96+
if device_id is not None:
97+
json_payload["device_id"] = device_id
98+
if access_code_id is not None:
99+
json_payload["access_code_id"] = access_code_id
100+
if sync is not None:
101+
json_payload["sync"] = sync
102+
res = self.seam.make_request(
103+
"POST",
104+
"/access_codes/delete",
105+
json=json_payload
106+
)
107+
return ActionAttempt.from_dict(res["action_attempt"])
108+
109+
110+
def generate_code(self, device_id: Optional[Any] = None):
111+
json_payload = {}
112+
if device_id is not None:
113+
json_payload["device_id"] = device_id
114+
res = self.seam.make_request(
115+
"POST",
116+
"/access_codes/generate_code",
117+
json=json_payload
118+
)
119+
return AccessCode.from_dict(res["generated_code"])
120+
121+
122+
def get(self, access_code_id: Any, device_id: Optional[Any] = None, code: Optional[Any] = None):
123+
json_payload = {}
124+
if access_code_id is not None:
125+
json_payload["access_code_id"] = access_code_id
126+
if device_id is not None:
127+
json_payload["device_id"] = device_id
128+
if code is not None:
129+
json_payload["code"] = code
130+
res = self.seam.make_request(
131+
"POST",
132+
"/access_codes/get",
133+
json=json_payload
134+
)
135+
return AccessCode.from_dict(res["access_code"])
136+
137+
138+
def list(self, device_id: Optional[Any] = None, access_code_ids: Optional[Any] = None, user_identifier_key: Optional[Any] = None):
139+
json_payload = {}
140+
if device_id is not None:
141+
json_payload["device_id"] = device_id
142+
if access_code_ids is not None:
143+
json_payload["access_code_ids"] = access_code_ids
144+
if user_identifier_key is not None:
145+
json_payload["user_identifier_key"] = user_identifier_key
146+
res = self.seam.make_request(
147+
"POST",
148+
"/access_codes/list",
149+
json=json_payload
150+
)
151+
return [AccessCode.from_dict(item) for item in res["access_codes"]]
152+
153+
154+
def pull_backup_access_code(self, access_code_id: Optional[Any] = None):
155+
json_payload = {}
156+
if access_code_id is not None:
157+
json_payload["access_code_id"] = access_code_id
158+
res = self.seam.make_request(
159+
"POST",
160+
"/access_codes/pull_backup_access_code",
161+
json=json_payload
162+
)
163+
return AccessCode.from_dict(res["backup_access_code"])
164+
165+
166+
def update(self, name: Optional[Any] = None, starts_at: Optional[Any] = None, ends_at: Optional[Any] = None, code: Optional[Any] = None, sync: Optional[Any] = None, attempt_for_offline_device: Optional[Any] = None, prefer_native_scheduling: Optional[Any] = None, use_backup_access_code_pool: Optional[Any] = None, allow_external_modification: Optional[Any] = None, is_external_modification_allowed: Optional[Any] = None, use_offline_access_code: Optional[Any] = None, is_offline_access_code: Optional[Any] = None, is_one_time_use: Optional[Any] = None, max_time_rounding: Optional[Any] = None, access_code_id: Optional[Any] = None, device_id: Optional[Any] = None, type: Optional[Any] = None, is_managed: Optional[Any] = None):
167+
json_payload = {}
168+
if name is not None:
169+
json_payload["name"] = name
170+
if starts_at is not None:
171+
json_payload["starts_at"] = starts_at
172+
if ends_at is not None:
173+
json_payload["ends_at"] = ends_at
174+
if code is not None:
175+
json_payload["code"] = code
176+
if sync is not None:
177+
json_payload["sync"] = sync
178+
if attempt_for_offline_device is not None:
179+
json_payload["attempt_for_offline_device"] = attempt_for_offline_device
180+
if prefer_native_scheduling is not None:
181+
json_payload["prefer_native_scheduling"] = prefer_native_scheduling
182+
if use_backup_access_code_pool is not None:
183+
json_payload["use_backup_access_code_pool"] = use_backup_access_code_pool
184+
if allow_external_modification is not None:
185+
json_payload["allow_external_modification"] = allow_external_modification
186+
if is_external_modification_allowed is not None:
187+
json_payload["is_external_modification_allowed"] = is_external_modification_allowed
188+
if use_offline_access_code is not None:
189+
json_payload["use_offline_access_code"] = use_offline_access_code
190+
if is_offline_access_code is not None:
191+
json_payload["is_offline_access_code"] = is_offline_access_code
192+
if is_one_time_use is not None:
193+
json_payload["is_one_time_use"] = is_one_time_use
194+
if max_time_rounding is not None:
195+
json_payload["max_time_rounding"] = max_time_rounding
196+
if access_code_id is not None:
197+
json_payload["access_code_id"] = access_code_id
198+
if device_id is not None:
199+
json_payload["device_id"] = device_id
200+
if type is not None:
201+
json_payload["type"] = type
202+
if is_managed is not None:
203+
json_payload["is_managed"] = is_managed
204+
res = self.seam.make_request(
205+
"POST",
206+
"/access_codes/update",
207+
json=json_payload
208+
)
209+
return ActionAttempt.from_dict(res["action_attempt"])
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from seamapi.types import (AbstractSimulateAccessCodes,AbstractSeam as Seam,UnmanagedAccessCode)
2+
from typing import (Optional, Any)
3+
4+
class SimulateAccessCodes(AbstractSimulateAccessCodes):
5+
seam: Seam
6+
7+
def __init__(self, seam: Seam):
8+
self.seam = seam
9+
10+
11+
12+
def create_unmanaged_access_code(self, device_id: Optional[Any] = None, name: Optional[Any] = None, code: Optional[Any] = None):
13+
json_payload = {}
14+
if device_id is not None:
15+
json_payload["device_id"] = device_id
16+
if name is not None:
17+
json_payload["name"] = name
18+
if code is not None:
19+
json_payload["code"] = code
20+
res = self.seam.make_request(
21+
"POST",
22+
"/access_codes/simulate/create_unmanaged_access_code",
23+
json=json_payload
24+
)
25+
return UnmanagedAccessCode.from_dict(res["access_code"])
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
from seamapi.types import (AbstractUnmanagedAccessCodes,AbstractSeam as Seam,ActionAttempt,UnmanagedAccessCode)
2+
from typing import (Optional, Any)
3+
4+
class UnmanagedAccessCodes(AbstractUnmanagedAccessCodes):
5+
seam: Seam
6+
7+
def __init__(self, seam: Seam):
8+
self.seam = seam
9+
10+
11+
12+
def delete(self, access_code_id: Optional[Any] = None, sync: Optional[Any] = None):
13+
json_payload = {}
14+
if access_code_id is not None:
15+
json_payload["access_code_id"] = access_code_id
16+
if sync is not None:
17+
json_payload["sync"] = sync
18+
res = self.seam.make_request(
19+
"POST",
20+
"/access_codes/unmanaged/delete",
21+
json=json_payload
22+
)
23+
return ActionAttempt.from_dict(res["action_attempt"])
24+
25+
26+
def get(self, access_code_id: Any, device_id: Optional[Any] = None, code: Optional[Any] = None):
27+
json_payload = {}
28+
if access_code_id is not None:
29+
json_payload["access_code_id"] = access_code_id
30+
if device_id is not None:
31+
json_payload["device_id"] = device_id
32+
if code is not None:
33+
json_payload["code"] = code
34+
res = self.seam.make_request(
35+
"POST",
36+
"/access_codes/unmanaged/get",
37+
json=json_payload
38+
)
39+
return UnmanagedAccessCode.from_dict(res["access_code"])
40+
41+
42+
def list(self, device_id: Optional[Any] = None, user_identifier_key: Optional[Any] = None):
43+
json_payload = {}
44+
if device_id is not None:
45+
json_payload["device_id"] = device_id
46+
if user_identifier_key is not None:
47+
json_payload["user_identifier_key"] = user_identifier_key
48+
res = self.seam.make_request(
49+
"POST",
50+
"/access_codes/unmanaged/list",
51+
json=json_payload
52+
)
53+
return [UnmanagedAccessCode.from_dict(item) for item in res["access_codes"]]
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from seamapi.types import (AbstractAccessGroupsAcs,AbstractSeam as Seam)
2+
from typing import (Optional, Any)
3+
4+
class AccessGroupsAcs(AbstractAccessGroupsAcs):
5+
seam: Seam
6+
7+
def __init__(self, seam: Seam):
8+
self.seam = seam
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from seamapi.types import (AbstractCredentialPoolsAcs,AbstractSeam as Seam)
2+
from typing import (Optional, Any)
3+
4+
class CredentialPoolsAcs(AbstractCredentialPoolsAcs):
5+
seam: Seam
6+
7+
def __init__(self, seam: Seam):
8+
self.seam = seam
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from seamapi.types import (AbstractCredentialProvisioningAutomationsAcs,AbstractSeam as Seam)
2+
from typing import (Optional, Any)
3+
4+
class CredentialProvisioningAutomationsAcs(AbstractCredentialProvisioningAutomationsAcs):
5+
seam: Seam
6+
7+
def __init__(self, seam: Seam):
8+
self.seam = seam

0 commit comments

Comments
 (0)