seam 2.0.0b5 → 2.0.0.prerelease.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +53 -49
- data/README.md +3 -323
- data/Rakefile +1 -4
- data/lib/seam/client.rb +129 -0
- data/lib/seam/clients/access_codes.rb +95 -0
- data/lib/seam/clients/access_codes_simulate.rb +17 -0
- data/lib/seam/clients/access_codes_unmanaged.rb +57 -0
- data/lib/seam/clients/acs.rb +35 -0
- data/lib/seam/clients/acs_access_groups.rb +57 -0
- data/lib/seam/clients/acs_credential_pools.rb +17 -0
- data/lib/seam/clients/acs_credential_provisioning_automations.rb +17 -0
- data/lib/seam/clients/acs_credentials.rb +77 -0
- data/lib/seam/clients/acs_entrances.rb +47 -0
- data/lib/seam/clients/acs_systems.rb +27 -0
- data/lib/seam/clients/acs_users.rb +117 -0
- data/lib/seam/clients/action_attempts.rb +30 -0
- data/lib/seam/clients/base_client.rb +21 -0
- data/lib/seam/clients/client_sessions.rb +77 -0
- data/lib/seam/clients/connect_webviews.rb +47 -0
- data/lib/seam/clients/connected_accounts.rb +47 -0
- data/lib/seam/clients/devices.rb +65 -0
- data/lib/seam/clients/devices_simulate.rb +17 -0
- data/lib/seam/clients/devices_unmanaged.rb +37 -0
- data/lib/seam/clients/events.rb +27 -0
- data/lib/seam/clients/locks.rb +53 -0
- data/lib/seam/clients/networks.rb +27 -0
- data/lib/seam/clients/noise_sensors.rb +15 -0
- data/lib/seam/clients/noise_sensors_noise_thresholds.rb +57 -0
- data/lib/seam/clients/noise_sensors_simulate.rb +17 -0
- data/lib/seam/clients/phones.rb +31 -0
- data/lib/seam/clients/phones_simulate.rb +17 -0
- data/lib/seam/clients/thermostats.rb +106 -0
- data/lib/seam/clients/thermostats_climate_setting_schedules.rb +57 -0
- data/lib/seam/clients/user_identities.rb +131 -0
- data/lib/seam/clients/user_identities_enrollment_automations.rb +47 -0
- data/lib/seam/clients/webhooks.rb +57 -0
- data/lib/seam/clients/workspaces.rb +50 -0
- data/lib/seam/logger.rb +12 -0
- data/lib/seam/request.rb +51 -84
- data/lib/seam/resources/access_code.rb +12 -0
- data/lib/seam/resources/acs_access_group.rb +9 -0
- data/lib/seam/resources/acs_credential.rb +12 -0
- data/lib/seam/resources/acs_credential_pool.rb +9 -0
- data/lib/seam/resources/acs_credential_provisioning_automation.rb +9 -0
- data/lib/seam/resources/acs_entrance.rb +9 -0
- data/lib/seam/resources/acs_system.rb +9 -0
- data/lib/seam/resources/acs_user.rb +9 -0
- data/lib/seam/resources/action_attempt.rb +46 -0
- data/lib/seam/resources/base_resource.rb +58 -0
- data/lib/seam/resources/client_session.rb +9 -0
- data/lib/seam/resources/climate_setting_schedule.rb +11 -0
- data/lib/seam/resources/connect_webview.rb +9 -0
- data/lib/seam/resources/connected_account.rb +12 -0
- data/lib/seam/resources/device.rb +12 -0
- data/lib/seam/resources/device_provider.rb +7 -0
- data/lib/seam/resources/enrollment_automation.rb +9 -0
- data/lib/seam/resources/event.rb +9 -0
- data/lib/seam/resources/network.rb +9 -0
- data/lib/seam/resources/noise_threshold.rb +7 -0
- data/lib/seam/resources/phone.rb +12 -0
- data/lib/seam/resources/resource_error.rb +9 -0
- data/lib/seam/resources/resource_errors_support.rb +9 -0
- data/lib/seam/resources/resource_warning.rb +9 -0
- data/lib/seam/resources/resource_warnings_support.rb +9 -0
- data/lib/seam/resources/service_health.rb +7 -0
- data/lib/seam/resources/unmanaged_access_code.rb +12 -0
- data/lib/seam/resources/unmanaged_device.rb +12 -0
- data/lib/seam/resources/user_identity.rb +9 -0
- data/lib/seam/resources/webhook.rb +7 -0
- data/lib/seam/resources/workspace.rb +7 -0
- data/lib/seam/version.rb +1 -1
- data/lib/seam.rb +68 -19
- metadata +71 -115
- data/lib/seam/auth.rb +0 -118
- data/lib/seam/base_resource.rb +0 -65
- data/lib/seam/deep_hash_accessor.rb +0 -37
- data/lib/seam/default_endpoint.rb +0 -5
- data/lib/seam/helpers/action_attempt.rb +0 -47
- data/lib/seam/http.rb +0 -52
- data/lib/seam/http_multi_workspace.rb +0 -66
- data/lib/seam/http_single_workspace.rb +0 -46
- data/lib/seam/options.rb +0 -64
- data/lib/seam/parse_options.rb +0 -23
- data/lib/seam/routes/clients/access_codes.rb +0 -74
- data/lib/seam/routes/clients/access_codes_simulate.rb +0 -18
- data/lib/seam/routes/clients/access_codes_unmanaged.rb +0 -42
- data/lib/seam/routes/clients/acs.rb +0 -44
- data/lib/seam/routes/clients/acs_access_groups.rb +0 -48
- data/lib/seam/routes/clients/acs_access_groups_unmanaged.rb +0 -24
- data/lib/seam/routes/clients/acs_credential_pools.rb +0 -18
- data/lib/seam/routes/clients/acs_credential_provisioning_automations.rb +0 -18
- data/lib/seam/routes/clients/acs_credentials.rb +0 -60
- data/lib/seam/routes/clients/acs_credentials_unmanaged.rb +0 -24
- data/lib/seam/routes/clients/acs_encoders.rb +0 -36
- data/lib/seam/routes/clients/acs_entrances.rb +0 -36
- data/lib/seam/routes/clients/acs_systems.rb +0 -30
- data/lib/seam/routes/clients/acs_users.rb +0 -78
- data/lib/seam/routes/clients/acs_users_unmanaged.rb +0 -24
- data/lib/seam/routes/clients/action_attempts.rb +0 -28
- data/lib/seam/routes/clients/client_sessions.rb +0 -54
- data/lib/seam/routes/clients/connect_webviews.rb +0 -36
- data/lib/seam/routes/clients/connected_accounts.rb +0 -36
- data/lib/seam/routes/clients/devices.rb +0 -50
- data/lib/seam/routes/clients/devices_simulate.rb +0 -30
- data/lib/seam/routes/clients/devices_unmanaged.rb +0 -30
- data/lib/seam/routes/clients/events.rb +0 -24
- data/lib/seam/routes/clients/index.rb +0 -38
- data/lib/seam/routes/clients/locks.rb +0 -42
- data/lib/seam/routes/clients/networks.rb +0 -24
- data/lib/seam/routes/clients/noise_sensors.rb +0 -26
- data/lib/seam/routes/clients/noise_sensors_noise_thresholds.rb +0 -42
- data/lib/seam/routes/clients/noise_sensors_simulate.rb +0 -18
- data/lib/seam/routes/clients/phones.rb +0 -28
- data/lib/seam/routes/clients/phones_simulate.rb +0 -18
- data/lib/seam/routes/clients/thermostats.rb +0 -108
- data/lib/seam/routes/clients/thermostats_schedules.rb +0 -42
- data/lib/seam/routes/clients/user_identities.rb +0 -88
- data/lib/seam/routes/clients/user_identities_enrollment_automations.rb +0 -36
- data/lib/seam/routes/clients/webhooks.rb +0 -42
- data/lib/seam/routes/clients/workspaces.rb +0 -40
- data/lib/seam/routes/resources/access_code.rb +0 -14
- data/lib/seam/routes/resources/acs_access_group.rb +0 -11
- data/lib/seam/routes/resources/acs_credential.rb +0 -14
- data/lib/seam/routes/resources/acs_credential_pool.rb +0 -11
- data/lib/seam/routes/resources/acs_credential_provisioning_automation.rb +0 -11
- data/lib/seam/routes/resources/acs_entrance.rb +0 -13
- data/lib/seam/routes/resources/acs_system.rb +0 -14
- data/lib/seam/routes/resources/acs_user.rb +0 -14
- data/lib/seam/routes/resources/action_attempt.rb +0 -9
- data/lib/seam/routes/resources/client_session.rb +0 -11
- data/lib/seam/routes/resources/connect_webview.rb +0 -11
- data/lib/seam/routes/resources/connected_account.rb +0 -14
- data/lib/seam/routes/resources/device.rb +0 -14
- data/lib/seam/routes/resources/device_provider.rb +0 -9
- data/lib/seam/routes/resources/enrollment_automation.rb +0 -11
- data/lib/seam/routes/resources/event.rb +0 -11
- data/lib/seam/routes/resources/index.rb +0 -33
- data/lib/seam/routes/resources/network.rb +0 -11
- data/lib/seam/routes/resources/noise_threshold.rb +0 -9
- data/lib/seam/routes/resources/phone.rb +0 -14
- data/lib/seam/routes/resources/resource_error.rb +0 -11
- data/lib/seam/routes/resources/resource_errors_support.rb +0 -11
- data/lib/seam/routes/resources/resource_warning.rb +0 -11
- data/lib/seam/routes/resources/resource_warnings_support.rb +0 -11
- data/lib/seam/routes/resources/service_health.rb +0 -9
- data/lib/seam/routes/resources/thermostat_schedule.rb +0 -13
- data/lib/seam/routes/resources/unmanaged_access_code.rb +0 -14
- data/lib/seam/routes/resources/unmanaged_device.rb +0 -14
- data/lib/seam/routes/resources/user_identity.rb +0 -11
- data/lib/seam/routes/resources/webhook.rb +0 -9
- data/lib/seam/routes/resources/workspace.rb +0 -9
- data/lib/seam/routes/routes.rb +0 -94
- data/lib/seam/token.rb +0 -53
- data/lib/seam/wait_for_action_attempt.rb +0 -32
- data/lib/seam/webhook.rb +0 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 633608dcbbd2c43fd668b46a8a6aa3ee7d23663a81ed92b84885d50dcedae3b4
|
4
|
+
data.tar.gz: 1f6c28b4b491077046e4b6d87cf26375871ba3a8a55df2c2c26c47ba52bea88f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b231444fe73cc6baae32e5ef0af4d9490892bc881f0a56ddc3d6dce6011a18ae80d0805e537a5db1d65bbaf8bd73b498ead3e7391400dd3ce94e70400779b5f5
|
7
|
+
data.tar.gz: 38504e2b53afb62af4ba3808dbf0c2345284c45833a07a6dea1774ae2a6a64edb45c1b66ae9ff87eafb12ff2402e148ad89230d78b9b423be046fee4cad796b8
|
data/Gemfile.lock
CHANGED
@@ -1,113 +1,117 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
seam (2.0.
|
5
|
-
|
6
|
-
faraday-retry (~> 2.2)
|
7
|
-
svix (~> 1.30)
|
4
|
+
seam (2.0.0.prerelease.1)
|
5
|
+
http (~> 5.2)
|
8
6
|
|
9
7
|
GEM
|
10
8
|
remote: https://rubygems.org/
|
11
9
|
specs:
|
12
|
-
addressable (2.8.
|
13
|
-
public_suffix (>= 2.0.2, <
|
10
|
+
addressable (2.8.6)
|
11
|
+
public_suffix (>= 2.0.2, < 6.0)
|
14
12
|
ansi (1.5.0)
|
15
13
|
ast (2.4.2)
|
16
|
-
|
14
|
+
base64 (0.2.0)
|
15
|
+
bigdecimal (3.1.7)
|
17
16
|
crack (1.0.0)
|
18
17
|
bigdecimal
|
19
18
|
rexml
|
20
19
|
diff-lcs (1.5.1)
|
21
|
-
docile (1.4.
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
net-http
|
28
|
-
faraday-retry (2.2.1)
|
29
|
-
faraday (~> 2.0)
|
20
|
+
docile (1.4.0)
|
21
|
+
domain_name (0.6.20240107)
|
22
|
+
ffi (1.16.3)
|
23
|
+
ffi-compiler (1.3.2)
|
24
|
+
ffi (>= 1.15.5)
|
25
|
+
rake
|
30
26
|
gem-release (2.2.2)
|
31
|
-
hashdiff (1.1.
|
32
|
-
|
27
|
+
hashdiff (1.1.0)
|
28
|
+
http (5.2.0)
|
29
|
+
addressable (~> 2.8)
|
30
|
+
base64 (~> 0.1)
|
31
|
+
http-cookie (~> 1.0)
|
32
|
+
http-form_data (~> 2.2)
|
33
|
+
llhttp-ffi (~> 0.5.0)
|
34
|
+
http-cookie (1.0.5)
|
35
|
+
domain_name (~> 0.5)
|
36
|
+
http-form_data (2.3.0)
|
37
|
+
json (2.7.2)
|
33
38
|
language_server-protocol (3.17.0.3)
|
34
39
|
lint_roller (1.1.0)
|
35
|
-
|
40
|
+
llhttp-ffi (0.5.0)
|
41
|
+
ffi-compiler (~> 1.0)
|
42
|
+
rake (~> 13.0)
|
36
43
|
multi_json (1.15.0)
|
37
|
-
|
38
|
-
uri
|
39
|
-
parallel (1.26.3)
|
44
|
+
parallel (1.24.0)
|
40
45
|
parse_gemspec (1.0.0)
|
41
46
|
parse_gemspec-cli (1.0.0)
|
42
47
|
multi_json
|
43
48
|
parse_gemspec
|
44
49
|
thor
|
45
|
-
parser (3.3.
|
50
|
+
parser (3.3.0.5)
|
46
51
|
ast (~> 2.4.1)
|
47
52
|
racc
|
48
|
-
public_suffix (
|
49
|
-
racc (1.
|
53
|
+
public_suffix (5.0.5)
|
54
|
+
racc (1.7.3)
|
50
55
|
rainbow (3.1.1)
|
51
56
|
rake (13.2.1)
|
52
|
-
regexp_parser (2.9.
|
53
|
-
rexml (3.
|
57
|
+
regexp_parser (2.9.0)
|
58
|
+
rexml (3.2.6)
|
54
59
|
rspec (3.13.0)
|
55
60
|
rspec-core (~> 3.13.0)
|
56
61
|
rspec-expectations (~> 3.13.0)
|
57
62
|
rspec-mocks (~> 3.13.0)
|
58
|
-
rspec-core (3.13.
|
63
|
+
rspec-core (3.13.0)
|
59
64
|
rspec-support (~> 3.13.0)
|
60
|
-
rspec-expectations (3.13.
|
65
|
+
rspec-expectations (3.13.0)
|
61
66
|
diff-lcs (>= 1.2.0, < 2.0)
|
62
67
|
rspec-support (~> 3.13.0)
|
63
|
-
rspec-mocks (3.13.
|
68
|
+
rspec-mocks (3.13.0)
|
64
69
|
diff-lcs (>= 1.2.0, < 2.0)
|
65
70
|
rspec-support (~> 3.13.0)
|
66
71
|
rspec-support (3.13.1)
|
67
|
-
rubocop (1.
|
72
|
+
rubocop (1.62.1)
|
68
73
|
json (~> 2.3)
|
69
74
|
language_server-protocol (>= 3.17.0)
|
70
75
|
parallel (~> 1.10)
|
71
76
|
parser (>= 3.3.0.2)
|
72
77
|
rainbow (>= 2.2.2, < 4.0)
|
73
|
-
regexp_parser (>=
|
74
|
-
|
78
|
+
regexp_parser (>= 1.8, < 3.0)
|
79
|
+
rexml (>= 3.2.5, < 4.0)
|
80
|
+
rubocop-ast (>= 1.31.1, < 2.0)
|
75
81
|
ruby-progressbar (~> 1.7)
|
76
82
|
unicode-display_width (>= 2.4.0, < 3.0)
|
77
|
-
rubocop-ast (1.
|
78
|
-
parser (>= 3.3.
|
79
|
-
rubocop-performance (1.
|
83
|
+
rubocop-ast (1.31.2)
|
84
|
+
parser (>= 3.3.0.4)
|
85
|
+
rubocop-performance (1.20.2)
|
80
86
|
rubocop (>= 1.48.1, < 2.0)
|
81
|
-
rubocop-ast (>= 1.
|
87
|
+
rubocop-ast (>= 1.30.0, < 2.0)
|
82
88
|
ruby-progressbar (1.13.0)
|
83
89
|
simplecov (0.22.0)
|
84
90
|
docile (~> 1.1)
|
85
91
|
simplecov-html (~> 0.11)
|
86
92
|
simplecov_json_formatter (~> 0.1)
|
87
|
-
simplecov-console (0.9.
|
93
|
+
simplecov-console (0.9.1)
|
88
94
|
ansi
|
89
95
|
simplecov
|
90
96
|
terminal-table
|
91
|
-
simplecov-html (0.
|
97
|
+
simplecov-html (0.12.3)
|
92
98
|
simplecov_json_formatter (0.1.4)
|
93
|
-
standard (1.
|
99
|
+
standard (1.35.1)
|
94
100
|
language_server-protocol (~> 3.17.0.2)
|
95
101
|
lint_roller (~> 1.0)
|
96
|
-
rubocop (~> 1.
|
102
|
+
rubocop (~> 1.62.0)
|
97
103
|
standard-custom (~> 1.0.0)
|
98
|
-
standard-performance (~> 1.
|
104
|
+
standard-performance (~> 1.3)
|
99
105
|
standard-custom (1.0.2)
|
100
106
|
lint_roller (~> 1.0)
|
101
107
|
rubocop (~> 1.50)
|
102
|
-
standard-performance (1.
|
108
|
+
standard-performance (1.3.1)
|
103
109
|
lint_roller (~> 1.1)
|
104
|
-
rubocop-performance (~> 1.
|
105
|
-
svix (1.40.0)
|
110
|
+
rubocop-performance (~> 1.20.2)
|
106
111
|
terminal-table (3.0.2)
|
107
112
|
unicode-display_width (>= 1.1.1, < 3)
|
108
|
-
thor (1.3.
|
109
|
-
unicode-display_width (2.
|
110
|
-
uri (1.0.1)
|
113
|
+
thor (1.3.1)
|
114
|
+
unicode-display_width (2.5.0)
|
111
115
|
webmock (3.0.1)
|
112
116
|
addressable (>= 2.3.6)
|
113
117
|
crack (>= 0.3.2)
|
@@ -130,4 +134,4 @@ DEPENDENCIES
|
|
130
134
|
webmock (~> 3.0.0)
|
131
135
|
|
132
136
|
BUNDLED WITH
|
133
|
-
2.
|
137
|
+
2.4.19
|
data/README.md
CHANGED
@@ -7,337 +7,17 @@ SDK for the Seam API written in Ruby.
|
|
7
7
|
|
8
8
|
## Description
|
9
9
|
|
10
|
-
|
11
|
-
This is an official SDK for the Seam API.
|
12
|
-
Please refer to the official [Seam Docs](https://docs.seam.co/latest/) to get started.
|
13
|
-
|
14
|
-
Parts of this SDK are generated from always up-to-date type information
|
15
|
-
provided by [@seamapi/types](https://github.com/seamapi/types/).
|
16
|
-
This ensures all API methods, request shapes, and response shapes are
|
17
|
-
accurate and fully typed.
|
18
|
-
|
19
|
-
<!-- toc -->
|
20
|
-
|
21
|
-
- [Installation](#installation)
|
22
|
-
- [Usage](#usage)
|
23
|
-
- [Examples](#examples)
|
24
|
-
- [List devices](#list-devices)
|
25
|
-
- [Unlock a door](#unlock-a-door)
|
26
|
-
- [Authentication Method](#authentication-method)
|
27
|
-
- [API Key](#api-key)
|
28
|
-
- [Personal Access Token](#personal-access-token)
|
29
|
-
- [Action Attempts](#action-attempts)
|
30
|
-
- [Interacting with Multiple Workspaces](#interacting-with-multiple-workspaces)
|
31
|
-
- [Webhooks](#webhooks)
|
32
|
-
- [Advanced Usage](#advanced-usage)
|
33
|
-
- [Additional Options](#additional-options)
|
34
|
-
- [Setting the endpoint](#setting-the-endpoint)
|
35
|
-
- [Configuring the Faraday Client](#configuring-the-faraday-client)
|
36
|
-
- [Using the Faraday Client](#using-the-faraday-client)
|
37
|
-
- [Overriding the Client](#overriding-the-client)
|
38
|
-
- [Development and Testing](#development-and-testing)
|
39
|
-
- [Quickstart](#quickstart)
|
40
|
-
- [Source code](#source-code)
|
41
|
-
- [Requirements](#requirements)
|
42
|
-
- [Publishing](#publishing)
|
43
|
-
- [Automatic](#automatic)
|
44
|
-
- [Manual](#manual)
|
45
|
-
- [GitHub Actions](#github-actions)
|
46
|
-
- [Secrets for Optional GitHub Actions](#secrets-for-optional-github-actions)
|
47
|
-
- [Contributing](#contributing)
|
48
|
-
- [License](#license)
|
49
|
-
- [Warranty](#warranty)
|
50
|
-
|
51
|
-
<!-- tocstop -->
|
10
|
+
TODO
|
52
11
|
|
53
12
|
## Installation
|
54
13
|
|
55
|
-
Add this as a dependency to your project using [Bundler] with
|
14
|
+
Add this as a dependency to your project using [Bundler] with
|
56
15
|
|
57
16
|
```
|
58
17
|
$ bundle add seam
|
59
18
|
```
|
60
19
|
|
61
|
-
[
|
62
|
-
|
63
|
-
## Usage
|
64
|
-
|
65
|
-
### Examples
|
66
|
-
|
67
|
-
> [!NOTE]
|
68
|
-
> These examples assume `SEAM_API_KEY` is set in your environment.
|
69
|
-
|
70
|
-
#### List devices
|
71
|
-
|
72
|
-
```ruby
|
73
|
-
require "seam"
|
74
|
-
|
75
|
-
seam = Seam.new
|
76
|
-
devices = seam.devices.list
|
77
|
-
```
|
78
|
-
|
79
|
-
#### Unlock a door
|
80
|
-
|
81
|
-
```ruby
|
82
|
-
require "seam"
|
83
|
-
|
84
|
-
seam = Seam.new
|
85
|
-
lock = seam.locks.get(name: "Front Door")
|
86
|
-
seam.locks.unlock_door(device_id: lock.device_id)
|
87
|
-
```
|
88
|
-
|
89
|
-
### Authentication Method
|
90
|
-
|
91
|
-
The SDK supports API key and personal access token authentication mechanisms.
|
92
|
-
Authentication may be configured by passing the corresponding options directly to the `Seam` constructor, or with the more ergonomic static factory methods.
|
93
|
-
|
94
|
-
#### API Key
|
95
|
-
|
96
|
-
An API key is scoped to a single workspace and should only be used on the server.
|
97
|
-
Obtain one from the Seam Console.
|
98
|
-
|
99
|
-
```ruby
|
100
|
-
# Set the `SEAM_API_KEY` environment variable
|
101
|
-
seam = Seam.new
|
102
|
-
|
103
|
-
# Pass as a keyword argument to the constructor
|
104
|
-
seam = Seam.new(api_key: "your-api-key")
|
105
|
-
|
106
|
-
# Use the factory method
|
107
|
-
seam = Seam.from_api_key("your-api-key")
|
108
|
-
```
|
109
|
-
|
110
|
-
#### Personal Access Token
|
111
|
-
|
112
|
-
A Personal Access Token is scoped to a Seam Console user.
|
113
|
-
Obtain one from the Seam Console.
|
114
|
-
A workspace ID must be provided when using this method and all requests will be scoped to that workspace.
|
115
|
-
|
116
|
-
```ruby
|
117
|
-
# Pass as an option to the constructor
|
118
|
-
seam = Seam.new(
|
119
|
-
personal_access_token: "your-personal-access-token",
|
120
|
-
workspace_id: "your-workspace-id"
|
121
|
-
)
|
122
|
-
|
123
|
-
# Use the factory method
|
124
|
-
seam = Seam.from_personal_access_token(
|
125
|
-
"your-personal-access-token",
|
126
|
-
"your-workspace-id"
|
127
|
-
)
|
128
|
-
```
|
129
|
-
|
130
|
-
### Action Attempts
|
131
|
-
|
132
|
-
Some asynchronous operations, e.g., unlocking a door, return an
|
133
|
-
[action attempt](https://docs.seam.co/latest/core-concepts/action-attempts).
|
134
|
-
Seam tracks the progress of the requested operation and updates the action attempt
|
135
|
-
when it succeeds or fails.
|
136
|
-
|
137
|
-
To make working with action attempts more convenient for applications,
|
138
|
-
this library provides the `wait_for_action_attempt` option and enables it by default.
|
139
|
-
|
140
|
-
When the `wait_for_action_attempt` option is enabled, the SDK:
|
141
|
-
|
142
|
-
- Polls the action attempt up to the `timeout`
|
143
|
-
at the `polling_interval` (both in seconds).
|
144
|
-
- Resolves with a fresh copy of the successful action attempt.
|
145
|
-
- Raises a `Seam::ActionAttemptFailedError` if the action attempt is unsuccessful.
|
146
|
-
- Raises a `Seam::ActionAttemptTimeoutError` if the action attempt is still pending when the `timeout` is reached.
|
147
|
-
- Both errors expose an `action_attempt` property.
|
148
|
-
|
149
|
-
If you already have an action attempt ID
|
150
|
-
and want to wait for it to resolve, simply use:
|
151
|
-
|
152
|
-
```ruby
|
153
|
-
seam.action_attempts.get(action_attempt_id: action_attempt_id)
|
154
|
-
```
|
155
|
-
|
156
|
-
Or, to get the current state of an action attempt by ID without waiting:
|
157
|
-
|
158
|
-
```ruby
|
159
|
-
seam.action_attempts.get(
|
160
|
-
action_attempt_id: action_attempt_id,
|
161
|
-
wait_for_action_attempt: false
|
162
|
-
)
|
163
|
-
```
|
164
|
-
|
165
|
-
To disable this behavior, set the default option for the client:
|
166
|
-
|
167
|
-
```ruby
|
168
|
-
seam = Seam.new(
|
169
|
-
api_key: "your-api-key",
|
170
|
-
wait_for_action_attempt: false
|
171
|
-
)
|
172
|
-
|
173
|
-
seam.locks.unlock_door(device_id: device_id)
|
174
|
-
```
|
175
|
-
|
176
|
-
or the behavior may be configured per-request:
|
177
|
-
|
178
|
-
```ruby
|
179
|
-
seam.locks.unlock_door(
|
180
|
-
device_id: device_id,
|
181
|
-
wait_for_action_attempt: false
|
182
|
-
)
|
183
|
-
```
|
184
|
-
|
185
|
-
The `polling_interval` and `timeout` may be configured for the client or per-request.
|
186
|
-
For example:
|
187
|
-
|
188
|
-
```ruby
|
189
|
-
require "seam"
|
190
|
-
|
191
|
-
seam = Seam.new("your-api-key")
|
192
|
-
|
193
|
-
locks = seam.locks.list
|
194
|
-
|
195
|
-
if locks.empty?
|
196
|
-
raise "No locks in this workspace"
|
197
|
-
end
|
198
|
-
|
199
|
-
lock = locks.first
|
200
|
-
|
201
|
-
begin
|
202
|
-
seam.locks.unlock_door(
|
203
|
-
device_id: lock.device_id,
|
204
|
-
wait_for_action_attempt: {
|
205
|
-
timeout: 5.0,
|
206
|
-
polling_interval: 1.0
|
207
|
-
}
|
208
|
-
)
|
209
|
-
|
210
|
-
puts "Door unlocked"
|
211
|
-
rescue Seam::ActionAttemptFailedError
|
212
|
-
puts "Could not unlock the door"
|
213
|
-
rescue Seam::ActionAttemptTimeoutError
|
214
|
-
puts "Door took too long to unlock"
|
215
|
-
end
|
216
|
-
```
|
217
|
-
|
218
|
-
### Interacting with Multiple Workspaces
|
219
|
-
|
220
|
-
Some Seam API endpoints interact with multiple workspaces. The `Seam::Http::SeamMultiWorkspace` client is not bound to a specific workspace and may use those endpoints with a personal access token authentication method.
|
221
|
-
|
222
|
-
A Personal Access Token is scoped to a Seam Console user. Obtain one from the Seam Console.
|
223
|
-
|
224
|
-
```ruby
|
225
|
-
# Pass as an option to the constructor
|
226
|
-
seam = Seam::Http::SeamMultiWorkspace.new(personal_access_token: "your-personal-access-token")
|
227
|
-
|
228
|
-
# Use the factory method
|
229
|
-
seam = Seam::Http::SeamMultiWorkspace.from_personal_access_token("your-personal-access-token")
|
230
|
-
|
231
|
-
# List workspaces authorized for this Personal Access Token
|
232
|
-
workspaces = seam.workspaces.list
|
233
|
-
```
|
234
|
-
|
235
|
-
### Webhooks
|
236
|
-
|
237
|
-
The Seam API implements webhooks using [Svix](https://www.svix.com).This SDK exports a thin wrapper `Seam::Webhook` around the svix package.
|
238
|
-
Use it to parse and validate Seam webhook events.
|
239
|
-
|
240
|
-
> [!TIP]
|
241
|
-
> This example is for [Sinatra](https://sinatrarb.com/), see the [Svix docs for more examples in specific frameworks](https://docs.svix.com/receiving/verifying-payloads/how).
|
242
|
-
|
243
|
-
```ruby
|
244
|
-
require "sinatra"
|
245
|
-
require "seam"
|
246
|
-
|
247
|
-
webhook = Seam::Webhook.new(ENV["SEAM_WEBHOOK_SECRET"])
|
248
|
-
|
249
|
-
post "/webhook" do
|
250
|
-
begin
|
251
|
-
headers = {
|
252
|
-
"svix-id" => request.env["HTTP_SVIX_ID"],
|
253
|
-
"svix-signature" => request.env["HTTP_SVIX_SIGNATURE"],
|
254
|
-
"svix-timestamp" => request.env["HTTP_SVIX_TIMESTAMP"]
|
255
|
-
}
|
256
|
-
data = webhook.verify(request.body.read, headers)
|
257
|
-
rescue Seam::WebhookVerificationError
|
258
|
-
halt 400, "Bad Request"
|
259
|
-
end
|
260
|
-
|
261
|
-
begin
|
262
|
-
store_event(data)
|
263
|
-
rescue
|
264
|
-
halt 500, "Internal Server Error"
|
265
|
-
end
|
266
|
-
|
267
|
-
204
|
268
|
-
end
|
269
|
-
|
270
|
-
def store_event(data)
|
271
|
-
puts data
|
272
|
-
end
|
273
|
-
```
|
274
|
-
|
275
|
-
### Advanced Usage
|
276
|
-
|
277
|
-
#### Additional Options
|
278
|
-
|
279
|
-
In addition to the various authentication options,
|
280
|
-
the constructor takes some advanced options that affect behavior.
|
281
|
-
|
282
|
-
```ruby
|
283
|
-
seam = Seam.new(
|
284
|
-
api_key: "your-api-key",
|
285
|
-
endpoint: "https://example.com",
|
286
|
-
faraday_options: {},
|
287
|
-
faraday_retry_options: {}
|
288
|
-
)
|
289
|
-
```
|
290
|
-
|
291
|
-
When using the static factory methods,
|
292
|
-
these options may be passed in as keyword arguments.
|
293
|
-
|
294
|
-
```ruby
|
295
|
-
seam = Seam.from_api_key("some-api-key",
|
296
|
-
endpoint: "https://example.com",
|
297
|
-
faraday_options: {},
|
298
|
-
faraday_retry_options: {})
|
299
|
-
```
|
300
|
-
|
301
|
-
#### Setting the endpoint
|
302
|
-
|
303
|
-
Some contexts may need to override the API endpoint,
|
304
|
-
e.g., testing or proxy setups. This option corresponds to the [Faraday](https://lostisland.github.io/faraday/#/) `url` setting.
|
305
|
-
|
306
|
-
Either pass the `endpoint` option, or set the `SEAM_ENDPOINT` environment variable.
|
307
|
-
|
308
|
-
#### Configuring the Faraday Client
|
309
|
-
|
310
|
-
The Faraday client and retry behavior may be configured with custom initiation options
|
311
|
-
via [`faraday_option`][faraday_option] and [`faraday_retry_option`][faraday_retry_option].
|
312
|
-
|
313
|
-
[faraday_option]: https://lostisland.github.io/faraday/#/customization/connection-options?id=connection-options
|
314
|
-
[faraday_retry_option]: https://github.com/lostisland/faraday-retry
|
315
|
-
|
316
|
-
#### Using the Faraday Client
|
317
|
-
|
318
|
-
The Faraday client is exposed and may be used or configured directly:
|
319
|
-
|
320
|
-
```ruby
|
321
|
-
require "seam"
|
322
|
-
require "faraday"
|
323
|
-
|
324
|
-
class MyMiddleware < Faraday::Middleware
|
325
|
-
def on_complete(env)
|
326
|
-
puts env.response.inspect
|
327
|
-
end
|
328
|
-
end
|
329
|
-
|
330
|
-
seam = Seam.new
|
331
|
-
|
332
|
-
seam.client.builder.use MyMiddleware
|
333
|
-
|
334
|
-
devices = seam.client.get("/devices/list").body["devices"]
|
335
|
-
```
|
336
|
-
|
337
|
-
#### Overriding the Client
|
338
|
-
|
339
|
-
A Faraday compatible client may be provided to create a `Seam` instance.
|
340
|
-
This API is used internally and is not directly supported.
|
20
|
+
[bundler]: https://bundler.io/
|
341
21
|
|
342
22
|
## Development and Testing
|
343
23
|
|
data/Rakefile
CHANGED
data/lib/seam/client.rb
ADDED
@@ -0,0 +1,129 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Seam
|
4
|
+
class Client
|
5
|
+
attr_accessor :api_key, :base_uri, :debug, :wait_for_action_attempt
|
6
|
+
|
7
|
+
def self.lts_version
|
8
|
+
Seam::LTS_VERSION
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize(api_key: nil, base_uri: nil, wait_for_action_attempt: false, debug: false)
|
12
|
+
@api_key = api_key || ENV["SEAM_API_KEY"]
|
13
|
+
@base_uri = base_uri || ENV["SEAM_API_URL"] || ENV["SEAM_ENDPOINT"] || "https://connect.getseam.com"
|
14
|
+
@debug = debug
|
15
|
+
@wait_for_action_attempt = wait_for_action_attempt
|
16
|
+
|
17
|
+
raise ArgumentError, "SEAM_API_KEY not found in environment, and api_key not provided" if @api_key.to_s.empty?
|
18
|
+
|
19
|
+
if ENV["SEAM_API_URL"]
|
20
|
+
warn "Using the SEAM_API_URL environment variable is deprecated. " \
|
21
|
+
"Support will be removed in a later major version. Use SEAM_ENDPOINT instead."
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def lts_version
|
26
|
+
Seam::LTS_VERSION
|
27
|
+
end
|
28
|
+
|
29
|
+
def access_codes
|
30
|
+
@access_codes ||= Seam::Clients::AccessCodes.new(self)
|
31
|
+
end
|
32
|
+
|
33
|
+
def acs
|
34
|
+
@acs ||= Seam::Clients::Acs.new(self)
|
35
|
+
end
|
36
|
+
|
37
|
+
def action_attempts
|
38
|
+
@action_attempts ||= Seam::Clients::ActionAttempts.new(self)
|
39
|
+
end
|
40
|
+
|
41
|
+
def client_sessions
|
42
|
+
@client_sessions ||= Seam::Clients::ClientSessions.new(self)
|
43
|
+
end
|
44
|
+
|
45
|
+
def connect_webviews
|
46
|
+
@connect_webviews ||= Seam::Clients::ConnectWebviews.new(self)
|
47
|
+
end
|
48
|
+
|
49
|
+
def connected_accounts
|
50
|
+
@connected_accounts ||= Seam::Clients::ConnectedAccounts.new(self)
|
51
|
+
end
|
52
|
+
|
53
|
+
def devices
|
54
|
+
@devices ||= Seam::Clients::Devices.new(self)
|
55
|
+
end
|
56
|
+
|
57
|
+
def events
|
58
|
+
@events ||= Seam::Clients::Events.new(self)
|
59
|
+
end
|
60
|
+
|
61
|
+
def locks
|
62
|
+
@locks ||= Seam::Clients::Locks.new(self)
|
63
|
+
end
|
64
|
+
|
65
|
+
def networks
|
66
|
+
@networks ||= Seam::Clients::Networks.new(self)
|
67
|
+
end
|
68
|
+
|
69
|
+
def noise_sensors
|
70
|
+
@noise_sensors ||= Seam::Clients::NoiseSensors.new(self)
|
71
|
+
end
|
72
|
+
|
73
|
+
def phones
|
74
|
+
@phones ||= Seam::Clients::Phones.new(self)
|
75
|
+
end
|
76
|
+
|
77
|
+
def thermostats
|
78
|
+
@thermostats ||= Seam::Clients::Thermostats.new(self)
|
79
|
+
end
|
80
|
+
|
81
|
+
def user_identities
|
82
|
+
@user_identities ||= Seam::Clients::UserIdentities.new(self)
|
83
|
+
end
|
84
|
+
|
85
|
+
def webhooks
|
86
|
+
@webhooks ||= Seam::Clients::Webhooks.new(self)
|
87
|
+
end
|
88
|
+
|
89
|
+
def workspaces
|
90
|
+
@workspaces ||= Seam::Clients::Workspaces.new(self)
|
91
|
+
end
|
92
|
+
|
93
|
+
def health
|
94
|
+
request_seam(:get, "/health")
|
95
|
+
end
|
96
|
+
|
97
|
+
# @deprecated Please use {#devices.unmanaged} instead.
|
98
|
+
def unmanaged_devices
|
99
|
+
warn "[DEPRECATION] 'unmanaged_devices' is deprecated. Please use 'devices.unmanaged' instead."
|
100
|
+
|
101
|
+
@unmanaged_devices ||= Seam::Clients::DevicesUnmanaged.new(self)
|
102
|
+
end
|
103
|
+
|
104
|
+
# @deprecated Please use {#access_codes.unmanaged} instead.
|
105
|
+
def unmanaged_access_codes
|
106
|
+
warn "[DEPRECATION] 'unmanaged_access_codes' is deprecated. Please use 'access_codes.unmanaged' instead."
|
107
|
+
|
108
|
+
@unmanaged_access_codes ||= Seam::Clients::AccessCodesUnmanaged.new(self)
|
109
|
+
end
|
110
|
+
|
111
|
+
def request_seam_object(method, path, klass, inner_object, config = {})
|
112
|
+
response = request_seam(method, path, config)
|
113
|
+
|
114
|
+
data = response[inner_object]
|
115
|
+
|
116
|
+
klass.load_from_response(data, self)
|
117
|
+
end
|
118
|
+
|
119
|
+
def request_seam(method, path, config = {})
|
120
|
+
Seam::Request.new(
|
121
|
+
api_key: api_key,
|
122
|
+
base_uri: base_uri,
|
123
|
+
debug: debug
|
124
|
+
).perform(
|
125
|
+
method, path, config
|
126
|
+
)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|