internetdata 2.9.3__tar.gz → 2.9.5__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.
Files changed (98) hide show
  1. {internetdata-2.9.3 → internetdata-2.9.5}/PKG-INFO +2 -2
  2. {internetdata-2.9.3 → internetdata-2.9.5}/README.md +1 -1
  3. {internetdata-2.9.3 → internetdata-2.9.5}/spec/openapi.yaml +32 -9
  4. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/__init__.py +1 -1
  5. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/api/api_keys/account_rotate_apikey.py +4 -4
  6. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/api/database_v_2/download_database_v2.py +21 -1
  7. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/database.py +1 -1
  8. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/database_version.py +2 -2
  9. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/client.py +1 -1
  10. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/errors.py +1 -1
  11. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/models.py +1 -1
  12. {internetdata-2.9.3 → internetdata-2.9.5}/testdata/testdata.json +1 -1
  13. {internetdata-2.9.3 → internetdata-2.9.5}/tests/test_conformance.py +1 -1
  14. {internetdata-2.9.3 → internetdata-2.9.5}/.gitignore +0 -0
  15. {internetdata-2.9.3 → internetdata-2.9.5}/LICENSE +0 -0
  16. {internetdata-2.9.3 → internetdata-2.9.5}/pyproject.toml +0 -0
  17. {internetdata-2.9.3 → internetdata-2.9.5}/scripts/download-spec.sh +0 -0
  18. {internetdata-2.9.3 → internetdata-2.9.5}/scripts/generate.sh +0 -0
  19. {internetdata-2.9.3 → internetdata-2.9.5}/scripts/publish.sh +0 -0
  20. {internetdata-2.9.3 → internetdata-2.9.5}/scripts/v2_subset.py +0 -0
  21. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_core.py +0 -0
  22. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/__init__.py +0 -0
  23. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/api/__init__.py +0 -0
  24. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/api/account/__init__.py +0 -0
  25. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/api/account/account_identity.py +0 -0
  26. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/api/api_keys/__init__.py +0 -0
  27. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/api/api_keys/account_create_apikey.py +0 -0
  28. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/api/api_keys/account_list_apikeys.py +0 -0
  29. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/api/api_keys/account_reveal_apikey.py +0 -0
  30. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/api/api_keys/account_revoke_apikey.py +0 -0
  31. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/api/authorization/__init__.py +0 -0
  32. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/api/authorization/oauth_authorize.py +0 -0
  33. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/api/authorization/oauth_device_authorization.py +0 -0
  34. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/api/authorization/oauth_metadata.py +0 -0
  35. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/api/authorization/oauth_register.py +0 -0
  36. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/api/authorization/oauth_revoke.py +0 -0
  37. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/api/authorization/oauth_token.py +0 -0
  38. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/api/database_v_2/__init__.py +0 -0
  39. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/api/database_v_2/database_checksum_v2.py +0 -0
  40. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/api/database_v_2/database_metadata_v2.py +0 -0
  41. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/api/database_v_2/list_databases.py +0 -0
  42. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/api/database_v_2/list_downloads.py +0 -0
  43. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/api/organization/__init__.py +0 -0
  44. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/api/organization/account_org.py +0 -0
  45. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/api/organization/account_org_members.py +0 -0
  46. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/client.py +0 -0
  47. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/errors.py +0 -0
  48. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/__init__.py +0 -0
  49. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/account_create_apikey_request.py +0 -0
  50. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/account_created_apikey.py +0 -0
  51. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/account_org.py +0 -0
  52. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/account_org_ref.py +0 -0
  53. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/account_org_wrap.py +0 -0
  54. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/account_rc.py +0 -0
  55. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/account_revealed_apikey.py +0 -0
  56. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/account_user.py +0 -0
  57. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/apikey_detail.py +0 -0
  58. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/apikey_list.py +0 -0
  59. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/client_registration.py +0 -0
  60. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/client_registration_request.py +0 -0
  61. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/database_checksum_v2_response_200.py +0 -0
  62. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/database_format.py +0 -0
  63. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/database_license_type_type_1.py +0 -0
  64. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/database_license_type_type_2_type_1.py +0 -0
  65. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/database_license_type_type_3_type_1.py +0 -0
  66. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/database_metadata.py +0 -0
  67. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/database_metadata_column.py +0 -0
  68. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/database_metadata_sample.py +0 -0
  69. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/database_metadata_sample_additional_property_item.py +0 -0
  70. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/database_metadata_sample_size.py +0 -0
  71. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/database_metadata_schema.py +0 -0
  72. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/database_metadata_size.py +0 -0
  73. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/db_checksums.py +0 -0
  74. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/device_authorization.py +0 -0
  75. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/device_authorization_request.py +0 -0
  76. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/download.py +0 -0
  77. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/download_outcome.py +0 -0
  78. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/error.py +0 -0
  79. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/identity.py +0 -0
  80. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/list_databases_response_200.py +0 -0
  81. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/list_downloads_response_200.py +0 -0
  82. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/oauth_authorize_code_challenge_method.py +0 -0
  83. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/oauth_authorize_response_type.py +0 -0
  84. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/oauth_error.py +0 -0
  85. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/oauth_metadata.py +0 -0
  86. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/oauth_revoke_response_200.py +0 -0
  87. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/revoke_request.py +0 -0
  88. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/standing.py +0 -0
  89. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/token_request.py +0 -0
  90. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/models/token_response.py +0 -0
  91. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/_generated/types.py +0 -0
  92. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/aio.py +0 -0
  93. {internetdata-2.9.3 → internetdata-2.9.5}/src/internetdata/py.typed +0 -0
  94. {internetdata-2.9.3 → internetdata-2.9.5}/tests/conftest.py +0 -0
  95. {internetdata-2.9.3 → internetdata-2.9.5}/tests/helpers.py +0 -0
  96. {internetdata-2.9.3 → internetdata-2.9.5}/tests/test_client.py +0 -0
  97. {internetdata-2.9.3 → internetdata-2.9.5}/tests/test_download.py +0 -0
  98. {internetdata-2.9.3 → internetdata-2.9.5}/tests/test_oauth.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: internetdata
