permitstack 1.0.0__tar.gz → 1.0.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {permitstack-1.0.0 → permitstack-1.0.2}/PKG-INFO +14 -12
- {permitstack-1.0.0 → permitstack-1.0.2}/README.md +11 -9
- {permitstack-1.0.0 → permitstack-1.0.2}/pyproject.toml +3 -3
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/_version.py +3 -3
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/health.py +166 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/models/__init__.py +18 -11
- permitstack-1.0.2/src/permitstack/models/export_permitsop.py +180 -0
- permitstack-1.0.2/src/permitstack/models/get_webhook_secretop.py +16 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/models/search_permitsop.py +14 -5
- permitstack-1.0.2/src/permitstack/models/test_webhookop.py +20 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/permits.py +288 -8
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/sdk.py +9 -9
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/webhooks.py +390 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack.egg-info/PKG-INFO +14 -12
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack.egg-info/SOURCES.txt +3 -3
- permitstack-1.0.0/src/permitstack/bulk_export.py +0 -241
- permitstack-1.0.0/src/permitstack/models/export_permits_csvop.py +0 -98
- permitstack-1.0.0/src/permitstack/models/permitcategory.py +0 -27
- {permitstack-1.0.0 → permitstack-1.0.2}/setup.cfg +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/__init__.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/_hooks/__init__.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/_hooks/sdkhooks.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/_hooks/types.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/basesdk.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/contractors.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/errors/__init__.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/errors/httpvalidationerror.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/errors/no_response_error.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/errors/permitstackdefaulterror.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/errors/permitstackerror.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/errors/responsevalidationerror.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/httpclient.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/models/contractorprofile.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/models/contractorsearchresponse.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/models/contractorsummary.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/models/delete_webhookop.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/models/get_contractor_permitsop.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/models/get_contractorop.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/models/get_permitop.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/models/get_permits_by_addressop.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/models/get_property_historyop.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/models/permitdetail.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/models/permitsearchresponse.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/models/permitstatus.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/models/permitsummary.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/models/propertytype.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/models/search_contractorsop.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/models/security.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/models/validationerror.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/models/webhookcreate.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/property_history.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/py.typed +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/sdkconfiguration.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/types/__init__.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/types/basemodel.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/utils/__init__.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/utils/annotations.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/utils/datetimes.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/utils/dynamic_imports.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/utils/enums.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/utils/eventstreaming.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/utils/forms.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/utils/headers.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/utils/logger.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/utils/metadata.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/utils/queryparams.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/utils/requestbodies.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/utils/retries.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/utils/security.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/utils/serializers.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/utils/unmarshal_json_response.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/utils/url.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack/utils/values.py +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack.egg-info/dependency_links.txt +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack.egg-info/requires.txt +0 -0
- {permitstack-1.0.0 → permitstack-1.0.2}/src/permitstack.egg-info/top_level.txt +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: permitstack
|
|
3
|
-
Version: 1.0.
|
|
4
|
-
Summary: Official Python SDK for the PermitStack building permit data API.
|
|
5
|
-
Author
|
|
3
|
+
Version: 1.0.2
|
|
4
|
+
Summary: Official Python SDK for the PermitStack building permit data API.
|
|
5
|
+
Author: PermitStack
|
|
6
6
|
License: Apache-2.0
|
|
7
7
|
Requires-Python: >=3.10
|
|
8
8
|
Description-Content-Type: text/markdown
|
|
@@ -25,23 +25,25 @@ Developer-friendly & type-safe Python SDK specifically catered to leverage *perm
|
|
|
25
25
|
PermitStack:
|
|
26
26
|
## PermitStack Building Permit API
|
|
27
27
|
|
|
28
|
-
Access
|
|
28
|
+
Access 33M+ building permits across 152 active U.S. jurisdictions (plus 16 historical archives), updated daily from official open data portals.
|
|
29
29
|
|
|
30
30
|
### Getting started
|
|
31
|
-
1. Sign up at [permit-stack.com](https://permit-stack.com/#pricing) for a free API key (
|
|
31
|
+
1. Sign up at [permit-stack.com](https://permit-stack.com/#pricing) for a free API key (100 req/day)
|
|
32
32
|
2. Pass your key as `X-API-Key` header on every request
|
|
33
33
|
3. See the `/v1/permits/search` endpoint to get started
|
|
34
34
|
|
|
35
35
|
### Rate limits
|
|
36
36
|
Tier | Requests/min | Requests/day
|
|
37
37
|
-----------|--------------|-------------
|
|
38
|
-
Free | 30 |
|
|
38
|
+
Free | 30 | 100
|
|
39
|
+
Indie | 30 | 1,000
|
|
40
|
+
Hobbyist | 30 | 2,500
|
|
39
41
|
Developer | 60 | 10,000
|
|
40
42
|
Startup | 200 | 100,000
|
|
41
43
|
Growth | 500 | 500,000
|
|
42
44
|
|
|
43
45
|
### Support
|
|
44
|
-
support@
|
|
46
|
+
support@permit-stack.com
|
|
45
47
|
<!-- End Summary [summary] -->
|
|
46
48
|
|
|
47
49
|
<!-- Start Table of Contents [toc] -->
|
|
@@ -227,10 +229,6 @@ with Permitstack(
|
|
|
227
229
|
<details open>
|
|
228
230
|
<summary>Available methods</summary>
|
|
229
231
|
|
|
230
|
-
### [BulkExport](docs/sdks/bulkexport/README.md)
|
|
231
|
-
|
|
232
|
-
* [export_permits_csv](docs/sdks/bulkexport/README.md#export_permits_csv) - Export Permits Csv
|
|
233
|
-
|
|
234
232
|
### [Contractors](docs/sdks/contractors/README.md)
|
|
235
233
|
|
|
236
234
|
* [search_contractors](docs/sdks/contractors/README.md#search_contractors) - Search Contractors
|
|
@@ -240,10 +238,12 @@ with Permitstack(
|
|
|
240
238
|
### [Health](docs/sdks/health/README.md)
|
|
241
239
|
|
|
242
240
|
* [health_check](docs/sdks/health/README.md#health_check) - Health Check
|
|
241
|
+
* [public_stats](docs/sdks/health/README.md#public_stats) - Public Stats
|
|
243
242
|
|
|
244
243
|
### [Permits](docs/sdks/permits/README.md)
|
|
245
244
|
|
|
246
245
|
* [search_permits](docs/sdks/permits/README.md#search_permits) - Search Permits
|
|
246
|
+
* [export_permits](docs/sdks/permits/README.md#export_permits) - Export Permits
|
|
247
247
|
* [get_permit](docs/sdks/permits/README.md#get_permit) - Get Permit
|
|
248
248
|
* [get_permits_by_address](docs/sdks/permits/README.md#get_permits_by_address) - Get Permits By Address
|
|
249
249
|
* [get_coverage_stats](docs/sdks/permits/README.md#get_coverage_stats) - Get Coverage Stats
|
|
@@ -257,6 +257,8 @@ with Permitstack(
|
|
|
257
257
|
* [list_webhooks](docs/sdks/webhooks/README.md#list_webhooks) - List Webhooks
|
|
258
258
|
* [create_webhook](docs/sdks/webhooks/README.md#create_webhook) - Create Webhook
|
|
259
259
|
* [delete_webhook](docs/sdks/webhooks/README.md#delete_webhook) - Delete Webhook
|
|
260
|
+
* [test_webhook](docs/sdks/webhooks/README.md#test_webhook) - Test Webhook
|
|
261
|
+
* [get_webhook_secret](docs/sdks/webhooks/README.md#get_webhook_secret) - Get Webhook Secret
|
|
260
262
|
|
|
261
263
|
</details>
|
|
262
264
|
<!-- End Available Resources and Operations [operations] -->
|
|
@@ -365,7 +367,7 @@ with Permitstack(
|
|
|
365
367
|
|
|
366
368
|
|
|
367
369
|
**Inherit from [`PermitstackError`](./src/permitstack/errors/permitstackerror.py)**:
|
|
368
|
-
* [`HTTPValidationError`](./src/permitstack/errors/httpvalidationerror.py): Validation Error. Status code `422`. Applicable to
|
|
370
|
+
* [`HTTPValidationError`](./src/permitstack/errors/httpvalidationerror.py): Validation Error. Status code `422`. Applicable to 12 of 16 methods.*
|
|
369
371
|
* [`ResponseValidationError`](./src/permitstack/errors/responsevalidationerror.py): Type mismatch between the response data and the expected Pydantic model. Provides access to the Pydantic validation error via the `cause` attribute.
|
|
370
372
|
|
|
371
373
|
</details>
|
|
@@ -13,23 +13,25 @@ Developer-friendly & type-safe Python SDK specifically catered to leverage *perm
|
|
|
13
13
|
PermitStack:
|
|
14
14
|
## PermitStack Building Permit API
|
|
15
15
|
|
|
16
|
-
Access
|
|
16
|
+
Access 33M+ building permits across 152 active U.S. jurisdictions (plus 16 historical archives), updated daily from official open data portals.
|
|
17
17
|
|
|
18
18
|
### Getting started
|
|
19
|
-
1. Sign up at [permit-stack.com](https://permit-stack.com/#pricing) for a free API key (
|
|
19
|
+
1. Sign up at [permit-stack.com](https://permit-stack.com/#pricing) for a free API key (100 req/day)
|
|
20
20
|
2. Pass your key as `X-API-Key` header on every request
|
|
21
21
|
3. See the `/v1/permits/search` endpoint to get started
|
|
22
22
|
|
|
23
23
|
### Rate limits
|
|
24
24
|
Tier | Requests/min | Requests/day
|
|
25
25
|
-----------|--------------|-------------
|
|
26
|
-
Free | 30 |
|
|
26
|
+
Free | 30 | 100
|
|
27
|
+
Indie | 30 | 1,000
|
|
28
|
+
Hobbyist | 30 | 2,500
|
|
27
29
|
Developer | 60 | 10,000
|
|
28
30
|
Startup | 200 | 100,000
|
|
29
31
|
Growth | 500 | 500,000
|
|
30
32
|
|
|
31
33
|
### Support
|
|
32
|
-
support@
|
|
34
|
+
support@permit-stack.com
|
|
33
35
|
<!-- End Summary [summary] -->
|
|
34
36
|
|
|
35
37
|
<!-- Start Table of Contents [toc] -->
|
|
@@ -215,10 +217,6 @@ with Permitstack(
|
|
|
215
217
|
<details open>
|
|
216
218
|
<summary>Available methods</summary>
|
|
217
219
|
|
|
218
|
-
### [BulkExport](docs/sdks/bulkexport/README.md)
|
|
219
|
-
|
|
220
|
-
* [export_permits_csv](docs/sdks/bulkexport/README.md#export_permits_csv) - Export Permits Csv
|
|
221
|
-
|
|
222
220
|
### [Contractors](docs/sdks/contractors/README.md)
|
|
223
221
|
|
|
224
222
|
* [search_contractors](docs/sdks/contractors/README.md#search_contractors) - Search Contractors
|
|
@@ -228,10 +226,12 @@ with Permitstack(
|
|
|
228
226
|
### [Health](docs/sdks/health/README.md)
|
|
229
227
|
|
|
230
228
|
* [health_check](docs/sdks/health/README.md#health_check) - Health Check
|
|
229
|
+
* [public_stats](docs/sdks/health/README.md#public_stats) - Public Stats
|
|
231
230
|
|
|
232
231
|
### [Permits](docs/sdks/permits/README.md)
|
|
233
232
|
|
|
234
233
|
* [search_permits](docs/sdks/permits/README.md#search_permits) - Search Permits
|
|
234
|
+
* [export_permits](docs/sdks/permits/README.md#export_permits) - Export Permits
|
|
235
235
|
* [get_permit](docs/sdks/permits/README.md#get_permit) - Get Permit
|
|
236
236
|
* [get_permits_by_address](docs/sdks/permits/README.md#get_permits_by_address) - Get Permits By Address
|
|
237
237
|
* [get_coverage_stats](docs/sdks/permits/README.md#get_coverage_stats) - Get Coverage Stats
|
|
@@ -245,6 +245,8 @@ with Permitstack(
|
|
|
245
245
|
* [list_webhooks](docs/sdks/webhooks/README.md#list_webhooks) - List Webhooks
|
|
246
246
|
* [create_webhook](docs/sdks/webhooks/README.md#create_webhook) - Create Webhook
|
|
247
247
|
* [delete_webhook](docs/sdks/webhooks/README.md#delete_webhook) - Delete Webhook
|
|
248
|
+
* [test_webhook](docs/sdks/webhooks/README.md#test_webhook) - Test Webhook
|
|
249
|
+
* [get_webhook_secret](docs/sdks/webhooks/README.md#get_webhook_secret) - Get Webhook Secret
|
|
248
250
|
|
|
249
251
|
</details>
|
|
250
252
|
<!-- End Available Resources and Operations [operations] -->
|
|
@@ -353,7 +355,7 @@ with Permitstack(
|
|
|
353
355
|
|
|
354
356
|
|
|
355
357
|
**Inherit from [`PermitstackError`](./src/permitstack/errors/permitstackerror.py)**:
|
|
356
|
-
* [`HTTPValidationError`](./src/permitstack/errors/httpvalidationerror.py): Validation Error. Status code `422`. Applicable to
|
|
358
|
+
* [`HTTPValidationError`](./src/permitstack/errors/httpvalidationerror.py): Validation Error. Status code `422`. Applicable to 12 of 16 methods.*
|
|
357
359
|
* [`ResponseValidationError`](./src/permitstack/errors/responsevalidationerror.py): Type mismatch between the response data and the expected Pydantic model. Provides access to the Pydantic validation error via the `cause` attribute.
|
|
358
360
|
|
|
359
361
|
</details>
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "permitstack"
|
|
3
|
-
version = "1.0.
|
|
4
|
-
description = "Official Python SDK for the PermitStack building permit data API.
|
|
5
|
-
authors = [{ name = "PermitStack"
|
|
3
|
+
version = "1.0.2"
|
|
4
|
+
description = "Official Python SDK for the PermitStack building permit data API."
|
|
5
|
+
authors = [{ name = "PermitStack" },]
|
|
6
6
|
readme = "README.md"
|
|
7
7
|
requires-python = ">=3.10"
|
|
8
8
|
dependencies = [
|
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
import importlib.metadata
|
|
4
4
|
|
|
5
5
|
__title__: str = "permitstack"
|
|
6
|
-
__version__: str = "1.0.
|
|
6
|
+
__version__: str = "1.0.2"
|
|
7
7
|
__openapi_doc_version__: str = "1.0.0"
|
|
8
|
-
__gen_version__: str = "2.
|
|
9
|
-
__user_agent__: str = "speakeasy-sdk/python 1.0.
|
|
8
|
+
__gen_version__: str = "2.884.13"
|
|
9
|
+
__user_agent__: str = "speakeasy-sdk/python 1.0.2 2.884.13 1.0.0 permitstack"
|
|
10
10
|
|
|
11
11
|
try:
|
|
12
12
|
if __package__ is not None:
|
|
@@ -169,3 +169,169 @@ class Health(BaseSDK):
|
|
|
169
169
|
)
|
|
170
170
|
|
|
171
171
|
raise errors.PermitstackDefaultError("Unexpected response received", http_res)
|
|
172
|
+
|
|
173
|
+
def public_stats(
|
|
174
|
+
self,
|
|
175
|
+
*,
|
|
176
|
+
retries: OptionalNullable[utils.RetryConfig] = UNSET,
|
|
177
|
+
server_url: Optional[str] = None,
|
|
178
|
+
timeout_ms: Optional[int] = None,
|
|
179
|
+
http_headers: Optional[Mapping[str, str]] = None,
|
|
180
|
+
) -> Any:
|
|
181
|
+
r"""Public Stats
|
|
182
|
+
|
|
183
|
+
Public stats endpoint — no auth required.
|
|
184
|
+
Returns aggregate coverage numbers for marketing/transparency.
|
|
185
|
+
Cached server-side for 5 minutes.
|
|
186
|
+
|
|
187
|
+
:param retries: Override the default retry configuration for this method
|
|
188
|
+
:param server_url: Override the default server URL for this method
|
|
189
|
+
:param timeout_ms: Override the default request timeout configuration for this method in milliseconds
|
|
190
|
+
:param http_headers: Additional headers to set or replace on requests.
|
|
191
|
+
"""
|
|
192
|
+
base_url = None
|
|
193
|
+
url_variables = None
|
|
194
|
+
if timeout_ms is None:
|
|
195
|
+
timeout_ms = self.sdk_configuration.timeout_ms
|
|
196
|
+
|
|
197
|
+
if server_url is not None:
|
|
198
|
+
base_url = server_url
|
|
199
|
+
else:
|
|
200
|
+
base_url = self._get_url(base_url, url_variables)
|
|
201
|
+
req = self._build_request(
|
|
202
|
+
method="GET",
|
|
203
|
+
path="/stats",
|
|
204
|
+
base_url=base_url,
|
|
205
|
+
url_variables=url_variables,
|
|
206
|
+
request=None,
|
|
207
|
+
request_body_required=False,
|
|
208
|
+
request_has_path_params=False,
|
|
209
|
+
request_has_query_params=True,
|
|
210
|
+
user_agent_header="user-agent",
|
|
211
|
+
accept_header_value="application/json",
|
|
212
|
+
http_headers=http_headers,
|
|
213
|
+
security=self.sdk_configuration.security,
|
|
214
|
+
allow_empty_value=None,
|
|
215
|
+
timeout_ms=timeout_ms,
|
|
216
|
+
)
|
|
217
|
+
|
|
218
|
+
if retries == UNSET:
|
|
219
|
+
if self.sdk_configuration.retry_config is not UNSET:
|
|
220
|
+
retries = self.sdk_configuration.retry_config
|
|
221
|
+
|
|
222
|
+
retry_config = None
|
|
223
|
+
if isinstance(retries, utils.RetryConfig):
|
|
224
|
+
retry_config = (retries, ["429", "500", "502", "503", "504"])
|
|
225
|
+
|
|
226
|
+
http_res = self.do_request(
|
|
227
|
+
hook_ctx=HookContext(
|
|
228
|
+
config=self.sdk_configuration,
|
|
229
|
+
base_url=base_url or "",
|
|
230
|
+
operation_id="public_stats",
|
|
231
|
+
oauth2_scopes=None,
|
|
232
|
+
security_source=get_security_from_env(
|
|
233
|
+
self.sdk_configuration.security, models.Security
|
|
234
|
+
),
|
|
235
|
+
),
|
|
236
|
+
request=req,
|
|
237
|
+
is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
|
|
238
|
+
retry_config=retry_config,
|
|
239
|
+
)
|
|
240
|
+
|
|
241
|
+
if utils.match_response(http_res, "200", "application/json"):
|
|
242
|
+
return unmarshal_json_response(Any, http_res)
|
|
243
|
+
if utils.match_response(http_res, "4XX", "*"):
|
|
244
|
+
http_res_text = utils.stream_to_text(http_res)
|
|
245
|
+
raise errors.PermitstackDefaultError(
|
|
246
|
+
"API error occurred", http_res, http_res_text
|
|
247
|
+
)
|
|
248
|
+
if utils.match_response(http_res, "5XX", "*"):
|
|
249
|
+
http_res_text = utils.stream_to_text(http_res)
|
|
250
|
+
raise errors.PermitstackDefaultError(
|
|
251
|
+
"API error occurred", http_res, http_res_text
|
|
252
|
+
)
|
|
253
|
+
|
|
254
|
+
raise errors.PermitstackDefaultError("Unexpected response received", http_res)
|
|
255
|
+
|
|
256
|
+
async def public_stats_async(
|
|
257
|
+
self,
|
|
258
|
+
*,
|
|
259
|
+
retries: OptionalNullable[utils.RetryConfig] = UNSET,
|
|
260
|
+
server_url: Optional[str] = None,
|
|
261
|
+
timeout_ms: Optional[int] = None,
|
|
262
|
+
http_headers: Optional[Mapping[str, str]] = None,
|
|
263
|
+
) -> Any:
|
|
264
|
+
r"""Public Stats
|
|
265
|
+
|
|
266
|
+
Public stats endpoint — no auth required.
|
|
267
|
+
Returns aggregate coverage numbers for marketing/transparency.
|
|
268
|
+
Cached server-side for 5 minutes.
|
|
269
|
+
|
|
270
|
+
:param retries: Override the default retry configuration for this method
|
|
271
|
+
:param server_url: Override the default server URL for this method
|
|
272
|
+
:param timeout_ms: Override the default request timeout configuration for this method in milliseconds
|
|
273
|
+
:param http_headers: Additional headers to set or replace on requests.
|
|
274
|
+
"""
|
|
275
|
+
base_url = None
|
|
276
|
+
url_variables = None
|
|
277
|
+
if timeout_ms is None:
|
|
278
|
+
timeout_ms = self.sdk_configuration.timeout_ms
|
|
279
|
+
|
|
280
|
+
if server_url is not None:
|
|
281
|
+
base_url = server_url
|
|
282
|
+
else:
|
|
283
|
+
base_url = self._get_url(base_url, url_variables)
|
|
284
|
+
req = self._build_request_async(
|
|
285
|
+
method="GET",
|
|
286
|
+
path="/stats",
|
|
287
|
+
base_url=base_url,
|
|
288
|
+
url_variables=url_variables,
|
|
289
|
+
request=None,
|
|
290
|
+
request_body_required=False,
|
|
291
|
+
request_has_path_params=False,
|
|
292
|
+
request_has_query_params=True,
|
|
293
|
+
user_agent_header="user-agent",
|
|
294
|
+
accept_header_value="application/json",
|
|
295
|
+
http_headers=http_headers,
|
|
296
|
+
security=self.sdk_configuration.security,
|
|
297
|
+
allow_empty_value=None,
|
|
298
|
+
timeout_ms=timeout_ms,
|
|
299
|
+
)
|
|
300
|
+
|
|
301
|
+
if retries == UNSET:
|
|
302
|
+
if self.sdk_configuration.retry_config is not UNSET:
|
|
303
|
+
retries = self.sdk_configuration.retry_config
|
|
304
|
+
|
|
305
|
+
retry_config = None
|
|
306
|
+
if isinstance(retries, utils.RetryConfig):
|
|
307
|
+
retry_config = (retries, ["429", "500", "502", "503", "504"])
|
|
308
|
+
|
|
309
|
+
http_res = await self.do_request_async(
|
|
310
|
+
hook_ctx=HookContext(
|
|
311
|
+
config=self.sdk_configuration,
|
|
312
|
+
base_url=base_url or "",
|
|
313
|
+
operation_id="public_stats",
|
|
314
|
+
oauth2_scopes=None,
|
|
315
|
+
security_source=get_security_from_env(
|
|
316
|
+
self.sdk_configuration.security, models.Security
|
|
317
|
+
),
|
|
318
|
+
),
|
|
319
|
+
request=req,
|
|
320
|
+
is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
|
|
321
|
+
retry_config=retry_config,
|
|
322
|
+
)
|
|
323
|
+
|
|
324
|
+
if utils.match_response(http_res, "200", "application/json"):
|
|
325
|
+
return unmarshal_json_response(Any, http_res)
|
|
326
|
+
if utils.match_response(http_res, "4XX", "*"):
|
|
327
|
+
http_res_text = await utils.stream_to_text_async(http_res)
|
|
328
|
+
raise errors.PermitstackDefaultError(
|
|
329
|
+
"API error occurred", http_res, http_res_text
|
|
330
|
+
)
|
|
331
|
+
if utils.match_response(http_res, "5XX", "*"):
|
|
332
|
+
http_res_text = await utils.stream_to_text_async(http_res)
|
|
333
|
+
raise errors.PermitstackDefaultError(
|
|
334
|
+
"API error occurred", http_res, http_res_text
|
|
335
|
+
)
|
|
336
|
+
|
|
337
|
+
raise errors.PermitstackDefaultError("Unexpected response received", http_res)
|
|
@@ -12,10 +12,7 @@ if TYPE_CHECKING:
|
|
|
12
12
|
)
|
|
13
13
|
from .contractorsummary import ContractorSummary, ContractorSummaryTypedDict
|
|
14
14
|
from .delete_webhookop import DeleteWebhookRequest, DeleteWebhookRequestTypedDict
|
|
15
|
-
from .
|
|
16
|
-
ExportPermitsCsvRequest,
|
|
17
|
-
ExportPermitsCsvRequestTypedDict,
|
|
18
|
-
)
|
|
15
|
+
from .export_permitsop import ExportPermitsRequest, ExportPermitsRequestTypedDict
|
|
19
16
|
from .get_contractor_permitsop import (
|
|
20
17
|
GetContractorPermitsRequest,
|
|
21
18
|
GetContractorPermitsRequestTypedDict,
|
|
@@ -30,7 +27,10 @@ if TYPE_CHECKING:
|
|
|
30
27
|
GetPropertyHistoryRequest,
|
|
31
28
|
GetPropertyHistoryRequestTypedDict,
|
|
32
29
|
)
|
|
33
|
-
from .
|
|
30
|
+
from .get_webhook_secretop import (
|
|
31
|
+
GetWebhookSecretRequest,
|
|
32
|
+
GetWebhookSecretRequestTypedDict,
|
|
33
|
+
)
|
|
34
34
|
from .permitdetail import PermitDetail, PermitDetailTypedDict
|
|
35
35
|
from .permitsearchresponse import (
|
|
36
36
|
PermitSearchResponse,
|
|
@@ -45,6 +45,7 @@ if TYPE_CHECKING:
|
|
|
45
45
|
)
|
|
46
46
|
from .search_permitsop import SearchPermitsRequest, SearchPermitsRequestTypedDict
|
|
47
47
|
from .security import Security, SecurityTypedDict
|
|
48
|
+
from .test_webhookop import TestWebhookRequest, TestWebhookRequestTypedDict
|
|
48
49
|
from .validationerror import (
|
|
49
50
|
Context,
|
|
50
51
|
ContextTypedDict,
|
|
@@ -66,8 +67,8 @@ __all__ = [
|
|
|
66
67
|
"ContractorSummaryTypedDict",
|
|
67
68
|
"DeleteWebhookRequest",
|
|
68
69
|
"DeleteWebhookRequestTypedDict",
|
|
69
|
-
"
|
|
70
|
-
"
|
|
70
|
+
"ExportPermitsRequest",
|
|
71
|
+
"ExportPermitsRequestTypedDict",
|
|
71
72
|
"GetContractorPermitsRequest",
|
|
72
73
|
"GetContractorPermitsRequestTypedDict",
|
|
73
74
|
"GetContractorRequest",
|
|
@@ -78,9 +79,10 @@ __all__ = [
|
|
|
78
79
|
"GetPermitsByAddressRequestTypedDict",
|
|
79
80
|
"GetPropertyHistoryRequest",
|
|
80
81
|
"GetPropertyHistoryRequestTypedDict",
|
|
82
|
+
"GetWebhookSecretRequest",
|
|
83
|
+
"GetWebhookSecretRequestTypedDict",
|
|
81
84
|
"Loc",
|
|
82
85
|
"LocTypedDict",
|
|
83
|
-
"PermitCategory",
|
|
84
86
|
"PermitDetail",
|
|
85
87
|
"PermitDetailTypedDict",
|
|
86
88
|
"PermitSearchResponse",
|
|
@@ -95,6 +97,8 @@ __all__ = [
|
|
|
95
97
|
"SearchPermitsRequestTypedDict",
|
|
96
98
|
"Security",
|
|
97
99
|
"SecurityTypedDict",
|
|
100
|
+
"TestWebhookRequest",
|
|
101
|
+
"TestWebhookRequestTypedDict",
|
|
98
102
|
"ValidationError",
|
|
99
103
|
"ValidationErrorTypedDict",
|
|
100
104
|
"WebhookCreate",
|
|
@@ -110,8 +114,8 @@ _dynamic_imports: dict[str, str] = {
|
|
|
110
114
|
"ContractorSummaryTypedDict": ".contractorsummary",
|
|
111
115
|
"DeleteWebhookRequest": ".delete_webhookop",
|
|
112
116
|
"DeleteWebhookRequestTypedDict": ".delete_webhookop",
|
|
113
|
-
"
|
|
114
|
-
"
|
|
117
|
+
"ExportPermitsRequest": ".export_permitsop",
|
|
118
|
+
"ExportPermitsRequestTypedDict": ".export_permitsop",
|
|
115
119
|
"GetContractorPermitsRequest": ".get_contractor_permitsop",
|
|
116
120
|
"GetContractorPermitsRequestTypedDict": ".get_contractor_permitsop",
|
|
117
121
|
"GetContractorRequest": ".get_contractorop",
|
|
@@ -122,7 +126,8 @@ _dynamic_imports: dict[str, str] = {
|
|
|
122
126
|
"GetPermitsByAddressRequestTypedDict": ".get_permits_by_addressop",
|
|
123
127
|
"GetPropertyHistoryRequest": ".get_property_historyop",
|
|
124
128
|
"GetPropertyHistoryRequestTypedDict": ".get_property_historyop",
|
|
125
|
-
"
|
|
129
|
+
"GetWebhookSecretRequest": ".get_webhook_secretop",
|
|
130
|
+
"GetWebhookSecretRequestTypedDict": ".get_webhook_secretop",
|
|
126
131
|
"PermitDetail": ".permitdetail",
|
|
127
132
|
"PermitDetailTypedDict": ".permitdetail",
|
|
128
133
|
"PermitSearchResponse": ".permitsearchresponse",
|
|
@@ -137,6 +142,8 @@ _dynamic_imports: dict[str, str] = {
|
|
|
137
142
|
"SearchPermitsRequestTypedDict": ".search_permitsop",
|
|
138
143
|
"Security": ".security",
|
|
139
144
|
"SecurityTypedDict": ".security",
|
|
145
|
+
"TestWebhookRequest": ".test_webhookop",
|
|
146
|
+
"TestWebhookRequestTypedDict": ".test_webhookop",
|
|
140
147
|
"Context": ".validationerror",
|
|
141
148
|
"ContextTypedDict": ".validationerror",
|
|
142
149
|
"Loc": ".validationerror",
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
from .permitstatus import PermitStatus
|
|
5
|
+
from .propertytype import PropertyType
|
|
6
|
+
from datetime import date
|
|
7
|
+
from permitstack.types import (
|
|
8
|
+
BaseModel,
|
|
9
|
+
Nullable,
|
|
10
|
+
OptionalNullable,
|
|
11
|
+
UNSET,
|
|
12
|
+
UNSET_SENTINEL,
|
|
13
|
+
)
|
|
14
|
+
from permitstack.utils import FieldMetadata, QueryParamMetadata
|
|
15
|
+
from pydantic import model_serializer
|
|
16
|
+
from typing import Optional
|
|
17
|
+
from typing_extensions import Annotated, NotRequired, TypedDict
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class ExportPermitsRequestTypedDict(TypedDict):
|
|
21
|
+
zip_code: NotRequired[Nullable[str]]
|
|
22
|
+
city: NotRequired[Nullable[str]]
|
|
23
|
+
state: NotRequired[Nullable[str]]
|
|
24
|
+
category: NotRequired[Nullable[str]]
|
|
25
|
+
status: NotRequired[Nullable[PermitStatus]]
|
|
26
|
+
property_type: NotRequired[Nullable[PropertyType]]
|
|
27
|
+
tag: NotRequired[Nullable[str]]
|
|
28
|
+
filed_after: NotRequired[Nullable[date]]
|
|
29
|
+
filed_before: NotRequired[Nullable[date]]
|
|
30
|
+
issued_after: NotRequired[Nullable[date]]
|
|
31
|
+
issued_before: NotRequired[Nullable[date]]
|
|
32
|
+
min_value: NotRequired[Nullable[float]]
|
|
33
|
+
max_value: NotRequired[Nullable[float]]
|
|
34
|
+
q: NotRequired[Nullable[str]]
|
|
35
|
+
contractor_name: NotRequired[Nullable[str]]
|
|
36
|
+
limit: NotRequired[int]
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class ExportPermitsRequest(BaseModel):
|
|
40
|
+
zip_code: Annotated[
|
|
41
|
+
OptionalNullable[str],
|
|
42
|
+
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
|
|
43
|
+
] = UNSET
|
|
44
|
+
|
|
45
|
+
city: Annotated[
|
|
46
|
+
OptionalNullable[str],
|
|
47
|
+
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
|
|
48
|
+
] = UNSET
|
|
49
|
+
|
|
50
|
+
state: Annotated[
|
|
51
|
+
OptionalNullable[str],
|
|
52
|
+
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
|
|
53
|
+
] = UNSET
|
|
54
|
+
|
|
55
|
+
category: Annotated[
|
|
56
|
+
OptionalNullable[str],
|
|
57
|
+
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
|
|
58
|
+
] = UNSET
|
|
59
|
+
|
|
60
|
+
status: Annotated[
|
|
61
|
+
OptionalNullable[PermitStatus],
|
|
62
|
+
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
|
|
63
|
+
] = UNSET
|
|
64
|
+
|
|
65
|
+
property_type: Annotated[
|
|
66
|
+
OptionalNullable[PropertyType],
|
|
67
|
+
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
|
|
68
|
+
] = UNSET
|
|
69
|
+
|
|
70
|
+
tag: Annotated[
|
|
71
|
+
OptionalNullable[str],
|
|
72
|
+
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
|
|
73
|
+
] = UNSET
|
|
74
|
+
|
|
75
|
+
filed_after: Annotated[
|
|
76
|
+
OptionalNullable[date],
|
|
77
|
+
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
|
|
78
|
+
] = UNSET
|
|
79
|
+
|
|
80
|
+
filed_before: Annotated[
|
|
81
|
+
OptionalNullable[date],
|
|
82
|
+
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
|
|
83
|
+
] = UNSET
|
|
84
|
+
|
|
85
|
+
issued_after: Annotated[
|
|
86
|
+
OptionalNullable[date],
|
|
87
|
+
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
|
|
88
|
+
] = UNSET
|
|
89
|
+
|
|
90
|
+
issued_before: Annotated[
|
|
91
|
+
OptionalNullable[date],
|
|
92
|
+
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
|
|
93
|
+
] = UNSET
|
|
94
|
+
|
|
95
|
+
min_value: Annotated[
|
|
96
|
+
OptionalNullable[float],
|
|
97
|
+
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
|
|
98
|
+
] = UNSET
|
|
99
|
+
|
|
100
|
+
max_value: Annotated[
|
|
101
|
+
OptionalNullable[float],
|
|
102
|
+
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
|
|
103
|
+
] = UNSET
|
|
104
|
+
|
|
105
|
+
q: Annotated[
|
|
106
|
+
OptionalNullable[str],
|
|
107
|
+
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
|
|
108
|
+
] = UNSET
|
|
109
|
+
|
|
110
|
+
contractor_name: Annotated[
|
|
111
|
+
OptionalNullable[str],
|
|
112
|
+
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
|
|
113
|
+
] = UNSET
|
|
114
|
+
|
|
115
|
+
limit: Annotated[
|
|
116
|
+
Optional[int],
|
|
117
|
+
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
|
|
118
|
+
] = 1000
|
|
119
|
+
|
|
120
|
+
@model_serializer(mode="wrap")
|
|
121
|
+
def serialize_model(self, handler):
|
|
122
|
+
optional_fields = set(
|
|
123
|
+
[
|
|
124
|
+
"zip_code",
|
|
125
|
+
"city",
|
|
126
|
+
"state",
|
|
127
|
+
"category",
|
|
128
|
+
"status",
|
|
129
|
+
"property_type",
|
|
130
|
+
"tag",
|
|
131
|
+
"filed_after",
|
|
132
|
+
"filed_before",
|
|
133
|
+
"issued_after",
|
|
134
|
+
"issued_before",
|
|
135
|
+
"min_value",
|
|
136
|
+
"max_value",
|
|
137
|
+
"q",
|
|
138
|
+
"contractor_name",
|
|
139
|
+
"limit",
|
|
140
|
+
]
|
|
141
|
+
)
|
|
142
|
+
nullable_fields = set(
|
|
143
|
+
[
|
|
144
|
+
"zip_code",
|
|
145
|
+
"city",
|
|
146
|
+
"state",
|
|
147
|
+
"category",
|
|
148
|
+
"status",
|
|
149
|
+
"property_type",
|
|
150
|
+
"tag",
|
|
151
|
+
"filed_after",
|
|
152
|
+
"filed_before",
|
|
153
|
+
"issued_after",
|
|
154
|
+
"issued_before",
|
|
155
|
+
"min_value",
|
|
156
|
+
"max_value",
|
|
157
|
+
"q",
|
|
158
|
+
"contractor_name",
|
|
159
|
+
]
|
|
160
|
+
)
|
|
161
|
+
serialized = handler(self)
|
|
162
|
+
m = {}
|
|
163
|
+
|
|
164
|
+
for n, f in type(self).model_fields.items():
|
|
165
|
+
k = f.alias or n
|
|
166
|
+
val = serialized.get(k, serialized.get(n))
|
|
167
|
+
is_nullable_and_explicitly_set = (
|
|
168
|
+
k in nullable_fields
|
|
169
|
+
and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
if val != UNSET_SENTINEL:
|
|
173
|
+
if (
|
|
174
|
+
val is not None
|
|
175
|
+
or k not in optional_fields
|
|
176
|
+
or is_nullable_and_explicitly_set
|
|
177
|
+
):
|
|
178
|
+
m[k] = val
|
|
179
|
+
|
|
180
|
+
return m
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
from permitstack.types import BaseModel
|
|
5
|
+
from permitstack.utils import FieldMetadata, PathParamMetadata
|
|
6
|
+
from typing_extensions import Annotated, TypedDict
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class GetWebhookSecretRequestTypedDict(TypedDict):
|
|
10
|
+
webhook_id: str
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class GetWebhookSecretRequest(BaseModel):
|
|
14
|
+
webhook_id: Annotated[
|
|
15
|
+
str, FieldMetadata(path=PathParamMetadata(style="simple", explode=False))
|
|
16
|
+
]
|