From 98c1eeb6eb57ecd7efe8b7fac645ac5eb0facc82 Mon Sep 17 00:00:00 2001 From: stainless-bot Date: Wed, 20 Nov 2024 01:26:24 +0000 Subject: [PATCH] feat(api): introduce bulk operation methods --- .stats.yml | 2 +- api.md | 64 +++- .../api_gateway/discovery/operations.py | 99 +++++- .../api_gateway/operations/operations.py | 83 +++++ .../email_security/settings/domains.py | 91 +++++ src/cloudflare/resources/filters.py | 210 +++++++++++ src/cloudflare/resources/firewall/rules.py | 332 +++++++++++++++++- .../resources/kv/namespaces/__init__.py | 14 - .../resources/kv/namespaces/bulk.py | 314 ----------------- .../resources/kv/namespaces/namespaces.py | 267 ++++++++++++-- .../resources/load_balancers/pools/pools.py | 115 ++++++ .../magic_transit/cf_interconnects.py | 125 ++++++- .../resources/magic_transit/gre_tunnels.py | 123 ++++++- .../resources/magic_transit/ipsec_tunnels.py | 124 +++++++ .../resources/magic_transit/routes.py | 105 +++++- src/cloudflare/resources/rum/rules.py | 131 ++++++- src/cloudflare/types/api_gateway/__init__.py | 1 + .../types/api_gateway/discovery/__init__.py | 2 + .../discovery/operation_bulk_edit_params.py | 24 ++ .../discovery/operation_bulk_edit_response.py | 20 ++ .../operation_bulk_delete_response.py | 17 + .../types/email_security/settings/__init__.py | 1 + .../settings/domain_bulk_delete_response.py | 16 + src/cloudflare/types/filters/__init__.py | 2 + .../filters/filter_bulk_delete_response.py | 10 + .../filters/filter_bulk_update_response.py | 10 + src/cloudflare/types/firewall/__init__.py | 5 + .../firewall/rule_bulk_delete_response.py | 10 + .../types/firewall/rule_bulk_edit_params.py | 14 + .../types/firewall/rule_bulk_edit_response.py | 10 + .../types/firewall/rule_bulk_update_params.py | 14 + .../firewall/rule_bulk_update_response.py | 10 + src/cloudflare/types/kv/__init__.py | 4 + .../types/kv/namespace_bulk_delete_params.py | 15 + ...e.py => namespace_bulk_delete_response.py} | 6 +- ...ams.py => namespace_bulk_update_params.py} | 4 +- ...e.py => namespace_bulk_update_response.py} | 6 +- .../types/kv/namespaces/__init__.py | 3 - .../types/load_balancers/__init__.py | 2 + .../load_balancers/pool_bulk_edit_params.py | 19 + .../load_balancers/pool_bulk_edit_response.py | 10 + .../types/magic_transit/__init__.py | 8 + .../cf_interconnect_bulk_update_params.py | 18 + .../cf_interconnect_bulk_update_response.py | 61 ++++ .../gre_tunnel_bulk_update_params.py | 18 + .../gre_tunnel_bulk_update_response.py | 118 +++++++ .../ipsec_tunnel_bulk_update_params.py | 18 + .../ipsec_tunnel_bulk_update_response.py | 124 +++++++ .../magic_transit/route_bulk_update_params.py | 40 +++ .../route_bulk_update_response.py | 44 +++ src/cloudflare/types/rum/__init__.py | 2 + .../types/rum/rule_bulk_create_params.py | 32 ++ .../types/rum/rule_bulk_create_response.py | 28 ++ .../api_gateway/discovery/test_operations.py | 113 +++++- .../api_gateway/test_operations.py | 77 ++++ .../email_security/settings/test_domains.py | 77 ++++ tests/api_resources/firewall/test_rules.py | 277 +++++++++++++++ .../api_resources/kv/namespaces/test_bulk.py | 224 ------------ tests/api_resources/kv/test_namespaces.py | 214 +++++++++++ .../load_balancers/test_pools.py | 93 +++++ .../magic_transit/test_cf_interconnects.py | 103 ++++++ .../magic_transit/test_gre_tunnels.py | 103 ++++++ .../magic_transit/test_ipsec_tunnels.py | 103 ++++++ .../magic_transit/test_routes.py | 141 ++++++++ tests/api_resources/rum/test_rules.py | 139 +++++++- tests/api_resources/test_filters.py | 174 +++++++++ 66 files changed, 4156 insertions(+), 627 deletions(-) delete mode 100644 src/cloudflare/resources/kv/namespaces/bulk.py create mode 100644 src/cloudflare/types/api_gateway/discovery/operation_bulk_edit_params.py create mode 100644 src/cloudflare/types/api_gateway/discovery/operation_bulk_edit_response.py create mode 100644 src/cloudflare/types/api_gateway/operation_bulk_delete_response.py create mode 100644 src/cloudflare/types/email_security/settings/domain_bulk_delete_response.py create mode 100644 src/cloudflare/types/filters/filter_bulk_delete_response.py create mode 100644 src/cloudflare/types/filters/filter_bulk_update_response.py create mode 100644 src/cloudflare/types/firewall/rule_bulk_delete_response.py create mode 100644 src/cloudflare/types/firewall/rule_bulk_edit_params.py create mode 100644 src/cloudflare/types/firewall/rule_bulk_edit_response.py create mode 100644 src/cloudflare/types/firewall/rule_bulk_update_params.py create mode 100644 src/cloudflare/types/firewall/rule_bulk_update_response.py create mode 100644 src/cloudflare/types/kv/namespace_bulk_delete_params.py rename src/cloudflare/types/kv/{namespaces/bulk_delete_response.py => namespace_bulk_delete_response.py} (74%) rename src/cloudflare/types/kv/{namespaces/bulk_update_params.py => namespace_bulk_update_params.py} (91%) rename src/cloudflare/types/kv/{namespaces/bulk_update_response.py => namespace_bulk_update_response.py} (74%) create mode 100644 src/cloudflare/types/load_balancers/pool_bulk_edit_params.py create mode 100644 src/cloudflare/types/load_balancers/pool_bulk_edit_response.py create mode 100644 src/cloudflare/types/magic_transit/cf_interconnect_bulk_update_params.py create mode 100644 src/cloudflare/types/magic_transit/cf_interconnect_bulk_update_response.py create mode 100644 src/cloudflare/types/magic_transit/gre_tunnel_bulk_update_params.py create mode 100644 src/cloudflare/types/magic_transit/gre_tunnel_bulk_update_response.py create mode 100644 src/cloudflare/types/magic_transit/ipsec_tunnel_bulk_update_params.py create mode 100644 src/cloudflare/types/magic_transit/ipsec_tunnel_bulk_update_response.py create mode 100644 src/cloudflare/types/magic_transit/route_bulk_update_params.py create mode 100644 src/cloudflare/types/magic_transit/route_bulk_update_response.py create mode 100644 src/cloudflare/types/rum/rule_bulk_create_params.py create mode 100644 src/cloudflare/types/rum/rule_bulk_create_response.py delete mode 100644 tests/api_resources/kv/namespaces/test_bulk.py diff --git a/.stats.yml b/.stats.yml index c397995164b..a5a069377cc 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,2 +1,2 @@ -configured_endpoints: 1435 +configured_endpoints: 1449 openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/cloudflare%2Fcloudflare-829ade7062fed63a30accc2a5e1a14c6c26fd4dc003d300d1b25a5416b8b8727.yml diff --git a/api.md b/api.md index a44181e0287..56b3b3898c0 100644 --- a/api.md +++ b/api.md @@ -544,7 +544,7 @@ Methods: Types: ```python -from cloudflare.types.load_balancers import Pool, PoolDeleteResponse +from cloudflare.types.load_balancers import Pool, PoolDeleteResponse, PoolBulkEditResponse ``` Methods: @@ -553,6 +553,7 @@ Methods: - client.load_balancers.pools.update(pool_id, \*, account_id, \*\*params) -> Pool - client.load_balancers.pools.list(\*, account_id, \*\*params) -> SyncSinglePage[Pool] - client.load_balancers.pools.delete(pool_id, \*, account_id) -> PoolDeleteResponse +- client.load_balancers.pools.bulk_edit(\*, account_id, \*\*params) -> PoolBulkEditResponse - client.load_balancers.pools.edit(pool_id, \*, account_id, \*\*params) -> Pool - client.load_balancers.pools.get(pool_id, \*, account_id) -> Pool @@ -1322,6 +1323,7 @@ Types: from cloudflare.types.email_security.settings import ( DomainListResponse, DomainDeleteResponse, + DomainBulkDeleteResponse, DomainEditResponse, DomainGetResponse, ) @@ -1331,6 +1333,7 @@ Methods: - client.email_security.settings.domains.list(\*, account_id, \*\*params) -> SyncV4PagePaginationArray[DomainListResponse] - client.email_security.settings.domains.delete(domain_id, \*, account_id) -> DomainDeleteResponse +- client.email_security.settings.domains.bulk_delete(\*, account_id) -> DomainBulkDeleteResponse - client.email_security.settings.domains.edit(domain_id, \*, account_id, \*\*params) -> DomainEditResponse - client.email_security.settings.domains.get(domain_id, \*, account_id) -> DomainGetResponse @@ -1473,7 +1476,12 @@ Methods: Types: ```python -from cloudflare.types.filters import FirewallFilter, FilterCreateResponse +from cloudflare.types.filters import ( + FirewallFilter, + FilterCreateResponse, + FilterBulkDeleteResponse, + FilterBulkUpdateResponse, +) ``` Methods: @@ -1482,6 +1490,8 @@ Methods: - client.filters.update(filter_id, \*, zone_id, \*\*params) -> FirewallFilter - client.filters.list(\*, zone_id, \*\*params) -> SyncV4PagePaginationArray[FirewallFilter] - client.filters.delete(filter_id, \*, zone_id) -> FirewallFilter +- client.filters.bulk_delete(\*, zone_id) -> Optional +- client.filters.bulk_update(\*, zone_id) -> Optional - client.filters.get(filter_id, \*, zone_id) -> FirewallFilter # Firewall @@ -1519,6 +1529,9 @@ from cloudflare.types.firewall import ( Product, DeletedFilter, RuleCreateResponse, + RuleBulkDeleteResponse, + RuleBulkEditResponse, + RuleBulkUpdateResponse, RuleEditResponse, ) ``` @@ -1529,6 +1542,9 @@ Methods: - client.firewall.rules.update(rule_id, \*, zone_id, \*\*params) -> FirewallRule - client.firewall.rules.list(\*, zone_id, \*\*params) -> SyncV4PagePaginationArray[FirewallRule] - client.firewall.rules.delete(rule_id, \*, zone_id) -> FirewallRule +- client.firewall.rules.bulk_delete(\*, zone_id) -> Optional +- client.firewall.rules.bulk_edit(\*, zone_id, \*\*params) -> Optional +- client.firewall.rules.bulk_update(\*, zone_id, \*\*params) -> Optional - client.firewall.rules.edit(rule_id, \*, zone_id) -> Optional - client.firewall.rules.get(rule_id, \*, zone_id, \*\*params) -> FirewallRule @@ -2499,7 +2515,13 @@ Methods: Types: ```python -from cloudflare.types.kv import Namespace, NamespaceUpdateResponse, NamespaceDeleteResponse +from cloudflare.types.kv import ( + Namespace, + NamespaceUpdateResponse, + NamespaceDeleteResponse, + NamespaceBulkDeleteResponse, + NamespaceBulkUpdateResponse, +) ``` Methods: @@ -2508,21 +2530,10 @@ Methods: - client.kv.namespaces.update(namespace_id, \*, account_id, \*\*params) -> Optional - client.kv.namespaces.list(\*, account_id, \*\*params) -> SyncV4PagePaginationArray[Namespace] - client.kv.namespaces.delete(namespace_id, \*, account_id) -> Optional +- client.kv.namespaces.bulk_delete(namespace_id, \*, account_id, \*\*params) -> Optional +- client.kv.namespaces.bulk_update(namespace_id, \*, account_id, \*\*params) -> Optional - client.kv.namespaces.get(namespace_id, \*, account_id) -> Optional -### Bulk - -Types: - -```python -from cloudflare.types.kv.namespaces import BulkUpdateResponse, BulkDeleteResponse -``` - -Methods: - -- client.kv.namespaces.bulk.update(namespace_id, \*, account_id, \*\*params) -> Optional -- client.kv.namespaces.bulk.delete(namespace_id, \*, account_id) -> Optional - ### Keys Types: @@ -2669,12 +2680,13 @@ Methods: Types: ```python -from cloudflare.types.api_gateway.discovery import OperationEditResponse +from cloudflare.types.api_gateway.discovery import OperationBulkEditResponse, OperationEditResponse ``` Methods: - client.api_gateway.discovery.operations.list(\*, zone_id, \*\*params) -> SyncV4PagePaginationArray[DiscoveryOperation] +- client.api_gateway.discovery.operations.bulk_edit(\*, zone_id, \*\*params) -> OperationBulkEditResponse - client.api_gateway.discovery.operations.edit(operation_id, \*, zone_id, \*\*params) -> OperationEditResponse ## Operations @@ -2687,6 +2699,7 @@ from cloudflare.types.api_gateway import ( OperationCreateResponse, OperationListResponse, OperationDeleteResponse, + OperationBulkDeleteResponse, OperationGetResponse, ) ``` @@ -2696,6 +2709,7 @@ Methods: - client.api_gateway.operations.create(\*, zone_id, \*\*params) -> OperationCreateResponse - client.api_gateway.operations.list(\*, zone_id, \*\*params) -> SyncV4PagePaginationArray[OperationListResponse] - client.api_gateway.operations.delete(operation_id, \*, zone_id) -> OperationDeleteResponse +- client.api_gateway.operations.bulk_delete(\*, zone_id) -> OperationBulkDeleteResponse - client.api_gateway.operations.get(operation_id, \*, zone_id, \*\*params) -> OperationGetResponse ### SchemaValidation @@ -3705,6 +3719,7 @@ Types: from cloudflare.types.magic_transit import ( CfInterconnectUpdateResponse, CfInterconnectListResponse, + CfInterconnectBulkUpdateResponse, CfInterconnectGetResponse, ) ``` @@ -3713,6 +3728,7 @@ Methods: - client.magic_transit.cf_interconnects.update(cf_interconnect_id, \*, account_id, \*\*params) -> CfInterconnectUpdateResponse - client.magic_transit.cf_interconnects.list(\*, account_id) -> CfInterconnectListResponse +- client.magic_transit.cf_interconnects.bulk_update(\*, account_id, \*\*params) -> CfInterconnectBulkUpdateResponse - client.magic_transit.cf_interconnects.get(cf_interconnect_id, \*, account_id) -> CfInterconnectGetResponse ## GRETunnels @@ -3725,6 +3741,7 @@ from cloudflare.types.magic_transit import ( GRETunnelUpdateResponse, GRETunnelListResponse, GRETunnelDeleteResponse, + GRETunnelBulkUpdateResponse, GRETunnelGetResponse, ) ``` @@ -3735,6 +3752,7 @@ Methods: - client.magic_transit.gre_tunnels.update(gre_tunnel_id, \*, account_id, \*\*params) -> GRETunnelUpdateResponse - client.magic_transit.gre_tunnels.list(\*, account_id) -> GRETunnelListResponse - client.magic_transit.gre_tunnels.delete(gre_tunnel_id, \*, account_id) -> GRETunnelDeleteResponse +- client.magic_transit.gre_tunnels.bulk_update(\*, account_id, \*\*params) -> GRETunnelBulkUpdateResponse - client.magic_transit.gre_tunnels.get(gre_tunnel_id, \*, account_id) -> GRETunnelGetResponse ## IPSECTunnels @@ -3748,6 +3766,7 @@ from cloudflare.types.magic_transit import ( IPSECTunnelUpdateResponse, IPSECTunnelListResponse, IPSECTunnelDeleteResponse, + IPSECTunnelBulkUpdateResponse, IPSECTunnelGetResponse, IPSECTunnelPSKGenerateResponse, ) @@ -3759,6 +3778,7 @@ Methods: - client.magic_transit.ipsec_tunnels.update(ipsec_tunnel_id, \*, account_id, \*\*params) -> IPSECTunnelUpdateResponse - client.magic_transit.ipsec_tunnels.list(\*, account_id) -> IPSECTunnelListResponse - client.magic_transit.ipsec_tunnels.delete(ipsec_tunnel_id, \*, account_id) -> IPSECTunnelDeleteResponse +- client.magic_transit.ipsec_tunnels.bulk_update(\*, account_id, \*\*params) -> IPSECTunnelBulkUpdateResponse - client.magic_transit.ipsec_tunnels.get(ipsec_tunnel_id, \*, account_id) -> IPSECTunnelGetResponse - client.magic_transit.ipsec_tunnels.psk_generate(ipsec_tunnel_id, \*, account_id, \*\*params) -> IPSECTunnelPSKGenerateResponse @@ -3773,6 +3793,7 @@ from cloudflare.types.magic_transit import ( RouteUpdateResponse, RouteListResponse, RouteDeleteResponse, + RouteBulkUpdateResponse, RouteEmptyResponse, RouteGetResponse, ) @@ -3784,6 +3805,7 @@ Methods: - client.magic_transit.routes.update(route_id, \*, account_id, \*\*params) -> RouteUpdateResponse - client.magic_transit.routes.list(\*, account_id) -> RouteListResponse - client.magic_transit.routes.delete(route_id, \*, account_id) -> RouteDeleteResponse +- client.magic_transit.routes.bulk_update(\*, account_id, \*\*params) -> RouteBulkUpdateResponse - client.magic_transit.routes.empty(\*, account_id) -> RouteEmptyResponse - client.magic_transit.routes.get(route_id, \*, account_id) -> RouteGetResponse @@ -6403,7 +6425,12 @@ Methods: Types: ```python -from cloudflare.types.rum import RUMRule, RuleListResponse, RuleDeleteResponse +from cloudflare.types.rum import ( + RUMRule, + RuleListResponse, + RuleDeleteResponse, + RuleBulkCreateResponse, +) ``` Methods: @@ -6412,6 +6439,7 @@ Methods: - client.rum.rules.update(rule_id, \*, account_id, ruleset_id, \*\*params) -> Optional - client.rum.rules.list(ruleset_id, \*, account_id) -> Optional - client.rum.rules.delete(rule_id, \*, account_id, ruleset_id) -> Optional +- client.rum.rules.bulk_create(ruleset_id, \*, account_id, \*\*params) -> Optional # Vectorize diff --git a/src/cloudflare/resources/api_gateway/discovery/operations.py b/src/cloudflare/resources/api_gateway/discovery/operations.py index ba21c48267f..1994f365d02 100644 --- a/src/cloudflare/resources/api_gateway/discovery/operations.py +++ b/src/cloudflare/resources/api_gateway/discovery/operations.py @@ -2,7 +2,7 @@ from __future__ import annotations -from typing import List, Type, cast +from typing import Dict, List, Type, cast from typing_extensions import Literal import httpx @@ -23,9 +23,10 @@ from ...._wrappers import ResultWrapper from ....pagination import SyncV4PagePaginationArray, AsyncV4PagePaginationArray from ...._base_client import AsyncPaginator, make_request_options -from ....types.api_gateway.discovery import operation_edit_params, operation_list_params +from ....types.api_gateway.discovery import operation_edit_params, operation_list_params, operation_bulk_edit_params from ....types.api_gateway.discovery_operation import DiscoveryOperation from ....types.api_gateway.discovery.operation_edit_response import OperationEditResponse +from ....types.api_gateway.discovery.operation_bulk_edit_response import OperationBulkEditResponse __all__ = ["OperationsResource", "AsyncOperationsResource"] @@ -148,6 +149,47 @@ def list( model=DiscoveryOperation, ) + def bulk_edit( + self, + *, + zone_id: str, + body: Dict[str, operation_bulk_edit_params.Body], + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> OperationBulkEditResponse: + """ + Update the `state` on one or more discovered operations + + Args: + zone_id: Identifier + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not zone_id: + raise ValueError(f"Expected a non-empty value for `zone_id` but received {zone_id!r}") + return self._patch( + f"/zones/{zone_id}/api_gateway/discovery/operations", + body=maybe_transform(body, operation_bulk_edit_params.OperationBulkEditParams), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + post_parser=ResultWrapper[OperationBulkEditResponse]._unwrapper, + ), + cast_to=cast(Type[OperationBulkEditResponse], ResultWrapper[OperationBulkEditResponse]), + ) + def edit( self, operation_id: str, @@ -318,6 +360,47 @@ def list( model=DiscoveryOperation, ) + async def bulk_edit( + self, + *, + zone_id: str, + body: Dict[str, operation_bulk_edit_params.Body], + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> OperationBulkEditResponse: + """ + Update the `state` on one or more discovered operations + + Args: + zone_id: Identifier + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not zone_id: + raise ValueError(f"Expected a non-empty value for `zone_id` but received {zone_id!r}") + return await self._patch( + f"/zones/{zone_id}/api_gateway/discovery/operations", + body=await async_maybe_transform(body, operation_bulk_edit_params.OperationBulkEditParams), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + post_parser=ResultWrapper[OperationBulkEditResponse]._unwrapper, + ), + cast_to=cast(Type[OperationBulkEditResponse], ResultWrapper[OperationBulkEditResponse]), + ) + async def edit( self, operation_id: str, @@ -377,6 +460,9 @@ def __init__(self, operations: OperationsResource) -> None: self.list = to_raw_response_wrapper( operations.list, ) + self.bulk_edit = to_raw_response_wrapper( + operations.bulk_edit, + ) self.edit = to_raw_response_wrapper( operations.edit, ) @@ -389,6 +475,9 @@ def __init__(self, operations: AsyncOperationsResource) -> None: self.list = async_to_raw_response_wrapper( operations.list, ) + self.bulk_edit = async_to_raw_response_wrapper( + operations.bulk_edit, + ) self.edit = async_to_raw_response_wrapper( operations.edit, ) @@ -401,6 +490,9 @@ def __init__(self, operations: OperationsResource) -> None: self.list = to_streamed_response_wrapper( operations.list, ) + self.bulk_edit = to_streamed_response_wrapper( + operations.bulk_edit, + ) self.edit = to_streamed_response_wrapper( operations.edit, ) @@ -413,6 +505,9 @@ def __init__(self, operations: AsyncOperationsResource) -> None: self.list = async_to_streamed_response_wrapper( operations.list, ) + self.bulk_edit = async_to_streamed_response_wrapper( + operations.bulk_edit, + ) self.edit = async_to_streamed_response_wrapper( operations.edit, ) diff --git a/src/cloudflare/resources/api_gateway/operations/operations.py b/src/cloudflare/resources/api_gateway/operations/operations.py index cab1bd954c9..4e2c044805e 100644 --- a/src/cloudflare/resources/api_gateway/operations/operations.py +++ b/src/cloudflare/resources/api_gateway/operations/operations.py @@ -36,6 +36,7 @@ from ....types.api_gateway.operation_list_response import OperationListResponse from ....types.api_gateway.operation_create_response import OperationCreateResponse from ....types.api_gateway.operation_delete_response import OperationDeleteResponse +from ....types.api_gateway.operation_bulk_delete_response import OperationBulkDeleteResponse __all__ = ["OperationsResource", "AsyncOperationsResource"] @@ -229,6 +230,41 @@ def delete( cast_to=OperationDeleteResponse, ) + def bulk_delete( + self, + *, + zone_id: str, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> OperationBulkDeleteResponse: + """ + Delete multiple operations + + Args: + zone_id: Identifier + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not zone_id: + raise ValueError(f"Expected a non-empty value for `zone_id` but received {zone_id!r}") + return self._delete( + f"/zones/{zone_id}/api_gateway/operations", + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=OperationBulkDeleteResponse, + ) + def get( self, operation_id: str, @@ -469,6 +505,41 @@ async def delete( cast_to=OperationDeleteResponse, ) + async def bulk_delete( + self, + *, + zone_id: str, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> OperationBulkDeleteResponse: + """ + Delete multiple operations + + Args: + zone_id: Identifier + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not zone_id: + raise ValueError(f"Expected a non-empty value for `zone_id` but received {zone_id!r}") + return await self._delete( + f"/zones/{zone_id}/api_gateway/operations", + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=OperationBulkDeleteResponse, + ) + async def get( self, operation_id: str, @@ -533,6 +604,9 @@ def __init__(self, operations: OperationsResource) -> None: self.delete = to_raw_response_wrapper( operations.delete, ) + self.bulk_delete = to_raw_response_wrapper( + operations.bulk_delete, + ) self.get = to_raw_response_wrapper( operations.get, ) @@ -555,6 +629,9 @@ def __init__(self, operations: AsyncOperationsResource) -> None: self.delete = async_to_raw_response_wrapper( operations.delete, ) + self.bulk_delete = async_to_raw_response_wrapper( + operations.bulk_delete, + ) self.get = async_to_raw_response_wrapper( operations.get, ) @@ -577,6 +654,9 @@ def __init__(self, operations: OperationsResource) -> None: self.delete = to_streamed_response_wrapper( operations.delete, ) + self.bulk_delete = to_streamed_response_wrapper( + operations.bulk_delete, + ) self.get = to_streamed_response_wrapper( operations.get, ) @@ -599,6 +679,9 @@ def __init__(self, operations: AsyncOperationsResource) -> None: self.delete = async_to_streamed_response_wrapper( operations.delete, ) + self.bulk_delete = async_to_streamed_response_wrapper( + operations.bulk_delete, + ) self.get = async_to_streamed_response_wrapper( operations.get, ) diff --git a/src/cloudflare/resources/email_security/settings/domains.py b/src/cloudflare/resources/email_security/settings/domains.py index 2fa9d8ec5bf..d0587f9f3f8 100644 --- a/src/cloudflare/resources/email_security/settings/domains.py +++ b/src/cloudflare/resources/email_security/settings/domains.py @@ -28,6 +28,7 @@ from ....types.email_security.settings.domain_edit_response import DomainEditResponse from ....types.email_security.settings.domain_list_response import DomainListResponse from ....types.email_security.settings.domain_delete_response import DomainDeleteResponse +from ....types.email_security.settings.domain_bulk_delete_response import DomainBulkDeleteResponse __all__ = ["DomainsResource", "AsyncDomainsResource"] @@ -168,6 +169,45 @@ def delete( cast_to=cast(Type[DomainDeleteResponse], ResultWrapper[DomainDeleteResponse]), ) + def bulk_delete( + self, + *, + account_id: str, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> DomainBulkDeleteResponse: + """ + Unprotect multiple email domains + + Args: + account_id: Account Identifier + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not account_id: + raise ValueError(f"Expected a non-empty value for `account_id` but received {account_id!r}") + return self._delete( + f"/accounts/{account_id}/email-security/settings/domains", + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + post_parser=ResultWrapper[DomainBulkDeleteResponse]._unwrapper, + ), + cast_to=cast(Type[DomainBulkDeleteResponse], ResultWrapper[DomainBulkDeleteResponse]), + ) + def edit( self, domain_id: int, @@ -402,6 +442,45 @@ async def delete( cast_to=cast(Type[DomainDeleteResponse], ResultWrapper[DomainDeleteResponse]), ) + async def bulk_delete( + self, + *, + account_id: str, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> DomainBulkDeleteResponse: + """ + Unprotect multiple email domains + + Args: + account_id: Account Identifier + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not account_id: + raise ValueError(f"Expected a non-empty value for `account_id` but received {account_id!r}") + return await self._delete( + f"/accounts/{account_id}/email-security/settings/domains", + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + post_parser=ResultWrapper[DomainBulkDeleteResponse]._unwrapper, + ), + cast_to=cast(Type[DomainBulkDeleteResponse], ResultWrapper[DomainBulkDeleteResponse]), + ) + async def edit( self, domain_id: int, @@ -510,6 +589,9 @@ def __init__(self, domains: DomainsResource) -> None: self.delete = to_raw_response_wrapper( domains.delete, ) + self.bulk_delete = to_raw_response_wrapper( + domains.bulk_delete, + ) self.edit = to_raw_response_wrapper( domains.edit, ) @@ -528,6 +610,9 @@ def __init__(self, domains: AsyncDomainsResource) -> None: self.delete = async_to_raw_response_wrapper( domains.delete, ) + self.bulk_delete = async_to_raw_response_wrapper( + domains.bulk_delete, + ) self.edit = async_to_raw_response_wrapper( domains.edit, ) @@ -546,6 +631,9 @@ def __init__(self, domains: DomainsResource) -> None: self.delete = to_streamed_response_wrapper( domains.delete, ) + self.bulk_delete = to_streamed_response_wrapper( + domains.bulk_delete, + ) self.edit = to_streamed_response_wrapper( domains.edit, ) @@ -564,6 +652,9 @@ def __init__(self, domains: AsyncDomainsResource) -> None: self.delete = async_to_streamed_response_wrapper( domains.delete, ) + self.bulk_delete = async_to_streamed_response_wrapper( + domains.bulk_delete, + ) self.edit = async_to_streamed_response_wrapper( domains.edit, ) diff --git a/src/cloudflare/resources/filters.py b/src/cloudflare/resources/filters.py index 4e696d2c05f..bda722a9a26 100644 --- a/src/cloudflare/resources/filters.py +++ b/src/cloudflare/resources/filters.py @@ -26,6 +26,8 @@ from ..types.filters import filter_list_params, filter_create_params, filter_update_params from ..types.filters.firewall_filter import FirewallFilter from ..types.filters.filter_create_response import FilterCreateResponse +from ..types.filters.filter_bulk_delete_response import FilterBulkDeleteResponse +from ..types.filters.filter_bulk_update_response import FilterBulkUpdateResponse __all__ = ["FiltersResource", "AsyncFiltersResource"] @@ -270,6 +272,90 @@ def delete( cast_to=cast(Type[FirewallFilter], ResultWrapper[FirewallFilter]), ) + @typing_extensions.deprecated( + "The Filters API is deprecated in favour of using the Ruleset Engine. See https://developers.cloudflare.com/fundamentals/api/reference/deprecations/#firewall-rules-api-and-filters-api for full details." + ) + def bulk_delete( + self, + *, + zone_id: str, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> Optional[FilterBulkDeleteResponse]: + """ + Deletes one or more existing filters. + + Args: + zone_id: Identifier + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not zone_id: + raise ValueError(f"Expected a non-empty value for `zone_id` but received {zone_id!r}") + return self._delete( + f"/zones/{zone_id}/filters", + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + post_parser=ResultWrapper[Optional[FilterBulkDeleteResponse]]._unwrapper, + ), + cast_to=cast(Type[Optional[FilterBulkDeleteResponse]], ResultWrapper[FilterBulkDeleteResponse]), + ) + + @typing_extensions.deprecated( + "The Filters API is deprecated in favour of using the Ruleset Engine. See https://developers.cloudflare.com/fundamentals/api/reference/deprecations/#firewall-rules-api-and-filters-api for full details." + ) + def bulk_update( + self, + *, + zone_id: str, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> Optional[FilterBulkUpdateResponse]: + """ + Updates one or more existing filters. + + Args: + zone_id: Identifier + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not zone_id: + raise ValueError(f"Expected a non-empty value for `zone_id` but received {zone_id!r}") + return self._put( + f"/zones/{zone_id}/filters", + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + post_parser=ResultWrapper[Optional[FilterBulkUpdateResponse]]._unwrapper, + ), + cast_to=cast(Type[Optional[FilterBulkUpdateResponse]], ResultWrapper[FilterBulkUpdateResponse]), + ) + @typing_extensions.deprecated( "The Filters API is deprecated in favour of using the Ruleset Engine. See https://developers.cloudflare.com/fundamentals/api/reference/deprecations/#firewall-rules-api-and-filters-api for full details." ) @@ -558,6 +644,90 @@ async def delete( cast_to=cast(Type[FirewallFilter], ResultWrapper[FirewallFilter]), ) + @typing_extensions.deprecated( + "The Filters API is deprecated in favour of using the Ruleset Engine. See https://developers.cloudflare.com/fundamentals/api/reference/deprecations/#firewall-rules-api-and-filters-api for full details." + ) + async def bulk_delete( + self, + *, + zone_id: str, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> Optional[FilterBulkDeleteResponse]: + """ + Deletes one or more existing filters. + + Args: + zone_id: Identifier + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not zone_id: + raise ValueError(f"Expected a non-empty value for `zone_id` but received {zone_id!r}") + return await self._delete( + f"/zones/{zone_id}/filters", + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + post_parser=ResultWrapper[Optional[FilterBulkDeleteResponse]]._unwrapper, + ), + cast_to=cast(Type[Optional[FilterBulkDeleteResponse]], ResultWrapper[FilterBulkDeleteResponse]), + ) + + @typing_extensions.deprecated( + "The Filters API is deprecated in favour of using the Ruleset Engine. See https://developers.cloudflare.com/fundamentals/api/reference/deprecations/#firewall-rules-api-and-filters-api for full details." + ) + async def bulk_update( + self, + *, + zone_id: str, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> Optional[FilterBulkUpdateResponse]: + """ + Updates one or more existing filters. + + Args: + zone_id: Identifier + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not zone_id: + raise ValueError(f"Expected a non-empty value for `zone_id` but received {zone_id!r}") + return await self._put( + f"/zones/{zone_id}/filters", + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + post_parser=ResultWrapper[Optional[FilterBulkUpdateResponse]]._unwrapper, + ), + cast_to=cast(Type[Optional[FilterBulkUpdateResponse]], ResultWrapper[FilterBulkUpdateResponse]), + ) + @typing_extensions.deprecated( "The Filters API is deprecated in favour of using the Ruleset Engine. See https://developers.cloudflare.com/fundamentals/api/reference/deprecations/#firewall-rules-api-and-filters-api for full details." ) @@ -630,6 +800,16 @@ def __init__(self, filters: FiltersResource) -> None: filters.delete # pyright: ignore[reportDeprecated], ) ) + self.bulk_delete = ( # pyright: ignore[reportDeprecated] + to_raw_response_wrapper( + filters.bulk_delete # pyright: ignore[reportDeprecated], + ) + ) + self.bulk_update = ( # pyright: ignore[reportDeprecated] + to_raw_response_wrapper( + filters.bulk_update # pyright: ignore[reportDeprecated], + ) + ) self.get = ( # pyright: ignore[reportDeprecated] to_raw_response_wrapper( filters.get # pyright: ignore[reportDeprecated], @@ -661,6 +841,16 @@ def __init__(self, filters: AsyncFiltersResource) -> None: filters.delete # pyright: ignore[reportDeprecated], ) ) + self.bulk_delete = ( # pyright: ignore[reportDeprecated] + async_to_raw_response_wrapper( + filters.bulk_delete # pyright: ignore[reportDeprecated], + ) + ) + self.bulk_update = ( # pyright: ignore[reportDeprecated] + async_to_raw_response_wrapper( + filters.bulk_update # pyright: ignore[reportDeprecated], + ) + ) self.get = ( # pyright: ignore[reportDeprecated] async_to_raw_response_wrapper( filters.get # pyright: ignore[reportDeprecated], @@ -692,6 +882,16 @@ def __init__(self, filters: FiltersResource) -> None: filters.delete # pyright: ignore[reportDeprecated], ) ) + self.bulk_delete = ( # pyright: ignore[reportDeprecated] + to_streamed_response_wrapper( + filters.bulk_delete # pyright: ignore[reportDeprecated], + ) + ) + self.bulk_update = ( # pyright: ignore[reportDeprecated] + to_streamed_response_wrapper( + filters.bulk_update # pyright: ignore[reportDeprecated], + ) + ) self.get = ( # pyright: ignore[reportDeprecated] to_streamed_response_wrapper( filters.get # pyright: ignore[reportDeprecated], @@ -723,6 +923,16 @@ def __init__(self, filters: AsyncFiltersResource) -> None: filters.delete # pyright: ignore[reportDeprecated], ) ) + self.bulk_delete = ( # pyright: ignore[reportDeprecated] + async_to_streamed_response_wrapper( + filters.bulk_delete # pyright: ignore[reportDeprecated], + ) + ) + self.bulk_update = ( # pyright: ignore[reportDeprecated] + async_to_streamed_response_wrapper( + filters.bulk_update # pyright: ignore[reportDeprecated], + ) + ) self.get = ( # pyright: ignore[reportDeprecated] async_to_streamed_response_wrapper( filters.get # pyright: ignore[reportDeprecated], diff --git a/src/cloudflare/resources/firewall/rules.py b/src/cloudflare/resources/firewall/rules.py index b760b0f9128..0fec41375bd 100644 --- a/src/cloudflare/resources/firewall/rules.py +++ b/src/cloudflare/resources/firewall/rules.py @@ -23,11 +23,21 @@ from ..._wrappers import ResultWrapper from ...pagination import SyncV4PagePaginationArray, AsyncV4PagePaginationArray from ..._base_client import AsyncPaginator, make_request_options -from ...types.firewall import rule_get_params, rule_list_params, rule_create_params, rule_update_params +from ...types.firewall import ( + rule_get_params, + rule_list_params, + rule_create_params, + rule_update_params, + rule_bulk_edit_params, + rule_bulk_update_params, +) from ...types.firewall.firewall_rule import FirewallRule from ...types.firewall.rule_edit_response import RuleEditResponse from ...types.filters.firewall_filter_param import FirewallFilterParam from ...types.firewall.rule_create_response import RuleCreateResponse +from ...types.firewall.rule_bulk_edit_response import RuleBulkEditResponse +from ...types.firewall.rule_bulk_delete_response import RuleBulkDeleteResponse +from ...types.firewall.rule_bulk_update_response import RuleBulkUpdateResponse __all__ = ["RulesResource", "AsyncRulesResource"] @@ -285,6 +295,136 @@ def delete( cast_to=cast(Type[FirewallRule], ResultWrapper[FirewallRule]), ) + @typing_extensions.deprecated( + "The Firewall Rules API is deprecated in favour of using the Ruleset Engine. See https://developers.cloudflare.com/fundamentals/api/reference/deprecations/#firewall-rules-api-and-filters-api for full details." + ) + def bulk_delete( + self, + *, + zone_id: str, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> Optional[RuleBulkDeleteResponse]: + """ + Deletes existing firewall rules. + + Args: + zone_id: Identifier + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not zone_id: + raise ValueError(f"Expected a non-empty value for `zone_id` but received {zone_id!r}") + return self._delete( + f"/zones/{zone_id}/firewall/rules", + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + post_parser=ResultWrapper[Optional[RuleBulkDeleteResponse]]._unwrapper, + ), + cast_to=cast(Type[Optional[RuleBulkDeleteResponse]], ResultWrapper[RuleBulkDeleteResponse]), + ) + + @typing_extensions.deprecated( + "The Firewall Rules API is deprecated in favour of using the Ruleset Engine. See https://developers.cloudflare.com/fundamentals/api/reference/deprecations/#firewall-rules-api-and-filters-api for full details." + ) + def bulk_edit( + self, + *, + zone_id: str, + body: object, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> Optional[RuleBulkEditResponse]: + """ + Updates the priority of existing firewall rules. + + Args: + zone_id: Identifier + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not zone_id: + raise ValueError(f"Expected a non-empty value for `zone_id` but received {zone_id!r}") + return self._patch( + f"/zones/{zone_id}/firewall/rules", + body=maybe_transform(body, rule_bulk_edit_params.RuleBulkEditParams), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + post_parser=ResultWrapper[Optional[RuleBulkEditResponse]]._unwrapper, + ), + cast_to=cast(Type[Optional[RuleBulkEditResponse]], ResultWrapper[RuleBulkEditResponse]), + ) + + @typing_extensions.deprecated( + "The Firewall Rules API is deprecated in favour of using the Ruleset Engine. See https://developers.cloudflare.com/fundamentals/api/reference/deprecations/#firewall-rules-api-and-filters-api for full details." + ) + def bulk_update( + self, + *, + zone_id: str, + body: object, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> Optional[RuleBulkUpdateResponse]: + """ + Updates one or more existing firewall rules. + + Args: + zone_id: Identifier + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not zone_id: + raise ValueError(f"Expected a non-empty value for `zone_id` but received {zone_id!r}") + return self._put( + f"/zones/{zone_id}/firewall/rules", + body=maybe_transform(body, rule_bulk_update_params.RuleBulkUpdateParams), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + post_parser=ResultWrapper[Optional[RuleBulkUpdateResponse]]._unwrapper, + ), + cast_to=cast(Type[Optional[RuleBulkUpdateResponse]], ResultWrapper[RuleBulkUpdateResponse]), + ) + @typing_extensions.deprecated( "The Firewall Rules API is deprecated in favour of using the Ruleset Engine. See https://developers.cloudflare.com/fundamentals/api/reference/deprecations/#firewall-rules-api-and-filters-api for full details." ) @@ -637,6 +777,136 @@ async def delete( cast_to=cast(Type[FirewallRule], ResultWrapper[FirewallRule]), ) + @typing_extensions.deprecated( + "The Firewall Rules API is deprecated in favour of using the Ruleset Engine. See https://developers.cloudflare.com/fundamentals/api/reference/deprecations/#firewall-rules-api-and-filters-api for full details." + ) + async def bulk_delete( + self, + *, + zone_id: str, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> Optional[RuleBulkDeleteResponse]: + """ + Deletes existing firewall rules. + + Args: + zone_id: Identifier + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not zone_id: + raise ValueError(f"Expected a non-empty value for `zone_id` but received {zone_id!r}") + return await self._delete( + f"/zones/{zone_id}/firewall/rules", + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + post_parser=ResultWrapper[Optional[RuleBulkDeleteResponse]]._unwrapper, + ), + cast_to=cast(Type[Optional[RuleBulkDeleteResponse]], ResultWrapper[RuleBulkDeleteResponse]), + ) + + @typing_extensions.deprecated( + "The Firewall Rules API is deprecated in favour of using the Ruleset Engine. See https://developers.cloudflare.com/fundamentals/api/reference/deprecations/#firewall-rules-api-and-filters-api for full details." + ) + async def bulk_edit( + self, + *, + zone_id: str, + body: object, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> Optional[RuleBulkEditResponse]: + """ + Updates the priority of existing firewall rules. + + Args: + zone_id: Identifier + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not zone_id: + raise ValueError(f"Expected a non-empty value for `zone_id` but received {zone_id!r}") + return await self._patch( + f"/zones/{zone_id}/firewall/rules", + body=await async_maybe_transform(body, rule_bulk_edit_params.RuleBulkEditParams), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + post_parser=ResultWrapper[Optional[RuleBulkEditResponse]]._unwrapper, + ), + cast_to=cast(Type[Optional[RuleBulkEditResponse]], ResultWrapper[RuleBulkEditResponse]), + ) + + @typing_extensions.deprecated( + "The Firewall Rules API is deprecated in favour of using the Ruleset Engine. See https://developers.cloudflare.com/fundamentals/api/reference/deprecations/#firewall-rules-api-and-filters-api for full details." + ) + async def bulk_update( + self, + *, + zone_id: str, + body: object, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> Optional[RuleBulkUpdateResponse]: + """ + Updates one or more existing firewall rules. + + Args: + zone_id: Identifier + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not zone_id: + raise ValueError(f"Expected a non-empty value for `zone_id` but received {zone_id!r}") + return await self._put( + f"/zones/{zone_id}/firewall/rules", + body=await async_maybe_transform(body, rule_bulk_update_params.RuleBulkUpdateParams), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + post_parser=ResultWrapper[Optional[RuleBulkUpdateResponse]]._unwrapper, + ), + cast_to=cast(Type[Optional[RuleBulkUpdateResponse]], ResultWrapper[RuleBulkUpdateResponse]), + ) + @typing_extensions.deprecated( "The Firewall Rules API is deprecated in favour of using the Ruleset Engine. See https://developers.cloudflare.com/fundamentals/api/reference/deprecations/#firewall-rules-api-and-filters-api for full details." ) @@ -760,6 +1030,21 @@ def __init__(self, rules: RulesResource) -> None: rules.delete # pyright: ignore[reportDeprecated], ) ) + self.bulk_delete = ( # pyright: ignore[reportDeprecated] + to_raw_response_wrapper( + rules.bulk_delete # pyright: ignore[reportDeprecated], + ) + ) + self.bulk_edit = ( # pyright: ignore[reportDeprecated] + to_raw_response_wrapper( + rules.bulk_edit # pyright: ignore[reportDeprecated], + ) + ) + self.bulk_update = ( # pyright: ignore[reportDeprecated] + to_raw_response_wrapper( + rules.bulk_update # pyright: ignore[reportDeprecated], + ) + ) self.edit = ( # pyright: ignore[reportDeprecated] to_raw_response_wrapper( rules.edit # pyright: ignore[reportDeprecated], @@ -796,6 +1081,21 @@ def __init__(self, rules: AsyncRulesResource) -> None: rules.delete # pyright: ignore[reportDeprecated], ) ) + self.bulk_delete = ( # pyright: ignore[reportDeprecated] + async_to_raw_response_wrapper( + rules.bulk_delete # pyright: ignore[reportDeprecated], + ) + ) + self.bulk_edit = ( # pyright: ignore[reportDeprecated] + async_to_raw_response_wrapper( + rules.bulk_edit # pyright: ignore[reportDeprecated], + ) + ) + self.bulk_update = ( # pyright: ignore[reportDeprecated] + async_to_raw_response_wrapper( + rules.bulk_update # pyright: ignore[reportDeprecated], + ) + ) self.edit = ( # pyright: ignore[reportDeprecated] async_to_raw_response_wrapper( rules.edit # pyright: ignore[reportDeprecated], @@ -832,6 +1132,21 @@ def __init__(self, rules: RulesResource) -> None: rules.delete # pyright: ignore[reportDeprecated], ) ) + self.bulk_delete = ( # pyright: ignore[reportDeprecated] + to_streamed_response_wrapper( + rules.bulk_delete # pyright: ignore[reportDeprecated], + ) + ) + self.bulk_edit = ( # pyright: ignore[reportDeprecated] + to_streamed_response_wrapper( + rules.bulk_edit # pyright: ignore[reportDeprecated], + ) + ) + self.bulk_update = ( # pyright: ignore[reportDeprecated] + to_streamed_response_wrapper( + rules.bulk_update # pyright: ignore[reportDeprecated], + ) + ) self.edit = ( # pyright: ignore[reportDeprecated] to_streamed_response_wrapper( rules.edit # pyright: ignore[reportDeprecated], @@ -868,6 +1183,21 @@ def __init__(self, rules: AsyncRulesResource) -> None: rules.delete # pyright: ignore[reportDeprecated], ) ) + self.bulk_delete = ( # pyright: ignore[reportDeprecated] + async_to_streamed_response_wrapper( + rules.bulk_delete # pyright: ignore[reportDeprecated], + ) + ) + self.bulk_edit = ( # pyright: ignore[reportDeprecated] + async_to_streamed_response_wrapper( + rules.bulk_edit # pyright: ignore[reportDeprecated], + ) + ) + self.bulk_update = ( # pyright: ignore[reportDeprecated] + async_to_streamed_response_wrapper( + rules.bulk_update # pyright: ignore[reportDeprecated], + ) + ) self.edit = ( # pyright: ignore[reportDeprecated] async_to_streamed_response_wrapper( rules.edit # pyright: ignore[reportDeprecated], diff --git a/src/cloudflare/resources/kv/namespaces/__init__.py b/src/cloudflare/resources/kv/namespaces/__init__.py index 0784dbb3103..eaf6f601cea 100644 --- a/src/cloudflare/resources/kv/namespaces/__init__.py +++ b/src/cloudflare/resources/kv/namespaces/__init__.py @@ -1,13 +1,5 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -from .bulk import ( - BulkResource, - AsyncBulkResource, - BulkResourceWithRawResponse, - AsyncBulkResourceWithRawResponse, - BulkResourceWithStreamingResponse, - AsyncBulkResourceWithStreamingResponse, -) from .keys import ( KeysResource, AsyncKeysResource, @@ -42,12 +34,6 @@ ) __all__ = [ - "BulkResource", - "AsyncBulkResource", - "BulkResourceWithRawResponse", - "AsyncBulkResourceWithRawResponse", - "BulkResourceWithStreamingResponse", - "AsyncBulkResourceWithStreamingResponse", "KeysResource", "AsyncKeysResource", "KeysResourceWithRawResponse", diff --git a/src/cloudflare/resources/kv/namespaces/bulk.py b/src/cloudflare/resources/kv/namespaces/bulk.py deleted file mode 100644 index 8fb4ed0f906..00000000000 --- a/src/cloudflare/resources/kv/namespaces/bulk.py +++ /dev/null @@ -1,314 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from __future__ import annotations - -from typing import Type, Iterable, Optional, cast - -import httpx - -from ...._types import NOT_GIVEN, Body, Query, Headers, NotGiven -from ...._utils import ( - maybe_transform, - async_maybe_transform, -) -from ...._compat import cached_property -from ...._resource import SyncAPIResource, AsyncAPIResource -from ...._response import ( - to_raw_response_wrapper, - to_streamed_response_wrapper, - async_to_raw_response_wrapper, - async_to_streamed_response_wrapper, -) -from ...._wrappers import ResultWrapper -from ...._base_client import make_request_options -from ....types.kv.namespaces import bulk_update_params -from ....types.kv.namespaces.bulk_delete_response import BulkDeleteResponse -from ....types.kv.namespaces.bulk_update_response import BulkUpdateResponse - -__all__ = ["BulkResource", "AsyncBulkResource"] - - -class BulkResource(SyncAPIResource): - @cached_property - def with_raw_response(self) -> BulkResourceWithRawResponse: - """ - This property can be used as a prefix for any HTTP method call to return the - the raw response object instead of the parsed content. - - For more information, see https://www.github.com/cloudflare/cloudflare-python#accessing-raw-response-data-eg-headers - """ - return BulkResourceWithRawResponse(self) - - @cached_property - def with_streaming_response(self) -> BulkResourceWithStreamingResponse: - """ - An alternative to `.with_raw_response` that doesn't eagerly read the response body. - - For more information, see https://www.github.com/cloudflare/cloudflare-python#with_streaming_response - """ - return BulkResourceWithStreamingResponse(self) - - def update( - self, - namespace_id: str, - *, - account_id: str, - body: Iterable[bulk_update_params.Body], - # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. - # The extra values given here take precedence over values defined on the client or passed to this method. - extra_headers: Headers | None = None, - extra_query: Query | None = None, - extra_body: Body | None = None, - timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, - ) -> Optional[BulkUpdateResponse]: - """Write multiple keys and values at once. - - Body should be an array of up to 10,000 - key-value pairs to be stored, along with optional expiration information. - Existing values and expirations will be overwritten. If neither `expiration` nor - `expiration_ttl` is specified, the key-value pair will never expire. If both are - set, `expiration_ttl` is used and `expiration` is ignored. The entire request - size must be 100 megabytes or less. - - Args: - account_id: Identifier - - namespace_id: Namespace identifier tag. - - extra_headers: Send extra headers - - extra_query: Add additional query parameters to the request - - extra_body: Add additional JSON properties to the request - - timeout: Override the client-level default timeout for this request, in seconds - """ - if not account_id: - raise ValueError(f"Expected a non-empty value for `account_id` but received {account_id!r}") - if not namespace_id: - raise ValueError(f"Expected a non-empty value for `namespace_id` but received {namespace_id!r}") - return self._put( - f"/accounts/{account_id}/storage/kv/namespaces/{namespace_id}/bulk", - body=maybe_transform(body, Iterable[bulk_update_params.Body]), - options=make_request_options( - extra_headers=extra_headers, - extra_query=extra_query, - extra_body=extra_body, - timeout=timeout, - post_parser=ResultWrapper[Optional[BulkUpdateResponse]]._unwrapper, - ), - cast_to=cast(Type[Optional[BulkUpdateResponse]], ResultWrapper[BulkUpdateResponse]), - ) - - def delete( - self, - namespace_id: str, - *, - account_id: str, - # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. - # The extra values given here take precedence over values defined on the client or passed to this method. - extra_headers: Headers | None = None, - extra_query: Query | None = None, - extra_body: Body | None = None, - timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, - ) -> Optional[BulkDeleteResponse]: - """Remove multiple KV pairs from the namespace. - - Body should be an array of up to - 10,000 keys to be removed. - - Args: - account_id: Identifier - - namespace_id: Namespace identifier tag. - - extra_headers: Send extra headers - - extra_query: Add additional query parameters to the request - - extra_body: Add additional JSON properties to the request - - timeout: Override the client-level default timeout for this request, in seconds - """ - if not account_id: - raise ValueError(f"Expected a non-empty value for `account_id` but received {account_id!r}") - if not namespace_id: - raise ValueError(f"Expected a non-empty value for `namespace_id` but received {namespace_id!r}") - return self._delete( - f"/accounts/{account_id}/storage/kv/namespaces/{namespace_id}/bulk", - options=make_request_options( - extra_headers=extra_headers, - extra_query=extra_query, - extra_body=extra_body, - timeout=timeout, - post_parser=ResultWrapper[Optional[BulkDeleteResponse]]._unwrapper, - ), - cast_to=cast(Type[Optional[BulkDeleteResponse]], ResultWrapper[BulkDeleteResponse]), - ) - - -class AsyncBulkResource(AsyncAPIResource): - @cached_property - def with_raw_response(self) -> AsyncBulkResourceWithRawResponse: - """ - This property can be used as a prefix for any HTTP method call to return the - the raw response object instead of the parsed content. - - For more information, see https://www.github.com/cloudflare/cloudflare-python#accessing-raw-response-data-eg-headers - """ - return AsyncBulkResourceWithRawResponse(self) - - @cached_property - def with_streaming_response(self) -> AsyncBulkResourceWithStreamingResponse: - """ - An alternative to `.with_raw_response` that doesn't eagerly read the response body. - - For more information, see https://www.github.com/cloudflare/cloudflare-python#with_streaming_response - """ - return AsyncBulkResourceWithStreamingResponse(self) - - async def update( - self, - namespace_id: str, - *, - account_id: str, - body: Iterable[bulk_update_params.Body], - # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. - # The extra values given here take precedence over values defined on the client or passed to this method. - extra_headers: Headers | None = None, - extra_query: Query | None = None, - extra_body: Body | None = None, - timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, - ) -> Optional[BulkUpdateResponse]: - """Write multiple keys and values at once. - - Body should be an array of up to 10,000 - key-value pairs to be stored, along with optional expiration information. - Existing values and expirations will be overwritten. If neither `expiration` nor - `expiration_ttl` is specified, the key-value pair will never expire. If both are - set, `expiration_ttl` is used and `expiration` is ignored. The entire request - size must be 100 megabytes or less. - - Args: - account_id: Identifier - - namespace_id: Namespace identifier tag. - - extra_headers: Send extra headers - - extra_query: Add additional query parameters to the request - - extra_body: Add additional JSON properties to the request - - timeout: Override the client-level default timeout for this request, in seconds - """ - if not account_id: - raise ValueError(f"Expected a non-empty value for `account_id` but received {account_id!r}") - if not namespace_id: - raise ValueError(f"Expected a non-empty value for `namespace_id` but received {namespace_id!r}") - return await self._put( - f"/accounts/{account_id}/storage/kv/namespaces/{namespace_id}/bulk", - body=await async_maybe_transform(body, Iterable[bulk_update_params.Body]), - options=make_request_options( - extra_headers=extra_headers, - extra_query=extra_query, - extra_body=extra_body, - timeout=timeout, - post_parser=ResultWrapper[Optional[BulkUpdateResponse]]._unwrapper, - ), - cast_to=cast(Type[Optional[BulkUpdateResponse]], ResultWrapper[BulkUpdateResponse]), - ) - - async def delete( - self, - namespace_id: str, - *, - account_id: str, - # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. - # The extra values given here take precedence over values defined on the client or passed to this method. - extra_headers: Headers | None = None, - extra_query: Query | None = None, - extra_body: Body | None = None, - timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, - ) -> Optional[BulkDeleteResponse]: - """Remove multiple KV pairs from the namespace. - - Body should be an array of up to - 10,000 keys to be removed. - - Args: - account_id: Identifier - - namespace_id: Namespace identifier tag. - - extra_headers: Send extra headers - - extra_query: Add additional query parameters to the request - - extra_body: Add additional JSON properties to the request - - timeout: Override the client-level default timeout for this request, in seconds - """ - if not account_id: - raise ValueError(f"Expected a non-empty value for `account_id` but received {account_id!r}") - if not namespace_id: - raise ValueError(f"Expected a non-empty value for `namespace_id` but received {namespace_id!r}") - return await self._delete( - f"/accounts/{account_id}/storage/kv/namespaces/{namespace_id}/bulk", - options=make_request_options( - extra_headers=extra_headers, - extra_query=extra_query, - extra_body=extra_body, - timeout=timeout, - post_parser=ResultWrapper[Optional[BulkDeleteResponse]]._unwrapper, - ), - cast_to=cast(Type[Optional[BulkDeleteResponse]], ResultWrapper[BulkDeleteResponse]), - ) - - -class BulkResourceWithRawResponse: - def __init__(self, bulk: BulkResource) -> None: - self._bulk = bulk - - self.update = to_raw_response_wrapper( - bulk.update, - ) - self.delete = to_raw_response_wrapper( - bulk.delete, - ) - - -class AsyncBulkResourceWithRawResponse: - def __init__(self, bulk: AsyncBulkResource) -> None: - self._bulk = bulk - - self.update = async_to_raw_response_wrapper( - bulk.update, - ) - self.delete = async_to_raw_response_wrapper( - bulk.delete, - ) - - -class BulkResourceWithStreamingResponse: - def __init__(self, bulk: BulkResource) -> None: - self._bulk = bulk - - self.update = to_streamed_response_wrapper( - bulk.update, - ) - self.delete = to_streamed_response_wrapper( - bulk.delete, - ) - - -class AsyncBulkResourceWithStreamingResponse: - def __init__(self, bulk: AsyncBulkResource) -> None: - self._bulk = bulk - - self.update = async_to_streamed_response_wrapper( - bulk.update, - ) - self.delete = async_to_streamed_response_wrapper( - bulk.delete, - ) diff --git a/src/cloudflare/resources/kv/namespaces/namespaces.py b/src/cloudflare/resources/kv/namespaces/namespaces.py index 95fea898307..3f47127b147 100644 --- a/src/cloudflare/resources/kv/namespaces/namespaces.py +++ b/src/cloudflare/resources/kv/namespaces/namespaces.py @@ -2,19 +2,11 @@ from __future__ import annotations -from typing import Type, Optional, cast +from typing import List, Type, Iterable, Optional, cast from typing_extensions import Literal import httpx -from .bulk import ( - BulkResource, - AsyncBulkResource, - BulkResourceWithRawResponse, - AsyncBulkResourceWithRawResponse, - BulkResourceWithStreamingResponse, - AsyncBulkResourceWithStreamingResponse, -) from .keys import ( KeysResource, AsyncKeysResource, @@ -45,7 +37,12 @@ async_maybe_transform, ) from ...._compat import cached_property -from ....types.kv import namespace_list_params, namespace_create_params, namespace_update_params +from ....types.kv import ( + namespace_list_params, + namespace_create_params, + namespace_update_params, + namespace_bulk_update_params, +) from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import ( to_raw_response_wrapper, @@ -59,15 +56,13 @@ from ....types.kv.namespace import Namespace from ....types.kv.namespace_delete_response import NamespaceDeleteResponse from ....types.kv.namespace_update_response import NamespaceUpdateResponse +from ....types.kv.namespace_bulk_delete_response import NamespaceBulkDeleteResponse +from ....types.kv.namespace_bulk_update_response import NamespaceBulkUpdateResponse __all__ = ["NamespacesResource", "AsyncNamespacesResource"] class NamespacesResource(SyncAPIResource): - @cached_property - def bulk(self) -> BulkResource: - return BulkResource(self._client) - @cached_property def keys(self) -> KeysResource: return KeysResource(self._client) @@ -297,6 +292,106 @@ def delete( cast_to=cast(Type[Optional[NamespaceDeleteResponse]], ResultWrapper[NamespaceDeleteResponse]), ) + def bulk_delete( + self, + namespace_id: str, + *, + account_id: str, + body: List[str], + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> Optional[NamespaceBulkDeleteResponse]: + """Remove multiple KV pairs from the namespace. + + Body should be an array of up to + 10,000 keys to be removed. + + Args: + account_id: Identifier + + namespace_id: Namespace identifier tag. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not account_id: + raise ValueError(f"Expected a non-empty value for `account_id` but received {account_id!r}") + if not namespace_id: + raise ValueError(f"Expected a non-empty value for `namespace_id` but received {namespace_id!r}") + return self._post( + f"/accounts/{account_id}/storage/kv/namespaces/{namespace_id}/bulk/delete", + body=maybe_transform(body, List[str]), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + post_parser=ResultWrapper[Optional[NamespaceBulkDeleteResponse]]._unwrapper, + ), + cast_to=cast(Type[Optional[NamespaceBulkDeleteResponse]], ResultWrapper[NamespaceBulkDeleteResponse]), + ) + + def bulk_update( + self, + namespace_id: str, + *, + account_id: str, + body: Iterable[namespace_bulk_update_params.Body], + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> Optional[NamespaceBulkUpdateResponse]: + """Write multiple keys and values at once. + + Body should be an array of up to 10,000 + key-value pairs to be stored, along with optional expiration information. + Existing values and expirations will be overwritten. If neither `expiration` nor + `expiration_ttl` is specified, the key-value pair will never expire. If both are + set, `expiration_ttl` is used and `expiration` is ignored. The entire request + size must be 100 megabytes or less. + + Args: + account_id: Identifier + + namespace_id: Namespace identifier tag. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not account_id: + raise ValueError(f"Expected a non-empty value for `account_id` but received {account_id!r}") + if not namespace_id: + raise ValueError(f"Expected a non-empty value for `namespace_id` but received {namespace_id!r}") + return self._put( + f"/accounts/{account_id}/storage/kv/namespaces/{namespace_id}/bulk", + body=maybe_transform(body, Iterable[namespace_bulk_update_params.Body]), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + post_parser=ResultWrapper[Optional[NamespaceBulkUpdateResponse]]._unwrapper, + ), + cast_to=cast(Type[Optional[NamespaceBulkUpdateResponse]], ResultWrapper[NamespaceBulkUpdateResponse]), + ) + def get( self, namespace_id: str, @@ -343,10 +438,6 @@ def get( class AsyncNamespacesResource(AsyncAPIResource): - @cached_property - def bulk(self) -> AsyncBulkResource: - return AsyncBulkResource(self._client) - @cached_property def keys(self) -> AsyncKeysResource: return AsyncKeysResource(self._client) @@ -576,6 +667,106 @@ async def delete( cast_to=cast(Type[Optional[NamespaceDeleteResponse]], ResultWrapper[NamespaceDeleteResponse]), ) + async def bulk_delete( + self, + namespace_id: str, + *, + account_id: str, + body: List[str], + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> Optional[NamespaceBulkDeleteResponse]: + """Remove multiple KV pairs from the namespace. + + Body should be an array of up to + 10,000 keys to be removed. + + Args: + account_id: Identifier + + namespace_id: Namespace identifier tag. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not account_id: + raise ValueError(f"Expected a non-empty value for `account_id` but received {account_id!r}") + if not namespace_id: + raise ValueError(f"Expected a non-empty value for `namespace_id` but received {namespace_id!r}") + return await self._post( + f"/accounts/{account_id}/storage/kv/namespaces/{namespace_id}/bulk/delete", + body=await async_maybe_transform(body, List[str]), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + post_parser=ResultWrapper[Optional[NamespaceBulkDeleteResponse]]._unwrapper, + ), + cast_to=cast(Type[Optional[NamespaceBulkDeleteResponse]], ResultWrapper[NamespaceBulkDeleteResponse]), + ) + + async def bulk_update( + self, + namespace_id: str, + *, + account_id: str, + body: Iterable[namespace_bulk_update_params.Body], + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> Optional[NamespaceBulkUpdateResponse]: + """Write multiple keys and values at once. + + Body should be an array of up to 10,000 + key-value pairs to be stored, along with optional expiration information. + Existing values and expirations will be overwritten. If neither `expiration` nor + `expiration_ttl` is specified, the key-value pair will never expire. If both are + set, `expiration_ttl` is used and `expiration` is ignored. The entire request + size must be 100 megabytes or less. + + Args: + account_id: Identifier + + namespace_id: Namespace identifier tag. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not account_id: + raise ValueError(f"Expected a non-empty value for `account_id` but received {account_id!r}") + if not namespace_id: + raise ValueError(f"Expected a non-empty value for `namespace_id` but received {namespace_id!r}") + return await self._put( + f"/accounts/{account_id}/storage/kv/namespaces/{namespace_id}/bulk", + body=await async_maybe_transform(body, Iterable[namespace_bulk_update_params.Body]), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + post_parser=ResultWrapper[Optional[NamespaceBulkUpdateResponse]]._unwrapper, + ), + cast_to=cast(Type[Optional[NamespaceBulkUpdateResponse]], ResultWrapper[NamespaceBulkUpdateResponse]), + ) + async def get( self, namespace_id: str, @@ -637,14 +828,16 @@ def __init__(self, namespaces: NamespacesResource) -> None: self.delete = to_raw_response_wrapper( namespaces.delete, ) + self.bulk_delete = to_raw_response_wrapper( + namespaces.bulk_delete, + ) + self.bulk_update = to_raw_response_wrapper( + namespaces.bulk_update, + ) self.get = to_raw_response_wrapper( namespaces.get, ) - @cached_property - def bulk(self) -> BulkResourceWithRawResponse: - return BulkResourceWithRawResponse(self._namespaces.bulk) - @cached_property def keys(self) -> KeysResourceWithRawResponse: return KeysResourceWithRawResponse(self._namespaces.keys) @@ -674,14 +867,16 @@ def __init__(self, namespaces: AsyncNamespacesResource) -> None: self.delete = async_to_raw_response_wrapper( namespaces.delete, ) + self.bulk_delete = async_to_raw_response_wrapper( + namespaces.bulk_delete, + ) + self.bulk_update = async_to_raw_response_wrapper( + namespaces.bulk_update, + ) self.get = async_to_raw_response_wrapper( namespaces.get, ) - @cached_property - def bulk(self) -> AsyncBulkResourceWithRawResponse: - return AsyncBulkResourceWithRawResponse(self._namespaces.bulk) - @cached_property def keys(self) -> AsyncKeysResourceWithRawResponse: return AsyncKeysResourceWithRawResponse(self._namespaces.keys) @@ -711,14 +906,16 @@ def __init__(self, namespaces: NamespacesResource) -> None: self.delete = to_streamed_response_wrapper( namespaces.delete, ) + self.bulk_delete = to_streamed_response_wrapper( + namespaces.bulk_delete, + ) + self.bulk_update = to_streamed_response_wrapper( + namespaces.bulk_update, + ) self.get = to_streamed_response_wrapper( namespaces.get, ) - @cached_property - def bulk(self) -> BulkResourceWithStreamingResponse: - return BulkResourceWithStreamingResponse(self._namespaces.bulk) - @cached_property def keys(self) -> KeysResourceWithStreamingResponse: return KeysResourceWithStreamingResponse(self._namespaces.keys) @@ -748,14 +945,16 @@ def __init__(self, namespaces: AsyncNamespacesResource) -> None: self.delete = async_to_streamed_response_wrapper( namespaces.delete, ) + self.bulk_delete = async_to_streamed_response_wrapper( + namespaces.bulk_delete, + ) + self.bulk_update = async_to_streamed_response_wrapper( + namespaces.bulk_update, + ) self.get = async_to_streamed_response_wrapper( namespaces.get, ) - @cached_property - def bulk(self) -> AsyncBulkResourceWithStreamingResponse: - return AsyncBulkResourceWithStreamingResponse(self._namespaces.bulk) - @cached_property def keys(self) -> AsyncKeysResourceWithStreamingResponse: return AsyncKeysResourceWithStreamingResponse(self._namespaces.keys) diff --git a/src/cloudflare/resources/load_balancers/pools/pools.py b/src/cloudflare/resources/load_balancers/pools/pools.py index 3efd17bda34..db842db77eb 100644 --- a/src/cloudflare/resources/load_balancers/pools/pools.py +++ b/src/cloudflare/resources/load_balancers/pools/pools.py @@ -3,6 +3,7 @@ from __future__ import annotations from typing import List, Type, Iterable, Optional, cast +from typing_extensions import Literal import httpx @@ -43,6 +44,7 @@ pool_list_params, pool_create_params, pool_update_params, + pool_bulk_edit_params, ) from ....types.load_balancers.pool import Pool from ....types.load_balancers.check_region import CheckRegion @@ -50,6 +52,7 @@ from ....types.load_balancers.load_shedding_param import LoadSheddingParam from ....types.load_balancers.pool_delete_response import PoolDeleteResponse from ....types.load_balancers.origin_steering_param import OriginSteeringParam +from ....types.load_balancers.pool_bulk_edit_response import PoolBulkEditResponse from ....types.load_balancers.notification_filter_param import NotificationFilterParam __all__ = ["PoolsResource", "AsyncPoolsResource"] @@ -391,6 +394,55 @@ def delete( cast_to=cast(Type[PoolDeleteResponse], ResultWrapper[PoolDeleteResponse]), ) + def bulk_edit( + self, + *, + account_id: str, + notification_email: Literal[""] | NotGiven = NOT_GIVEN, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> PoolBulkEditResponse: + """Apply changes to a number of existing pools, overwriting the supplied + properties. + + Pools are ordered by ascending `name`. Returns the list of affected + pools. Supports the standard pagination query parameters, either + `limit`/`offset` or `per_page`/`page`. + + Args: + account_id: Identifier + + notification_email: The email address to send health status notifications to. This field is now + deprecated in favor of Cloudflare Notifications for Load Balancing, so only + resetting this field with an empty string `""` is accepted. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not account_id: + raise ValueError(f"Expected a non-empty value for `account_id` but received {account_id!r}") + return self._patch( + f"/accounts/{account_id}/load_balancers/pools", + body=maybe_transform({"notification_email": notification_email}, pool_bulk_edit_params.PoolBulkEditParams), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + post_parser=ResultWrapper[PoolBulkEditResponse]._unwrapper, + ), + cast_to=cast(Type[PoolBulkEditResponse], ResultWrapper[PoolBulkEditResponse]), + ) + def edit( self, pool_id: str, @@ -885,6 +937,57 @@ async def delete( cast_to=cast(Type[PoolDeleteResponse], ResultWrapper[PoolDeleteResponse]), ) + async def bulk_edit( + self, + *, + account_id: str, + notification_email: Literal[""] | NotGiven = NOT_GIVEN, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> PoolBulkEditResponse: + """Apply changes to a number of existing pools, overwriting the supplied + properties. + + Pools are ordered by ascending `name`. Returns the list of affected + pools. Supports the standard pagination query parameters, either + `limit`/`offset` or `per_page`/`page`. + + Args: + account_id: Identifier + + notification_email: The email address to send health status notifications to. This field is now + deprecated in favor of Cloudflare Notifications for Load Balancing, so only + resetting this field with an empty string `""` is accepted. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not account_id: + raise ValueError(f"Expected a non-empty value for `account_id` but received {account_id!r}") + return await self._patch( + f"/accounts/{account_id}/load_balancers/pools", + body=await async_maybe_transform( + {"notification_email": notification_email}, pool_bulk_edit_params.PoolBulkEditParams + ), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + post_parser=ResultWrapper[PoolBulkEditResponse]._unwrapper, + ), + cast_to=cast(Type[PoolBulkEditResponse], ResultWrapper[PoolBulkEditResponse]), + ) + async def edit( self, pool_id: str, @@ -1059,6 +1162,9 @@ def __init__(self, pools: PoolsResource) -> None: self.delete = to_raw_response_wrapper( pools.delete, ) + self.bulk_edit = to_raw_response_wrapper( + pools.bulk_edit, + ) self.edit = to_raw_response_wrapper( pools.edit, ) @@ -1091,6 +1197,9 @@ def __init__(self, pools: AsyncPoolsResource) -> None: self.delete = async_to_raw_response_wrapper( pools.delete, ) + self.bulk_edit = async_to_raw_response_wrapper( + pools.bulk_edit, + ) self.edit = async_to_raw_response_wrapper( pools.edit, ) @@ -1123,6 +1232,9 @@ def __init__(self, pools: PoolsResource) -> None: self.delete = to_streamed_response_wrapper( pools.delete, ) + self.bulk_edit = to_streamed_response_wrapper( + pools.bulk_edit, + ) self.edit = to_streamed_response_wrapper( pools.edit, ) @@ -1155,6 +1267,9 @@ def __init__(self, pools: AsyncPoolsResource) -> None: self.delete = async_to_streamed_response_wrapper( pools.delete, ) + self.bulk_edit = async_to_streamed_response_wrapper( + pools.bulk_edit, + ) self.edit = async_to_streamed_response_wrapper( pools.edit, ) diff --git a/src/cloudflare/resources/magic_transit/cf_interconnects.py b/src/cloudflare/resources/magic_transit/cf_interconnects.py index 843fb30c559..a7d54b6c147 100644 --- a/src/cloudflare/resources/magic_transit/cf_interconnects.py +++ b/src/cloudflare/resources/magic_transit/cf_interconnects.py @@ -23,11 +23,12 @@ ) from ..._wrappers import ResultWrapper from ..._base_client import make_request_options -from ...types.magic_transit import cf_interconnect_update_params +from ...types.magic_transit import cf_interconnect_update_params, cf_interconnect_bulk_update_params from ...types.magic_transit.health_check_param import HealthCheckParam from ...types.magic_transit.cf_interconnect_get_response import CfInterconnectGetResponse from ...types.magic_transit.cf_interconnect_list_response import CfInterconnectListResponse from ...types.magic_transit.cf_interconnect_update_response import CfInterconnectUpdateResponse +from ...types.magic_transit.cf_interconnect_bulk_update_response import CfInterconnectBulkUpdateResponse __all__ = ["CfInterconnectsResource", "AsyncCfInterconnectsResource"] @@ -186,6 +187,61 @@ def list( cast_to=cast(Type[CfInterconnectListResponse], ResultWrapper[CfInterconnectListResponse]), ) + def bulk_update( + self, + *, + account_id: str, + body: object, + x_magic_new_hc_target: bool | NotGiven = NOT_GIVEN, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> CfInterconnectBulkUpdateResponse: + """Updates multiple interconnects associated with an account. + + Use + `?validate_only=true` as an optional query parameter to only run validation + without persisting changes. + + Args: + account_id: Identifier + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not account_id: + raise ValueError(f"Expected a non-empty value for `account_id` but received {account_id!r}") + extra_headers = { + **strip_not_given( + { + "x-magic-new-hc-target": ("true" if x_magic_new_hc_target else "false") + if is_given(x_magic_new_hc_target) + else NOT_GIVEN + } + ), + **(extra_headers or {}), + } + return self._put( + f"/accounts/{account_id}/magic/cf_interconnects", + body=maybe_transform(body, cf_interconnect_bulk_update_params.CfInterconnectBulkUpdateParams), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + post_parser=ResultWrapper[CfInterconnectBulkUpdateResponse]._unwrapper, + ), + cast_to=cast(Type[CfInterconnectBulkUpdateResponse], ResultWrapper[CfInterconnectBulkUpdateResponse]), + ) + def get( self, cf_interconnect_id: str, @@ -396,6 +452,61 @@ async def list( cast_to=cast(Type[CfInterconnectListResponse], ResultWrapper[CfInterconnectListResponse]), ) + async def bulk_update( + self, + *, + account_id: str, + body: object, + x_magic_new_hc_target: bool | NotGiven = NOT_GIVEN, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> CfInterconnectBulkUpdateResponse: + """Updates multiple interconnects associated with an account. + + Use + `?validate_only=true` as an optional query parameter to only run validation + without persisting changes. + + Args: + account_id: Identifier + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not account_id: + raise ValueError(f"Expected a non-empty value for `account_id` but received {account_id!r}") + extra_headers = { + **strip_not_given( + { + "x-magic-new-hc-target": ("true" if x_magic_new_hc_target else "false") + if is_given(x_magic_new_hc_target) + else NOT_GIVEN + } + ), + **(extra_headers or {}), + } + return await self._put( + f"/accounts/{account_id}/magic/cf_interconnects", + body=await async_maybe_transform(body, cf_interconnect_bulk_update_params.CfInterconnectBulkUpdateParams), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + post_parser=ResultWrapper[CfInterconnectBulkUpdateResponse]._unwrapper, + ), + cast_to=cast(Type[CfInterconnectBulkUpdateResponse], ResultWrapper[CfInterconnectBulkUpdateResponse]), + ) + async def get( self, cf_interconnect_id: str, @@ -462,6 +573,9 @@ def __init__(self, cf_interconnects: CfInterconnectsResource) -> None: self.list = to_raw_response_wrapper( cf_interconnects.list, ) + self.bulk_update = to_raw_response_wrapper( + cf_interconnects.bulk_update, + ) self.get = to_raw_response_wrapper( cf_interconnects.get, ) @@ -477,6 +591,9 @@ def __init__(self, cf_interconnects: AsyncCfInterconnectsResource) -> None: self.list = async_to_raw_response_wrapper( cf_interconnects.list, ) + self.bulk_update = async_to_raw_response_wrapper( + cf_interconnects.bulk_update, + ) self.get = async_to_raw_response_wrapper( cf_interconnects.get, ) @@ -492,6 +609,9 @@ def __init__(self, cf_interconnects: CfInterconnectsResource) -> None: self.list = to_streamed_response_wrapper( cf_interconnects.list, ) + self.bulk_update = to_streamed_response_wrapper( + cf_interconnects.bulk_update, + ) self.get = to_streamed_response_wrapper( cf_interconnects.get, ) @@ -507,6 +627,9 @@ def __init__(self, cf_interconnects: AsyncCfInterconnectsResource) -> None: self.list = async_to_streamed_response_wrapper( cf_interconnects.list, ) + self.bulk_update = async_to_streamed_response_wrapper( + cf_interconnects.bulk_update, + ) self.get = async_to_streamed_response_wrapper( cf_interconnects.get, ) diff --git a/src/cloudflare/resources/magic_transit/gre_tunnels.py b/src/cloudflare/resources/magic_transit/gre_tunnels.py index 60b2dbc9fcc..1d5a624258c 100644 --- a/src/cloudflare/resources/magic_transit/gre_tunnels.py +++ b/src/cloudflare/resources/magic_transit/gre_tunnels.py @@ -23,12 +23,13 @@ ) from ..._wrappers import ResultWrapper from ..._base_client import make_request_options -from ...types.magic_transit import gre_tunnel_create_params, gre_tunnel_update_params +from ...types.magic_transit import gre_tunnel_create_params, gre_tunnel_update_params, gre_tunnel_bulk_update_params from ...types.magic_transit.gre_tunnel_get_response import GRETunnelGetResponse from ...types.magic_transit.gre_tunnel_list_response import GRETunnelListResponse from ...types.magic_transit.gre_tunnel_create_response import GRETunnelCreateResponse from ...types.magic_transit.gre_tunnel_delete_response import GRETunnelDeleteResponse from ...types.magic_transit.gre_tunnel_update_response import GRETunnelUpdateResponse +from ...types.magic_transit.gre_tunnel_bulk_update_response import GRETunnelBulkUpdateResponse __all__ = ["GRETunnelsResource", "AsyncGRETunnelsResource"] @@ -310,6 +311,60 @@ def delete( cast_to=cast(Type[GRETunnelDeleteResponse], ResultWrapper[GRETunnelDeleteResponse]), ) + def bulk_update( + self, + *, + account_id: str, + body: object, + x_magic_new_hc_target: bool | NotGiven = NOT_GIVEN, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> GRETunnelBulkUpdateResponse: + """Updates multiple GRE tunnels. + + Use `?validate_only=true` as an optional query + parameter to only run validation without persisting changes. + + Args: + account_id: Identifier + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not account_id: + raise ValueError(f"Expected a non-empty value for `account_id` but received {account_id!r}") + extra_headers = { + **strip_not_given( + { + "x-magic-new-hc-target": ("true" if x_magic_new_hc_target else "false") + if is_given(x_magic_new_hc_target) + else NOT_GIVEN + } + ), + **(extra_headers or {}), + } + return self._put( + f"/accounts/{account_id}/magic/gre_tunnels", + body=maybe_transform(body, gre_tunnel_bulk_update_params.GRETunnelBulkUpdateParams), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + post_parser=ResultWrapper[GRETunnelBulkUpdateResponse]._unwrapper, + ), + cast_to=cast(Type[GRETunnelBulkUpdateResponse], ResultWrapper[GRETunnelBulkUpdateResponse]), + ) + def get( self, gre_tunnel_id: str, @@ -643,6 +698,60 @@ async def delete( cast_to=cast(Type[GRETunnelDeleteResponse], ResultWrapper[GRETunnelDeleteResponse]), ) + async def bulk_update( + self, + *, + account_id: str, + body: object, + x_magic_new_hc_target: bool | NotGiven = NOT_GIVEN, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> GRETunnelBulkUpdateResponse: + """Updates multiple GRE tunnels. + + Use `?validate_only=true` as an optional query + parameter to only run validation without persisting changes. + + Args: + account_id: Identifier + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not account_id: + raise ValueError(f"Expected a non-empty value for `account_id` but received {account_id!r}") + extra_headers = { + **strip_not_given( + { + "x-magic-new-hc-target": ("true" if x_magic_new_hc_target else "false") + if is_given(x_magic_new_hc_target) + else NOT_GIVEN + } + ), + **(extra_headers or {}), + } + return await self._put( + f"/accounts/{account_id}/magic/gre_tunnels", + body=await async_maybe_transform(body, gre_tunnel_bulk_update_params.GRETunnelBulkUpdateParams), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + post_parser=ResultWrapper[GRETunnelBulkUpdateResponse]._unwrapper, + ), + cast_to=cast(Type[GRETunnelBulkUpdateResponse], ResultWrapper[GRETunnelBulkUpdateResponse]), + ) + async def get( self, gre_tunnel_id: str, @@ -715,6 +824,9 @@ def __init__(self, gre_tunnels: GRETunnelsResource) -> None: self.delete = to_raw_response_wrapper( gre_tunnels.delete, ) + self.bulk_update = to_raw_response_wrapper( + gre_tunnels.bulk_update, + ) self.get = to_raw_response_wrapper( gre_tunnels.get, ) @@ -736,6 +848,9 @@ def __init__(self, gre_tunnels: AsyncGRETunnelsResource) -> None: self.delete = async_to_raw_response_wrapper( gre_tunnels.delete, ) + self.bulk_update = async_to_raw_response_wrapper( + gre_tunnels.bulk_update, + ) self.get = async_to_raw_response_wrapper( gre_tunnels.get, ) @@ -757,6 +872,9 @@ def __init__(self, gre_tunnels: GRETunnelsResource) -> None: self.delete = to_streamed_response_wrapper( gre_tunnels.delete, ) + self.bulk_update = to_streamed_response_wrapper( + gre_tunnels.bulk_update, + ) self.get = to_streamed_response_wrapper( gre_tunnels.get, ) @@ -778,6 +896,9 @@ def __init__(self, gre_tunnels: AsyncGRETunnelsResource) -> None: self.delete = async_to_streamed_response_wrapper( gre_tunnels.delete, ) + self.bulk_update = async_to_streamed_response_wrapper( + gre_tunnels.bulk_update, + ) self.get = async_to_streamed_response_wrapper( gre_tunnels.get, ) diff --git a/src/cloudflare/resources/magic_transit/ipsec_tunnels.py b/src/cloudflare/resources/magic_transit/ipsec_tunnels.py index d0ff7696e03..e59ba9a890a 100644 --- a/src/cloudflare/resources/magic_transit/ipsec_tunnels.py +++ b/src/cloudflare/resources/magic_transit/ipsec_tunnels.py @@ -26,6 +26,7 @@ from ...types.magic_transit import ( ipsec_tunnel_create_params, ipsec_tunnel_update_params, + ipsec_tunnel_bulk_update_params, ipsec_tunnel_psk_generate_params, ) from ...types.magic_transit.ipsec_tunnel_get_response import IPSECTunnelGetResponse @@ -33,6 +34,7 @@ from ...types.magic_transit.ipsec_tunnel_create_response import IPSECTunnelCreateResponse from ...types.magic_transit.ipsec_tunnel_delete_response import IPSECTunnelDeleteResponse from ...types.magic_transit.ipsec_tunnel_update_response import IPSECTunnelUpdateResponse +from ...types.magic_transit.ipsec_tunnel_bulk_update_response import IPSECTunnelBulkUpdateResponse from ...types.magic_transit.ipsec_tunnel_psk_generate_response import IPSECTunnelPSKGenerateResponse __all__ = ["IPSECTunnelsResource", "AsyncIPSECTunnelsResource"] @@ -354,6 +356,61 @@ def delete( cast_to=cast(Type[IPSECTunnelDeleteResponse], ResultWrapper[IPSECTunnelDeleteResponse]), ) + def bulk_update( + self, + *, + account_id: str, + body: object, + x_magic_new_hc_target: bool | NotGiven = NOT_GIVEN, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> IPSECTunnelBulkUpdateResponse: + """Update multiple IPsec tunnels associated with an account. + + Use + `?validate_only=true` as an optional query parameter to only run validation + without persisting changes. + + Args: + account_id: Identifier + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not account_id: + raise ValueError(f"Expected a non-empty value for `account_id` but received {account_id!r}") + extra_headers = { + **strip_not_given( + { + "x-magic-new-hc-target": ("true" if x_magic_new_hc_target else "false") + if is_given(x_magic_new_hc_target) + else NOT_GIVEN + } + ), + **(extra_headers or {}), + } + return self._put( + f"/accounts/{account_id}/magic/ipsec_tunnels", + body=maybe_transform(body, ipsec_tunnel_bulk_update_params.IPSECTunnelBulkUpdateParams), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + post_parser=ResultWrapper[IPSECTunnelBulkUpdateResponse]._unwrapper, + ), + cast_to=cast(Type[IPSECTunnelBulkUpdateResponse], ResultWrapper[IPSECTunnelBulkUpdateResponse]), + ) + def get( self, ipsec_tunnel_id: str, @@ -776,6 +833,61 @@ async def delete( cast_to=cast(Type[IPSECTunnelDeleteResponse], ResultWrapper[IPSECTunnelDeleteResponse]), ) + async def bulk_update( + self, + *, + account_id: str, + body: object, + x_magic_new_hc_target: bool | NotGiven = NOT_GIVEN, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> IPSECTunnelBulkUpdateResponse: + """Update multiple IPsec tunnels associated with an account. + + Use + `?validate_only=true` as an optional query parameter to only run validation + without persisting changes. + + Args: + account_id: Identifier + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not account_id: + raise ValueError(f"Expected a non-empty value for `account_id` but received {account_id!r}") + extra_headers = { + **strip_not_given( + { + "x-magic-new-hc-target": ("true" if x_magic_new_hc_target else "false") + if is_given(x_magic_new_hc_target) + else NOT_GIVEN + } + ), + **(extra_headers or {}), + } + return await self._put( + f"/accounts/{account_id}/magic/ipsec_tunnels", + body=await async_maybe_transform(body, ipsec_tunnel_bulk_update_params.IPSECTunnelBulkUpdateParams), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + post_parser=ResultWrapper[IPSECTunnelBulkUpdateResponse]._unwrapper, + ), + cast_to=cast(Type[IPSECTunnelBulkUpdateResponse], ResultWrapper[IPSECTunnelBulkUpdateResponse]), + ) + async def get( self, ipsec_tunnel_id: str, @@ -898,6 +1010,9 @@ def __init__(self, ipsec_tunnels: IPSECTunnelsResource) -> None: self.delete = to_raw_response_wrapper( ipsec_tunnels.delete, ) + self.bulk_update = to_raw_response_wrapper( + ipsec_tunnels.bulk_update, + ) self.get = to_raw_response_wrapper( ipsec_tunnels.get, ) @@ -922,6 +1037,9 @@ def __init__(self, ipsec_tunnels: AsyncIPSECTunnelsResource) -> None: self.delete = async_to_raw_response_wrapper( ipsec_tunnels.delete, ) + self.bulk_update = async_to_raw_response_wrapper( + ipsec_tunnels.bulk_update, + ) self.get = async_to_raw_response_wrapper( ipsec_tunnels.get, ) @@ -946,6 +1064,9 @@ def __init__(self, ipsec_tunnels: IPSECTunnelsResource) -> None: self.delete = to_streamed_response_wrapper( ipsec_tunnels.delete, ) + self.bulk_update = to_streamed_response_wrapper( + ipsec_tunnels.bulk_update, + ) self.get = to_streamed_response_wrapper( ipsec_tunnels.get, ) @@ -970,6 +1091,9 @@ def __init__(self, ipsec_tunnels: AsyncIPSECTunnelsResource) -> None: self.delete = async_to_streamed_response_wrapper( ipsec_tunnels.delete, ) + self.bulk_update = async_to_streamed_response_wrapper( + ipsec_tunnels.bulk_update, + ) self.get = async_to_streamed_response_wrapper( ipsec_tunnels.get, ) diff --git a/src/cloudflare/resources/magic_transit/routes.py b/src/cloudflare/resources/magic_transit/routes.py index ec525c9aa78..c8de89a8570 100644 --- a/src/cloudflare/resources/magic_transit/routes.py +++ b/src/cloudflare/resources/magic_transit/routes.py @@ -2,7 +2,7 @@ from __future__ import annotations -from typing import Type, cast +from typing import Type, Iterable, cast import httpx @@ -21,7 +21,7 @@ ) from ..._wrappers import ResultWrapper from ..._base_client import make_request_options -from ...types.magic_transit import route_create_params, route_update_params +from ...types.magic_transit import route_create_params, route_update_params, route_bulk_update_params from ...types.magic_transit.scope_param import ScopeParam from ...types.magic_transit.route_get_response import RouteGetResponse from ...types.magic_transit.route_list_response import RouteListResponse @@ -29,6 +29,7 @@ from ...types.magic_transit.route_create_response import RouteCreateResponse from ...types.magic_transit.route_delete_response import RouteDeleteResponse from ...types.magic_transit.route_update_response import RouteUpdateResponse +from ...types.magic_transit.route_bulk_update_response import RouteBulkUpdateResponse __all__ = ["RoutesResource", "AsyncRoutesResource"] @@ -254,6 +255,50 @@ def delete( cast_to=cast(Type[RouteDeleteResponse], ResultWrapper[RouteDeleteResponse]), ) + def bulk_update( + self, + *, + account_id: str, + routes: Iterable[route_bulk_update_params.Route], + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> RouteBulkUpdateResponse: + """Update multiple Magic static routes. + + Use `?validate_only=true` as an optional + query parameter to run validation only without persisting changes. Only fields + for a route that need to be changed need be provided. + + Args: + account_id: Identifier + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not account_id: + raise ValueError(f"Expected a non-empty value for `account_id` but received {account_id!r}") + return self._put( + f"/accounts/{account_id}/magic/routes", + body=maybe_transform({"routes": routes}, route_bulk_update_params.RouteBulkUpdateParams), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + post_parser=ResultWrapper[RouteBulkUpdateResponse]._unwrapper, + ), + cast_to=cast(Type[RouteBulkUpdateResponse], ResultWrapper[RouteBulkUpdateResponse]), + ) + def empty( self, *, @@ -559,6 +604,50 @@ async def delete( cast_to=cast(Type[RouteDeleteResponse], ResultWrapper[RouteDeleteResponse]), ) + async def bulk_update( + self, + *, + account_id: str, + routes: Iterable[route_bulk_update_params.Route], + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> RouteBulkUpdateResponse: + """Update multiple Magic static routes. + + Use `?validate_only=true` as an optional + query parameter to run validation only without persisting changes. Only fields + for a route that need to be changed need be provided. + + Args: + account_id: Identifier + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not account_id: + raise ValueError(f"Expected a non-empty value for `account_id` but received {account_id!r}") + return await self._put( + f"/accounts/{account_id}/magic/routes", + body=await async_maybe_transform({"routes": routes}, route_bulk_update_params.RouteBulkUpdateParams), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + post_parser=ResultWrapper[RouteBulkUpdateResponse]._unwrapper, + ), + cast_to=cast(Type[RouteBulkUpdateResponse], ResultWrapper[RouteBulkUpdateResponse]), + ) + async def empty( self, *, @@ -659,6 +748,9 @@ def __init__(self, routes: RoutesResource) -> None: self.delete = to_raw_response_wrapper( routes.delete, ) + self.bulk_update = to_raw_response_wrapper( + routes.bulk_update, + ) self.empty = to_raw_response_wrapper( routes.empty, ) @@ -683,6 +775,9 @@ def __init__(self, routes: AsyncRoutesResource) -> None: self.delete = async_to_raw_response_wrapper( routes.delete, ) + self.bulk_update = async_to_raw_response_wrapper( + routes.bulk_update, + ) self.empty = async_to_raw_response_wrapper( routes.empty, ) @@ -707,6 +802,9 @@ def __init__(self, routes: RoutesResource) -> None: self.delete = to_streamed_response_wrapper( routes.delete, ) + self.bulk_update = to_streamed_response_wrapper( + routes.bulk_update, + ) self.empty = to_streamed_response_wrapper( routes.empty, ) @@ -731,6 +829,9 @@ def __init__(self, routes: AsyncRoutesResource) -> None: self.delete = async_to_streamed_response_wrapper( routes.delete, ) + self.bulk_update = async_to_streamed_response_wrapper( + routes.bulk_update, + ) self.empty = async_to_streamed_response_wrapper( routes.empty, ) diff --git a/src/cloudflare/resources/rum/rules.py b/src/cloudflare/resources/rum/rules.py index 9dd639c610a..4f81b98d586 100644 --- a/src/cloudflare/resources/rum/rules.py +++ b/src/cloudflare/resources/rum/rules.py @@ -2,7 +2,7 @@ from __future__ import annotations -from typing import List, Type, Optional, cast +from typing import List, Type, Iterable, Optional, cast import httpx @@ -20,11 +20,12 @@ async_to_streamed_response_wrapper, ) from ..._wrappers import ResultWrapper -from ...types.rum import rule_create_params, rule_update_params +from ...types.rum import rule_create_params, rule_update_params, rule_bulk_create_params from ..._base_client import make_request_options from ...types.rum.rum_rule import RUMRule from ...types.rum.rule_list_response import RuleListResponse from ...types.rum.rule_delete_response import RuleDeleteResponse +from ...types.rum.rule_bulk_create_response import RuleBulkCreateResponse __all__ = ["RulesResource", "AsyncRulesResource"] @@ -269,6 +270,63 @@ def delete( cast_to=cast(Type[Optional[RuleDeleteResponse]], ResultWrapper[RuleDeleteResponse]), ) + def bulk_create( + self, + ruleset_id: str, + *, + account_id: str, + delete_rules: List[str] | NotGiven = NOT_GIVEN, + rules: Iterable[rule_bulk_create_params.Rule] | NotGiven = NOT_GIVEN, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> Optional[RuleBulkCreateResponse]: + """ + Modifies one or more rules in a Web Analytics ruleset with a single request. + + Args: + account_id: Identifier + + ruleset_id: The Web Analytics ruleset identifier. + + delete_rules: A list of rule identifiers to delete. + + rules: A list of rules to create or update. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not account_id: + raise ValueError(f"Expected a non-empty value for `account_id` but received {account_id!r}") + if not ruleset_id: + raise ValueError(f"Expected a non-empty value for `ruleset_id` but received {ruleset_id!r}") + return self._post( + f"/accounts/{account_id}/rum/v2/{ruleset_id}/rules", + body=maybe_transform( + { + "delete_rules": delete_rules, + "rules": rules, + }, + rule_bulk_create_params.RuleBulkCreateParams, + ), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + post_parser=ResultWrapper[Optional[RuleBulkCreateResponse]]._unwrapper, + ), + cast_to=cast(Type[Optional[RuleBulkCreateResponse]], ResultWrapper[RuleBulkCreateResponse]), + ) + class AsyncRulesResource(AsyncAPIResource): @cached_property @@ -510,6 +568,63 @@ async def delete( cast_to=cast(Type[Optional[RuleDeleteResponse]], ResultWrapper[RuleDeleteResponse]), ) + async def bulk_create( + self, + ruleset_id: str, + *, + account_id: str, + delete_rules: List[str] | NotGiven = NOT_GIVEN, + rules: Iterable[rule_bulk_create_params.Rule] | NotGiven = NOT_GIVEN, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> Optional[RuleBulkCreateResponse]: + """ + Modifies one or more rules in a Web Analytics ruleset with a single request. + + Args: + account_id: Identifier + + ruleset_id: The Web Analytics ruleset identifier. + + delete_rules: A list of rule identifiers to delete. + + rules: A list of rules to create or update. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not account_id: + raise ValueError(f"Expected a non-empty value for `account_id` but received {account_id!r}") + if not ruleset_id: + raise ValueError(f"Expected a non-empty value for `ruleset_id` but received {ruleset_id!r}") + return await self._post( + f"/accounts/{account_id}/rum/v2/{ruleset_id}/rules", + body=await async_maybe_transform( + { + "delete_rules": delete_rules, + "rules": rules, + }, + rule_bulk_create_params.RuleBulkCreateParams, + ), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + post_parser=ResultWrapper[Optional[RuleBulkCreateResponse]]._unwrapper, + ), + cast_to=cast(Type[Optional[RuleBulkCreateResponse]], ResultWrapper[RuleBulkCreateResponse]), + ) + class RulesResourceWithRawResponse: def __init__(self, rules: RulesResource) -> None: @@ -527,6 +642,9 @@ def __init__(self, rules: RulesResource) -> None: self.delete = to_raw_response_wrapper( rules.delete, ) + self.bulk_create = to_raw_response_wrapper( + rules.bulk_create, + ) class AsyncRulesResourceWithRawResponse: @@ -545,6 +663,9 @@ def __init__(self, rules: AsyncRulesResource) -> None: self.delete = async_to_raw_response_wrapper( rules.delete, ) + self.bulk_create = async_to_raw_response_wrapper( + rules.bulk_create, + ) class RulesResourceWithStreamingResponse: @@ -563,6 +684,9 @@ def __init__(self, rules: RulesResource) -> None: self.delete = to_streamed_response_wrapper( rules.delete, ) + self.bulk_create = to_streamed_response_wrapper( + rules.bulk_create, + ) class AsyncRulesResourceWithStreamingResponse: @@ -581,3 +705,6 @@ def __init__(self, rules: AsyncRulesResource) -> None: self.delete = async_to_streamed_response_wrapper( rules.delete, ) + self.bulk_create = async_to_streamed_response_wrapper( + rules.bulk_create, + ) diff --git a/src/cloudflare/types/api_gateway/__init__.py b/src/cloudflare/types/api_gateway/__init__.py index 15d29b9c6f3..272e71c2b78 100644 --- a/src/cloudflare/types/api_gateway/__init__.py +++ b/src/cloudflare/types/api_gateway/__init__.py @@ -27,3 +27,4 @@ from .configuration_update_params import ConfigurationUpdateParams as ConfigurationUpdateParams from .user_schema_delete_response import UserSchemaDeleteResponse as UserSchemaDeleteResponse from .configuration_update_response import ConfigurationUpdateResponse as ConfigurationUpdateResponse +from .operation_bulk_delete_response import OperationBulkDeleteResponse as OperationBulkDeleteResponse diff --git a/src/cloudflare/types/api_gateway/discovery/__init__.py b/src/cloudflare/types/api_gateway/discovery/__init__.py index 91d80c2cedc..40378bcab0c 100644 --- a/src/cloudflare/types/api_gateway/discovery/__init__.py +++ b/src/cloudflare/types/api_gateway/discovery/__init__.py @@ -5,3 +5,5 @@ from .operation_edit_params import OperationEditParams as OperationEditParams from .operation_list_params import OperationListParams as OperationListParams from .operation_edit_response import OperationEditResponse as OperationEditResponse +from .operation_bulk_edit_params import OperationBulkEditParams as OperationBulkEditParams +from .operation_bulk_edit_response import OperationBulkEditResponse as OperationBulkEditResponse diff --git a/src/cloudflare/types/api_gateway/discovery/operation_bulk_edit_params.py b/src/cloudflare/types/api_gateway/discovery/operation_bulk_edit_params.py new file mode 100644 index 00000000000..db2119fa7b6 --- /dev/null +++ b/src/cloudflare/types/api_gateway/discovery/operation_bulk_edit_params.py @@ -0,0 +1,24 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing import Dict +from typing_extensions import Literal, Required, TypedDict + +__all__ = ["OperationBulkEditParams", "Body"] + + +class OperationBulkEditParams(TypedDict, total=False): + zone_id: Required[str] + """Identifier""" + + body: Required[Dict[str, Body]] + + +class Body(TypedDict, total=False): + state: Literal["review", "ignored"] + """Mark state of operation in API Discovery + + - `review` - Mark operation as for review + - `ignored` - Mark operation as ignored + """ diff --git a/src/cloudflare/types/api_gateway/discovery/operation_bulk_edit_response.py b/src/cloudflare/types/api_gateway/discovery/operation_bulk_edit_response.py new file mode 100644 index 00000000000..cd0e5264150 --- /dev/null +++ b/src/cloudflare/types/api_gateway/discovery/operation_bulk_edit_response.py @@ -0,0 +1,20 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing import Dict, Optional +from typing_extensions import Literal, TypeAlias + +from ...._models import BaseModel + +__all__ = ["OperationBulkEditResponse", "OperationBulkEditResponseItem"] + + +class OperationBulkEditResponseItem(BaseModel): + state: Optional[Literal["review", "ignored"]] = None + """Mark state of operation in API Discovery + + - `review` - Mark operation as for review + - `ignored` - Mark operation as ignored + """ + + +OperationBulkEditResponse: TypeAlias = Dict[str, OperationBulkEditResponseItem] diff --git a/src/cloudflare/types/api_gateway/operation_bulk_delete_response.py b/src/cloudflare/types/api_gateway/operation_bulk_delete_response.py new file mode 100644 index 00000000000..fa2db0d647c --- /dev/null +++ b/src/cloudflare/types/api_gateway/operation_bulk_delete_response.py @@ -0,0 +1,17 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing_extensions import Literal + +from .message import Message +from ..._models import BaseModel + +__all__ = ["OperationBulkDeleteResponse"] + + +class OperationBulkDeleteResponse(BaseModel): + errors: Message + + messages: Message + + success: Literal[True] + """Whether the API call was successful""" diff --git a/src/cloudflare/types/email_security/settings/__init__.py b/src/cloudflare/types/email_security/settings/__init__.py index 3cdacd3f71b..26c5fc41f06 100644 --- a/src/cloudflare/types/email_security/settings/__init__.py +++ b/src/cloudflare/types/email_security/settings/__init__.py @@ -22,6 +22,7 @@ from .block_sender_list_response import BlockSenderListResponse as BlockSenderListResponse from .trusted_domain_edit_params import TrustedDomainEditParams as TrustedDomainEditParams from .trusted_domain_list_params import TrustedDomainListParams as TrustedDomainListParams +from .domain_bulk_delete_response import DomainBulkDeleteResponse as DomainBulkDeleteResponse from .trusted_domain_get_response import TrustedDomainGetResponse as TrustedDomainGetResponse from .allow_policy_create_response import AllowPolicyCreateResponse as AllowPolicyCreateResponse from .allow_policy_delete_response import AllowPolicyDeleteResponse as AllowPolicyDeleteResponse diff --git a/src/cloudflare/types/email_security/settings/domain_bulk_delete_response.py b/src/cloudflare/types/email_security/settings/domain_bulk_delete_response.py new file mode 100644 index 00000000000..bf90cf2a6ed --- /dev/null +++ b/src/cloudflare/types/email_security/settings/domain_bulk_delete_response.py @@ -0,0 +1,16 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing import List +from typing_extensions import TypeAlias + +from ...._models import BaseModel + +__all__ = ["DomainBulkDeleteResponse", "DomainBulkDeleteResponseItem"] + + +class DomainBulkDeleteResponseItem(BaseModel): + id: int + """The unique identifier for the domain.""" + + +DomainBulkDeleteResponse: TypeAlias = List[DomainBulkDeleteResponseItem] diff --git a/src/cloudflare/types/filters/__init__.py b/src/cloudflare/types/filters/__init__.py index 84b9f911178..be5345ef460 100644 --- a/src/cloudflare/types/filters/__init__.py +++ b/src/cloudflare/types/filters/__init__.py @@ -8,3 +8,5 @@ from .filter_update_params import FilterUpdateParams as FilterUpdateParams from .firewall_filter_param import FirewallFilterParam as FirewallFilterParam from .filter_create_response import FilterCreateResponse as FilterCreateResponse +from .filter_bulk_delete_response import FilterBulkDeleteResponse as FilterBulkDeleteResponse +from .filter_bulk_update_response import FilterBulkUpdateResponse as FilterBulkUpdateResponse diff --git a/src/cloudflare/types/filters/filter_bulk_delete_response.py b/src/cloudflare/types/filters/filter_bulk_delete_response.py new file mode 100644 index 00000000000..7a37b1b4cbd --- /dev/null +++ b/src/cloudflare/types/filters/filter_bulk_delete_response.py @@ -0,0 +1,10 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing import List +from typing_extensions import TypeAlias + +from .firewall_filter import FirewallFilter + +__all__ = ["FilterBulkDeleteResponse"] + +FilterBulkDeleteResponse: TypeAlias = List[FirewallFilter] diff --git a/src/cloudflare/types/filters/filter_bulk_update_response.py b/src/cloudflare/types/filters/filter_bulk_update_response.py new file mode 100644 index 00000000000..48059fa12a6 --- /dev/null +++ b/src/cloudflare/types/filters/filter_bulk_update_response.py @@ -0,0 +1,10 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing import List +from typing_extensions import TypeAlias + +from .firewall_filter import FirewallFilter + +__all__ = ["FilterBulkUpdateResponse"] + +FilterBulkUpdateResponse: TypeAlias = List[FirewallFilter] diff --git a/src/cloudflare/types/firewall/__init__.py b/src/cloudflare/types/firewall/__init__.py index 9e3458a7b6d..0b12a89c62b 100644 --- a/src/cloudflare/types/firewall/__init__.py +++ b/src/cloudflare/types/firewall/__init__.py @@ -21,6 +21,7 @@ from .rule_create_response import RuleCreateResponse as RuleCreateResponse from .ua_rule_get_response import UARuleGetResponse as UARuleGetResponse from .country_configuration import CountryConfiguration as CountryConfiguration +from .rule_bulk_edit_params import RuleBulkEditParams as RuleBulkEditParams from .ua_rule_create_params import UARuleCreateParams as UARuleCreateParams from .ua_rule_list_response import UARuleListResponse as UARuleListResponse from .ua_rule_update_params import UARuleUpdateParams as UARuleUpdateParams @@ -29,6 +30,8 @@ from .access_rule_edit_params import AccessRuleEditParams as AccessRuleEditParams from .access_rule_list_params import AccessRuleListParams as AccessRuleListParams from .asn_configuration_param import ASNConfigurationParam as ASNConfigurationParam +from .rule_bulk_edit_response import RuleBulkEditResponse as RuleBulkEditResponse +from .rule_bulk_update_params import RuleBulkUpdateParams as RuleBulkUpdateParams from .ua_rule_create_response import UARuleCreateResponse as UARuleCreateResponse from .ua_rule_delete_response import UARuleDeleteResponse as UARuleDeleteResponse from .ua_rule_update_response import UARuleUpdateResponse as UARuleUpdateResponse @@ -39,6 +42,8 @@ from .access_rule_edit_response import AccessRuleEditResponse as AccessRuleEditResponse from .access_rule_list_response import AccessRuleListResponse as AccessRuleListResponse from .lockdown_ip_configuration import LockdownIPConfiguration as LockdownIPConfiguration +from .rule_bulk_delete_response import RuleBulkDeleteResponse as RuleBulkDeleteResponse +from .rule_bulk_update_response import RuleBulkUpdateResponse as RuleBulkUpdateResponse from .access_rule_create_response import AccessRuleCreateResponse as AccessRuleCreateResponse from .access_rule_delete_response import AccessRuleDeleteResponse as AccessRuleDeleteResponse from .country_configuration_param import CountryConfigurationParam as CountryConfigurationParam diff --git a/src/cloudflare/types/firewall/rule_bulk_delete_response.py b/src/cloudflare/types/firewall/rule_bulk_delete_response.py new file mode 100644 index 00000000000..535192b8afb --- /dev/null +++ b/src/cloudflare/types/firewall/rule_bulk_delete_response.py @@ -0,0 +1,10 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing import List +from typing_extensions import TypeAlias + +from .firewall_rule import FirewallRule + +__all__ = ["RuleBulkDeleteResponse"] + +RuleBulkDeleteResponse: TypeAlias = List[FirewallRule] diff --git a/src/cloudflare/types/firewall/rule_bulk_edit_params.py b/src/cloudflare/types/firewall/rule_bulk_edit_params.py new file mode 100644 index 00000000000..f47f108569c --- /dev/null +++ b/src/cloudflare/types/firewall/rule_bulk_edit_params.py @@ -0,0 +1,14 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing_extensions import Required, TypedDict + +__all__ = ["RuleBulkEditParams"] + + +class RuleBulkEditParams(TypedDict, total=False): + zone_id: Required[str] + """Identifier""" + + body: Required[object] diff --git a/src/cloudflare/types/firewall/rule_bulk_edit_response.py b/src/cloudflare/types/firewall/rule_bulk_edit_response.py new file mode 100644 index 00000000000..f6d4fdaf7f2 --- /dev/null +++ b/src/cloudflare/types/firewall/rule_bulk_edit_response.py @@ -0,0 +1,10 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing import List +from typing_extensions import TypeAlias + +from .firewall_rule import FirewallRule + +__all__ = ["RuleBulkEditResponse"] + +RuleBulkEditResponse: TypeAlias = List[FirewallRule] diff --git a/src/cloudflare/types/firewall/rule_bulk_update_params.py b/src/cloudflare/types/firewall/rule_bulk_update_params.py new file mode 100644 index 00000000000..97016b19207 --- /dev/null +++ b/src/cloudflare/types/firewall/rule_bulk_update_params.py @@ -0,0 +1,14 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing_extensions import Required, TypedDict + +__all__ = ["RuleBulkUpdateParams"] + + +class RuleBulkUpdateParams(TypedDict, total=False): + zone_id: Required[str] + """Identifier""" + + body: Required[object] diff --git a/src/cloudflare/types/firewall/rule_bulk_update_response.py b/src/cloudflare/types/firewall/rule_bulk_update_response.py new file mode 100644 index 00000000000..d8bacf8ab0e --- /dev/null +++ b/src/cloudflare/types/firewall/rule_bulk_update_response.py @@ -0,0 +1,10 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing import List +from typing_extensions import TypeAlias + +from .firewall_rule import FirewallRule + +__all__ = ["RuleBulkUpdateResponse"] + +RuleBulkUpdateResponse: TypeAlias = List[FirewallRule] diff --git a/src/cloudflare/types/kv/__init__.py b/src/cloudflare/types/kv/__init__.py index e345eaf540a..afaccc1c1e0 100644 --- a/src/cloudflare/types/kv/__init__.py +++ b/src/cloudflare/types/kv/__init__.py @@ -8,3 +8,7 @@ from .namespace_update_params import NamespaceUpdateParams as NamespaceUpdateParams from .namespace_delete_response import NamespaceDeleteResponse as NamespaceDeleteResponse from .namespace_update_response import NamespaceUpdateResponse as NamespaceUpdateResponse +from .namespace_bulk_delete_params import NamespaceBulkDeleteParams as NamespaceBulkDeleteParams +from .namespace_bulk_update_params import NamespaceBulkUpdateParams as NamespaceBulkUpdateParams +from .namespace_bulk_delete_response import NamespaceBulkDeleteResponse as NamespaceBulkDeleteResponse +from .namespace_bulk_update_response import NamespaceBulkUpdateResponse as NamespaceBulkUpdateResponse diff --git a/src/cloudflare/types/kv/namespace_bulk_delete_params.py b/src/cloudflare/types/kv/namespace_bulk_delete_params.py new file mode 100644 index 00000000000..1de9c109a16 --- /dev/null +++ b/src/cloudflare/types/kv/namespace_bulk_delete_params.py @@ -0,0 +1,15 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing import List +from typing_extensions import Required, TypedDict + +__all__ = ["NamespaceBulkDeleteParams"] + + +class NamespaceBulkDeleteParams(TypedDict, total=False): + account_id: Required[str] + """Identifier""" + + body: Required[List[str]] diff --git a/src/cloudflare/types/kv/namespaces/bulk_delete_response.py b/src/cloudflare/types/kv/namespace_bulk_delete_response.py similarity index 74% rename from src/cloudflare/types/kv/namespaces/bulk_delete_response.py rename to src/cloudflare/types/kv/namespace_bulk_delete_response.py index d0ff56c5e18..5cf86953b96 100644 --- a/src/cloudflare/types/kv/namespaces/bulk_delete_response.py +++ b/src/cloudflare/types/kv/namespace_bulk_delete_response.py @@ -2,12 +2,12 @@ from typing import List, Optional -from ...._models import BaseModel +from ..._models import BaseModel -__all__ = ["BulkDeleteResponse"] +__all__ = ["NamespaceBulkDeleteResponse"] -class BulkDeleteResponse(BaseModel): +class NamespaceBulkDeleteResponse(BaseModel): successful_key_count: Optional[float] = None """Number of keys successfully updated""" diff --git a/src/cloudflare/types/kv/namespaces/bulk_update_params.py b/src/cloudflare/types/kv/namespace_bulk_update_params.py similarity index 91% rename from src/cloudflare/types/kv/namespaces/bulk_update_params.py rename to src/cloudflare/types/kv/namespace_bulk_update_params.py index 6cb8d8702c8..e1ce68a86b6 100644 --- a/src/cloudflare/types/kv/namespaces/bulk_update_params.py +++ b/src/cloudflare/types/kv/namespace_bulk_update_params.py @@ -5,10 +5,10 @@ from typing import Dict, Iterable from typing_extensions import Required, TypedDict -__all__ = ["BulkUpdateParams", "Body"] +__all__ = ["NamespaceBulkUpdateParams", "Body"] -class BulkUpdateParams(TypedDict, total=False): +class NamespaceBulkUpdateParams(TypedDict, total=False): account_id: Required[str] """Identifier""" diff --git a/src/cloudflare/types/kv/namespaces/bulk_update_response.py b/src/cloudflare/types/kv/namespace_bulk_update_response.py similarity index 74% rename from src/cloudflare/types/kv/namespaces/bulk_update_response.py rename to src/cloudflare/types/kv/namespace_bulk_update_response.py index 083a81a27f8..6076c1444f5 100644 --- a/src/cloudflare/types/kv/namespaces/bulk_update_response.py +++ b/src/cloudflare/types/kv/namespace_bulk_update_response.py @@ -2,12 +2,12 @@ from typing import List, Optional -from ...._models import BaseModel +from ..._models import BaseModel -__all__ = ["BulkUpdateResponse"] +__all__ = ["NamespaceBulkUpdateResponse"] -class BulkUpdateResponse(BaseModel): +class NamespaceBulkUpdateResponse(BaseModel): successful_key_count: Optional[float] = None """Number of keys successfully updated""" diff --git a/src/cloudflare/types/kv/namespaces/__init__.py b/src/cloudflare/types/kv/namespaces/__init__.py index 69632f0965e..49140e07efe 100644 --- a/src/cloudflare/types/kv/namespaces/__init__.py +++ b/src/cloudflare/types/kv/namespaces/__init__.py @@ -4,10 +4,7 @@ from .key import Key as Key from .key_list_params import KeyListParams as KeyListParams -from .bulk_update_params import BulkUpdateParams as BulkUpdateParams from .value_update_params import ValueUpdateParams as ValueUpdateParams -from .bulk_delete_response import BulkDeleteResponse as BulkDeleteResponse -from .bulk_update_response import BulkUpdateResponse as BulkUpdateResponse from .metadata_get_response import MetadataGetResponse as MetadataGetResponse from .value_delete_response import ValueDeleteResponse as ValueDeleteResponse from .value_update_response import ValueUpdateResponse as ValueUpdateResponse diff --git a/src/cloudflare/types/load_balancers/__init__.py b/src/cloudflare/types/load_balancers/__init__.py index 46d78e92ec5..c6035687d61 100644 --- a/src/cloudflare/types/load_balancers/__init__.py +++ b/src/cloudflare/types/load_balancers/__init__.py @@ -40,10 +40,12 @@ from .monitor_create_params import MonitorCreateParams as MonitorCreateParams from .monitor_update_params import MonitorUpdateParams as MonitorUpdateParams from .origin_steering_param import OriginSteeringParam as OriginSteeringParam +from .pool_bulk_edit_params import PoolBulkEditParams as PoolBulkEditParams from .random_steering_param import RandomSteeringParam as RandomSteeringParam from .adaptive_routing_param import AdaptiveRoutingParam as AdaptiveRoutingParam from .location_strategy_param import LocationStrategyParam as LocationStrategyParam from .monitor_delete_response import MonitorDeleteResponse as MonitorDeleteResponse +from .pool_bulk_edit_response import PoolBulkEditResponse as PoolBulkEditResponse from .load_balancer_edit_params import LoadBalancerEditParams as LoadBalancerEditParams from .notification_filter_param import NotificationFilterParam as NotificationFilterParam from .load_balancer_create_params import LoadBalancerCreateParams as LoadBalancerCreateParams diff --git a/src/cloudflare/types/load_balancers/pool_bulk_edit_params.py b/src/cloudflare/types/load_balancers/pool_bulk_edit_params.py new file mode 100644 index 00000000000..4e1d26424e0 --- /dev/null +++ b/src/cloudflare/types/load_balancers/pool_bulk_edit_params.py @@ -0,0 +1,19 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing_extensions import Literal, Required, TypedDict + +__all__ = ["PoolBulkEditParams"] + + +class PoolBulkEditParams(TypedDict, total=False): + account_id: Required[str] + """Identifier""" + + notification_email: Literal[""] + """The email address to send health status notifications to. + + This field is now deprecated in favor of Cloudflare Notifications for Load + Balancing, so only resetting this field with an empty string `""` is accepted. + """ diff --git a/src/cloudflare/types/load_balancers/pool_bulk_edit_response.py b/src/cloudflare/types/load_balancers/pool_bulk_edit_response.py new file mode 100644 index 00000000000..068a163bed5 --- /dev/null +++ b/src/cloudflare/types/load_balancers/pool_bulk_edit_response.py @@ -0,0 +1,10 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing import List +from typing_extensions import TypeAlias + +from .pool import Pool + +__all__ = ["PoolBulkEditResponse"] + +PoolBulkEditResponse: TypeAlias = List[Pool] diff --git a/src/cloudflare/types/magic_transit/__init__.py b/src/cloudflare/types/magic_transit/__init__.py index 099059832ec..26a12934156 100644 --- a/src/cloudflare/types/magic_transit/__init__.py +++ b/src/cloudflare/types/magic_transit/__init__.py @@ -46,6 +46,7 @@ from .gre_tunnel_create_params import GRETunnelCreateParams as GRETunnelCreateParams from .gre_tunnel_list_response import GRETunnelListResponse as GRETunnelListResponse from .gre_tunnel_update_params import GRETunnelUpdateParams as GRETunnelUpdateParams +from .route_bulk_update_params import RouteBulkUpdateParams as RouteBulkUpdateParams from .connector_update_response import ConnectorUpdateResponse as ConnectorUpdateResponse from .ipsec_tunnel_get_response import IPSECTunnelGetResponse as IPSECTunnelGetResponse from .gre_tunnel_create_response import GRETunnelCreateResponse as GRETunnelCreateResponse @@ -54,12 +55,19 @@ from .ipsec_tunnel_create_params import IPSECTunnelCreateParams as IPSECTunnelCreateParams from .ipsec_tunnel_list_response import IPSECTunnelListResponse as IPSECTunnelListResponse from .ipsec_tunnel_update_params import IPSECTunnelUpdateParams as IPSECTunnelUpdateParams +from .route_bulk_update_response import RouteBulkUpdateResponse as RouteBulkUpdateResponse from .cf_interconnect_get_response import CfInterconnectGetResponse as CfInterconnectGetResponse from .ipsec_tunnel_create_response import IPSECTunnelCreateResponse as IPSECTunnelCreateResponse from .ipsec_tunnel_delete_response import IPSECTunnelDeleteResponse as IPSECTunnelDeleteResponse from .ipsec_tunnel_update_response import IPSECTunnelUpdateResponse as IPSECTunnelUpdateResponse from .cf_interconnect_list_response import CfInterconnectListResponse as CfInterconnectListResponse from .cf_interconnect_update_params import CfInterconnectUpdateParams as CfInterconnectUpdateParams +from .gre_tunnel_bulk_update_params import GRETunnelBulkUpdateParams as GRETunnelBulkUpdateParams from .cf_interconnect_update_response import CfInterconnectUpdateResponse as CfInterconnectUpdateResponse +from .gre_tunnel_bulk_update_response import GRETunnelBulkUpdateResponse as GRETunnelBulkUpdateResponse +from .ipsec_tunnel_bulk_update_params import IPSECTunnelBulkUpdateParams as IPSECTunnelBulkUpdateParams from .ipsec_tunnel_psk_generate_params import IPSECTunnelPSKGenerateParams as IPSECTunnelPSKGenerateParams +from .ipsec_tunnel_bulk_update_response import IPSECTunnelBulkUpdateResponse as IPSECTunnelBulkUpdateResponse +from .cf_interconnect_bulk_update_params import CfInterconnectBulkUpdateParams as CfInterconnectBulkUpdateParams from .ipsec_tunnel_psk_generate_response import IPSECTunnelPSKGenerateResponse as IPSECTunnelPSKGenerateResponse +from .cf_interconnect_bulk_update_response import CfInterconnectBulkUpdateResponse as CfInterconnectBulkUpdateResponse diff --git a/src/cloudflare/types/magic_transit/cf_interconnect_bulk_update_params.py b/src/cloudflare/types/magic_transit/cf_interconnect_bulk_update_params.py new file mode 100644 index 00000000000..ab9e94f12de --- /dev/null +++ b/src/cloudflare/types/magic_transit/cf_interconnect_bulk_update_params.py @@ -0,0 +1,18 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing_extensions import Required, Annotated, TypedDict + +from ..._utils import PropertyInfo + +__all__ = ["CfInterconnectBulkUpdateParams"] + + +class CfInterconnectBulkUpdateParams(TypedDict, total=False): + account_id: Required[str] + """Identifier""" + + body: Required[object] + + x_magic_new_hc_target: Annotated[bool, PropertyInfo(alias="x-magic-new-hc-target")] diff --git a/src/cloudflare/types/magic_transit/cf_interconnect_bulk_update_response.py b/src/cloudflare/types/magic_transit/cf_interconnect_bulk_update_response.py new file mode 100644 index 00000000000..958181967d4 --- /dev/null +++ b/src/cloudflare/types/magic_transit/cf_interconnect_bulk_update_response.py @@ -0,0 +1,61 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing import List, Optional +from datetime import datetime + +from ..._models import BaseModel +from .health_check import HealthCheck + +__all__ = ["CfInterconnectBulkUpdateResponse", "ModifiedInterconnect", "ModifiedInterconnectGRE"] + + +class ModifiedInterconnectGRE(BaseModel): + cloudflare_endpoint: Optional[str] = None + """ + The IP address assigned to the Cloudflare side of the GRE tunnel created as part + of the Interconnect. + """ + + +class ModifiedInterconnect(BaseModel): + id: Optional[str] = None + """Tunnel identifier tag.""" + + colo_name: Optional[str] = None + """The name of the interconnect. The name cannot share a name with other tunnels.""" + + created_on: Optional[datetime] = None + """The date and time the tunnel was created.""" + + description: Optional[str] = None + """An optional description of the interconnect.""" + + gre: Optional[ModifiedInterconnectGRE] = None + """The configuration specific to GRE interconnects.""" + + health_check: Optional[HealthCheck] = None + + interface_address: Optional[str] = None + """ + A 31-bit prefix (/31 in CIDR notation) supporting two hosts, one for each side + of the tunnel. Select the subnet from the following private IP space: + 10.0.0.0–10.255.255.255, 172.16.0.0–172.31.255.255, 192.168.0.0–192.168.255.255. + """ + + modified_on: Optional[datetime] = None + """The date and time the tunnel was last modified.""" + + mtu: Optional[int] = None + """The Maximum Transmission Unit (MTU) in bytes for the interconnect. + + The minimum value is 576. + """ + + name: Optional[str] = None + """The name of the interconnect. The name cannot share a name with other tunnels.""" + + +class CfInterconnectBulkUpdateResponse(BaseModel): + modified: Optional[bool] = None + + modified_interconnects: Optional[List[ModifiedInterconnect]] = None diff --git a/src/cloudflare/types/magic_transit/gre_tunnel_bulk_update_params.py b/src/cloudflare/types/magic_transit/gre_tunnel_bulk_update_params.py new file mode 100644 index 00000000000..652e4f41702 --- /dev/null +++ b/src/cloudflare/types/magic_transit/gre_tunnel_bulk_update_params.py @@ -0,0 +1,18 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing_extensions import Required, Annotated, TypedDict + +from ..._utils import PropertyInfo + +__all__ = ["GRETunnelBulkUpdateParams"] + + +class GRETunnelBulkUpdateParams(TypedDict, total=False): + account_id: Required[str] + """Identifier""" + + body: Required[object] + + x_magic_new_hc_target: Annotated[bool, PropertyInfo(alias="x-magic-new-hc-target")] diff --git a/src/cloudflare/types/magic_transit/gre_tunnel_bulk_update_response.py b/src/cloudflare/types/magic_transit/gre_tunnel_bulk_update_response.py new file mode 100644 index 00000000000..5ee74bdd932 --- /dev/null +++ b/src/cloudflare/types/magic_transit/gre_tunnel_bulk_update_response.py @@ -0,0 +1,118 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing import List, Union, Optional +from datetime import datetime +from typing_extensions import Literal, TypeAlias + +from ..._models import BaseModel +from .health_check_rate import HealthCheckRate +from .health_check_type import HealthCheckType + +__all__ = [ + "GRETunnelBulkUpdateResponse", + "ModifiedGRETunnel", + "ModifiedGRETunnelHealthCheck", + "ModifiedGRETunnelHealthCheckTarget", + "ModifiedGRETunnelHealthCheckTargetMagicHealthCheckTarget", +] + + +class ModifiedGRETunnelHealthCheckTargetMagicHealthCheckTarget(BaseModel): + effective: Optional[str] = None + """The effective health check target. + + If 'saved' is empty, then this field will be populated with the calculated + default value on GET requests. Ignored in POST, PUT, and PATCH requests. + """ + + saved: Optional[str] = None + """The saved health check target. + + Setting the value to the empty string indicates that the calculated default + value will be used. + """ + + +ModifiedGRETunnelHealthCheckTarget: TypeAlias = Union[ModifiedGRETunnelHealthCheckTargetMagicHealthCheckTarget, str] + + +class ModifiedGRETunnelHealthCheck(BaseModel): + direction: Optional[Literal["unidirectional", "bidirectional"]] = None + """The direction of the flow of the healthcheck. + + Either unidirectional, where the probe comes to you via the tunnel and the + result comes back to Cloudflare via the open Internet, or bidirectional where + both the probe and result come and go via the tunnel. + """ + + enabled: Optional[bool] = None + """Determines whether to run healthchecks for a tunnel.""" + + rate: Optional[HealthCheckRate] = None + """How frequent the health check is run. The default value is `mid`.""" + + target: Optional[ModifiedGRETunnelHealthCheckTarget] = None + """The destination address in a request type health check. + + After the healthcheck is decapsulated at the customer end of the tunnel, the + ICMP echo will be forwarded to this address. This field defaults to + `customer_gre_endpoint address`. This field is ignored for bidirectional + healthchecks as the interface_address (not assigned to the Cloudflare side of + the tunnel) is used as the target. Must be in object form if the + x-magic-new-hc-target header is set to true and string form if + x-magic-new-hc-target is absent or set to false. + """ + + type: Optional[HealthCheckType] = None + """The type of healthcheck to run, reply or request. The default value is `reply`.""" + + +class ModifiedGRETunnel(BaseModel): + cloudflare_gre_endpoint: str + """The IP address assigned to the Cloudflare side of the GRE tunnel.""" + + customer_gre_endpoint: str + """The IP address assigned to the customer side of the GRE tunnel.""" + + interface_address: str + """ + A 31-bit prefix (/31 in CIDR notation) supporting two hosts, one for each side + of the tunnel. Select the subnet from the following private IP space: + 10.0.0.0–10.255.255.255, 172.16.0.0–172.31.255.255, 192.168.0.0–192.168.255.255. + """ + + name: str + """The name of the tunnel. + + The name cannot contain spaces or special characters, must be 15 characters or + less, and cannot share a name with another GRE tunnel. + """ + + id: Optional[str] = None + """Tunnel identifier tag.""" + + created_on: Optional[datetime] = None + """The date and time the tunnel was created.""" + + description: Optional[str] = None + """An optional description of the GRE tunnel.""" + + health_check: Optional[ModifiedGRETunnelHealthCheck] = None + + modified_on: Optional[datetime] = None + """The date and time the tunnel was last modified.""" + + mtu: Optional[int] = None + """Maximum Transmission Unit (MTU) in bytes for the GRE tunnel. + + The minimum value is 576. + """ + + ttl: Optional[int] = None + """Time To Live (TTL) in number of hops of the GRE tunnel.""" + + +class GRETunnelBulkUpdateResponse(BaseModel): + modified: Optional[bool] = None + + modified_gre_tunnels: Optional[List[ModifiedGRETunnel]] = None diff --git a/src/cloudflare/types/magic_transit/ipsec_tunnel_bulk_update_params.py b/src/cloudflare/types/magic_transit/ipsec_tunnel_bulk_update_params.py new file mode 100644 index 00000000000..c35b7181e30 --- /dev/null +++ b/src/cloudflare/types/magic_transit/ipsec_tunnel_bulk_update_params.py @@ -0,0 +1,18 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing_extensions import Required, Annotated, TypedDict + +from ..._utils import PropertyInfo + +__all__ = ["IPSECTunnelBulkUpdateParams"] + + +class IPSECTunnelBulkUpdateParams(TypedDict, total=False): + account_id: Required[str] + """Identifier""" + + body: Required[object] + + x_magic_new_hc_target: Annotated[bool, PropertyInfo(alias="x-magic-new-hc-target")] diff --git a/src/cloudflare/types/magic_transit/ipsec_tunnel_bulk_update_response.py b/src/cloudflare/types/magic_transit/ipsec_tunnel_bulk_update_response.py new file mode 100644 index 00000000000..107d0ce5fa5 --- /dev/null +++ b/src/cloudflare/types/magic_transit/ipsec_tunnel_bulk_update_response.py @@ -0,0 +1,124 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing import List, Union, Optional +from datetime import datetime +from typing_extensions import Literal, TypeAlias + +from ..._models import BaseModel +from .psk_metadata import PSKMetadata +from .health_check_rate import HealthCheckRate +from .health_check_type import HealthCheckType + +__all__ = [ + "IPSECTunnelBulkUpdateResponse", + "ModifiedIPSECTunnel", + "ModifiedIPSECTunnelHealthCheck", + "ModifiedIPSECTunnelHealthCheckTarget", + "ModifiedIPSECTunnelHealthCheckTargetMagicHealthCheckTarget", +] + + +class ModifiedIPSECTunnelHealthCheckTargetMagicHealthCheckTarget(BaseModel): + effective: Optional[str] = None + """The effective health check target. + + If 'saved' is empty, then this field will be populated with the calculated + default value on GET requests. Ignored in POST, PUT, and PATCH requests. + """ + + saved: Optional[str] = None + """The saved health check target. + + Setting the value to the empty string indicates that the calculated default + value will be used. + """ + + +ModifiedIPSECTunnelHealthCheckTarget: TypeAlias = Union[ModifiedIPSECTunnelHealthCheckTargetMagicHealthCheckTarget, str] + + +class ModifiedIPSECTunnelHealthCheck(BaseModel): + direction: Optional[Literal["unidirectional", "bidirectional"]] = None + """The direction of the flow of the healthcheck. + + Either unidirectional, where the probe comes to you via the tunnel and the + result comes back to Cloudflare via the open Internet, or bidirectional where + both the probe and result come and go via the tunnel. + """ + + enabled: Optional[bool] = None + """Determines whether to run healthchecks for a tunnel.""" + + rate: Optional[HealthCheckRate] = None + """How frequent the health check is run. The default value is `mid`.""" + + target: Optional[ModifiedIPSECTunnelHealthCheckTarget] = None + """The destination address in a request type health check. + + After the healthcheck is decapsulated at the customer end of the tunnel, the + ICMP echo will be forwarded to this address. This field defaults to + `customer_gre_endpoint address`. This field is ignored for bidirectional + healthchecks as the interface_address (not assigned to the Cloudflare side of + the tunnel) is used as the target. Must be in object form if the + x-magic-new-hc-target header is set to true and string form if + x-magic-new-hc-target is absent or set to false. + """ + + type: Optional[HealthCheckType] = None + """The type of healthcheck to run, reply or request. The default value is `reply`.""" + + +class ModifiedIPSECTunnel(BaseModel): + cloudflare_endpoint: str + """The IP address assigned to the Cloudflare side of the IPsec tunnel.""" + + interface_address: str + """ + A 31-bit prefix (/31 in CIDR notation) supporting two hosts, one for each side + of the tunnel. Select the subnet from the following private IP space: + 10.0.0.0–10.255.255.255, 172.16.0.0–172.31.255.255, 192.168.0.0–192.168.255.255. + """ + + name: str + """The name of the IPsec tunnel. The name cannot share a name with other tunnels.""" + + id: Optional[str] = None + """Tunnel identifier tag.""" + + allow_null_cipher: Optional[bool] = None + """ + When `true`, the tunnel can use a null-cipher (`ENCR_NULL`) in the ESP tunnel + (Phase 2). + """ + + created_on: Optional[datetime] = None + """The date and time the tunnel was created.""" + + customer_endpoint: Optional[str] = None + """The IP address assigned to the customer side of the IPsec tunnel. + + Not required, but must be set for proactive traceroutes to work. + """ + + description: Optional[str] = None + """An optional description forthe IPsec tunnel.""" + + health_check: Optional[ModifiedIPSECTunnelHealthCheck] = None + + modified_on: Optional[datetime] = None + """The date and time the tunnel was last modified.""" + + psk_metadata: Optional[PSKMetadata] = None + """The PSK metadata that includes when the PSK was generated.""" + + replay_protection: Optional[bool] = None + """ + If `true`, then IPsec replay protection will be supported in the + Cloudflare-to-customer direction. + """ + + +class IPSECTunnelBulkUpdateResponse(BaseModel): + modified: Optional[bool] = None + + modified_ipsec_tunnels: Optional[List[ModifiedIPSECTunnel]] = None diff --git a/src/cloudflare/types/magic_transit/route_bulk_update_params.py b/src/cloudflare/types/magic_transit/route_bulk_update_params.py new file mode 100644 index 00000000000..9fe9f18041d --- /dev/null +++ b/src/cloudflare/types/magic_transit/route_bulk_update_params.py @@ -0,0 +1,40 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing import Iterable +from typing_extensions import Required, TypedDict + +from .scope_param import ScopeParam + +__all__ = ["RouteBulkUpdateParams", "Route"] + + +class RouteBulkUpdateParams(TypedDict, total=False): + account_id: Required[str] + """Identifier""" + + routes: Required[Iterable[Route]] + + +class Route(TypedDict, total=False): + id: Required[str] + """Identifier""" + + nexthop: Required[str] + """The next-hop IP Address for the static route.""" + + prefix: Required[str] + """IP Prefix in Classless Inter-Domain Routing format.""" + + priority: Required[int] + """Priority of the static route.""" + + description: str + """An optional human provided description of the static route.""" + + scope: ScopeParam + """Used only for ECMP routes.""" + + weight: int + """Optional weight of the ECMP scope - if provided.""" diff --git a/src/cloudflare/types/magic_transit/route_bulk_update_response.py b/src/cloudflare/types/magic_transit/route_bulk_update_response.py new file mode 100644 index 00000000000..6c675c3587c --- /dev/null +++ b/src/cloudflare/types/magic_transit/route_bulk_update_response.py @@ -0,0 +1,44 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing import List, Optional +from datetime import datetime + +from .scope import Scope +from ..._models import BaseModel + +__all__ = ["RouteBulkUpdateResponse", "ModifiedRoute"] + + +class ModifiedRoute(BaseModel): + nexthop: str + """The next-hop IP Address for the static route.""" + + prefix: str + """IP Prefix in Classless Inter-Domain Routing format.""" + + priority: int + """Priority of the static route.""" + + id: Optional[str] = None + """Identifier""" + + created_on: Optional[datetime] = None + """When the route was created.""" + + description: Optional[str] = None + """An optional human provided description of the static route.""" + + modified_on: Optional[datetime] = None + """When the route was last modified.""" + + scope: Optional[Scope] = None + """Used only for ECMP routes.""" + + weight: Optional[int] = None + """Optional weight of the ECMP scope - if provided.""" + + +class RouteBulkUpdateResponse(BaseModel): + modified: Optional[bool] = None + + modified_routes: Optional[List[ModifiedRoute]] = None diff --git a/src/cloudflare/types/rum/__init__.py b/src/cloudflare/types/rum/__init__.py index 870d7373122..31efc427c14 100644 --- a/src/cloudflare/types/rum/__init__.py +++ b/src/cloudflare/types/rum/__init__.py @@ -9,6 +9,8 @@ from .rule_update_params import RuleUpdateParams as RuleUpdateParams from .rule_delete_response import RuleDeleteResponse as RuleDeleteResponse from .site_info_list_params import SiteInfoListParams as SiteInfoListParams +from .rule_bulk_create_params import RuleBulkCreateParams as RuleBulkCreateParams from .site_info_create_params import SiteInfoCreateParams as SiteInfoCreateParams from .site_info_update_params import SiteInfoUpdateParams as SiteInfoUpdateParams +from .rule_bulk_create_response import RuleBulkCreateResponse as RuleBulkCreateResponse from .site_info_delete_response import SiteInfoDeleteResponse as SiteInfoDeleteResponse diff --git a/src/cloudflare/types/rum/rule_bulk_create_params.py b/src/cloudflare/types/rum/rule_bulk_create_params.py new file mode 100644 index 00000000000..c99c444584e --- /dev/null +++ b/src/cloudflare/types/rum/rule_bulk_create_params.py @@ -0,0 +1,32 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing import List, Iterable +from typing_extensions import Required, TypedDict + +__all__ = ["RuleBulkCreateParams", "Rule"] + + +class RuleBulkCreateParams(TypedDict, total=False): + account_id: Required[str] + """Identifier""" + + delete_rules: List[str] + """A list of rule identifiers to delete.""" + + rules: Iterable[Rule] + """A list of rules to create or update.""" + + +class Rule(TypedDict, total=False): + id: str + """The Web Analytics rule identifier.""" + + host: str + + inclusive: bool + + is_paused: bool + + paths: List[str] diff --git a/src/cloudflare/types/rum/rule_bulk_create_response.py b/src/cloudflare/types/rum/rule_bulk_create_response.py new file mode 100644 index 00000000000..7370f98b684 --- /dev/null +++ b/src/cloudflare/types/rum/rule_bulk_create_response.py @@ -0,0 +1,28 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing import List, Optional + +from .rum_rule import RUMRule +from ..._models import BaseModel + +__all__ = ["RuleBulkCreateResponse", "Ruleset"] + + +class Ruleset(BaseModel): + id: Optional[str] = None + """The Web Analytics ruleset identifier.""" + + enabled: Optional[bool] = None + """Whether the ruleset is enabled.""" + + zone_name: Optional[str] = None + + zone_tag: Optional[str] = None + """The zone identifier.""" + + +class RuleBulkCreateResponse(BaseModel): + rules: Optional[List[RUMRule]] = None + """A list of rules.""" + + ruleset: Optional[Ruleset] = None diff --git a/tests/api_resources/api_gateway/discovery/test_operations.py b/tests/api_resources/api_gateway/discovery/test_operations.py index 021c6643c93..01e6ba3122e 100644 --- a/tests/api_resources/api_gateway/discovery/test_operations.py +++ b/tests/api_resources/api_gateway/discovery/test_operations.py @@ -11,7 +11,10 @@ from tests.utils import assert_matches_type from cloudflare.pagination import SyncV4PagePaginationArray, AsyncV4PagePaginationArray from cloudflare.types.api_gateway import DiscoveryOperation -from cloudflare.types.api_gateway.discovery import OperationEditResponse +from cloudflare.types.api_gateway.discovery import ( + OperationEditResponse, + OperationBulkEditResponse, +) base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") @@ -74,6 +77,60 @@ def test_path_params_list(self, client: Cloudflare) -> None: zone_id="", ) + @parametrize + def test_method_bulk_edit(self, client: Cloudflare) -> None: + operation = client.api_gateway.discovery.operations.bulk_edit( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + body={ + "3818d821-5901-4147-a474-f5f5aec1d54e": {}, + "b17c8043-99a0-4202-b7d9-8f7cdbee02cd": {}, + }, + ) + assert_matches_type(OperationBulkEditResponse, operation, path=["response"]) + + @parametrize + def test_raw_response_bulk_edit(self, client: Cloudflare) -> None: + response = client.api_gateway.discovery.operations.with_raw_response.bulk_edit( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + body={ + "3818d821-5901-4147-a474-f5f5aec1d54e": {}, + "b17c8043-99a0-4202-b7d9-8f7cdbee02cd": {}, + }, + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + operation = response.parse() + assert_matches_type(OperationBulkEditResponse, operation, path=["response"]) + + @parametrize + def test_streaming_response_bulk_edit(self, client: Cloudflare) -> None: + with client.api_gateway.discovery.operations.with_streaming_response.bulk_edit( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + body={ + "3818d821-5901-4147-a474-f5f5aec1d54e": {}, + "b17c8043-99a0-4202-b7d9-8f7cdbee02cd": {}, + }, + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + operation = response.parse() + assert_matches_type(OperationBulkEditResponse, operation, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_path_params_bulk_edit(self, client: Cloudflare) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `zone_id` but received ''"): + client.api_gateway.discovery.operations.with_raw_response.bulk_edit( + zone_id="", + body={ + "3818d821-5901-4147-a474-f5f5aec1d54e": {}, + "b17c8043-99a0-4202-b7d9-8f7cdbee02cd": {}, + }, + ) + @parametrize def test_method_edit(self, client: Cloudflare) -> None: operation = client.api_gateway.discovery.operations.edit( @@ -190,6 +247,60 @@ async def test_path_params_list(self, async_client: AsyncCloudflare) -> None: zone_id="", ) + @parametrize + async def test_method_bulk_edit(self, async_client: AsyncCloudflare) -> None: + operation = await async_client.api_gateway.discovery.operations.bulk_edit( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + body={ + "3818d821-5901-4147-a474-f5f5aec1d54e": {}, + "b17c8043-99a0-4202-b7d9-8f7cdbee02cd": {}, + }, + ) + assert_matches_type(OperationBulkEditResponse, operation, path=["response"]) + + @parametrize + async def test_raw_response_bulk_edit(self, async_client: AsyncCloudflare) -> None: + response = await async_client.api_gateway.discovery.operations.with_raw_response.bulk_edit( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + body={ + "3818d821-5901-4147-a474-f5f5aec1d54e": {}, + "b17c8043-99a0-4202-b7d9-8f7cdbee02cd": {}, + }, + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + operation = await response.parse() + assert_matches_type(OperationBulkEditResponse, operation, path=["response"]) + + @parametrize + async def test_streaming_response_bulk_edit(self, async_client: AsyncCloudflare) -> None: + async with async_client.api_gateway.discovery.operations.with_streaming_response.bulk_edit( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + body={ + "3818d821-5901-4147-a474-f5f5aec1d54e": {}, + "b17c8043-99a0-4202-b7d9-8f7cdbee02cd": {}, + }, + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + operation = await response.parse() + assert_matches_type(OperationBulkEditResponse, operation, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_path_params_bulk_edit(self, async_client: AsyncCloudflare) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `zone_id` but received ''"): + await async_client.api_gateway.discovery.operations.with_raw_response.bulk_edit( + zone_id="", + body={ + "3818d821-5901-4147-a474-f5f5aec1d54e": {}, + "b17c8043-99a0-4202-b7d9-8f7cdbee02cd": {}, + }, + ) + @parametrize async def test_method_edit(self, async_client: AsyncCloudflare) -> None: operation = await async_client.api_gateway.discovery.operations.edit( diff --git a/tests/api_resources/api_gateway/test_operations.py b/tests/api_resources/api_gateway/test_operations.py index 255418352e0..2be09e57fa3 100644 --- a/tests/api_resources/api_gateway/test_operations.py +++ b/tests/api_resources/api_gateway/test_operations.py @@ -15,6 +15,7 @@ OperationListResponse, OperationCreateResponse, OperationDeleteResponse, + OperationBulkDeleteResponse, ) base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") @@ -190,6 +191,44 @@ def test_path_params_delete(self, client: Cloudflare) -> None: zone_id="023e105f4ecef8ad9ca31a8372d0c353", ) + @parametrize + def test_method_bulk_delete(self, client: Cloudflare) -> None: + operation = client.api_gateway.operations.bulk_delete( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + ) + assert_matches_type(OperationBulkDeleteResponse, operation, path=["response"]) + + @parametrize + def test_raw_response_bulk_delete(self, client: Cloudflare) -> None: + response = client.api_gateway.operations.with_raw_response.bulk_delete( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + operation = response.parse() + assert_matches_type(OperationBulkDeleteResponse, operation, path=["response"]) + + @parametrize + def test_streaming_response_bulk_delete(self, client: Cloudflare) -> None: + with client.api_gateway.operations.with_streaming_response.bulk_delete( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + operation = response.parse() + assert_matches_type(OperationBulkDeleteResponse, operation, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_path_params_bulk_delete(self, client: Cloudflare) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `zone_id` but received ''"): + client.api_gateway.operations.with_raw_response.bulk_delete( + zone_id="", + ) + @parametrize def test_method_get(self, client: Cloudflare) -> None: operation = client.api_gateway.operations.get( @@ -418,6 +457,44 @@ async def test_path_params_delete(self, async_client: AsyncCloudflare) -> None: zone_id="023e105f4ecef8ad9ca31a8372d0c353", ) + @parametrize + async def test_method_bulk_delete(self, async_client: AsyncCloudflare) -> None: + operation = await async_client.api_gateway.operations.bulk_delete( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + ) + assert_matches_type(OperationBulkDeleteResponse, operation, path=["response"]) + + @parametrize + async def test_raw_response_bulk_delete(self, async_client: AsyncCloudflare) -> None: + response = await async_client.api_gateway.operations.with_raw_response.bulk_delete( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + operation = await response.parse() + assert_matches_type(OperationBulkDeleteResponse, operation, path=["response"]) + + @parametrize + async def test_streaming_response_bulk_delete(self, async_client: AsyncCloudflare) -> None: + async with async_client.api_gateway.operations.with_streaming_response.bulk_delete( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + operation = await response.parse() + assert_matches_type(OperationBulkDeleteResponse, operation, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_path_params_bulk_delete(self, async_client: AsyncCloudflare) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `zone_id` but received ''"): + await async_client.api_gateway.operations.with_raw_response.bulk_delete( + zone_id="", + ) + @parametrize async def test_method_get(self, async_client: AsyncCloudflare) -> None: operation = await async_client.api_gateway.operations.get( diff --git a/tests/api_resources/email_security/settings/test_domains.py b/tests/api_resources/email_security/settings/test_domains.py index 462d209c780..f2ee13c6fbb 100644 --- a/tests/api_resources/email_security/settings/test_domains.py +++ b/tests/api_resources/email_security/settings/test_domains.py @@ -15,6 +15,7 @@ DomainEditResponse, DomainListResponse, DomainDeleteResponse, + DomainBulkDeleteResponse, ) base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") @@ -117,6 +118,44 @@ def test_path_params_delete(self, client: Cloudflare) -> None: account_id="", ) + @parametrize + def test_method_bulk_delete(self, client: Cloudflare) -> None: + domain = client.email_security.settings.domains.bulk_delete( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + ) + assert_matches_type(DomainBulkDeleteResponse, domain, path=["response"]) + + @parametrize + def test_raw_response_bulk_delete(self, client: Cloudflare) -> None: + response = client.email_security.settings.domains.with_raw_response.bulk_delete( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + domain = response.parse() + assert_matches_type(DomainBulkDeleteResponse, domain, path=["response"]) + + @parametrize + def test_streaming_response_bulk_delete(self, client: Cloudflare) -> None: + with client.email_security.settings.domains.with_streaming_response.bulk_delete( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + domain = response.parse() + assert_matches_type(DomainBulkDeleteResponse, domain, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_path_params_bulk_delete(self, client: Cloudflare) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `account_id` but received ''"): + client.email_security.settings.domains.with_raw_response.bulk_delete( + account_id="", + ) + @parametrize def test_method_edit(self, client: Cloudflare) -> None: domain = client.email_security.settings.domains.edit( @@ -311,6 +350,44 @@ async def test_path_params_delete(self, async_client: AsyncCloudflare) -> None: account_id="", ) + @parametrize + async def test_method_bulk_delete(self, async_client: AsyncCloudflare) -> None: + domain = await async_client.email_security.settings.domains.bulk_delete( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + ) + assert_matches_type(DomainBulkDeleteResponse, domain, path=["response"]) + + @parametrize + async def test_raw_response_bulk_delete(self, async_client: AsyncCloudflare) -> None: + response = await async_client.email_security.settings.domains.with_raw_response.bulk_delete( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + domain = await response.parse() + assert_matches_type(DomainBulkDeleteResponse, domain, path=["response"]) + + @parametrize + async def test_streaming_response_bulk_delete(self, async_client: AsyncCloudflare) -> None: + async with async_client.email_security.settings.domains.with_streaming_response.bulk_delete( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + domain = await response.parse() + assert_matches_type(DomainBulkDeleteResponse, domain, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_path_params_bulk_delete(self, async_client: AsyncCloudflare) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `account_id` but received ''"): + await async_client.email_security.settings.domains.with_raw_response.bulk_delete( + account_id="", + ) + @parametrize async def test_method_edit(self, async_client: AsyncCloudflare) -> None: domain = await async_client.email_security.settings.domains.edit( diff --git a/tests/api_resources/firewall/test_rules.py b/tests/api_resources/firewall/test_rules.py index 8f4c18bf1e2..62388686851 100644 --- a/tests/api_resources/firewall/test_rules.py +++ b/tests/api_resources/firewall/test_rules.py @@ -14,6 +14,9 @@ FirewallRule, RuleEditResponse, RuleCreateResponse, + RuleBulkEditResponse, + RuleBulkDeleteResponse, + RuleBulkUpdateResponse, ) # pyright: reportDeprecated=false @@ -306,6 +309,143 @@ def test_path_params_delete(self, client: Cloudflare) -> None: zone_id="023e105f4ecef8ad9ca31a8372d0c353", ) + @parametrize + def test_method_bulk_delete(self, client: Cloudflare) -> None: + with pytest.warns(DeprecationWarning): + rule = client.firewall.rules.bulk_delete( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + ) + + assert_matches_type(Optional[RuleBulkDeleteResponse], rule, path=["response"]) + + @parametrize + def test_raw_response_bulk_delete(self, client: Cloudflare) -> None: + with pytest.warns(DeprecationWarning): + response = client.firewall.rules.with_raw_response.bulk_delete( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + rule = response.parse() + assert_matches_type(Optional[RuleBulkDeleteResponse], rule, path=["response"]) + + @parametrize + def test_streaming_response_bulk_delete(self, client: Cloudflare) -> None: + with pytest.warns(DeprecationWarning): + with client.firewall.rules.with_streaming_response.bulk_delete( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + rule = response.parse() + assert_matches_type(Optional[RuleBulkDeleteResponse], rule, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_path_params_bulk_delete(self, client: Cloudflare) -> None: + with pytest.warns(DeprecationWarning): + with pytest.raises(ValueError, match=r"Expected a non-empty value for `zone_id` but received ''"): + client.firewall.rules.with_raw_response.bulk_delete( + zone_id="", + ) + + @parametrize + def test_method_bulk_edit(self, client: Cloudflare) -> None: + with pytest.warns(DeprecationWarning): + rule = client.firewall.rules.bulk_edit( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + body={}, + ) + + assert_matches_type(Optional[RuleBulkEditResponse], rule, path=["response"]) + + @parametrize + def test_raw_response_bulk_edit(self, client: Cloudflare) -> None: + with pytest.warns(DeprecationWarning): + response = client.firewall.rules.with_raw_response.bulk_edit( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + body={}, + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + rule = response.parse() + assert_matches_type(Optional[RuleBulkEditResponse], rule, path=["response"]) + + @parametrize + def test_streaming_response_bulk_edit(self, client: Cloudflare) -> None: + with pytest.warns(DeprecationWarning): + with client.firewall.rules.with_streaming_response.bulk_edit( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + body={}, + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + rule = response.parse() + assert_matches_type(Optional[RuleBulkEditResponse], rule, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_path_params_bulk_edit(self, client: Cloudflare) -> None: + with pytest.warns(DeprecationWarning): + with pytest.raises(ValueError, match=r"Expected a non-empty value for `zone_id` but received ''"): + client.firewall.rules.with_raw_response.bulk_edit( + zone_id="", + body={}, + ) + + @parametrize + def test_method_bulk_update(self, client: Cloudflare) -> None: + with pytest.warns(DeprecationWarning): + rule = client.firewall.rules.bulk_update( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + body={}, + ) + + assert_matches_type(Optional[RuleBulkUpdateResponse], rule, path=["response"]) + + @parametrize + def test_raw_response_bulk_update(self, client: Cloudflare) -> None: + with pytest.warns(DeprecationWarning): + response = client.firewall.rules.with_raw_response.bulk_update( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + body={}, + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + rule = response.parse() + assert_matches_type(Optional[RuleBulkUpdateResponse], rule, path=["response"]) + + @parametrize + def test_streaming_response_bulk_update(self, client: Cloudflare) -> None: + with pytest.warns(DeprecationWarning): + with client.firewall.rules.with_streaming_response.bulk_update( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + body={}, + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + rule = response.parse() + assert_matches_type(Optional[RuleBulkUpdateResponse], rule, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_path_params_bulk_update(self, client: Cloudflare) -> None: + with pytest.warns(DeprecationWarning): + with pytest.raises(ValueError, match=r"Expected a non-empty value for `zone_id` but received ''"): + client.firewall.rules.with_raw_response.bulk_update( + zone_id="", + body={}, + ) + @pytest.mark.skip(reason="TODO: investigate broken test") @parametrize def test_method_edit(self, client: Cloudflare) -> None: @@ -713,6 +853,143 @@ async def test_path_params_delete(self, async_client: AsyncCloudflare) -> None: zone_id="023e105f4ecef8ad9ca31a8372d0c353", ) + @parametrize + async def test_method_bulk_delete(self, async_client: AsyncCloudflare) -> None: + with pytest.warns(DeprecationWarning): + rule = await async_client.firewall.rules.bulk_delete( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + ) + + assert_matches_type(Optional[RuleBulkDeleteResponse], rule, path=["response"]) + + @parametrize + async def test_raw_response_bulk_delete(self, async_client: AsyncCloudflare) -> None: + with pytest.warns(DeprecationWarning): + response = await async_client.firewall.rules.with_raw_response.bulk_delete( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + rule = await response.parse() + assert_matches_type(Optional[RuleBulkDeleteResponse], rule, path=["response"]) + + @parametrize + async def test_streaming_response_bulk_delete(self, async_client: AsyncCloudflare) -> None: + with pytest.warns(DeprecationWarning): + async with async_client.firewall.rules.with_streaming_response.bulk_delete( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + rule = await response.parse() + assert_matches_type(Optional[RuleBulkDeleteResponse], rule, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_path_params_bulk_delete(self, async_client: AsyncCloudflare) -> None: + with pytest.warns(DeprecationWarning): + with pytest.raises(ValueError, match=r"Expected a non-empty value for `zone_id` but received ''"): + await async_client.firewall.rules.with_raw_response.bulk_delete( + zone_id="", + ) + + @parametrize + async def test_method_bulk_edit(self, async_client: AsyncCloudflare) -> None: + with pytest.warns(DeprecationWarning): + rule = await async_client.firewall.rules.bulk_edit( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + body={}, + ) + + assert_matches_type(Optional[RuleBulkEditResponse], rule, path=["response"]) + + @parametrize + async def test_raw_response_bulk_edit(self, async_client: AsyncCloudflare) -> None: + with pytest.warns(DeprecationWarning): + response = await async_client.firewall.rules.with_raw_response.bulk_edit( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + body={}, + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + rule = await response.parse() + assert_matches_type(Optional[RuleBulkEditResponse], rule, path=["response"]) + + @parametrize + async def test_streaming_response_bulk_edit(self, async_client: AsyncCloudflare) -> None: + with pytest.warns(DeprecationWarning): + async with async_client.firewall.rules.with_streaming_response.bulk_edit( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + body={}, + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + rule = await response.parse() + assert_matches_type(Optional[RuleBulkEditResponse], rule, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_path_params_bulk_edit(self, async_client: AsyncCloudflare) -> None: + with pytest.warns(DeprecationWarning): + with pytest.raises(ValueError, match=r"Expected a non-empty value for `zone_id` but received ''"): + await async_client.firewall.rules.with_raw_response.bulk_edit( + zone_id="", + body={}, + ) + + @parametrize + async def test_method_bulk_update(self, async_client: AsyncCloudflare) -> None: + with pytest.warns(DeprecationWarning): + rule = await async_client.firewall.rules.bulk_update( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + body={}, + ) + + assert_matches_type(Optional[RuleBulkUpdateResponse], rule, path=["response"]) + + @parametrize + async def test_raw_response_bulk_update(self, async_client: AsyncCloudflare) -> None: + with pytest.warns(DeprecationWarning): + response = await async_client.firewall.rules.with_raw_response.bulk_update( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + body={}, + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + rule = await response.parse() + assert_matches_type(Optional[RuleBulkUpdateResponse], rule, path=["response"]) + + @parametrize + async def test_streaming_response_bulk_update(self, async_client: AsyncCloudflare) -> None: + with pytest.warns(DeprecationWarning): + async with async_client.firewall.rules.with_streaming_response.bulk_update( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + body={}, + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + rule = await response.parse() + assert_matches_type(Optional[RuleBulkUpdateResponse], rule, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_path_params_bulk_update(self, async_client: AsyncCloudflare) -> None: + with pytest.warns(DeprecationWarning): + with pytest.raises(ValueError, match=r"Expected a non-empty value for `zone_id` but received ''"): + await async_client.firewall.rules.with_raw_response.bulk_update( + zone_id="", + body={}, + ) + @pytest.mark.skip(reason="TODO: investigate broken test") @parametrize async def test_method_edit(self, async_client: AsyncCloudflare) -> None: diff --git a/tests/api_resources/kv/namespaces/test_bulk.py b/tests/api_resources/kv/namespaces/test_bulk.py deleted file mode 100644 index 57f87368451..00000000000 --- a/tests/api_resources/kv/namespaces/test_bulk.py +++ /dev/null @@ -1,224 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from __future__ import annotations - -import os -from typing import Any, Optional, cast - -import pytest - -from cloudflare import Cloudflare, AsyncCloudflare -from tests.utils import assert_matches_type -from cloudflare.types.kv.namespaces import BulkDeleteResponse, BulkUpdateResponse - -base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") - - -class TestBulk: - parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"]) - - @parametrize - def test_method_update(self, client: Cloudflare) -> None: - bulk = client.kv.namespaces.bulk.update( - namespace_id="0f2ac74b498b48028cb68387c421e279", - account_id="023e105f4ecef8ad9ca31a8372d0c353", - body=[{}], - ) - assert_matches_type(Optional[BulkUpdateResponse], bulk, path=["response"]) - - @parametrize - def test_raw_response_update(self, client: Cloudflare) -> None: - response = client.kv.namespaces.bulk.with_raw_response.update( - namespace_id="0f2ac74b498b48028cb68387c421e279", - account_id="023e105f4ecef8ad9ca31a8372d0c353", - body=[{}], - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - bulk = response.parse() - assert_matches_type(Optional[BulkUpdateResponse], bulk, path=["response"]) - - @parametrize - def test_streaming_response_update(self, client: Cloudflare) -> None: - with client.kv.namespaces.bulk.with_streaming_response.update( - namespace_id="0f2ac74b498b48028cb68387c421e279", - account_id="023e105f4ecef8ad9ca31a8372d0c353", - body=[{}], - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - bulk = response.parse() - assert_matches_type(Optional[BulkUpdateResponse], bulk, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @parametrize - def test_path_params_update(self, client: Cloudflare) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `account_id` but received ''"): - client.kv.namespaces.bulk.with_raw_response.update( - namespace_id="0f2ac74b498b48028cb68387c421e279", - account_id="", - body=[{}], - ) - - with pytest.raises(ValueError, match=r"Expected a non-empty value for `namespace_id` but received ''"): - client.kv.namespaces.bulk.with_raw_response.update( - namespace_id="", - account_id="023e105f4ecef8ad9ca31a8372d0c353", - body=[{}], - ) - - @parametrize - def test_method_delete(self, client: Cloudflare) -> None: - bulk = client.kv.namespaces.bulk.delete( - namespace_id="0f2ac74b498b48028cb68387c421e279", - account_id="023e105f4ecef8ad9ca31a8372d0c353", - ) - assert_matches_type(Optional[BulkDeleteResponse], bulk, path=["response"]) - - @parametrize - def test_raw_response_delete(self, client: Cloudflare) -> None: - response = client.kv.namespaces.bulk.with_raw_response.delete( - namespace_id="0f2ac74b498b48028cb68387c421e279", - account_id="023e105f4ecef8ad9ca31a8372d0c353", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - bulk = response.parse() - assert_matches_type(Optional[BulkDeleteResponse], bulk, path=["response"]) - - @parametrize - def test_streaming_response_delete(self, client: Cloudflare) -> None: - with client.kv.namespaces.bulk.with_streaming_response.delete( - namespace_id="0f2ac74b498b48028cb68387c421e279", - account_id="023e105f4ecef8ad9ca31a8372d0c353", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - bulk = response.parse() - assert_matches_type(Optional[BulkDeleteResponse], bulk, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @parametrize - def test_path_params_delete(self, client: Cloudflare) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `account_id` but received ''"): - client.kv.namespaces.bulk.with_raw_response.delete( - namespace_id="0f2ac74b498b48028cb68387c421e279", - account_id="", - ) - - with pytest.raises(ValueError, match=r"Expected a non-empty value for `namespace_id` but received ''"): - client.kv.namespaces.bulk.with_raw_response.delete( - namespace_id="", - account_id="023e105f4ecef8ad9ca31a8372d0c353", - ) - - -class TestAsyncBulk: - parametrize = pytest.mark.parametrize("async_client", [False, True], indirect=True, ids=["loose", "strict"]) - - @parametrize - async def test_method_update(self, async_client: AsyncCloudflare) -> None: - bulk = await async_client.kv.namespaces.bulk.update( - namespace_id="0f2ac74b498b48028cb68387c421e279", - account_id="023e105f4ecef8ad9ca31a8372d0c353", - body=[{}], - ) - assert_matches_type(Optional[BulkUpdateResponse], bulk, path=["response"]) - - @parametrize - async def test_raw_response_update(self, async_client: AsyncCloudflare) -> None: - response = await async_client.kv.namespaces.bulk.with_raw_response.update( - namespace_id="0f2ac74b498b48028cb68387c421e279", - account_id="023e105f4ecef8ad9ca31a8372d0c353", - body=[{}], - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - bulk = await response.parse() - assert_matches_type(Optional[BulkUpdateResponse], bulk, path=["response"]) - - @parametrize - async def test_streaming_response_update(self, async_client: AsyncCloudflare) -> None: - async with async_client.kv.namespaces.bulk.with_streaming_response.update( - namespace_id="0f2ac74b498b48028cb68387c421e279", - account_id="023e105f4ecef8ad9ca31a8372d0c353", - body=[{}], - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - bulk = await response.parse() - assert_matches_type(Optional[BulkUpdateResponse], bulk, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @parametrize - async def test_path_params_update(self, async_client: AsyncCloudflare) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `account_id` but received ''"): - await async_client.kv.namespaces.bulk.with_raw_response.update( - namespace_id="0f2ac74b498b48028cb68387c421e279", - account_id="", - body=[{}], - ) - - with pytest.raises(ValueError, match=r"Expected a non-empty value for `namespace_id` but received ''"): - await async_client.kv.namespaces.bulk.with_raw_response.update( - namespace_id="", - account_id="023e105f4ecef8ad9ca31a8372d0c353", - body=[{}], - ) - - @parametrize - async def test_method_delete(self, async_client: AsyncCloudflare) -> None: - bulk = await async_client.kv.namespaces.bulk.delete( - namespace_id="0f2ac74b498b48028cb68387c421e279", - account_id="023e105f4ecef8ad9ca31a8372d0c353", - ) - assert_matches_type(Optional[BulkDeleteResponse], bulk, path=["response"]) - - @parametrize - async def test_raw_response_delete(self, async_client: AsyncCloudflare) -> None: - response = await async_client.kv.namespaces.bulk.with_raw_response.delete( - namespace_id="0f2ac74b498b48028cb68387c421e279", - account_id="023e105f4ecef8ad9ca31a8372d0c353", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - bulk = await response.parse() - assert_matches_type(Optional[BulkDeleteResponse], bulk, path=["response"]) - - @parametrize - async def test_streaming_response_delete(self, async_client: AsyncCloudflare) -> None: - async with async_client.kv.namespaces.bulk.with_streaming_response.delete( - namespace_id="0f2ac74b498b48028cb68387c421e279", - account_id="023e105f4ecef8ad9ca31a8372d0c353", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - bulk = await response.parse() - assert_matches_type(Optional[BulkDeleteResponse], bulk, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @parametrize - async def test_path_params_delete(self, async_client: AsyncCloudflare) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `account_id` but received ''"): - await async_client.kv.namespaces.bulk.with_raw_response.delete( - namespace_id="0f2ac74b498b48028cb68387c421e279", - account_id="", - ) - - with pytest.raises(ValueError, match=r"Expected a non-empty value for `namespace_id` but received ''"): - await async_client.kv.namespaces.bulk.with_raw_response.delete( - namespace_id="", - account_id="023e105f4ecef8ad9ca31a8372d0c353", - ) diff --git a/tests/api_resources/kv/test_namespaces.py b/tests/api_resources/kv/test_namespaces.py index aa2e9589dfe..7f288603c1d 100644 --- a/tests/api_resources/kv/test_namespaces.py +++ b/tests/api_resources/kv/test_namespaces.py @@ -13,6 +13,8 @@ Namespace, NamespaceDeleteResponse, NamespaceUpdateResponse, + NamespaceBulkDeleteResponse, + NamespaceBulkUpdateResponse, ) from cloudflare.pagination import SyncV4PagePaginationArray, AsyncV4PagePaginationArray @@ -214,6 +216,112 @@ def test_path_params_delete(self, client: Cloudflare) -> None: account_id="023e105f4ecef8ad9ca31a8372d0c353", ) + @parametrize + def test_method_bulk_delete(self, client: Cloudflare) -> None: + namespace = client.kv.namespaces.bulk_delete( + namespace_id="0f2ac74b498b48028cb68387c421e279", + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body=["My-Key"], + ) + assert_matches_type(Optional[NamespaceBulkDeleteResponse], namespace, path=["response"]) + + @parametrize + def test_raw_response_bulk_delete(self, client: Cloudflare) -> None: + response = client.kv.namespaces.with_raw_response.bulk_delete( + namespace_id="0f2ac74b498b48028cb68387c421e279", + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body=["My-Key"], + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + namespace = response.parse() + assert_matches_type(Optional[NamespaceBulkDeleteResponse], namespace, path=["response"]) + + @parametrize + def test_streaming_response_bulk_delete(self, client: Cloudflare) -> None: + with client.kv.namespaces.with_streaming_response.bulk_delete( + namespace_id="0f2ac74b498b48028cb68387c421e279", + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body=["My-Key"], + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + namespace = response.parse() + assert_matches_type(Optional[NamespaceBulkDeleteResponse], namespace, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_path_params_bulk_delete(self, client: Cloudflare) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `account_id` but received ''"): + client.kv.namespaces.with_raw_response.bulk_delete( + namespace_id="0f2ac74b498b48028cb68387c421e279", + account_id="", + body=["My-Key"], + ) + + with pytest.raises(ValueError, match=r"Expected a non-empty value for `namespace_id` but received ''"): + client.kv.namespaces.with_raw_response.bulk_delete( + namespace_id="", + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body=["My-Key"], + ) + + @parametrize + def test_method_bulk_update(self, client: Cloudflare) -> None: + namespace = client.kv.namespaces.bulk_update( + namespace_id="0f2ac74b498b48028cb68387c421e279", + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body=[{}], + ) + assert_matches_type(Optional[NamespaceBulkUpdateResponse], namespace, path=["response"]) + + @parametrize + def test_raw_response_bulk_update(self, client: Cloudflare) -> None: + response = client.kv.namespaces.with_raw_response.bulk_update( + namespace_id="0f2ac74b498b48028cb68387c421e279", + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body=[{}], + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + namespace = response.parse() + assert_matches_type(Optional[NamespaceBulkUpdateResponse], namespace, path=["response"]) + + @parametrize + def test_streaming_response_bulk_update(self, client: Cloudflare) -> None: + with client.kv.namespaces.with_streaming_response.bulk_update( + namespace_id="0f2ac74b498b48028cb68387c421e279", + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body=[{}], + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + namespace = response.parse() + assert_matches_type(Optional[NamespaceBulkUpdateResponse], namespace, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_path_params_bulk_update(self, client: Cloudflare) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `account_id` but received ''"): + client.kv.namespaces.with_raw_response.bulk_update( + namespace_id="0f2ac74b498b48028cb68387c421e279", + account_id="", + body=[{}], + ) + + with pytest.raises(ValueError, match=r"Expected a non-empty value for `namespace_id` but received ''"): + client.kv.namespaces.with_raw_response.bulk_update( + namespace_id="", + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body=[{}], + ) + @parametrize def test_method_get(self, client: Cloudflare) -> None: namespace = client.kv.namespaces.get( @@ -458,6 +566,112 @@ async def test_path_params_delete(self, async_client: AsyncCloudflare) -> None: account_id="023e105f4ecef8ad9ca31a8372d0c353", ) + @parametrize + async def test_method_bulk_delete(self, async_client: AsyncCloudflare) -> None: + namespace = await async_client.kv.namespaces.bulk_delete( + namespace_id="0f2ac74b498b48028cb68387c421e279", + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body=["My-Key"], + ) + assert_matches_type(Optional[NamespaceBulkDeleteResponse], namespace, path=["response"]) + + @parametrize + async def test_raw_response_bulk_delete(self, async_client: AsyncCloudflare) -> None: + response = await async_client.kv.namespaces.with_raw_response.bulk_delete( + namespace_id="0f2ac74b498b48028cb68387c421e279", + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body=["My-Key"], + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + namespace = await response.parse() + assert_matches_type(Optional[NamespaceBulkDeleteResponse], namespace, path=["response"]) + + @parametrize + async def test_streaming_response_bulk_delete(self, async_client: AsyncCloudflare) -> None: + async with async_client.kv.namespaces.with_streaming_response.bulk_delete( + namespace_id="0f2ac74b498b48028cb68387c421e279", + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body=["My-Key"], + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + namespace = await response.parse() + assert_matches_type(Optional[NamespaceBulkDeleteResponse], namespace, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_path_params_bulk_delete(self, async_client: AsyncCloudflare) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `account_id` but received ''"): + await async_client.kv.namespaces.with_raw_response.bulk_delete( + namespace_id="0f2ac74b498b48028cb68387c421e279", + account_id="", + body=["My-Key"], + ) + + with pytest.raises(ValueError, match=r"Expected a non-empty value for `namespace_id` but received ''"): + await async_client.kv.namespaces.with_raw_response.bulk_delete( + namespace_id="", + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body=["My-Key"], + ) + + @parametrize + async def test_method_bulk_update(self, async_client: AsyncCloudflare) -> None: + namespace = await async_client.kv.namespaces.bulk_update( + namespace_id="0f2ac74b498b48028cb68387c421e279", + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body=[{}], + ) + assert_matches_type(Optional[NamespaceBulkUpdateResponse], namespace, path=["response"]) + + @parametrize + async def test_raw_response_bulk_update(self, async_client: AsyncCloudflare) -> None: + response = await async_client.kv.namespaces.with_raw_response.bulk_update( + namespace_id="0f2ac74b498b48028cb68387c421e279", + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body=[{}], + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + namespace = await response.parse() + assert_matches_type(Optional[NamespaceBulkUpdateResponse], namespace, path=["response"]) + + @parametrize + async def test_streaming_response_bulk_update(self, async_client: AsyncCloudflare) -> None: + async with async_client.kv.namespaces.with_streaming_response.bulk_update( + namespace_id="0f2ac74b498b48028cb68387c421e279", + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body=[{}], + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + namespace = await response.parse() + assert_matches_type(Optional[NamespaceBulkUpdateResponse], namespace, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_path_params_bulk_update(self, async_client: AsyncCloudflare) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `account_id` but received ''"): + await async_client.kv.namespaces.with_raw_response.bulk_update( + namespace_id="0f2ac74b498b48028cb68387c421e279", + account_id="", + body=[{}], + ) + + with pytest.raises(ValueError, match=r"Expected a non-empty value for `namespace_id` but received ''"): + await async_client.kv.namespaces.with_raw_response.bulk_update( + namespace_id="", + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body=[{}], + ) + @parametrize async def test_method_get(self, async_client: AsyncCloudflare) -> None: namespace = await async_client.kv.namespaces.get( diff --git a/tests/api_resources/load_balancers/test_pools.py b/tests/api_resources/load_balancers/test_pools.py index fd1432ad458..3808356bd7f 100644 --- a/tests/api_resources/load_balancers/test_pools.py +++ b/tests/api_resources/load_balancers/test_pools.py @@ -13,6 +13,7 @@ from cloudflare.types.load_balancers import ( Pool, PoolDeleteResponse, + PoolBulkEditResponse, ) base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") @@ -305,6 +306,52 @@ def test_path_params_delete(self, client: Cloudflare) -> None: account_id="023e105f4ecef8ad9ca31a8372d0c353", ) + @parametrize + def test_method_bulk_edit(self, client: Cloudflare) -> None: + pool = client.load_balancers.pools.bulk_edit( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + ) + assert_matches_type(PoolBulkEditResponse, pool, path=["response"]) + + @parametrize + def test_method_bulk_edit_with_all_params(self, client: Cloudflare) -> None: + pool = client.load_balancers.pools.bulk_edit( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + notification_email="", + ) + assert_matches_type(PoolBulkEditResponse, pool, path=["response"]) + + @parametrize + def test_raw_response_bulk_edit(self, client: Cloudflare) -> None: + response = client.load_balancers.pools.with_raw_response.bulk_edit( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + pool = response.parse() + assert_matches_type(PoolBulkEditResponse, pool, path=["response"]) + + @parametrize + def test_streaming_response_bulk_edit(self, client: Cloudflare) -> None: + with client.load_balancers.pools.with_streaming_response.bulk_edit( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + pool = response.parse() + assert_matches_type(PoolBulkEditResponse, pool, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_path_params_bulk_edit(self, client: Cloudflare) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `account_id` but received ''"): + client.load_balancers.pools.with_raw_response.bulk_edit( + account_id="", + ) + @parametrize def test_method_edit(self, client: Cloudflare) -> None: pool = client.load_balancers.pools.edit( @@ -733,6 +780,52 @@ async def test_path_params_delete(self, async_client: AsyncCloudflare) -> None: account_id="023e105f4ecef8ad9ca31a8372d0c353", ) + @parametrize + async def test_method_bulk_edit(self, async_client: AsyncCloudflare) -> None: + pool = await async_client.load_balancers.pools.bulk_edit( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + ) + assert_matches_type(PoolBulkEditResponse, pool, path=["response"]) + + @parametrize + async def test_method_bulk_edit_with_all_params(self, async_client: AsyncCloudflare) -> None: + pool = await async_client.load_balancers.pools.bulk_edit( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + notification_email="", + ) + assert_matches_type(PoolBulkEditResponse, pool, path=["response"]) + + @parametrize + async def test_raw_response_bulk_edit(self, async_client: AsyncCloudflare) -> None: + response = await async_client.load_balancers.pools.with_raw_response.bulk_edit( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + pool = await response.parse() + assert_matches_type(PoolBulkEditResponse, pool, path=["response"]) + + @parametrize + async def test_streaming_response_bulk_edit(self, async_client: AsyncCloudflare) -> None: + async with async_client.load_balancers.pools.with_streaming_response.bulk_edit( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + pool = await response.parse() + assert_matches_type(PoolBulkEditResponse, pool, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_path_params_bulk_edit(self, async_client: AsyncCloudflare) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `account_id` but received ''"): + await async_client.load_balancers.pools.with_raw_response.bulk_edit( + account_id="", + ) + @parametrize async def test_method_edit(self, async_client: AsyncCloudflare) -> None: pool = await async_client.load_balancers.pools.edit( diff --git a/tests/api_resources/magic_transit/test_cf_interconnects.py b/tests/api_resources/magic_transit/test_cf_interconnects.py index 57ed25ea535..8c66eb4f777 100644 --- a/tests/api_resources/magic_transit/test_cf_interconnects.py +++ b/tests/api_resources/magic_transit/test_cf_interconnects.py @@ -13,6 +13,7 @@ CfInterconnectGetResponse, CfInterconnectListResponse, CfInterconnectUpdateResponse, + CfInterconnectBulkUpdateResponse, ) base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") @@ -134,6 +135,57 @@ def test_path_params_list(self, client: Cloudflare) -> None: account_id="", ) + @parametrize + def test_method_bulk_update(self, client: Cloudflare) -> None: + cf_interconnect = client.magic_transit.cf_interconnects.bulk_update( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body={}, + ) + assert_matches_type(CfInterconnectBulkUpdateResponse, cf_interconnect, path=["response"]) + + @parametrize + def test_method_bulk_update_with_all_params(self, client: Cloudflare) -> None: + cf_interconnect = client.magic_transit.cf_interconnects.bulk_update( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body={}, + x_magic_new_hc_target=True, + ) + assert_matches_type(CfInterconnectBulkUpdateResponse, cf_interconnect, path=["response"]) + + @parametrize + def test_raw_response_bulk_update(self, client: Cloudflare) -> None: + response = client.magic_transit.cf_interconnects.with_raw_response.bulk_update( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body={}, + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + cf_interconnect = response.parse() + assert_matches_type(CfInterconnectBulkUpdateResponse, cf_interconnect, path=["response"]) + + @parametrize + def test_streaming_response_bulk_update(self, client: Cloudflare) -> None: + with client.magic_transit.cf_interconnects.with_streaming_response.bulk_update( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body={}, + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + cf_interconnect = response.parse() + assert_matches_type(CfInterconnectBulkUpdateResponse, cf_interconnect, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_path_params_bulk_update(self, client: Cloudflare) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `account_id` but received ''"): + client.magic_transit.cf_interconnects.with_raw_response.bulk_update( + account_id="", + body={}, + ) + @parametrize def test_method_get(self, client: Cloudflare) -> None: cf_interconnect = client.magic_transit.cf_interconnects.get( @@ -308,6 +360,57 @@ async def test_path_params_list(self, async_client: AsyncCloudflare) -> None: account_id="", ) + @parametrize + async def test_method_bulk_update(self, async_client: AsyncCloudflare) -> None: + cf_interconnect = await async_client.magic_transit.cf_interconnects.bulk_update( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body={}, + ) + assert_matches_type(CfInterconnectBulkUpdateResponse, cf_interconnect, path=["response"]) + + @parametrize + async def test_method_bulk_update_with_all_params(self, async_client: AsyncCloudflare) -> None: + cf_interconnect = await async_client.magic_transit.cf_interconnects.bulk_update( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body={}, + x_magic_new_hc_target=True, + ) + assert_matches_type(CfInterconnectBulkUpdateResponse, cf_interconnect, path=["response"]) + + @parametrize + async def test_raw_response_bulk_update(self, async_client: AsyncCloudflare) -> None: + response = await async_client.magic_transit.cf_interconnects.with_raw_response.bulk_update( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body={}, + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + cf_interconnect = await response.parse() + assert_matches_type(CfInterconnectBulkUpdateResponse, cf_interconnect, path=["response"]) + + @parametrize + async def test_streaming_response_bulk_update(self, async_client: AsyncCloudflare) -> None: + async with async_client.magic_transit.cf_interconnects.with_streaming_response.bulk_update( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body={}, + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + cf_interconnect = await response.parse() + assert_matches_type(CfInterconnectBulkUpdateResponse, cf_interconnect, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_path_params_bulk_update(self, async_client: AsyncCloudflare) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `account_id` but received ''"): + await async_client.magic_transit.cf_interconnects.with_raw_response.bulk_update( + account_id="", + body={}, + ) + @parametrize async def test_method_get(self, async_client: AsyncCloudflare) -> None: cf_interconnect = await async_client.magic_transit.cf_interconnects.get( diff --git a/tests/api_resources/magic_transit/test_gre_tunnels.py b/tests/api_resources/magic_transit/test_gre_tunnels.py index 286e971795d..ad8f9e60f61 100644 --- a/tests/api_resources/magic_transit/test_gre_tunnels.py +++ b/tests/api_resources/magic_transit/test_gre_tunnels.py @@ -15,6 +15,7 @@ GRETunnelCreateResponse, GRETunnelDeleteResponse, GRETunnelUpdateResponse, + GRETunnelBulkUpdateResponse, ) base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") @@ -273,6 +274,57 @@ def test_path_params_delete(self, client: Cloudflare) -> None: account_id="023e105f4ecef8ad9ca31a8372d0c353", ) + @parametrize + def test_method_bulk_update(self, client: Cloudflare) -> None: + gre_tunnel = client.magic_transit.gre_tunnels.bulk_update( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body={}, + ) + assert_matches_type(GRETunnelBulkUpdateResponse, gre_tunnel, path=["response"]) + + @parametrize + def test_method_bulk_update_with_all_params(self, client: Cloudflare) -> None: + gre_tunnel = client.magic_transit.gre_tunnels.bulk_update( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body={}, + x_magic_new_hc_target=True, + ) + assert_matches_type(GRETunnelBulkUpdateResponse, gre_tunnel, path=["response"]) + + @parametrize + def test_raw_response_bulk_update(self, client: Cloudflare) -> None: + response = client.magic_transit.gre_tunnels.with_raw_response.bulk_update( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body={}, + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + gre_tunnel = response.parse() + assert_matches_type(GRETunnelBulkUpdateResponse, gre_tunnel, path=["response"]) + + @parametrize + def test_streaming_response_bulk_update(self, client: Cloudflare) -> None: + with client.magic_transit.gre_tunnels.with_streaming_response.bulk_update( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body={}, + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + gre_tunnel = response.parse() + assert_matches_type(GRETunnelBulkUpdateResponse, gre_tunnel, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_path_params_bulk_update(self, client: Cloudflare) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `account_id` but received ''"): + client.magic_transit.gre_tunnels.with_raw_response.bulk_update( + account_id="", + body={}, + ) + @parametrize def test_method_get(self, client: Cloudflare) -> None: gre_tunnel = client.magic_transit.gre_tunnels.get( @@ -584,6 +636,57 @@ async def test_path_params_delete(self, async_client: AsyncCloudflare) -> None: account_id="023e105f4ecef8ad9ca31a8372d0c353", ) + @parametrize + async def test_method_bulk_update(self, async_client: AsyncCloudflare) -> None: + gre_tunnel = await async_client.magic_transit.gre_tunnels.bulk_update( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body={}, + ) + assert_matches_type(GRETunnelBulkUpdateResponse, gre_tunnel, path=["response"]) + + @parametrize + async def test_method_bulk_update_with_all_params(self, async_client: AsyncCloudflare) -> None: + gre_tunnel = await async_client.magic_transit.gre_tunnels.bulk_update( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body={}, + x_magic_new_hc_target=True, + ) + assert_matches_type(GRETunnelBulkUpdateResponse, gre_tunnel, path=["response"]) + + @parametrize + async def test_raw_response_bulk_update(self, async_client: AsyncCloudflare) -> None: + response = await async_client.magic_transit.gre_tunnels.with_raw_response.bulk_update( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body={}, + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + gre_tunnel = await response.parse() + assert_matches_type(GRETunnelBulkUpdateResponse, gre_tunnel, path=["response"]) + + @parametrize + async def test_streaming_response_bulk_update(self, async_client: AsyncCloudflare) -> None: + async with async_client.magic_transit.gre_tunnels.with_streaming_response.bulk_update( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body={}, + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + gre_tunnel = await response.parse() + assert_matches_type(GRETunnelBulkUpdateResponse, gre_tunnel, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_path_params_bulk_update(self, async_client: AsyncCloudflare) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `account_id` but received ''"): + await async_client.magic_transit.gre_tunnels.with_raw_response.bulk_update( + account_id="", + body={}, + ) + @parametrize async def test_method_get(self, async_client: AsyncCloudflare) -> None: gre_tunnel = await async_client.magic_transit.gre_tunnels.get( diff --git a/tests/api_resources/magic_transit/test_ipsec_tunnels.py b/tests/api_resources/magic_transit/test_ipsec_tunnels.py index 00aaa8d4ba8..483c4d4d1b8 100644 --- a/tests/api_resources/magic_transit/test_ipsec_tunnels.py +++ b/tests/api_resources/magic_transit/test_ipsec_tunnels.py @@ -15,6 +15,7 @@ IPSECTunnelCreateResponse, IPSECTunnelDeleteResponse, IPSECTunnelUpdateResponse, + IPSECTunnelBulkUpdateResponse, IPSECTunnelPSKGenerateResponse, ) @@ -285,6 +286,57 @@ def test_path_params_delete(self, client: Cloudflare) -> None: account_id="023e105f4ecef8ad9ca31a8372d0c353", ) + @parametrize + def test_method_bulk_update(self, client: Cloudflare) -> None: + ipsec_tunnel = client.magic_transit.ipsec_tunnels.bulk_update( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body={}, + ) + assert_matches_type(IPSECTunnelBulkUpdateResponse, ipsec_tunnel, path=["response"]) + + @parametrize + def test_method_bulk_update_with_all_params(self, client: Cloudflare) -> None: + ipsec_tunnel = client.magic_transit.ipsec_tunnels.bulk_update( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body={}, + x_magic_new_hc_target=True, + ) + assert_matches_type(IPSECTunnelBulkUpdateResponse, ipsec_tunnel, path=["response"]) + + @parametrize + def test_raw_response_bulk_update(self, client: Cloudflare) -> None: + response = client.magic_transit.ipsec_tunnels.with_raw_response.bulk_update( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body={}, + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + ipsec_tunnel = response.parse() + assert_matches_type(IPSECTunnelBulkUpdateResponse, ipsec_tunnel, path=["response"]) + + @parametrize + def test_streaming_response_bulk_update(self, client: Cloudflare) -> None: + with client.magic_transit.ipsec_tunnels.with_streaming_response.bulk_update( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body={}, + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + ipsec_tunnel = response.parse() + assert_matches_type(IPSECTunnelBulkUpdateResponse, ipsec_tunnel, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_path_params_bulk_update(self, client: Cloudflare) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `account_id` but received ''"): + client.magic_transit.ipsec_tunnels.with_raw_response.bulk_update( + account_id="", + body={}, + ) + @parametrize def test_method_get(self, client: Cloudflare) -> None: ipsec_tunnel = client.magic_transit.ipsec_tunnels.get( @@ -660,6 +712,57 @@ async def test_path_params_delete(self, async_client: AsyncCloudflare) -> None: account_id="023e105f4ecef8ad9ca31a8372d0c353", ) + @parametrize + async def test_method_bulk_update(self, async_client: AsyncCloudflare) -> None: + ipsec_tunnel = await async_client.magic_transit.ipsec_tunnels.bulk_update( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body={}, + ) + assert_matches_type(IPSECTunnelBulkUpdateResponse, ipsec_tunnel, path=["response"]) + + @parametrize + async def test_method_bulk_update_with_all_params(self, async_client: AsyncCloudflare) -> None: + ipsec_tunnel = await async_client.magic_transit.ipsec_tunnels.bulk_update( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body={}, + x_magic_new_hc_target=True, + ) + assert_matches_type(IPSECTunnelBulkUpdateResponse, ipsec_tunnel, path=["response"]) + + @parametrize + async def test_raw_response_bulk_update(self, async_client: AsyncCloudflare) -> None: + response = await async_client.magic_transit.ipsec_tunnels.with_raw_response.bulk_update( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body={}, + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + ipsec_tunnel = await response.parse() + assert_matches_type(IPSECTunnelBulkUpdateResponse, ipsec_tunnel, path=["response"]) + + @parametrize + async def test_streaming_response_bulk_update(self, async_client: AsyncCloudflare) -> None: + async with async_client.magic_transit.ipsec_tunnels.with_streaming_response.bulk_update( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + body={}, + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + ipsec_tunnel = await response.parse() + assert_matches_type(IPSECTunnelBulkUpdateResponse, ipsec_tunnel, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_path_params_bulk_update(self, async_client: AsyncCloudflare) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `account_id` but received ''"): + await async_client.magic_transit.ipsec_tunnels.with_raw_response.bulk_update( + account_id="", + body={}, + ) + @parametrize async def test_method_get(self, async_client: AsyncCloudflare) -> None: ipsec_tunnel = await async_client.magic_transit.ipsec_tunnels.get( diff --git a/tests/api_resources/magic_transit/test_routes.py b/tests/api_resources/magic_transit/test_routes.py index 0344c8e2a13..607186daf23 100644 --- a/tests/api_resources/magic_transit/test_routes.py +++ b/tests/api_resources/magic_transit/test_routes.py @@ -16,6 +16,7 @@ RouteCreateResponse, RouteDeleteResponse, RouteUpdateResponse, + RouteBulkUpdateResponse, ) base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") @@ -236,6 +237,76 @@ def test_path_params_delete(self, client: Cloudflare) -> None: account_id="023e105f4ecef8ad9ca31a8372d0c353", ) + @parametrize + def test_method_bulk_update(self, client: Cloudflare) -> None: + route = client.magic_transit.routes.bulk_update( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + routes=[ + { + "id": "023e105f4ecef8ad9ca31a8372d0c353", + "nexthop": "203.0.113.1", + "prefix": "192.0.2.0/24", + "priority": 0, + } + ], + ) + assert_matches_type(RouteBulkUpdateResponse, route, path=["response"]) + + @parametrize + def test_raw_response_bulk_update(self, client: Cloudflare) -> None: + response = client.magic_transit.routes.with_raw_response.bulk_update( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + routes=[ + { + "id": "023e105f4ecef8ad9ca31a8372d0c353", + "nexthop": "203.0.113.1", + "prefix": "192.0.2.0/24", + "priority": 0, + } + ], + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + route = response.parse() + assert_matches_type(RouteBulkUpdateResponse, route, path=["response"]) + + @parametrize + def test_streaming_response_bulk_update(self, client: Cloudflare) -> None: + with client.magic_transit.routes.with_streaming_response.bulk_update( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + routes=[ + { + "id": "023e105f4ecef8ad9ca31a8372d0c353", + "nexthop": "203.0.113.1", + "prefix": "192.0.2.0/24", + "priority": 0, + } + ], + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + route = response.parse() + assert_matches_type(RouteBulkUpdateResponse, route, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_path_params_bulk_update(self, client: Cloudflare) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `account_id` but received ''"): + client.magic_transit.routes.with_raw_response.bulk_update( + account_id="", + routes=[ + { + "id": "023e105f4ecef8ad9ca31a8372d0c353", + "nexthop": "203.0.113.1", + "prefix": "192.0.2.0/24", + "priority": 0, + } + ], + ) + @parametrize def test_method_empty(self, client: Cloudflare) -> None: route = client.magic_transit.routes.empty( @@ -538,6 +609,76 @@ async def test_path_params_delete(self, async_client: AsyncCloudflare) -> None: account_id="023e105f4ecef8ad9ca31a8372d0c353", ) + @parametrize + async def test_method_bulk_update(self, async_client: AsyncCloudflare) -> None: + route = await async_client.magic_transit.routes.bulk_update( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + routes=[ + { + "id": "023e105f4ecef8ad9ca31a8372d0c353", + "nexthop": "203.0.113.1", + "prefix": "192.0.2.0/24", + "priority": 0, + } + ], + ) + assert_matches_type(RouteBulkUpdateResponse, route, path=["response"]) + + @parametrize + async def test_raw_response_bulk_update(self, async_client: AsyncCloudflare) -> None: + response = await async_client.magic_transit.routes.with_raw_response.bulk_update( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + routes=[ + { + "id": "023e105f4ecef8ad9ca31a8372d0c353", + "nexthop": "203.0.113.1", + "prefix": "192.0.2.0/24", + "priority": 0, + } + ], + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + route = await response.parse() + assert_matches_type(RouteBulkUpdateResponse, route, path=["response"]) + + @parametrize + async def test_streaming_response_bulk_update(self, async_client: AsyncCloudflare) -> None: + async with async_client.magic_transit.routes.with_streaming_response.bulk_update( + account_id="023e105f4ecef8ad9ca31a8372d0c353", + routes=[ + { + "id": "023e105f4ecef8ad9ca31a8372d0c353", + "nexthop": "203.0.113.1", + "prefix": "192.0.2.0/24", + "priority": 0, + } + ], + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + route = await response.parse() + assert_matches_type(RouteBulkUpdateResponse, route, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_path_params_bulk_update(self, async_client: AsyncCloudflare) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `account_id` but received ''"): + await async_client.magic_transit.routes.with_raw_response.bulk_update( + account_id="", + routes=[ + { + "id": "023e105f4ecef8ad9ca31a8372d0c353", + "nexthop": "203.0.113.1", + "prefix": "192.0.2.0/24", + "priority": 0, + } + ], + ) + @parametrize async def test_method_empty(self, async_client: AsyncCloudflare) -> None: route = await async_client.magic_transit.routes.empty( diff --git a/tests/api_resources/rum/test_rules.py b/tests/api_resources/rum/test_rules.py index 6cdb5f5db36..5ab034386be 100644 --- a/tests/api_resources/rum/test_rules.py +++ b/tests/api_resources/rum/test_rules.py @@ -9,7 +9,12 @@ from cloudflare import Cloudflare, AsyncCloudflare from tests.utils import assert_matches_type -from cloudflare.types.rum import RUMRule, RuleListResponse, RuleDeleteResponse +from cloudflare.types.rum import ( + RUMRule, + RuleListResponse, + RuleDeleteResponse, + RuleBulkCreateResponse, +) base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") @@ -258,6 +263,72 @@ def test_path_params_delete(self, client: Cloudflare) -> None: ruleset_id="f174e90a-fafe-4643-bbbc-4a0ed4fc8415", ) + @parametrize + def test_method_bulk_create(self, client: Cloudflare) -> None: + rule = client.rum.rules.bulk_create( + ruleset_id="f174e90a-fafe-4643-bbbc-4a0ed4fc8415", + account_id="023e105f4ecef8ad9ca31a8372d0c353", + ) + assert_matches_type(Optional[RuleBulkCreateResponse], rule, path=["response"]) + + @parametrize + def test_method_bulk_create_with_all_params(self, client: Cloudflare) -> None: + rule = client.rum.rules.bulk_create( + ruleset_id="f174e90a-fafe-4643-bbbc-4a0ed4fc8415", + account_id="023e105f4ecef8ad9ca31a8372d0c353", + delete_rules=["f174e90a-fafe-4643-bbbc-4a0ed4fc8415"], + rules=[ + { + "id": "f174e90a-fafe-4643-bbbc-4a0ed4fc8415", + "host": "example.com", + "inclusive": True, + "is_paused": False, + "paths": ["*"], + } + ], + ) + assert_matches_type(Optional[RuleBulkCreateResponse], rule, path=["response"]) + + @parametrize + def test_raw_response_bulk_create(self, client: Cloudflare) -> None: + response = client.rum.rules.with_raw_response.bulk_create( + ruleset_id="f174e90a-fafe-4643-bbbc-4a0ed4fc8415", + account_id="023e105f4ecef8ad9ca31a8372d0c353", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + rule = response.parse() + assert_matches_type(Optional[RuleBulkCreateResponse], rule, path=["response"]) + + @parametrize + def test_streaming_response_bulk_create(self, client: Cloudflare) -> None: + with client.rum.rules.with_streaming_response.bulk_create( + ruleset_id="f174e90a-fafe-4643-bbbc-4a0ed4fc8415", + account_id="023e105f4ecef8ad9ca31a8372d0c353", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + rule = response.parse() + assert_matches_type(Optional[RuleBulkCreateResponse], rule, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_path_params_bulk_create(self, client: Cloudflare) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `account_id` but received ''"): + client.rum.rules.with_raw_response.bulk_create( + ruleset_id="f174e90a-fafe-4643-bbbc-4a0ed4fc8415", + account_id="", + ) + + with pytest.raises(ValueError, match=r"Expected a non-empty value for `ruleset_id` but received ''"): + client.rum.rules.with_raw_response.bulk_create( + ruleset_id="", + account_id="023e105f4ecef8ad9ca31a8372d0c353", + ) + class TestAsyncRules: parametrize = pytest.mark.parametrize("async_client", [False, True], indirect=True, ids=["loose", "strict"]) @@ -502,3 +573,69 @@ async def test_path_params_delete(self, async_client: AsyncCloudflare) -> None: account_id="023e105f4ecef8ad9ca31a8372d0c353", ruleset_id="f174e90a-fafe-4643-bbbc-4a0ed4fc8415", ) + + @parametrize + async def test_method_bulk_create(self, async_client: AsyncCloudflare) -> None: + rule = await async_client.rum.rules.bulk_create( + ruleset_id="f174e90a-fafe-4643-bbbc-4a0ed4fc8415", + account_id="023e105f4ecef8ad9ca31a8372d0c353", + ) + assert_matches_type(Optional[RuleBulkCreateResponse], rule, path=["response"]) + + @parametrize + async def test_method_bulk_create_with_all_params(self, async_client: AsyncCloudflare) -> None: + rule = await async_client.rum.rules.bulk_create( + ruleset_id="f174e90a-fafe-4643-bbbc-4a0ed4fc8415", + account_id="023e105f4ecef8ad9ca31a8372d0c353", + delete_rules=["f174e90a-fafe-4643-bbbc-4a0ed4fc8415"], + rules=[ + { + "id": "f174e90a-fafe-4643-bbbc-4a0ed4fc8415", + "host": "example.com", + "inclusive": True, + "is_paused": False, + "paths": ["*"], + } + ], + ) + assert_matches_type(Optional[RuleBulkCreateResponse], rule, path=["response"]) + + @parametrize + async def test_raw_response_bulk_create(self, async_client: AsyncCloudflare) -> None: + response = await async_client.rum.rules.with_raw_response.bulk_create( + ruleset_id="f174e90a-fafe-4643-bbbc-4a0ed4fc8415", + account_id="023e105f4ecef8ad9ca31a8372d0c353", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + rule = await response.parse() + assert_matches_type(Optional[RuleBulkCreateResponse], rule, path=["response"]) + + @parametrize + async def test_streaming_response_bulk_create(self, async_client: AsyncCloudflare) -> None: + async with async_client.rum.rules.with_streaming_response.bulk_create( + ruleset_id="f174e90a-fafe-4643-bbbc-4a0ed4fc8415", + account_id="023e105f4ecef8ad9ca31a8372d0c353", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + rule = await response.parse() + assert_matches_type(Optional[RuleBulkCreateResponse], rule, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_path_params_bulk_create(self, async_client: AsyncCloudflare) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `account_id` but received ''"): + await async_client.rum.rules.with_raw_response.bulk_create( + ruleset_id="f174e90a-fafe-4643-bbbc-4a0ed4fc8415", + account_id="", + ) + + with pytest.raises(ValueError, match=r"Expected a non-empty value for `ruleset_id` but received ''"): + await async_client.rum.rules.with_raw_response.bulk_create( + ruleset_id="", + account_id="023e105f4ecef8ad9ca31a8372d0c353", + ) diff --git a/tests/api_resources/test_filters.py b/tests/api_resources/test_filters.py index 683f923ca5a..eb126fb8162 100644 --- a/tests/api_resources/test_filters.py +++ b/tests/api_resources/test_filters.py @@ -13,6 +13,8 @@ from cloudflare.types.filters import ( FirewallFilter, FilterCreateResponse, + FilterBulkDeleteResponse, + FilterBulkUpdateResponse, ) # pyright: reportDeprecated=false @@ -248,6 +250,92 @@ def test_path_params_delete(self, client: Cloudflare) -> None: zone_id="023e105f4ecef8ad9ca31a8372d0c353", ) + @parametrize + def test_method_bulk_delete(self, client: Cloudflare) -> None: + with pytest.warns(DeprecationWarning): + filter = client.filters.bulk_delete( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + ) + + assert_matches_type(Optional[FilterBulkDeleteResponse], filter, path=["response"]) + + @parametrize + def test_raw_response_bulk_delete(self, client: Cloudflare) -> None: + with pytest.warns(DeprecationWarning): + response = client.filters.with_raw_response.bulk_delete( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + filter = response.parse() + assert_matches_type(Optional[FilterBulkDeleteResponse], filter, path=["response"]) + + @parametrize + def test_streaming_response_bulk_delete(self, client: Cloudflare) -> None: + with pytest.warns(DeprecationWarning): + with client.filters.with_streaming_response.bulk_delete( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + filter = response.parse() + assert_matches_type(Optional[FilterBulkDeleteResponse], filter, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_path_params_bulk_delete(self, client: Cloudflare) -> None: + with pytest.warns(DeprecationWarning): + with pytest.raises(ValueError, match=r"Expected a non-empty value for `zone_id` but received ''"): + client.filters.with_raw_response.bulk_delete( + zone_id="", + ) + + @parametrize + def test_method_bulk_update(self, client: Cloudflare) -> None: + with pytest.warns(DeprecationWarning): + filter = client.filters.bulk_update( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + ) + + assert_matches_type(Optional[FilterBulkUpdateResponse], filter, path=["response"]) + + @parametrize + def test_raw_response_bulk_update(self, client: Cloudflare) -> None: + with pytest.warns(DeprecationWarning): + response = client.filters.with_raw_response.bulk_update( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + filter = response.parse() + assert_matches_type(Optional[FilterBulkUpdateResponse], filter, path=["response"]) + + @parametrize + def test_streaming_response_bulk_update(self, client: Cloudflare) -> None: + with pytest.warns(DeprecationWarning): + with client.filters.with_streaming_response.bulk_update( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + filter = response.parse() + assert_matches_type(Optional[FilterBulkUpdateResponse], filter, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_path_params_bulk_update(self, client: Cloudflare) -> None: + with pytest.warns(DeprecationWarning): + with pytest.raises(ValueError, match=r"Expected a non-empty value for `zone_id` but received ''"): + client.filters.with_raw_response.bulk_update( + zone_id="", + ) + @parametrize def test_method_get(self, client: Cloudflare) -> None: with pytest.warns(DeprecationWarning): @@ -530,6 +618,92 @@ async def test_path_params_delete(self, async_client: AsyncCloudflare) -> None: zone_id="023e105f4ecef8ad9ca31a8372d0c353", ) + @parametrize + async def test_method_bulk_delete(self, async_client: AsyncCloudflare) -> None: + with pytest.warns(DeprecationWarning): + filter = await async_client.filters.bulk_delete( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + ) + + assert_matches_type(Optional[FilterBulkDeleteResponse], filter, path=["response"]) + + @parametrize + async def test_raw_response_bulk_delete(self, async_client: AsyncCloudflare) -> None: + with pytest.warns(DeprecationWarning): + response = await async_client.filters.with_raw_response.bulk_delete( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + filter = await response.parse() + assert_matches_type(Optional[FilterBulkDeleteResponse], filter, path=["response"]) + + @parametrize + async def test_streaming_response_bulk_delete(self, async_client: AsyncCloudflare) -> None: + with pytest.warns(DeprecationWarning): + async with async_client.filters.with_streaming_response.bulk_delete( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + filter = await response.parse() + assert_matches_type(Optional[FilterBulkDeleteResponse], filter, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_path_params_bulk_delete(self, async_client: AsyncCloudflare) -> None: + with pytest.warns(DeprecationWarning): + with pytest.raises(ValueError, match=r"Expected a non-empty value for `zone_id` but received ''"): + await async_client.filters.with_raw_response.bulk_delete( + zone_id="", + ) + + @parametrize + async def test_method_bulk_update(self, async_client: AsyncCloudflare) -> None: + with pytest.warns(DeprecationWarning): + filter = await async_client.filters.bulk_update( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + ) + + assert_matches_type(Optional[FilterBulkUpdateResponse], filter, path=["response"]) + + @parametrize + async def test_raw_response_bulk_update(self, async_client: AsyncCloudflare) -> None: + with pytest.warns(DeprecationWarning): + response = await async_client.filters.with_raw_response.bulk_update( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + filter = await response.parse() + assert_matches_type(Optional[FilterBulkUpdateResponse], filter, path=["response"]) + + @parametrize + async def test_streaming_response_bulk_update(self, async_client: AsyncCloudflare) -> None: + with pytest.warns(DeprecationWarning): + async with async_client.filters.with_streaming_response.bulk_update( + zone_id="023e105f4ecef8ad9ca31a8372d0c353", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + filter = await response.parse() + assert_matches_type(Optional[FilterBulkUpdateResponse], filter, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_path_params_bulk_update(self, async_client: AsyncCloudflare) -> None: + with pytest.warns(DeprecationWarning): + with pytest.raises(ValueError, match=r"Expected a non-empty value for `zone_id` but received ''"): + await async_client.filters.with_raw_response.bulk_update( + zone_id="", + ) + @parametrize async def test_method_get(self, async_client: AsyncCloudflare) -> None: with pytest.warns(DeprecationWarning):