diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f4ad13d6..e4572582 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,7 +19,7 @@ jobs: timeout-minutes: 10 name: lint runs-on: ${{ github.repository == 'stainless-sdks/gcore-python' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }} - if: github.event_name == 'push' || github.event.pull_request.head.repo.fork + if: (github.event_name == 'push' || github.event.pull_request.head.repo.fork) && (github.event_name != 'push' || github.event.head_commit.message != 'codegen metadata') steps: - uses: actions/checkout@v6 @@ -38,7 +38,7 @@ jobs: run: ./scripts/lint build: - if: github.event_name == 'push' || github.event.pull_request.head.repo.fork + if: (github.event_name == 'push' || github.event.pull_request.head.repo.fork) && (github.event_name != 'push' || github.event.head_commit.message != 'codegen metadata') timeout-minutes: 10 name: build permissions: diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 1b5dc400..0a40b9d7 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.39.0" + ".": "0.40.0" } \ No newline at end of file diff --git a/.stats.yml b/.stats.yml index fc18f90f..0e3dc221 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 655 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore%2Fgcore-c4c09a01a5791ea1d7c33e3c7ae09130b461848a881644003c4f0d7aaabef8b6.yml -openapi_spec_hash: 01f8b65e87e0dd05dec110fa43c4553f -config_hash: 85e457318a30eaef6f8360fe795eec52 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gcore%2Fgcore-1f57a1cf50c68ba6dc2d77a192a18497fac3892e6bb6f21cee74ea3382a22ead.yml +openapi_spec_hash: e9a65c4d11c292b5755109138a184880 +config_hash: 028ddbe5e97b3ec6a74358d4aaaf7b8a diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d106a03..52c6031d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,23 @@ # Changelog +## 0.40.0 (2026-03-25) + +Full Changelog: [v0.39.0...v0.40.0](https://github.com/G-Core/gcore-python/compare/v0.39.0...v0.40.0) + +### Features + +* **api:** aggregated API specs update ([07228a2](https://github.com/G-Core/gcore-python/commit/07228a2d29b1fb8f4c2b1a41c0369f944ba503ed)) +* **cdn:** enable terraform support for cdn_rule_template ([e6e4283](https://github.com/G-Core/gcore-python/commit/e6e428388751914c243d937c152cd28ea19d8320)) +* **fastedge:** enable fastedge_template for Terraform ([5e9dab6](https://github.com/G-Core/gcore-python/commit/5e9dab60da36beb8438b295fabbef4e2ad2e220e)) + + +### Chores + +* **ci:** skip lint on metadata-only changes ([5277f95](https://github.com/G-Core/gcore-python/commit/5277f95a3de9c67fa39dc5e611d8315a624bae45)) +* **tests:** bump steady to v0.19.6 ([ba47f6b](https://github.com/G-Core/gcore-python/commit/ba47f6be3548421482c401a94c2f8ea481ffcb0d)) +* **tests:** bump steady to v0.19.7 ([7767e13](https://github.com/G-Core/gcore-python/commit/7767e1315ca81c246fa32663455731f9191a5d12)) +* **tests:** skip tests failing due to OpenAPI spec issues ([0e83fd1](https://github.com/G-Core/gcore-python/commit/0e83fd19bb738c95d4f563257d2d29bba560c26e)) + ## 0.39.0 (2026-03-23) Full Changelog: [v0.38.0...v0.39.0](https://github.com/G-Core/gcore-python/compare/v0.38.0...v0.39.0) diff --git a/pyproject.toml b/pyproject.toml index c5374241..e1f6e294 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "gcore" -version = "0.39.0" +version = "0.40.0" description = "The official Python library for the gcore API" dynamic = ["readme"] license = "Apache-2.0" diff --git a/scripts/mock b/scripts/mock index 2f1753e4..fc783eb8 100755 --- a/scripts/mock +++ b/scripts/mock @@ -22,9 +22,9 @@ echo "==> Starting mock server with URL ${URL}" # Run steady mock on the given spec if [ "$1" == "--daemon" ]; then # Pre-install the package so the download doesn't eat into the startup timeout - npm exec --package=@stdy/cli@0.19.5 -- steady --version + npm exec --package=@stdy/cli@0.19.7 -- steady --version - npm exec --package=@stdy/cli@0.19.5 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=dots --validator-query-object-format=dots "$URL" &> .stdy.log & + npm exec --package=@stdy/cli@0.19.7 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=dots --validator-query-object-format=dots "$URL" &> .stdy.log & # Wait for server to come online via health endpoint (max 30s) echo -n "Waiting for server" @@ -48,5 +48,5 @@ if [ "$1" == "--daemon" ]; then echo else - npm exec --package=@stdy/cli@0.19.5 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=dots --validator-query-object-format=dots "$URL" + npm exec --package=@stdy/cli@0.19.7 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=dots --validator-query-object-format=dots "$URL" fi diff --git a/scripts/test b/scripts/test index 6568816c..8c6330b3 100755 --- a/scripts/test +++ b/scripts/test @@ -43,7 +43,7 @@ elif ! steady_is_running ; then echo -e "To run the server, pass in the path or url of your OpenAPI" echo -e "spec to the steady command:" echo - echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.19.5 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=dots --validator-query-object-format=dots${NC}" + echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.19.7 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=dots --validator-query-object-format=dots${NC}" echo exit 1 diff --git a/src/gcore/_version.py b/src/gcore/_version.py index 709616bd..9c0d445a 100644 --- a/src/gcore/_version.py +++ b/src/gcore/_version.py @@ -1,4 +1,4 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. __title__ = "gcore" -__version__ = "0.39.0" # x-release-please-version +__version__ = "0.40.0" # x-release-please-version diff --git a/src/gcore/resources/cdn/cdn.py b/src/gcore/resources/cdn/cdn.py index 1a41c290..7b80bde4 100644 --- a/src/gcore/resources/cdn/cdn.py +++ b/src/gcore/resources/cdn/cdn.py @@ -156,6 +156,9 @@ def origin_groups(self) -> OriginGroupsResource: @cached_property def rule_templates(self) -> RuleTemplatesResource: + """ + CDN rule templates define reusable rule configurations that can be applied across multiple CDN resources for consistent caching, delivery, and security policies. + """ return RuleTemplatesResource(self._client) @cached_property @@ -498,6 +501,9 @@ def origin_groups(self) -> AsyncOriginGroupsResource: @cached_property def rule_templates(self) -> AsyncRuleTemplatesResource: + """ + CDN rule templates define reusable rule configurations that can be applied across multiple CDN resources for consistent caching, delivery, and security policies. + """ return AsyncRuleTemplatesResource(self._client) @cached_property @@ -865,6 +871,9 @@ def origin_groups(self) -> OriginGroupsResourceWithRawResponse: @cached_property def rule_templates(self) -> RuleTemplatesResourceWithRawResponse: + """ + CDN rule templates define reusable rule configurations that can be applied across multiple CDN resources for consistent caching, delivery, and security policies. + """ return RuleTemplatesResourceWithRawResponse(self._cdn.rule_templates) @cached_property @@ -985,6 +994,9 @@ def origin_groups(self) -> AsyncOriginGroupsResourceWithRawResponse: @cached_property def rule_templates(self) -> AsyncRuleTemplatesResourceWithRawResponse: + """ + CDN rule templates define reusable rule configurations that can be applied across multiple CDN resources for consistent caching, delivery, and security policies. + """ return AsyncRuleTemplatesResourceWithRawResponse(self._cdn.rule_templates) @cached_property @@ -1105,6 +1117,9 @@ def origin_groups(self) -> OriginGroupsResourceWithStreamingResponse: @cached_property def rule_templates(self) -> RuleTemplatesResourceWithStreamingResponse: + """ + CDN rule templates define reusable rule configurations that can be applied across multiple CDN resources for consistent caching, delivery, and security policies. + """ return RuleTemplatesResourceWithStreamingResponse(self._cdn.rule_templates) @cached_property @@ -1225,6 +1240,9 @@ def origin_groups(self) -> AsyncOriginGroupsResourceWithStreamingResponse: @cached_property def rule_templates(self) -> AsyncRuleTemplatesResourceWithStreamingResponse: + """ + CDN rule templates define reusable rule configurations that can be applied across multiple CDN resources for consistent caching, delivery, and security policies. + """ return AsyncRuleTemplatesResourceWithStreamingResponse(self._cdn.rule_templates) @cached_property diff --git a/src/gcore/resources/cdn/rule_templates.py b/src/gcore/resources/cdn/rule_templates.py index 86caf8e2..7782c733 100644 --- a/src/gcore/resources/cdn/rule_templates.py +++ b/src/gcore/resources/cdn/rule_templates.py @@ -26,6 +26,10 @@ class RuleTemplatesResource(SyncAPIResource): + """ + CDN rule templates define reusable rule configurations that can be applied across multiple CDN resources for consistent caching, delivery, and security policies. + """ + @cached_property def with_raw_response(self) -> RuleTemplatesResourceWithRawResponse: """ @@ -395,6 +399,10 @@ def replace( class AsyncRuleTemplatesResource(AsyncAPIResource): + """ + CDN rule templates define reusable rule configurations that can be applied across multiple CDN resources for consistent caching, delivery, and security policies. + """ + @cached_property def with_raw_response(self) -> AsyncRuleTemplatesResourceWithRawResponse: """ diff --git a/src/gcore/resources/fastedge/fastedge.py b/src/gcore/resources/fastedge/fastedge.py index d4bb3ff7..856f83f0 100644 --- a/src/gcore/resources/fastedge/fastedge.py +++ b/src/gcore/resources/fastedge/fastedge.py @@ -72,7 +72,9 @@ class FastedgeResource(SyncAPIResource): @cached_property def templates(self) -> TemplatesResource: - """Application templates""" + """ + FastEdge templates encapsulate reusable configurations for FastEdge applications, including a WebAssembly binary reference and configurable parameters. + """ return TemplatesResource(self._client) @cached_property @@ -153,7 +155,9 @@ class AsyncFastedgeResource(AsyncAPIResource): @cached_property def templates(self) -> AsyncTemplatesResource: - """Application templates""" + """ + FastEdge templates encapsulate reusable configurations for FastEdge applications, including a WebAssembly binary reference and configurable parameters. + """ return AsyncTemplatesResource(self._client) @cached_property @@ -239,7 +243,9 @@ def __init__(self, fastedge: FastedgeResource) -> None: @cached_property def templates(self) -> TemplatesResourceWithRawResponse: - """Application templates""" + """ + FastEdge templates encapsulate reusable configurations for FastEdge applications, including a WebAssembly binary reference and configurable parameters. + """ return TemplatesResourceWithRawResponse(self._fastedge.templates) @cached_property @@ -284,7 +290,9 @@ def __init__(self, fastedge: AsyncFastedgeResource) -> None: @cached_property def templates(self) -> AsyncTemplatesResourceWithRawResponse: - """Application templates""" + """ + FastEdge templates encapsulate reusable configurations for FastEdge applications, including a WebAssembly binary reference and configurable parameters. + """ return AsyncTemplatesResourceWithRawResponse(self._fastedge.templates) @cached_property @@ -329,7 +337,9 @@ def __init__(self, fastedge: FastedgeResource) -> None: @cached_property def templates(self) -> TemplatesResourceWithStreamingResponse: - """Application templates""" + """ + FastEdge templates encapsulate reusable configurations for FastEdge applications, including a WebAssembly binary reference and configurable parameters. + """ return TemplatesResourceWithStreamingResponse(self._fastedge.templates) @cached_property @@ -374,7 +384,9 @@ def __init__(self, fastedge: AsyncFastedgeResource) -> None: @cached_property def templates(self) -> AsyncTemplatesResourceWithStreamingResponse: - """Application templates""" + """ + FastEdge templates encapsulate reusable configurations for FastEdge applications, including a WebAssembly binary reference and configurable parameters. + """ return AsyncTemplatesResourceWithStreamingResponse(self._fastedge.templates) @cached_property diff --git a/src/gcore/resources/fastedge/templates.py b/src/gcore/resources/fastedge/templates.py index a8b56092..6cb9524b 100644 --- a/src/gcore/resources/fastedge/templates.py +++ b/src/gcore/resources/fastedge/templates.py @@ -33,7 +33,9 @@ class TemplatesResource(SyncAPIResource): - """Application templates""" + """ + FastEdge templates encapsulate reusable configurations for FastEdge applications, including a WebAssembly binary reference and configurable parameters. + """ @cached_property def with_raw_response(self) -> TemplatesResourceWithRawResponse: @@ -314,7 +316,9 @@ def replace( class AsyncTemplatesResource(AsyncAPIResource): - """Application templates""" + """ + FastEdge templates encapsulate reusable configurations for FastEdge applications, including a WebAssembly binary reference and configurable parameters. + """ @cached_property def with_raw_response(self) -> AsyncTemplatesResourceWithRawResponse: diff --git a/src/gcore/types/cloud/networks/router_create_params.py b/src/gcore/types/cloud/networks/router_create_params.py index 4fa5449b..a39462ea 100644 --- a/src/gcore/types/cloud/networks/router_create_params.py +++ b/src/gcore/types/cloud/networks/router_create_params.py @@ -66,10 +66,10 @@ class Interface(TypedDict, total=False): class Route(TypedDict, total=False): destination: Required[str] - """CIDR of destination IPv4 subnet.""" + """CIDR of destination IPv4 or IPv6 subnet.""" nexthop: Required[str] """ - IPv4 address to forward traffic to if it's destination IP matches 'destination' - CIDR. + IPv4 or IPv6 address to forward traffic to if it's destination IP matches + 'destination' CIDR. """ diff --git a/src/gcore/types/cloud/networks/router_update_params.py b/src/gcore/types/cloud/networks/router_update_params.py index 44e4f142..4fe90a8a 100644 --- a/src/gcore/types/cloud/networks/router_update_params.py +++ b/src/gcore/types/cloud/networks/router_update_params.py @@ -38,10 +38,10 @@ class ExternalGatewayInfo(TypedDict, total=False): class Route(TypedDict, total=False): destination: Required[str] - """CIDR of destination IPv4 subnet.""" + """CIDR of destination IPv4 or IPv6 subnet.""" nexthop: Required[str] """ - IPv4 address to forward traffic to if it's destination IP matches 'destination' - CIDR. + IPv4 or IPv6 address to forward traffic to if it's destination IP matches + 'destination' CIDR. """ diff --git a/src/gcore/types/cloud/networks/subnet_create_params.py b/src/gcore/types/cloud/networks/subnet_create_params.py index 5a6b365f..8a69e99b 100644 --- a/src/gcore/types/cloud/networks/subnet_create_params.py +++ b/src/gcore/types/cloud/networks/subnet_create_params.py @@ -73,10 +73,10 @@ class SubnetCreateParams(TypedDict, total=False): class HostRoute(TypedDict, total=False): destination: Required[str] - """CIDR of destination IPv4 subnet.""" + """CIDR of destination IPv4 or IPv6 subnet.""" nexthop: Required[str] """ - IPv4 address to forward traffic to if it's destination IP matches 'destination' - CIDR. + IPv4 or IPv6 address to forward traffic to if it's destination IP matches + 'destination' CIDR. """ diff --git a/src/gcore/types/cloud/networks/subnet_update_params.py b/src/gcore/types/cloud/networks/subnet_update_params.py index d7a68399..cc8b9eb1 100644 --- a/src/gcore/types/cloud/networks/subnet_update_params.py +++ b/src/gcore/types/cloud/networks/subnet_update_params.py @@ -66,10 +66,10 @@ class SubnetUpdateParams(TypedDict, total=False): class HostRoute(TypedDict, total=False): destination: Required[str] - """CIDR of destination IPv4 subnet.""" + """CIDR of destination IPv4 or IPv6 subnet.""" nexthop: Required[str] """ - IPv4 address to forward traffic to if it's destination IP matches 'destination' - CIDR. + IPv4 or IPv6 address to forward traffic to if it's destination IP matches + 'destination' CIDR. """ diff --git a/src/gcore/types/cloud/route.py b/src/gcore/types/cloud/route.py index f9854287..14274cdb 100644 --- a/src/gcore/types/cloud/route.py +++ b/src/gcore/types/cloud/route.py @@ -7,10 +7,10 @@ class Route(BaseModel): destination: str - """CIDR of destination IPv4 subnet.""" + """CIDR of destination IPv4 or IPv6 subnet.""" nexthop: str """ - IPv4 address to forward traffic to if it's destination IP matches 'destination' - CIDR. + IPv4 or IPv6 address to forward traffic to if it's destination IP matches + 'destination' CIDR. """ diff --git a/tests/api_resources/cdn/test_logs.py b/tests/api_resources/cdn/test_logs.py index f72d4e71..5da6a35e 100644 --- a/tests/api_resources/cdn/test_logs.py +++ b/tests/api_resources/cdn/test_logs.py @@ -26,6 +26,7 @@ class TestLogs: parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"]) + @pytest.mark.skip(reason="CDM-2235: OpenAPI spec missing required 'data' field in response schema") @parametrize def test_method_list(self, client: Gcore) -> None: log = client.cdn.logs.list( @@ -34,6 +35,7 @@ def test_method_list(self, client: Gcore) -> None: ) assert_matches_type(SyncOffsetPageCDNLogs[Data], log, path=["response"]) + @pytest.mark.skip(reason="CDM-2235: OpenAPI spec missing required 'data' field in response schema") @parametrize def test_method_list_with_all_params(self, client: Gcore) -> None: log = client.cdn.logs.list( @@ -91,6 +93,7 @@ def test_method_list_with_all_params(self, client: Gcore) -> None: ) assert_matches_type(SyncOffsetPageCDNLogs[Data], log, path=["response"]) + @pytest.mark.skip(reason="CDM-2235: OpenAPI spec missing required 'data' field in response schema") @parametrize def test_raw_response_list(self, client: Gcore) -> None: response = client.cdn.logs.with_raw_response.list( @@ -103,6 +106,7 @@ def test_raw_response_list(self, client: Gcore) -> None: log = response.parse() assert_matches_type(SyncOffsetPageCDNLogs[Data], log, path=["response"]) + @pytest.mark.skip(reason="CDM-2235: OpenAPI spec missing required 'data' field in response schema") @parametrize def test_streaming_response_list(self, client: Gcore) -> None: with client.cdn.logs.with_streaming_response.list( @@ -234,6 +238,7 @@ class TestAsyncLogs: "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"] ) + @pytest.mark.skip(reason="CDM-2235: OpenAPI spec missing required 'data' field in response schema") @parametrize async def test_method_list(self, async_client: AsyncGcore) -> None: log = await async_client.cdn.logs.list( @@ -242,6 +247,7 @@ async def test_method_list(self, async_client: AsyncGcore) -> None: ) assert_matches_type(AsyncOffsetPageCDNLogs[Data], log, path=["response"]) + @pytest.mark.skip(reason="CDM-2235: OpenAPI spec missing required 'data' field in response schema") @parametrize async def test_method_list_with_all_params(self, async_client: AsyncGcore) -> None: log = await async_client.cdn.logs.list( @@ -299,6 +305,7 @@ async def test_method_list_with_all_params(self, async_client: AsyncGcore) -> No ) assert_matches_type(AsyncOffsetPageCDNLogs[Data], log, path=["response"]) + @pytest.mark.skip(reason="CDM-2235: OpenAPI spec missing required 'data' field in response schema") @parametrize async def test_raw_response_list(self, async_client: AsyncGcore) -> None: response = await async_client.cdn.logs.with_raw_response.list( @@ -311,6 +318,7 @@ async def test_raw_response_list(self, async_client: AsyncGcore) -> None: log = await response.parse() assert_matches_type(AsyncOffsetPageCDNLogs[Data], log, path=["response"]) + @pytest.mark.skip(reason="CDM-2235: OpenAPI spec missing required 'data' field in response schema") @parametrize async def test_streaming_response_list(self, async_client: AsyncGcore) -> None: async with async_client.cdn.logs.with_streaming_response.list( diff --git a/tests/api_resources/dns/test_network_mappings.py b/tests/api_resources/dns/test_network_mappings.py index 158a3f7b..2211c8fe 100644 --- a/tests/api_resources/dns/test_network_mappings.py +++ b/tests/api_resources/dns/test_network_mappings.py @@ -158,6 +158,7 @@ def test_streaming_response_get(self, client: Gcore) -> None: assert cast(Any, response.is_closed) is True + @pytest.mark.skip(reason="DNS-2948: OpenAPI spec has ambiguous overlapping path templates {id} vs {name}") @parametrize def test_method_get_by_name(self, client: Gcore) -> None: network_mapping = client.dns.network_mappings.get_by_name( @@ -165,6 +166,7 @@ def test_method_get_by_name(self, client: Gcore) -> None: ) assert_matches_type(DNSNetworkMapping, network_mapping, path=["response"]) + @pytest.mark.skip(reason="DNS-2948: OpenAPI spec has ambiguous overlapping path templates {id} vs {name}") @parametrize def test_raw_response_get_by_name(self, client: Gcore) -> None: response = client.dns.network_mappings.with_raw_response.get_by_name( @@ -176,6 +178,7 @@ def test_raw_response_get_by_name(self, client: Gcore) -> None: network_mapping = response.parse() assert_matches_type(DNSNetworkMapping, network_mapping, path=["response"]) + @pytest.mark.skip(reason="DNS-2948: OpenAPI spec has ambiguous overlapping path templates {id} vs {name}") @parametrize def test_streaming_response_get_by_name(self, client: Gcore) -> None: with client.dns.network_mappings.with_streaming_response.get_by_name( @@ -409,6 +412,7 @@ async def test_streaming_response_get(self, async_client: AsyncGcore) -> None: assert cast(Any, response.is_closed) is True + @pytest.mark.skip(reason="DNS-2948: OpenAPI spec has ambiguous overlapping path templates {id} vs {name}") @parametrize async def test_method_get_by_name(self, async_client: AsyncGcore) -> None: network_mapping = await async_client.dns.network_mappings.get_by_name( @@ -416,6 +420,7 @@ async def test_method_get_by_name(self, async_client: AsyncGcore) -> None: ) assert_matches_type(DNSNetworkMapping, network_mapping, path=["response"]) + @pytest.mark.skip(reason="DNS-2948: OpenAPI spec has ambiguous overlapping path templates {id} vs {name}") @parametrize async def test_raw_response_get_by_name(self, async_client: AsyncGcore) -> None: response = await async_client.dns.network_mappings.with_raw_response.get_by_name( @@ -427,6 +432,7 @@ async def test_raw_response_get_by_name(self, async_client: AsyncGcore) -> None: network_mapping = await response.parse() assert_matches_type(DNSNetworkMapping, network_mapping, path=["response"]) + @pytest.mark.skip(reason="DNS-2948: OpenAPI spec has ambiguous overlapping path templates {id} vs {name}") @parametrize async def test_streaming_response_get_by_name(self, async_client: AsyncGcore) -> None: async with async_client.dns.network_mappings.with_streaming_response.get_by_name( diff --git a/tests/api_resources/fastedge/apps/test_logs.py b/tests/api_resources/fastedge/apps/test_logs.py index 7773365d..a5a1323d 100644 --- a/tests/api_resources/fastedge/apps/test_logs.py +++ b/tests/api_resources/fastedge/apps/test_logs.py @@ -19,6 +19,7 @@ class TestLogs: parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"]) + @pytest.mark.skip(reason="CDP-2415: OpenAPI spec missing required fields in response schema") @parametrize def test_method_list(self, client: Gcore) -> None: log = client.fastedge.apps.logs.list( @@ -26,6 +27,7 @@ def test_method_list(self, client: Gcore) -> None: ) assert_matches_type(SyncOffsetPageFastedgeAppLogs[Log], log, path=["response"]) + @pytest.mark.skip(reason="CDP-2415: OpenAPI spec missing required fields in response schema") @parametrize def test_method_list_with_all_params(self, client: Gcore) -> None: log = client.fastedge.apps.logs.list( @@ -41,6 +43,7 @@ def test_method_list_with_all_params(self, client: Gcore) -> None: ) assert_matches_type(SyncOffsetPageFastedgeAppLogs[Log], log, path=["response"]) + @pytest.mark.skip(reason="CDP-2415: OpenAPI spec missing required fields in response schema") @parametrize def test_raw_response_list(self, client: Gcore) -> None: response = client.fastedge.apps.logs.with_raw_response.list( @@ -52,6 +55,7 @@ def test_raw_response_list(self, client: Gcore) -> None: log = response.parse() assert_matches_type(SyncOffsetPageFastedgeAppLogs[Log], log, path=["response"]) + @pytest.mark.skip(reason="CDP-2415: OpenAPI spec missing required fields in response schema") @parametrize def test_streaming_response_list(self, client: Gcore) -> None: with client.fastedge.apps.logs.with_streaming_response.list( @@ -71,6 +75,7 @@ class TestAsyncLogs: "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"] ) + @pytest.mark.skip(reason="CDP-2415: OpenAPI spec missing required fields in response schema") @parametrize async def test_method_list(self, async_client: AsyncGcore) -> None: log = await async_client.fastedge.apps.logs.list( @@ -78,6 +83,7 @@ async def test_method_list(self, async_client: AsyncGcore) -> None: ) assert_matches_type(AsyncOffsetPageFastedgeAppLogs[Log], log, path=["response"]) + @pytest.mark.skip(reason="CDP-2415: OpenAPI spec missing required fields in response schema") @parametrize async def test_method_list_with_all_params(self, async_client: AsyncGcore) -> None: log = await async_client.fastedge.apps.logs.list( @@ -93,6 +99,7 @@ async def test_method_list_with_all_params(self, async_client: AsyncGcore) -> No ) assert_matches_type(AsyncOffsetPageFastedgeAppLogs[Log], log, path=["response"]) + @pytest.mark.skip(reason="CDP-2415: OpenAPI spec missing required fields in response schema") @parametrize async def test_raw_response_list(self, async_client: AsyncGcore) -> None: response = await async_client.fastedge.apps.logs.with_raw_response.list( @@ -104,6 +111,7 @@ async def test_raw_response_list(self, async_client: AsyncGcore) -> None: log = await response.parse() assert_matches_type(AsyncOffsetPageFastedgeAppLogs[Log], log, path=["response"]) + @pytest.mark.skip(reason="CDP-2415: OpenAPI spec missing required fields in response schema") @parametrize async def test_streaming_response_list(self, async_client: AsyncGcore) -> None: async with async_client.fastedge.apps.logs.with_streaming_response.list( diff --git a/tests/api_resources/fastedge/test_apps.py b/tests/api_resources/fastedge/test_apps.py index d2c13598..cb23b781 100644 --- a/tests/api_resources/fastedge/test_apps.py +++ b/tests/api_resources/fastedge/test_apps.py @@ -124,11 +124,13 @@ def test_streaming_response_update(self, client: Gcore) -> None: assert cast(Any, response.is_closed) is True + @pytest.mark.skip(reason="CDP-2415: OpenAPI spec missing required 'count' field in response schema") @parametrize def test_method_list(self, client: Gcore) -> None: app = client.fastedge.apps.list() assert_matches_type(SyncOffsetPageFastedgeApps[AppShort], app, path=["response"]) + @pytest.mark.skip(reason="CDP-2415: OpenAPI spec missing required 'count' field in response schema") @parametrize def test_method_list_with_all_params(self, client: Gcore) -> None: app = client.fastedge.apps.list( @@ -144,6 +146,7 @@ def test_method_list_with_all_params(self, client: Gcore) -> None: ) assert_matches_type(SyncOffsetPageFastedgeApps[AppShort], app, path=["response"]) + @pytest.mark.skip(reason="CDP-2415: OpenAPI spec missing required 'count' field in response schema") @parametrize def test_raw_response_list(self, client: Gcore) -> None: response = client.fastedge.apps.with_raw_response.list() @@ -153,6 +156,7 @@ def test_raw_response_list(self, client: Gcore) -> None: app = response.parse() assert_matches_type(SyncOffsetPageFastedgeApps[AppShort], app, path=["response"]) + @pytest.mark.skip(reason="CDP-2415: OpenAPI spec missing required 'count' field in response schema") @parametrize def test_streaming_response_list(self, client: Gcore) -> None: with client.fastedge.apps.with_streaming_response.list() as response: @@ -392,11 +396,13 @@ async def test_streaming_response_update(self, async_client: AsyncGcore) -> None assert cast(Any, response.is_closed) is True + @pytest.mark.skip(reason="CDP-2415: OpenAPI spec missing required 'count' field in response schema") @parametrize async def test_method_list(self, async_client: AsyncGcore) -> None: app = await async_client.fastedge.apps.list() assert_matches_type(AsyncOffsetPageFastedgeApps[AppShort], app, path=["response"]) + @pytest.mark.skip(reason="CDP-2415: OpenAPI spec missing required 'count' field in response schema") @parametrize async def test_method_list_with_all_params(self, async_client: AsyncGcore) -> None: app = await async_client.fastedge.apps.list( @@ -412,6 +418,7 @@ async def test_method_list_with_all_params(self, async_client: AsyncGcore) -> No ) assert_matches_type(AsyncOffsetPageFastedgeApps[AppShort], app, path=["response"]) + @pytest.mark.skip(reason="CDP-2415: OpenAPI spec missing required 'count' field in response schema") @parametrize async def test_raw_response_list(self, async_client: AsyncGcore) -> None: response = await async_client.fastedge.apps.with_raw_response.list() @@ -421,6 +428,7 @@ async def test_raw_response_list(self, async_client: AsyncGcore) -> None: app = await response.parse() assert_matches_type(AsyncOffsetPageFastedgeApps[AppShort], app, path=["response"]) + @pytest.mark.skip(reason="CDP-2415: OpenAPI spec missing required 'count' field in response schema") @parametrize async def test_streaming_response_list(self, async_client: AsyncGcore) -> None: async with async_client.fastedge.apps.with_streaming_response.list() as response: diff --git a/tests/api_resources/fastedge/test_templates.py b/tests/api_resources/fastedge/test_templates.py index 4f86e098..83409242 100644 --- a/tests/api_resources/fastedge/test_templates.py +++ b/tests/api_resources/fastedge/test_templates.py @@ -99,11 +99,13 @@ def test_streaming_response_create(self, client: Gcore) -> None: assert cast(Any, response.is_closed) is True + @pytest.mark.skip(reason="CDP-2415: OpenAPI spec missing required 'count' field in response schema") @parametrize def test_method_list(self, client: Gcore) -> None: template = client.fastedge.templates.list() assert_matches_type(SyncOffsetPageFastedgeTemplates[TemplateShort], template, path=["response"]) + @pytest.mark.skip(reason="CDP-2415: OpenAPI spec missing required 'count' field in response schema") @parametrize def test_method_list_with_all_params(self, client: Gcore) -> None: template = client.fastedge.templates.list( @@ -114,6 +116,7 @@ def test_method_list_with_all_params(self, client: Gcore) -> None: ) assert_matches_type(SyncOffsetPageFastedgeTemplates[TemplateShort], template, path=["response"]) + @pytest.mark.skip(reason="CDP-2415: OpenAPI spec missing required 'count' field in response schema") @parametrize def test_raw_response_list(self, client: Gcore) -> None: response = client.fastedge.templates.with_raw_response.list() @@ -123,6 +126,7 @@ def test_raw_response_list(self, client: Gcore) -> None: template = response.parse() assert_matches_type(SyncOffsetPageFastedgeTemplates[TemplateShort], template, path=["response"]) + @pytest.mark.skip(reason="CDP-2415: OpenAPI spec missing required 'count' field in response schema") @parametrize def test_streaming_response_list(self, client: Gcore) -> None: with client.fastedge.templates.with_streaming_response.list() as response: @@ -370,11 +374,13 @@ async def test_streaming_response_create(self, async_client: AsyncGcore) -> None assert cast(Any, response.is_closed) is True + @pytest.mark.skip(reason="CDP-2415: OpenAPI spec missing required 'count' field in response schema") @parametrize async def test_method_list(self, async_client: AsyncGcore) -> None: template = await async_client.fastedge.templates.list() assert_matches_type(AsyncOffsetPageFastedgeTemplates[TemplateShort], template, path=["response"]) + @pytest.mark.skip(reason="CDP-2415: OpenAPI spec missing required 'count' field in response schema") @parametrize async def test_method_list_with_all_params(self, async_client: AsyncGcore) -> None: template = await async_client.fastedge.templates.list( @@ -385,6 +391,7 @@ async def test_method_list_with_all_params(self, async_client: AsyncGcore) -> No ) assert_matches_type(AsyncOffsetPageFastedgeTemplates[TemplateShort], template, path=["response"]) + @pytest.mark.skip(reason="CDP-2415: OpenAPI spec missing required 'count' field in response schema") @parametrize async def test_raw_response_list(self, async_client: AsyncGcore) -> None: response = await async_client.fastedge.templates.with_raw_response.list() @@ -394,6 +401,7 @@ async def test_raw_response_list(self, async_client: AsyncGcore) -> None: template = await response.parse() assert_matches_type(AsyncOffsetPageFastedgeTemplates[TemplateShort], template, path=["response"]) + @pytest.mark.skip(reason="CDP-2415: OpenAPI spec missing required 'count' field in response schema") @parametrize async def test_streaming_response_list(self, async_client: AsyncGcore) -> None: async with async_client.fastedge.templates.with_streaming_response.list() as response: diff --git a/tests/api_resources/iam/test_users.py b/tests/api_resources/iam/test_users.py index c8c15d5a..b6c2b47c 100644 --- a/tests/api_resources/iam/test_users.py +++ b/tests/api_resources/iam/test_users.py @@ -21,6 +21,7 @@ class TestUsers: parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"]) + @pytest.mark.skip(reason="IMP-1903: OpenAPI spec PATCH requires PUT-only fields") @parametrize def test_method_update(self, client: Gcore) -> None: user = client.iam.users.update( @@ -33,6 +34,7 @@ def test_method_update(self, client: Gcore) -> None: ) assert_matches_type(User, user, path=["response"]) + @pytest.mark.skip(reason="IMP-1903: OpenAPI spec PATCH requires PUT-only fields") @parametrize def test_raw_response_update(self, client: Gcore) -> None: response = client.iam.users.with_raw_response.update( @@ -49,6 +51,7 @@ def test_raw_response_update(self, client: Gcore) -> None: user = response.parse() assert_matches_type(User, user, path=["response"]) + @pytest.mark.skip(reason="IMP-1903: OpenAPI spec PATCH requires PUT-only fields") @parametrize def test_streaming_response_update(self, client: Gcore) -> None: with client.iam.users.with_streaming_response.update( @@ -67,11 +70,13 @@ def test_streaming_response_update(self, client: Gcore) -> None: assert cast(Any, response.is_closed) is True + @pytest.mark.skip(reason="IMP-1904: OpenAPI spec missing required fields in response schema") @parametrize def test_method_list(self, client: Gcore) -> None: user = client.iam.users.list() assert_matches_type(SyncOffsetPage[User], user, path=["response"]) + @pytest.mark.skip(reason="IMP-1904: OpenAPI spec missing required fields in response schema") @parametrize def test_method_list_with_all_params(self, client: Gcore) -> None: user = client.iam.users.list( @@ -80,6 +85,7 @@ def test_method_list_with_all_params(self, client: Gcore) -> None: ) assert_matches_type(SyncOffsetPage[User], user, path=["response"]) + @pytest.mark.skip(reason="IMP-1904: OpenAPI spec missing required fields in response schema") @parametrize def test_raw_response_list(self, client: Gcore) -> None: response = client.iam.users.with_raw_response.list() @@ -89,6 +95,7 @@ def test_raw_response_list(self, client: Gcore) -> None: user = response.parse() assert_matches_type(SyncOffsetPage[User], user, path=["response"]) + @pytest.mark.skip(reason="IMP-1904: OpenAPI spec missing required fields in response schema") @parametrize def test_streaming_response_list(self, client: Gcore) -> None: with client.iam.users.with_streaming_response.list() as response: @@ -222,6 +229,7 @@ class TestAsyncUsers: "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"] ) + @pytest.mark.skip(reason="IMP-1903: OpenAPI spec PATCH requires PUT-only fields") @parametrize async def test_method_update(self, async_client: AsyncGcore) -> None: user = await async_client.iam.users.update( @@ -234,6 +242,7 @@ async def test_method_update(self, async_client: AsyncGcore) -> None: ) assert_matches_type(User, user, path=["response"]) + @pytest.mark.skip(reason="IMP-1903: OpenAPI spec PATCH requires PUT-only fields") @parametrize async def test_raw_response_update(self, async_client: AsyncGcore) -> None: response = await async_client.iam.users.with_raw_response.update( @@ -250,6 +259,7 @@ async def test_raw_response_update(self, async_client: AsyncGcore) -> None: user = await response.parse() assert_matches_type(User, user, path=["response"]) + @pytest.mark.skip(reason="IMP-1903: OpenAPI spec PATCH requires PUT-only fields") @parametrize async def test_streaming_response_update(self, async_client: AsyncGcore) -> None: async with async_client.iam.users.with_streaming_response.update( @@ -268,11 +278,13 @@ async def test_streaming_response_update(self, async_client: AsyncGcore) -> None assert cast(Any, response.is_closed) is True + @pytest.mark.skip(reason="IMP-1904: OpenAPI spec missing required fields in response schema") @parametrize async def test_method_list(self, async_client: AsyncGcore) -> None: user = await async_client.iam.users.list() assert_matches_type(AsyncOffsetPage[User], user, path=["response"]) + @pytest.mark.skip(reason="IMP-1904: OpenAPI spec missing required fields in response schema") @parametrize async def test_method_list_with_all_params(self, async_client: AsyncGcore) -> None: user = await async_client.iam.users.list( @@ -281,6 +293,7 @@ async def test_method_list_with_all_params(self, async_client: AsyncGcore) -> No ) assert_matches_type(AsyncOffsetPage[User], user, path=["response"]) + @pytest.mark.skip(reason="IMP-1904: OpenAPI spec missing required fields in response schema") @parametrize async def test_raw_response_list(self, async_client: AsyncGcore) -> None: response = await async_client.iam.users.with_raw_response.list() @@ -290,6 +303,7 @@ async def test_raw_response_list(self, async_client: AsyncGcore) -> None: user = await response.parse() assert_matches_type(AsyncOffsetPage[User], user, path=["response"]) + @pytest.mark.skip(reason="IMP-1904: OpenAPI spec missing required fields in response schema") @parametrize async def test_streaming_response_list(self, async_client: AsyncGcore) -> None: async with async_client.iam.users.with_streaming_response.list() as response: