internetdata 2.7.2__tar.gz → 2.7.4__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.
- {internetdata-2.7.2 → internetdata-2.7.4}/PKG-INFO +1 -1
- {internetdata-2.7.2 → internetdata-2.7.4}/spec/openapi.yaml +15 -18
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/__init__.py +1 -1
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_core.py +13 -7
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/api/database_v_2/list_databases.py +0 -4
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/api/organization/account_org_members.py +4 -4
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/account_create_apikey_request.py +1 -1
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/apikey_detail.py +1 -1
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/database.py +6 -7
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/database_metadata.py +1 -3
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/download.py +1 -3
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/models.py +5 -6
- {internetdata-2.7.2 → internetdata-2.7.4}/tests/test_conformance.py +36 -4
- {internetdata-2.7.2 → internetdata-2.7.4}/.gitignore +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/LICENSE +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/README.md +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/pyproject.toml +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/scripts/download-spec.sh +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/scripts/generate.sh +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/scripts/publish.sh +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/scripts/v2_subset.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/__init__.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/api/__init__.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/api/account/__init__.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/api/account/account_identity.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/api/api_keys/__init__.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/api/api_keys/account_create_apikey.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/api/api_keys/account_list_apikeys.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/api/api_keys/account_reveal_apikey.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/api/api_keys/account_revoke_apikey.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/api/api_keys/account_rotate_apikey.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/api/authorization/__init__.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/api/authorization/oauth_authorize.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/api/authorization/oauth_device_authorization.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/api/authorization/oauth_metadata.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/api/authorization/oauth_revoke.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/api/authorization/oauth_token.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/api/database_v_2/__init__.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/api/database_v_2/database_checksum_v2.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/api/database_v_2/database_metadata_v2.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/api/database_v_2/download_database_v2.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/api/database_v_2/list_downloads.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/api/organization/__init__.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/api/organization/account_org.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/client.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/errors.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/__init__.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/account_created_apikey.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/account_org.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/account_org_ref.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/account_org_wrap.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/account_rc.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/account_revealed_apikey.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/account_user.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/apikey_list.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/database_checksum_v2_response_200.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/database_format.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/database_license_type_type_1.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/database_license_type_type_2_type_1.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/database_license_type_type_3_type_1.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/database_metadata_column.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/database_metadata_sample.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/database_metadata_sample_additional_property_item.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/database_metadata_sample_size.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/database_metadata_schema.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/database_metadata_size.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/database_version.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/db_checksums.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/device_authorization.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/device_authorization_request.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/download_outcome.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/error.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/identity.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/list_databases_response_200.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/list_downloads_response_200.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/oauth_authorize_code_challenge_method.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/oauth_authorize_response_type.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/oauth_error.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/oauth_metadata.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/oauth_revoke_response_200.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/revoke_request.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/standing.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/token_request.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/token_response.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/types.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/aio.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/client.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/errors.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/py.typed +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/testdata/testdata.json +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/tests/conftest.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/tests/helpers.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/tests/test_client.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/tests/test_download.py +0 -0
- {internetdata-2.7.2 → internetdata-2.7.4}/tests/test_oauth.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: internetdata
|
|
3
|
-
Version: 2.7.
|
|
3
|
+
Version: 2.7.4
|
|
4
4
|
Summary: Official Python client library for the InternetData API. Download and verify licensed IP datasets.
|
|
5
5
|
Project-URL: Homepage, https://internetdata.io
|
|
6
6
|
Project-URL: Documentation, https://docs.internetdata.io
|
|
@@ -12,7 +12,7 @@ info:
|
|
|
12
12
|
email: support@internetdata.io
|
|
13
13
|
url: https://internetdata.io
|
|
14
14
|
termsOfService: https://internetdata.io/terms
|
|
15
|
-
version: 2026.10.
|
|
15
|
+
version: 2026.10.15
|
|
16
16
|
servers:
|
|
17
17
|
- url: https://internetdata.io
|
|
18
18
|
tags:
|
|
@@ -29,8 +29,9 @@ tags:
|
|
|
29
29
|
|
|
30
30
|
Access is granted by CONTRACT, one dataset family at a time: there is no
|
|
31
31
|
self-service purchase and no subscription behind it. The Open databases
|
|
32
|
-
are
|
|
33
|
-
|
|
32
|
+
are licensed to every organization from the start, a `standard` license
|
|
33
|
+
to each, and are free under CC BY-SA 4.0 besides. `list` marks them
|
|
34
|
+
`open`.
|
|
34
35
|
|
|
35
36
|
A successful download answers `302` with a time-limited URL pointing
|
|
36
37
|
straight at object storage. Follow the redirect (`curl -L`); the link
|
|
@@ -60,7 +61,6 @@ paths:
|
|
|
60
61
|
The whole published catalog, with your organization's license beside
|
|
61
62
|
each entry, so `standing` says whether a database is yours today
|
|
62
63
|
(`licensed`), was (`expired`), or has never been bought (`unlicensed`).
|
|
63
|
-
An `open` database downloads whatever its `standing`.
|
|
64
64
|
security:
|
|
65
65
|
- ApiKeyQueryAuth: []
|
|
66
66
|
- ApiKeyHeaderAuth: []
|
|
@@ -416,7 +416,7 @@ paths:
|
|
|
416
416
|
summary: Members
|
|
417
417
|
description: |
|
|
418
418
|
Read-only. Adding or removing a member is an invitation flow with email
|
|
419
|
-
in the middle rather than a POST, and
|
|
419
|
+
in the middle rather than a POST, and modeling it as one here would
|
|
420
420
|
promise something this API does not do.
|
|
421
421
|
security:
|
|
422
422
|
- BearerAuth:
|
|
@@ -902,8 +902,7 @@ components:
|
|
|
902
902
|
description: |
|
|
903
903
|
Where your license for a database family stands today. `licensed` is a
|
|
904
904
|
live grant, `expired` one whose term has ended, and `unlicensed` a
|
|
905
|
-
database published but never bought.
|
|
906
|
-
downloads whatever this says.
|
|
905
|
+
database published but never bought.
|
|
907
906
|
enum:
|
|
908
907
|
- licensed
|
|
909
908
|
- expired
|
|
@@ -942,11 +941,11 @@ components:
|
|
|
942
941
|
open:
|
|
943
942
|
type: boolean
|
|
944
943
|
description: |
|
|
945
|
-
An Open database:
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
944
|
+
An Open database: free under CC BY-SA 4.0 (credit InternetData,
|
|
945
|
+
https://internetdata.io, and share what you build from it under
|
|
946
|
+
the same license). Every organization holds a `standard` license
|
|
947
|
+
to it from the start, which `standing` and `license_type` report
|
|
948
|
+
like any other.
|
|
950
949
|
license_type:
|
|
951
950
|
type: string
|
|
952
951
|
nullable: true
|
|
@@ -1056,9 +1055,7 @@ components:
|
|
|
1056
1055
|
open:
|
|
1057
1056
|
type: boolean
|
|
1058
1057
|
description: |
|
|
1059
|
-
|
|
1060
|
-
Open database downloaded while your organization held no license
|
|
1061
|
-
in term for it.
|
|
1058
|
+
A download of an Open database.
|
|
1062
1059
|
bytes:
|
|
1063
1060
|
type: integer
|
|
1064
1061
|
format: int64
|
|
@@ -1368,7 +1365,7 @@ components:
|
|
|
1368
1365
|
type: string
|
|
1369
1366
|
key_prefix:
|
|
1370
1367
|
type: string
|
|
1371
|
-
description: The leading, non-secret part, so a key is
|
|
1368
|
+
description: The leading, non-secret part, so a key is recognizable without storing it.
|
|
1372
1369
|
created:
|
|
1373
1370
|
type: string
|
|
1374
1371
|
format: date-time
|
|
@@ -1408,7 +1405,7 @@ components:
|
|
|
1408
1405
|
properties:
|
|
1409
1406
|
name:
|
|
1410
1407
|
type: string
|
|
1411
|
-
description: A label you will
|
|
1408
|
+
description: A label you will recognize later. Shown wherever the key is listed.
|
|
1412
1409
|
allowed_scopes:
|
|
1413
1410
|
type: array
|
|
1414
1411
|
items:
|
|
@@ -1647,7 +1644,7 @@ components:
|
|
|
1647
1644
|
V2NotLicensed:
|
|
1648
1645
|
description: |
|
|
1649
1646
|
Your organization holds no license for this database, or its term has
|
|
1650
|
-
ended.
|
|
1647
|
+
ended.
|
|
1651
1648
|
`rc`: `NOT_LICENSED`, `LICENSE_EXPIRED`.
|
|
1652
1649
|
content:
|
|
1653
1650
|
application/json:
|
|
@@ -81,6 +81,11 @@ def build_client(
|
|
|
81
81
|
the `Authorization` header when it CONSTRUCTS the httpx client itself.
|
|
82
82
|
"""
|
|
83
83
|
api_key = check_api_key(api_key)
|
|
84
|
+
# httpx drops one trailing slash when it joins a path onto the base URL and keeps the
|
|
85
|
+
# rest, so a second or third reached the API as `//api/v2/database/list`, which prod
|
|
86
|
+
# answers with a redirect this client does not follow: every call failed (2.7.3,
|
|
87
|
+
# measured 2026-10-16).
|
|
88
|
+
base_url = base_url.rstrip("/")
|
|
84
89
|
httpx_args: dict[str, Any] = {}
|
|
85
90
|
if transport is not None:
|
|
86
91
|
httpx_args["transport"] = transport
|
|
@@ -135,19 +140,20 @@ def build_async_transfer_client(
|
|
|
135
140
|
def check_api_key(api_key: str | None) -> str | None:
|
|
136
141
|
"""`api_key` without the blanks around it, or None when nothing else is left.
|
|
137
142
|
|
|
138
|
-
Refused where it is SET when a control character remains
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
+
Refused where it is SET when a control character remains, or a character outside
|
|
144
|
+
ASCII, which httpx cannot put in a header: a CR, LF or NUL failed every call as a
|
|
145
|
+
retried `network` error with nothing sent, a C1 control or any other non-ASCII
|
|
146
|
+
character as a raw `UnicodeEncodeError` (2.7.3, measured 2026-10-16), while a tab or
|
|
147
|
+
DEL went out on the wire. Untrimmed, a key of blanks was sent as one rather than as no
|
|
148
|
+
key, and failed every call the same way (2.7.1, measured 2026-10-12).
|
|
143
149
|
"""
|
|
144
150
|
if api_key is None:
|
|
145
151
|
return None
|
|
146
152
|
if not isinstance(api_key, str):
|
|
147
153
|
raise TypeError(f"api_key must be a string or None, not {type(api_key).__name__}")
|
|
148
154
|
key = api_key.strip()
|
|
149
|
-
if any(ord(char) < 0x20 or ord(char)
|
|
150
|
-
raise ValueError("api_key holds a control character")
|
|
155
|
+
if any(ord(char) < 0x20 or ord(char) >= 0x7F for char in key):
|
|
156
|
+
raise ValueError("api_key holds a control character or one outside ASCII")
|
|
151
157
|
return key or None
|
|
152
158
|
|
|
153
159
|
|
|
@@ -59,7 +59,6 @@ def sync_detailed(
|
|
|
59
59
|
The whole published catalog, with your organization's license beside
|
|
60
60
|
each entry, so `standing` says whether a database is yours today
|
|
61
61
|
(`licensed`), was (`expired`), or has never been bought (`unlicensed`).
|
|
62
|
-
An `open` database downloads whatever its `standing`.
|
|
63
62
|
|
|
64
63
|
Raises:
|
|
65
64
|
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
|
|
@@ -87,7 +86,6 @@ def sync(
|
|
|
87
86
|
The whole published catalog, with your organization's license beside
|
|
88
87
|
each entry, so `standing` says whether a database is yours today
|
|
89
88
|
(`licensed`), was (`expired`), or has never been bought (`unlicensed`).
|
|
90
|
-
An `open` database downloads whatever its `standing`.
|
|
91
89
|
|
|
92
90
|
Raises:
|
|
93
91
|
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
|
|
@@ -111,7 +109,6 @@ async def asyncio_detailed(
|
|
|
111
109
|
The whole published catalog, with your organization's license beside
|
|
112
110
|
each entry, so `standing` says whether a database is yours today
|
|
113
111
|
(`licensed`), was (`expired`), or has never been bought (`unlicensed`).
|
|
114
|
-
An `open` database downloads whatever its `standing`.
|
|
115
112
|
|
|
116
113
|
Raises:
|
|
117
114
|
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
|
|
@@ -137,7 +134,6 @@ async def asyncio(
|
|
|
137
134
|
The whole published catalog, with your organization's license beside
|
|
138
135
|
each entry, so `standing` says whether a database is yours today
|
|
139
136
|
(`licensed`), was (`expired`), or has never been bought (`unlicensed`).
|
|
140
|
-
An `open` database downloads whatever its `standing`.
|
|
141
137
|
|
|
142
138
|
Raises:
|
|
143
139
|
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
|
|
@@ -61,7 +61,7 @@ def sync_detailed(
|
|
|
61
61
|
"""Members
|
|
62
62
|
|
|
63
63
|
Read-only. Adding or removing a member is an invitation flow with email
|
|
64
|
-
in the middle rather than a POST, and
|
|
64
|
+
in the middle rather than a POST, and modeling it as one here would
|
|
65
65
|
promise something this API does not do.
|
|
66
66
|
|
|
67
67
|
Raises:
|
|
@@ -88,7 +88,7 @@ def sync(
|
|
|
88
88
|
"""Members
|
|
89
89
|
|
|
90
90
|
Read-only. Adding or removing a member is an invitation flow with email
|
|
91
|
-
in the middle rather than a POST, and
|
|
91
|
+
in the middle rather than a POST, and modeling it as one here would
|
|
92
92
|
promise something this API does not do.
|
|
93
93
|
|
|
94
94
|
Raises:
|
|
@@ -111,7 +111,7 @@ async def asyncio_detailed(
|
|
|
111
111
|
"""Members
|
|
112
112
|
|
|
113
113
|
Read-only. Adding or removing a member is an invitation flow with email
|
|
114
|
-
in the middle rather than a POST, and
|
|
114
|
+
in the middle rather than a POST, and modeling it as one here would
|
|
115
115
|
promise something this API does not do.
|
|
116
116
|
|
|
117
117
|
Raises:
|
|
@@ -136,7 +136,7 @@ async def asyncio(
|
|
|
136
136
|
"""Members
|
|
137
137
|
|
|
138
138
|
Read-only. Adding or removing a member is an invitation flow with email
|
|
139
|
-
in the middle rather than a POST, and
|
|
139
|
+
in the middle rather than a POST, and modeling it as one here would
|
|
140
140
|
promise something this API does not do.
|
|
141
141
|
|
|
142
142
|
Raises:
|
|
@@ -15,7 +15,7 @@ T = TypeVar("T", bound="AccountCreateApikeyRequest")
|
|
|
15
15
|
class AccountCreateApikeyRequest:
|
|
16
16
|
"""
|
|
17
17
|
Attributes:
|
|
18
|
-
name (str): A label you will
|
|
18
|
+
name (str): A label you will recognize later. Shown wherever the key is listed.
|
|
19
19
|
allowed_scopes (list[str] | Unset): What the new key may do. Omit for a key that carries no named scope, which
|
|
20
20
|
is the safe default.
|
|
21
21
|
"""
|
{internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/apikey_detail.py
RENAMED
|
@@ -20,7 +20,7 @@ class ApikeyDetail:
|
|
|
20
20
|
Attributes:
|
|
21
21
|
id (UUID):
|
|
22
22
|
name (str):
|
|
23
|
-
key_prefix (str): The leading, non-secret part, so a key is
|
|
23
|
+
key_prefix (str): The leading, non-secret part, so a key is recognizable without storing it.
|
|
24
24
|
created (datetime.datetime):
|
|
25
25
|
expires (datetime.datetime | None | Unset):
|
|
26
26
|
last_used_at (datetime.datetime | None | Unset):
|
|
@@ -31,13 +31,12 @@ class Database:
|
|
|
31
31
|
summary (str): One line on what the newest version contains.
|
|
32
32
|
standing (Standing): Where your license for a database family stands today. `licensed` is a
|
|
33
33
|
live grant, `expired` one whose term has ended, and `unlicensed` a
|
|
34
|
-
database published but never bought.
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
own license, which grants more where you hold one.
|
|
34
|
+
database published but never bought.
|
|
35
|
+
open_ (bool): An Open database: free under CC BY-SA 4.0 (credit InternetData,
|
|
36
|
+
https://internetdata.io, and share what you build from it under
|
|
37
|
+
the same license). Every organization holds a `standard` license
|
|
38
|
+
to it from the start, which `standing` and `license_type` report
|
|
39
|
+
like any other.
|
|
41
40
|
license_type (DatabaseLicenseTypeType1 | DatabaseLicenseTypeType2Type1 | DatabaseLicenseTypeType3Type1 | None):
|
|
42
41
|
What your license permits you to do with the data. Null when there
|
|
43
42
|
is no license, which is every family with standing `unlicensed`.
|
{internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/database_metadata.py
RENAMED
|
@@ -95,9 +95,7 @@ class DatabaseMetadata:
|
|
|
95
95
|
@classmethod
|
|
96
96
|
def from_dict(cls, src_dict: Mapping[str, Any]) -> Self:
|
|
97
97
|
from ..models.database_metadata_sample import DatabaseMetadataSample
|
|
98
|
-
from ..models.database_metadata_sample_size import
|
|
99
|
-
DatabaseMetadataSampleSize,
|
|
100
|
-
)
|
|
98
|
+
from ..models.database_metadata_sample_size import DatabaseMetadataSampleSize
|
|
101
99
|
from ..models.database_metadata_schema import DatabaseMetadataSchema
|
|
102
100
|
from ..models.database_metadata_size import DatabaseMetadataSize
|
|
103
101
|
|
|
@@ -21,9 +21,7 @@ class Download:
|
|
|
21
21
|
format_ (str):
|
|
22
22
|
outcome (DownloadOutcome):
|
|
23
23
|
sample (bool): The evaluation sample rather than the database itself.
|
|
24
|
-
open_ (bool):
|
|
25
|
-
Open database downloaded while your organization held no license
|
|
26
|
-
in term for it.
|
|
24
|
+
open_ (bool): A download of an Open database.
|
|
27
25
|
bytes_ (int | None): Object size at redirect time, NOT bytes delivered: the transfer is a
|
|
28
26
|
presigned redirect straight to object storage, so we never observe
|
|
29
27
|
how much of it was taken.
|
|
@@ -86,9 +86,9 @@ class Database:
|
|
|
86
86
|
"""One database FAMILY, with your organization's license beside it.
|
|
87
87
|
|
|
88
88
|
A family your organization has never licensed is still listed, with `standing` set to
|
|
89
|
-
`unlicensed`, so you can see what else exists. One that is `open`
|
|
90
|
-
|
|
91
|
-
|
|
89
|
+
`unlicensed`, so you can see what else exists. One that is `open` is free under
|
|
90
|
+
CC BY-SA 4.0, and every organization holds a `standard` license to it from the start,
|
|
91
|
+
which `standing` and `license_type` report like any other.
|
|
92
92
|
|
|
93
93
|
A rolling license carries `renews_at`, when it next renews, and `notice_due_at`, the
|
|
94
94
|
last day notice of non-renewal can be given for the term ending then. Both are None
|
|
@@ -167,9 +167,8 @@ class Download:
|
|
|
167
167
|
# with a default, so a Download built by hand before 2.5.0 still builds; the parser
|
|
168
168
|
# always sets it.
|
|
169
169
|
sample: bool = field(default=False, kw_only=True)
|
|
170
|
-
#
|
|
171
|
-
#
|
|
172
|
-
# with a default, so a Download built by hand before 2.7.0 still builds.
|
|
170
|
+
# A download of an Open database. Keyword-only with a default, so a Download built
|
|
171
|
+
# by hand before 2.7.0 still builds.
|
|
173
172
|
open: bool = field(default=False, kw_only=True)
|
|
174
173
|
|
|
175
174
|
|
|
@@ -274,12 +274,44 @@ def test_the_api_key_is_trimmed(make_client: ClientFactory) -> None:
|
|
|
274
274
|
|
|
275
275
|
|
|
276
276
|
@pytest.mark.parametrize(
|
|
277
|
-
"api_key", ["key\r\nX-Injected: 1", "ke\ty", "key\x00", "key\x7f", "k\ney"]
|
|
277
|
+
"api_key", ["key\r\nX-Injected: 1", "ke\ty", "key\x00", "key\x7f", "k\ney", "k\x85ey", "kéy"]
|
|
278
278
|
)
|
|
279
|
-
def
|
|
279
|
+
def test_a_control_character_or_one_outside_ascii_is_refused_where_the_key_is_set(
|
|
280
280
|
make_client: ClientFactory, api_key: str
|
|
281
281
|
) -> None:
|
|
282
282
|
"""Accepted, a CR, LF or NUL failed every call as a retried network error with nothing
|
|
283
|
-
sent, and a tab or DEL went out on the wire inside the header (2.7.1).
|
|
284
|
-
with
|
|
283
|
+
sent, and a tab or DEL went out on the wire inside the header (2.7.1). A C1 control or
|
|
284
|
+
any other character outside ASCII failed every call with a raw UnicodeEncodeError and
|
|
285
|
+
nothing sent, since httpx encodes a header value as ASCII (2.7.3)."""
|
|
286
|
+
with pytest.raises(ValueError, match="control character or one outside ASCII"):
|
|
285
287
|
make_client(api_key=api_key)
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
@pytest.mark.parametrize("slashes", [1, 2, 3])
|
|
291
|
+
def test_every_trailing_slash_on_the_base_url_is_dropped(
|
|
292
|
+
make_client: ClientFactory, slashes: int
|
|
293
|
+
) -> None:
|
|
294
|
+
"""httpx drops one when it joins a path on and keeps the rest, so through 2.7.3 a
|
|
295
|
+
second reached the API as `//api/v2/database/list`, which prod answers with a
|
|
296
|
+
redirect this client does not follow."""
|
|
297
|
+
digests = {"md5": "m", "sha1": "s1", "sha256": "s256", "sha512": "s512"}
|
|
298
|
+
stub = Stub(
|
|
299
|
+
{
|
|
300
|
+
LIST_PATH: {"body": {"databases": []}},
|
|
301
|
+
CHECKSUM_PATH: {"body": {"id": "bogon_ip_v1", "format": "csvgz", "checksums": digests}},
|
|
302
|
+
"/.well-known/oauth-authorization-server": {
|
|
303
|
+
"body": {
|
|
304
|
+
"issuer": "https://api.example",
|
|
305
|
+
"authorization_endpoint": "https://api.example/oauth/authorize",
|
|
306
|
+
"token_endpoint": "https://api.example/oauth/token",
|
|
307
|
+
}
|
|
308
|
+
},
|
|
309
|
+
}
|
|
310
|
+
)
|
|
311
|
+
client = make_client(transport=stub.transport, base_url="https://api.example" + "/" * slashes)
|
|
312
|
+
|
|
313
|
+
client.database.list()
|
|
314
|
+
client.database.checksums("bogon_ip_v1", "csvgz")
|
|
315
|
+
client.oauth.metadata()
|
|
316
|
+
|
|
317
|
+
assert stub.paths() == [LIST_PATH, CHECKSUM_PATH, "/.well-known/oauth-authorization-server"]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/api/account/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/api/api_keys/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/api/authorization/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/api/database_v_2/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/api/organization/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/account_org_ref.py
RENAMED
|
File without changes
|
{internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/account_org_wrap.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/account_user.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/database_format.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/database_version.py
RENAMED
|
File without changes
|
{internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/db_checksums.py
RENAMED
|
File without changes
|
{internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/device_authorization.py
RENAMED
|
File without changes
|
|
File without changes
|
{internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/download_outcome.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/oauth_metadata.py
RENAMED
|
File without changes
|
|
File without changes
|
{internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/revoke_request.py
RENAMED
|
File without changes
|
|
File without changes
|
{internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/token_request.py
RENAMED
|
File without changes
|
{internetdata-2.7.2 → internetdata-2.7.4}/src/internetdata/_generated/models/token_response.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|