3
- Version: 2.9.3
3
+ Version: 2.9.5
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
@@ -72,7 +72,7 @@ with InternetData(api_key) as client:
72
72
 
73
73
  ### The catalog
74
74
 
75
- `list` answers database FAMILIES. A license is held against a family, while a download names a specific version, so the ids the other calls take come from each family's `versions`:
75
+ `list` answers database FAMILIES. A license is held against a family, while a download names a specific version, so the IDs the other calls take come from each family's `versions`:
76
76
 
77
77
  ```python
78
78
  for family in client.database.list():
@@ -38,7 +38,7 @@ with InternetData(api_key) as client:
38
38
 
39
39
  ### The catalog
40
40
 
41
- `list` answers database FAMILIES. A license is held against a family, while a download names a specific version, so the ids the other calls take come from each family's `versions`:
41
+ `list` answers database FAMILIES. A license is held against a family, while a download names a specific version, so the IDs the other calls take come from each family's `versions`:
42
42
 
43
43
  ```python
44
44
  for family in client.database.list():
@@ -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.21
15
+ version: 2026.11.05
16
16
  servers:
17
17
  - url: https://internetdata.io
18
18
  tags:
@@ -99,6 +99,7 @@ paths:
99
99
  parameters:
100
100
  - $ref: '#/components/parameters/DbId'
101
101
  - $ref: '#/components/parameters/DbFormat'
102
+ - $ref: '#/components/parameters/DbBuild'
102
103
  responses:
103
104
  '302':
104
105
  description: Follow the Location header to object storage.
@@ -107,7 +108,9 @@ paths:
107
108
  schema:
108
109
  type: string
109
110
  '400':
110
- description: The database is not built in the requested format.
111
+ description: |
112
+ The database is not built in the requested format (`INVALID_FORMAT`),
113
+ or `build` is not a build's name (`INVALID_BUILD`).
111
114
  content:
112
115
  application/json:
113
116
  schema:
@@ -118,6 +121,14 @@ paths:
118
121
  $ref: '#/components/responses/V2Forbidden'
119
122
  '404':
120
123
  $ref: '#/components/responses/V2UnknownDatabase'
124
+ '410':
125
+ description: |
126
+ The build named in `build` is no longer kept (`BUILD_GONE`): builds are
127
+ kept 7 days. Download without `build` for the live one.
128
+ content:
129
+ application/json:
130
+ schema:
131
+ $ref: '#/components/schemas/Error'
121
132
  '503':
122
133
  $ref: '#/components/responses/V2NotAvailable'
123
134
  /api/v2/database/metadata:
@@ -506,7 +517,7 @@ paths:
506
517
  - API keys
507
518
  summary: Rotate
508
519
  description: |
509
- Replaces the secret behind a key, keeping its id, name and settings.
520
+ Replaces the secret behind a key, keeping its ID, name and settings.
510
521
  The previous secret stops working immediately. The new secret comes
511
522
  back in the answer, so this needs `apikeys.reveal` as well as
512
523
  `apikeys.manage`.
@@ -890,7 +901,7 @@ components:
890
901
  name: apikey
891
902
  description: |
892
903
  UUID-format API key issued to the customer. Each key is authorized for a
893
- specific set of database ids; requesting any other id returns 403.
904
+ specific set of database IDs; requesting any other ID returns 403.
894
905
 
895
906
  v1 only. The v2 endpoints take a console-issued key as a bearer token.
896
907
  BearerAuth:
@@ -932,11 +943,23 @@ components:
932
943
  description: Database file format.
933
944
  schema:
934
945
  $ref: '#/components/schemas/DatabaseFormat'
946
+ DbBuild:
947
+ name: build
948
+ in: query
949
+ required: false
950
+ description: |
951
+ One build of the database, by the name a `database.updated` webhook gives
952
+ it, so the file is the one whose `sha256` the webhook carries. Without
953
+ it, the build that is live.
954
+ schema:
955
+ type: string
956
+ pattern: ^[0-9]{8}\.[a-z0-9]{6}$
957
+ example: 20261105.0t53s5
935
958
  ApikeyIdParam:
936
959
  name: id
937
960
  in: path
938
961
  required: true
939
- description: The key's id, as returned by the list endpoint. Never the key itself.
962
+ description: The key's ID, as returned by the list endpoint. Never the key itself.
940
963
  schema:
941
964
  type: string
942
965
  format: uuid
@@ -973,7 +996,7 @@ components:
973
996
  description: |
974
997
  One database FAMILY, with your organization's license beside it. A
975
998
  license covers the family, while a download names a specific version,
976
- so the ids passed to `download` and `checksum` come from `versions`.
999
+ so the IDs passed to `download` and `checksum` come from `versions`.
977
1000
  required:
978
1001
  - base
979
1002
  - name
@@ -1061,7 +1084,7 @@ components:
1061
1084
  properties:
1062
1085
  id:
1063
1086
  type: string
1064
- description: The versioned id. Pass this to `download`, `checksum` and `metadata`.
1087
+ description: The versioned ID. Pass this to `download`, `checksum` and `metadata`.
1065
1088
  example: vpn_ip_v1
1066
1089
  version:
1067
1090
  type: integer
@@ -1072,7 +1095,7 @@ components:
1072
1095
  type: array
1073
1096
  description: |
1074
1097
  The formats this version is BUILT in. Asking for another is a 400,
1075
- not a gap - the `_provider` catalogs are keyed by provider id, so no
1098
+ not a gap - the `_provider` catalogs are keyed by provider ID, so no
1076
1099
  MMDB exists for them.
1077
1100
  items:
1078
1101
  $ref: '#/components/schemas/DatabaseFormat'
@@ -1826,7 +1849,7 @@ components:
1826
1849
  schema:
1827
1850
  $ref: '#/components/schemas/DbInvalidApiKeyError'
1828
1851
  Forbidden:
1829
- description: The `apikey` is valid but is not authorized for the requested database id.
1852
+ description: The `apikey` is valid but is not authorized for the requested database ID.
1830
1853
  content:
1831
1854
  application/json:
1832
1855
  schema:
@@ -40,7 +40,7 @@ from .models import (
40
40
  TokenResponse,
41
41
  )
42
42
 
43
- __version__ = "2.9.3"
43
+ __version__ = "2.9.5"
44
44
 
45
45
  __all__ = [
46
46
  "DATABASE_FORMATS",
@@ -73,7 +73,7 @@ def sync_detailed(
73
73
  ) -> Response[AccountCreatedApikey | AccountRc]:
74
74
  """Rotate
75
75
 
76
- Replaces the secret behind a key, keeping its id, name and settings.
76
+ Replaces the secret behind a key, keeping its ID, name and settings.
77
77
  The previous secret stops working immediately. The new secret comes
78
78
  back in the answer, so this needs `apikeys.reveal` as well as
79
79
  `apikeys.manage`.
@@ -107,7 +107,7 @@ def sync(
107
107
  ) -> AccountCreatedApikey | AccountRc | None:
108
108
  """Rotate
109
109
 
110
- Replaces the secret behind a key, keeping its id, name and settings.
110
+ Replaces the secret behind a key, keeping its ID, name and settings.
111
111
  The previous secret stops working immediately. The new secret comes
112
112
  back in the answer, so this needs `apikeys.reveal` as well as
113
113
  `apikeys.manage`.
@@ -136,7 +136,7 @@ async def asyncio_detailed(
136
136
  ) -> Response[AccountCreatedApikey | AccountRc]:
137
137
  """Rotate
138
138
 
139
- Replaces the secret behind a key, keeping its id, name and settings.
139
+ Replaces the secret behind a key, keeping its ID, name and settings.
140
140
  The previous secret stops working immediately. The new secret comes
141
141
  back in the answer, so this needs `apikeys.reveal` as well as
142
142
  `apikeys.manage`.
@@ -168,7 +168,7 @@ async def asyncio(
168
168
  ) -> AccountCreatedApikey | AccountRc | None:
169
169
  """Rotate
170
170
 
171
- Replaces the secret behind a key, keeping its id, name and settings.
171
+ Replaces the secret behind a key, keeping its ID, name and settings.
172
172
  The previous secret stops working immediately. The new secret comes
173
173
  back in the answer, so this needs `apikeys.reveal` as well as
174
174
  `apikeys.manage`.
@@ -7,13 +7,14 @@ from ... import errors
7
7
  from ...client import AuthenticatedClient, Client
8
8
  from ...models.database_format import DatabaseFormat
9
9
  from ...models.error import Error
10
- from ...types import UNSET, Response
10
+ from ...types import UNSET, Response, Unset
11
11
 
12
12
 
13
13
  def _get_kwargs(
14
14
  *,
15
15
  id: str,
16
16
  format_: DatabaseFormat,
17
+ build: str | Unset = UNSET,
17
18
  ) -> dict[str, Any]:
18
19
 
19
20
  params: dict[str, Any] = {}
@@ -23,6 +24,8 @@ def _get_kwargs(
23
24
  json_format_ = format_.value
24
25
  params["format"] = json_format_
25
26
 
27
+ params["build"] = build
28
+
26
29
  params = {k: v for k, v in params.items() if v is not UNSET and v is not None}
27
30
 
28
31
  _kwargs: dict[str, Any] = {
@@ -61,6 +64,11 @@ def _parse_response(
61
64
 
62
65
  return response_404
63
66
 
67
+ if response.status_code == 410:
68
+ response_410 = Error.from_dict(response.json())
69
+
70
+ return response_410
71
+
64
72
  if response.status_code == 503:
65
73
  response_503 = Error.from_dict(response.json())
66
74
 
@@ -88,6 +96,7 @@ def sync_detailed(
88
96
  client: AuthenticatedClient,
89
97
  id: str,
90
98
  format_: DatabaseFormat,
99
+ build: str | Unset = UNSET,
91
100
  ) -> Response[Any | Error]:
92
101
  """Download
93
102
 
@@ -97,6 +106,7 @@ def sync_detailed(
97
106
  Args:
98
107
  id (str): Example: vpn_ip_v1.
99
108
  format_ (DatabaseFormat): A file format a database version is published in. Example: mmdb.
109
+ build (str | Unset): Example: 20261105.0t53s5.
100
110
 
101
111
  Raises:
102
112
  errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
@@ -109,6 +119,7 @@ def sync_detailed(
109
119
  kwargs = _get_kwargs(
110
120
  id=id,
111
121
  format_=format_,
122
+ build=build,
112
123
  )
113
124
 
114
125
  response = client.get_httpx_client().request(
@@ -123,6 +134,7 @@ def sync(
123
134
  client: AuthenticatedClient,
124
135
  id: str,
125
136
  format_: DatabaseFormat,
137
+ build: str | Unset = UNSET,
126
138
  ) -> Any | Error | None:
127
139
  """Download
128
140
 
@@ -132,6 +144,7 @@ def sync(
132
144
  Args:
133
145
  id (str): Example: vpn_ip_v1.
134
146
  format_ (DatabaseFormat): A file format a database version is published in. Example: mmdb.
147
+ build (str | Unset): Example: 20261105.0t53s5.
135
148
 
136
149
  Raises:
137
150
  errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
@@ -145,6 +158,7 @@ def sync(
145
158
  client=client,
146
159
  id=id,
147
160
  format_=format_,
161
+ build=build,
148
162
  ).parsed
149
163
 
150
164
 
@@ -153,6 +167,7 @@ async def asyncio_detailed(
153
167
  client: AuthenticatedClient,
154
168
  id: str,
155
169
  format_: DatabaseFormat,
170
+ build: str | Unset = UNSET,
156
171
  ) -> Response[Any | Error]:
157
172
  """Download
158
173
 
@@ -162,6 +177,7 @@ async def asyncio_detailed(
162
177
  Args:
163
178
  id (str): Example: vpn_ip_v1.
164
179
  format_ (DatabaseFormat): A file format a database version is published in. Example: mmdb.
180
+ build (str | Unset): Example: 20261105.0t53s5.
165
181
 
166
182
  Raises:
167
183
  errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
@@ -174,6 +190,7 @@ async def asyncio_detailed(
174
190
  kwargs = _get_kwargs(
175
191
  id=id,
176
192
  format_=format_,
193
+ build=build,
177
194
  )
178
195
 
179
196
  response = await client.get_async_httpx_client().request(**kwargs)
@@ -186,6 +203,7 @@ async def asyncio(
186
203
  client: AuthenticatedClient,
187
204
  id: str,
188
205
  format_: DatabaseFormat,
206
+ build: str | Unset = UNSET,
189
207
  ) -> Any | Error | None:
190
208
  """Download
191
209
 
@@ -195,6 +213,7 @@ async def asyncio(
195
213
  Args:
196
214
  id (str): Example: vpn_ip_v1.
197
215
  format_ (DatabaseFormat): A file format a database version is published in. Example: mmdb.
216
+ build (str | Unset): Example: 20261105.0t53s5.
198
217
 
199
218
  Raises:
200
219
  errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
@@ -209,5 +228,6 @@ async def asyncio(
209
228
  client=client,
210
229
  id=id,
211
230
  format_=format_,
231
+ build=build,
212
232
  )
213
233
  ).parsed
@@ -23,7 +23,7 @@ T = TypeVar("T", bound="Database")
23
23
  class Database:
24
24
  """One database FAMILY, with your organization's license beside it. A
25
25
  license covers the family, while a download names a specific version,
26
- so the ids passed to `download` and `checksum` come from `versions`.
26
+ so the IDs passed to `download` and `checksum` come from `versions`.
27
27
 
28
28
  Attributes:
29
29
  base (str): The family, e.g. `vpn_ip`. What a license is held against. Example: vpn_ip.
@@ -16,11 +16,11 @@ T = TypeVar("T", bound="DatabaseVersion")
16
16
  class DatabaseVersion:
17
17
  """
18
18
  Attributes:
19
- id (str): The versioned id. Pass this to `download`, `checksum` and `metadata`. Example: vpn_ip_v1.
19
+ id (str): The versioned ID. Pass this to `download`, `checksum` and `metadata`. Example: vpn_ip_v1.
20
20
  version (int): Example: 1.
21
21
  summary (str):
22
22
  formats (list[DatabaseFormat]): The formats this version is BUILT in. Asking for another is a 400,
23
- not a gap - the `_provider` catalogs are keyed by provider id, so no
23
+ not a gap - the `_provider` catalogs are keyed by provider ID, so no
24
24
  MMDB exists for them.
25
25
  sample_formats (list[DatabaseFormat] | Unset): The formats an evaluation sample is published in, if any.
26
26
  """
@@ -184,7 +184,7 @@ class DatabaseApi:
184
184
  for the key you are holding, so a listing held from one key is not an answer for
185
185
  another.
186
186
 
187
- A license covers a FAMILY, while a download names a version, so the ids for the
187
+ A license covers a FAMILY, while a download names a version, so the IDs for the
188
188
  other calls come from each entry's `versions`.
189
189
 
190
190
  `timeout` bounds each attempt at this call alone, in place of the client's.
@@ -128,7 +128,7 @@ def error_from_response(status: int, headers: httpx.Headers, body: Any) -> Inter
128
128
  """Classify a failed response.
129
129
 
130
130
  Everything outside the four named statuses is decided by its RANGE rather than by an
131
- enumerated list, which is the whole point: a 404 from a database id that does not
131
+ enumerated list, which is the whole point: a 404 from a database ID that does not
132
132
  exist has to land on a client error, and mapping 400/401/403/429 and letting the rest
133
133
  fall through to `server_error` retries it twice before failing. Three of the four
134
134
  first SDKs shipped exactly that bug, so the shared corpus pins both 404 shapes.
@@ -39,7 +39,7 @@ Format = Literal["csvgz", "mmdb"]
39
39
 
40
40
  Which of them a given version HAS is `DatabaseVersion.formats`; asking for another is a
41
41
  `bad_request` rather than a gap, because the `_provider` catalogs are keyed by provider
42
- id and no MMDB exists for them.
42
+ ID and no MMDB exists for them.
43
43
  """
44
44
 
45
45
  Standing = Literal["licensed", "expired", "unlicensed"]
@@ -150,7 +150,7 @@
150
150
  "mmdb"
151
151
  ],
152
152
  "visibility": {
153
- "why": "A private family is one built for a single customer. It must be ABSENT from a listing for an org that does not license it, not present with standing 'unlicensed' - the standing field is the discovery surface for public datasets only. The server enforces this; an SDK must not reconstruct a catalog from any other source and must not assume the listing is the same for every key. The private ids are deliberately NOT named here: this corpus is committed into twelve PUBLIC repositories, so naming them would publish the customer relationship the rule exists to keep private.",
153
+ "why": "A private family is one built for a single customer. It must be ABSENT from a listing for an org that does not license it, not present with standing 'unlicensed' - the standing field is the discovery surface for public datasets only. The server enforces this; an SDK must not reconstruct a catalog from any other source and must not assume the listing is the same for every key. The private IDs are deliberately NOT named here: this corpus is committed into twelve PUBLIC repositories, so naming them would publish the customer relationship the rule exists to keep private.",
154
154
  "clientRules": [
155
155
  "listing-is-returned-as-served",
156
156
  "no-catalog-is-compiled-into-the-client",
@@ -168,7 +168,7 @@ def test_the_listing_is_returned_exactly_as_served(make_client: ClientFactory) -
168
168
  def test_no_catalog_is_compiled_into_the_client(make_client: ClientFactory) -> None:
169
169
  """An empty listing must stay empty.
170
170
 
171
- This is the mistake worth guarding: a client that knows the published database ids -
171
+ This is the mistake worth guarding: a client that knows the published database IDs -
172
172
  from a bundled table, an enum, or a merge with anything - would hand back a family the
173
173
  server deliberately withheld, and the leak answers 200 while moving no bytes.
174
174
  """
File without changes
File without changes