Skip to content

Commit 6bc4067

Browse files
committed
test: fix schemathesis query parameters test
1 parent 60e6342 commit 6bc4067

31 files changed

+486
-279
lines changed

Makefile

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@
22

33
AMALTHEA_JS_VERSION ?= 0.11.0
44
AMALTHEA_SESSIONS_VERSION ?= 0.0.1-new-operator-chart
5+
codegen_params = --input-file-type openapi --output-model-type pydantic_v2.BaseModel --use-double-quotes --target-python-version 3.12 --collapse-root-models --field-constraints --strict-nullable --set-default-enum-member --openapi-scopes schemas paths parameters --set-default-enum-member --use-one-literal-as-default --use-default
56

67
define test_apispec_up_to_date
78
$(eval $@_NAME=$(1))
89
cp "components/renku_data_services/${$@_NAME}/apispec.py" "/tmp/apispec_orig.py"
9-
poetry run datamodel-codegen --input components/renku_data_services/${$@_NAME}/api.spec.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output components/renku_data_services/${$@_NAME}/apispec.py --use-double-quotes --target-python-version 3.12 --collapse-root-models --field-constraints --strict-nullable --base-class renku_data_services.${$@_NAME}.apispec_base.BaseAPISpec --set-default-enum-member
10+
poetry run datamodel-codegen --input components/renku_data_services/${$@_NAME}/api.spec.yaml --output components/renku_data_services/${$@_NAME}/apispec.py --base-class renku_data_services.${$@_NAME}.apispec_base.BaseAPISpec $(codegen_params)
1011
diff -I "^# timestamp\: " "/tmp/apispec_orig.py" "components/renku_data_services/${$@_NAME}/apispec.py"
1112
@RESULT=$?
1213
cp "/tmp/apispec_orig.py" "components/renku_data_services/${$@_NAME}/apispec.py"
@@ -16,29 +17,29 @@ endef
1617
all: help
1718

1819
components/renku_data_services/crc/apispec.py: components/renku_data_services/crc/api.spec.yaml
19-
poetry run datamodel-codegen --input components/renku_data_services/crc/api.spec.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output components/renku_data_services/crc/apispec.py --use-double-quotes --target-python-version 3.12 --collapse-root-models --field-constraints --strict-nullable --base-class renku_data_services.crc.apispec_base.BaseAPISpec --set-default-enum-member
20+
poetry run datamodel-codegen --input components/renku_data_services/crc/api.spec.yaml --output components/renku_data_services/crc/apispec.py --base-class renku_data_services.crc.apispec_base.BaseAPISpec $(codegen_params)
2021
components/renku_data_services/storage/apispec.py: components/renku_data_services/storage/api.spec.yaml
21-
poetry run datamodel-codegen --input components/renku_data_services/storage/api.spec.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output components/renku_data_services/storage/apispec.py --use-double-quotes --target-python-version 3.12 --collapse-root-models --field-constraints --strict-nullable --base-class renku_data_services.storage.apispec_base.BaseAPISpec --set-default-enum-member
22+
poetry run datamodel-codegen --input components/renku_data_services/storage/api.spec.yaml --output components/renku_data_services/storage/apispec.py --base-class renku_data_services.storage.apispec_base.BaseAPISpec $(codegen_params)
2223
components/renku_data_services/users/apispec.py: components/renku_data_services/users/api.spec.yaml
23-
poetry run datamodel-codegen --input components/renku_data_services/users/api.spec.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output components/renku_data_services/users/apispec.py --use-double-quotes --target-python-version 3.12 --collapse-root-models --field-constraints --strict-nullable --base-class renku_data_services.users.apispec_base.BaseAPISpec --set-default-enum-member
24+
poetry run datamodel-codegen --input components/renku_data_services/users/api.spec.yaml --output components/renku_data_services/users/apispec.py --base-class renku_data_services.users.apispec_base.BaseAPISpec $(codegen_params)
2425
components/renku_data_services/project/apispec.py: components/renku_data_services/project/api.spec.yaml
25-
poetry run datamodel-codegen --input components/renku_data_services/project/api.spec.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output components/renku_data_services/project/apispec.py --use-double-quotes --target-python-version 3.12 --collapse-root-models --field-constraints --strict-nullable --base-class renku_data_services.project.apispec_base.BaseAPISpec --set-default-enum-member
26+
poetry run datamodel-codegen --input components/renku_data_services/project/api.spec.yaml --output components/renku_data_services/project/apispec.py --base-class renku_data_services.project.apispec_base.BaseAPISpec $(codegen_params)
2627
components/renku_data_services/session/apispec.py: components/renku_data_services/session/api.spec.yaml
27-
poetry run datamodel-codegen --input components/renku_data_services/session/api.spec.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output components/renku_data_services/session/apispec.py --use-double-quotes --target-python-version 3.12 --collapse-root-models --field-constraints --strict-nullable --base-class renku_data_services.session.apispec_base.BaseAPISpec --set-default-enum-member
28+
poetry run datamodel-codegen --input components/renku_data_services/session/api.spec.yaml --output components/renku_data_services/session/apispec.py --base-class renku_data_services.session.apispec_base.BaseAPISpec $(codegen_params)
2829
components/renku_data_services/user_preferences/apispec.py: components/renku_data_services/user_preferences/api.spec.yaml
29-
poetry run datamodel-codegen --input components/renku_data_services/user_preferences/api.spec.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output components/renku_data_services/user_preferences/apispec.py --use-double-quotes --target-python-version 3.12 --collapse-root-models --field-constraints --strict-nullable --base-class renku_data_services.user_preferences.apispec_base.BaseAPISpec --set-default-enum-member
30+
poetry run datamodel-codegen --input components/renku_data_services/user_preferences/api.spec.yaml --output components/renku_data_services/user_preferences/apispec.py --base-class renku_data_services.user_preferences.apispec_base.BaseAPISpec $(codegen_params)
3031
components/renku_data_services/namespace/apispec.py: components/renku_data_services/namespace/api.spec.yaml
31-
poetry run datamodel-codegen --input components/renku_data_services/namespace/api.spec.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output components/renku_data_services/namespace/apispec.py --use-double-quotes --target-python-version 3.12 --collapse-root-models --field-constraints --strict-nullable --base-class renku_data_services.namespace.apispec_base.BaseAPISpec --set-default-enum-member
32+
poetry run datamodel-codegen --input components/renku_data_services/namespace/api.spec.yaml --output components/renku_data_services/namespace/apispec.py --base-class renku_data_services.namespace.apispec_base.BaseAPISpec $(codegen_params)
3233
components/renku_data_services/secrets/apispec.py: components/renku_data_services/secrets/api.spec.yaml
33-
poetry run datamodel-codegen --input components/renku_data_services/secrets/api.spec.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output components/renku_data_services/secrets/apispec.py --use-double-quotes --target-python-version 3.12 --collapse-root-models --field-constraints --strict-nullable --base-class renku_data_services.secrets.apispec_base.BaseAPISpec --set-default-enum-member
34+
poetry run datamodel-codegen --input components/renku_data_services/secrets/api.spec.yaml --output components/renku_data_services/secrets/apispec.py --base-class renku_data_services.secrets.apispec_base.BaseAPISpec $(codegen_params)
3435
components/renku_data_services/connected_services/apispec.py: components/renku_data_services/connected_services/api.spec.yaml
35-
poetry run datamodel-codegen --input components/renku_data_services/connected_services/api.spec.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output components/renku_data_services/connected_services/apispec.py --use-double-quotes --target-python-version 3.12 --collapse-root-models --field-constraints --strict-nullable --base-class renku_data_services.connected_services.apispec_base.BaseAPISpec --set-default-enum-member
36+
poetry run datamodel-codegen --input components/renku_data_services/connected_services/api.spec.yaml --output components/renku_data_services/connected_services/apispec.py --base-class renku_data_services.connected_services.apispec_base.BaseAPISpec $(codegen_params)
3637
components/renku_data_services/repositories/apispec.py: components/renku_data_services/repositories/api.spec.yaml
37-
poetry run datamodel-codegen --input components/renku_data_services/repositories/api.spec.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output components/renku_data_services/repositories/apispec.py --use-double-quotes --target-python-version 3.12 --collapse-root-models --field-constraints --strict-nullable --base-class renku_data_services.repositories.apispec_base.BaseAPISpec --set-default-enum-member
38+
poetry run datamodel-codegen --input components/renku_data_services/repositories/api.spec.yaml --output components/renku_data_services/repositories/apispec.py --base-class renku_data_services.repositories.apispec_base.BaseAPISpec $(codegen_params)
3839
components/renku_data_services/notebooks/apispec.py: components/renku_data_services/notebooks/api.spec.yaml
39-
poetry run datamodel-codegen --input components/renku_data_services/notebooks/api.spec.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output components/renku_data_services/notebooks/apispec.py --use-double-quotes --target-python-version 3.12 --collapse-root-models --field-constraints --strict-nullable --base-class renku_data_services.notebooks.apispec_base.BaseAPISpec --set-default-enum-member
40+
poetry run datamodel-codegen --input components/renku_data_services/notebooks/api.spec.yaml --output components/renku_data_services/notebooks/apispec.py --base-class renku_data_services.notebooks.apispec_base.BaseAPISpec $(codegen_params)
4041
components/renku_data_services/platform/apispec.py: components/renku_data_services/platform/api.spec.yaml
41-
poetry run datamodel-codegen --input components/renku_data_services/platform/api.spec.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output components/renku_data_services/platform/apispec.py --use-double-quotes --target-python-version 3.12 --collapse-root-models --field-constraints --strict-nullable --base-class renku_data_services.platform.apispec_base.BaseAPISpec --set-default-enum-member
42+
poetry run datamodel-codegen --input components/renku_data_services/platform/api.spec.yaml --output components/renku_data_services/platform/apispec.py --base-class renku_data_services.platform.apispec_base.BaseAPISpec $(codegen_params)
4243

4344
##@ Apispec
4445

components/renku_data_services/connected_services/api.spec.yaml

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,10 +123,17 @@ paths:
123123
schema:
124124
type: string
125125
- in: query
126-
name: next_url
126+
description: query parameters
127+
name: authorize_params
128+
style: form
129+
explode: true
127130
schema:
128-
description: The URL to redirect the user to once the authorization flow has been completed.
129-
type: string
131+
type: object
132+
additionalProperties: false
133+
properties:
134+
next_url:
135+
description: The URL to redirect the user to once the authorization flow has been completed.
136+
type: string
130137
responses:
131138
"302":
132139
description: The authorization URL for this OAuth2 Client.

components/renku_data_services/connected_services/apispec.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# generated by datamodel-codegen:
22
# filename: api.spec.yaml
3-
# timestamp: 2024-06-17T17:31:13+00:00
3+
# timestamp: 2024-08-06T05:55:35+00:00
44

55
from __future__ import annotations
66

@@ -33,6 +33,20 @@ class ErrorResponse(BaseAPISpec):
3333
error: Error
3434

3535

36+
class AuthorizeParams(BaseAPISpec):
37+
model_config = ConfigDict(
38+
extra="forbid",
39+
)
40+
next_url: Optional[str] = Field(
41+
None,
42+
description="The URL to redirect the user to once the authorization flow has been completed.",
43+
)
44+
45+
46+
class Oauth2ProvidersProviderIdAuthorizeGetParametersQuery(BaseAPISpec):
47+
authorize_params: Optional[AuthorizeParams] = None
48+
49+
3650
class Provider(BaseAPISpec):
3751
model_config = ConfigDict(
3852
extra="forbid",

components/renku_data_services/connected_services/blueprints.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,11 +90,13 @@ def authorize(self) -> BlueprintFactoryResponse:
9090

9191
@authenticate(self.authenticator)
9292
@only_authenticated
93-
async def _authorize(request: Request, user: base_models.APIUser, provider_id: str) -> HTTPResponse:
94-
params = AuthorizeParams.model_validate(dict(request.query_args))
93+
@validate(query=apispec.AuthorizeParams)
94+
async def _authorize(
95+
request: Request, user: base_models.APIUser, provider_id: str, query: AuthorizeParams
96+
) -> HTTPResponse:
9597
callback_url = self._get_callback_url(request)
9698
url = await self.connected_services_repo.authorize_client(
97-
provider_id=provider_id, user=user, callback_url=callback_url, next_url=params.next_url
99+
provider_id=provider_id, user=user, callback_url=callback_url, next_url=query.next_url
98100
)
99101
return redirect(to=url)
100102

components/renku_data_services/crc/api.spec.yaml

Lines changed: 32 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -15,29 +15,22 @@ paths:
1515
summary: Get all resource pool definitions
1616
parameters:
1717
- in: query
18-
name: cpu
19-
required: false
20-
description: Filter for classes that meet or exceed the number of cpu cores
18+
description: query parameters
19+
name: resource_pools_params
20+
style: form
21+
explode: true
2122
schema:
22-
$ref: "#/components/schemas/CpuFilter"
23-
- in: query
24-
name: gpu
25-
required: false
26-
description: Filter for classes that meet or exceed the number of gpus
27-
schema:
28-
$ref: "#/components/schemas/Gpu"
29-
- in: query
30-
name: memory
31-
required: false
32-
description: Filter for classes that meet or exceed the amount of memory in gigabytes
33-
schema:
34-
$ref: "#/components/schemas/MemoryFilter"
35-
- in: query
36-
name: max_storage
37-
required: false
38-
description: Filter for classes that meet or exceed the amount of max_storage in gigabytes
39-
schema:
40-
$ref: "#/components/schemas/StorageFilter"
23+
type: object
24+
additionalProperties: false
25+
properties:
26+
cpu:
27+
$ref: "#/components/schemas/CpuFilter"
28+
gpu:
29+
$ref: "#/components/schemas/Gpu"
30+
memory:
31+
$ref: "#/components/schemas/MemoryFilter"
32+
max_storage:
33+
$ref: "#/components/schemas/StorageFilter"
4134
responses:
4235
"200":
4336
description: The resource pool definitions
@@ -330,10 +323,15 @@ paths:
330323
type: integer
331324
- in: query
332325
description: Filter for resource classes based on the provided name as a prefix. Omitting this parameter returns all classes.
333-
name: name
326+
name: resource_class_params
327+
style: form
328+
explode: true
334329
schema:
335-
$ref: "#/components/schemas/Name"
336-
required: false
330+
type: object
331+
additionalProperties: false
332+
properties:
333+
name:
334+
$ref: "#/components/schemas/Name"
337335
responses:
338336
"200":
339337
description: The resource class in the specific pool
@@ -719,11 +717,16 @@ paths:
719717
schema:
720718
type: string
721719
- in: query
722-
description: Filter for resource pools based on the provided name as a prefix. Omitting this parameter returns all resource pools.
723-
name: name
720+
description: Filter for resource classes based on the provided name as a prefix. Omitting this parameter returns all classes.
721+
name: user_resource_params
722+
style: form
723+
explode: true
724724
schema:
725-
$ref: "#/components/schemas/Name"
726-
required: false
725+
type: object
726+
additionalProperties: false
727+
properties:
728+
name:
729+
$ref: "#/components/schemas/Name"
727730
responses:
728731
"200":
729732
description: The resource pools that the user has access to

components/renku_data_services/crc/apispec.py

Lines changed: 63 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# generated by datamodel-codegen:
22
# filename: api.spec.yaml
3-
# timestamp: 2024-07-02T12:20:59+00:00
3+
# timestamp: 2024-08-06T05:55:27+00:00
44

55
from __future__ import annotations
66

@@ -34,30 +34,6 @@ class Version(BaseAPISpec):
3434
version: str
3535

3636

37-
class CpuFilter(RootModel[float]):
38-
root: float = Field(..., description="Number of cpu cores", example=10, ge=0.0)
39-
40-
41-
class MemoryFilter(RootModel[int]):
42-
root: int = Field(
43-
...,
44-
description="Number of gigabytes of memory",
45-
example=4,
46-
ge=0,
47-
le=9223372036854775807,
48-
)
49-
50-
51-
class StorageFilter(RootModel[int]):
52-
root: int = Field(
53-
...,
54-
description="Number of gigabytes of storage",
55-
example=100,
56-
ge=0,
57-
le=9223372036854775807,
58-
)
59-
60-
6137
class IntegerIds(RootModel[List[int]]):
6238
root: List[int] = Field(..., example=[1, 3, 5], min_length=1)
6339

@@ -100,6 +76,68 @@ class ErrorResponse(BaseAPISpec):
10076
error: Error
10177

10278

79+
class ResourcePoolsParams(BaseAPISpec):
80+
model_config = ConfigDict(
81+
extra="forbid",
82+
)
83+
cpu: Optional[float] = Field(
84+
None, description="Number of cpu cores", example=10, ge=0.0
85+
)
86+
gpu: Optional[int] = Field(
87+
None, description="Number of GPUs", example=8, ge=0, le=9223372036854775807
88+
)
89+
memory: Optional[int] = Field(
90+
None,
91+
description="Number of gigabytes of memory",
92+
example=4,
93+
ge=0,
94+
le=9223372036854775807,
95+
)
96+
max_storage: Optional[int] = Field(
97+
None,
98+
description="Number of gigabytes of storage",
99+
example=100,
100+
ge=0,
101+
le=9223372036854775807,
102+
)
103+
104+
105+
class ResourcePoolsGetParametersQuery(BaseAPISpec):
106+
resource_pools_params: Optional[ResourcePoolsParams] = None
107+
108+
109+
class ResourceClassParams(BaseAPISpec):
110+
model_config = ConfigDict(
111+
extra="forbid",
112+
)
113+
name: Optional[str] = Field(
114+
None,
115+
description="A name for a specific resource",
116+
example="the name of a resource",
117+
min_length=5,
118+
)
119+
120+
121+
class ResourcePoolsResourcePoolIdClassesGetParametersQuery(BaseAPISpec):
122+
resource_class_params: Optional[ResourceClassParams] = None
123+
124+
125+
class UserResourceParams(BaseAPISpec):
126+
model_config = ConfigDict(
127+
extra="forbid",
128+
)
129+
name: Optional[str] = Field(
130+
None,
131+
description="A name for a specific resource",
132+
example="the name of a resource",
133+
min_length=5,
134+
)
135+
136+
137+
class UsersUserIdResourcePoolsGetParametersQuery(BaseAPISpec):
138+
user_resource_params: Optional[UserResourceParams] = None
139+
140+
103141
class PoolUserWithId(BaseAPISpec):
104142
model_config = ConfigDict(
105143
extra="forbid",
Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""Base models for API specifications."""
22

3-
from pydantic import BaseModel, Field
3+
from pydantic import BaseModel
44

55

66
class BaseAPISpec(BaseModel):
@@ -10,17 +10,3 @@ class Config:
1010
"""Enables orm mode for pydantic."""
1111

1212
from_attributes = True
13-
14-
15-
class ResourceClassesFilter(BaseAPISpec):
16-
"""The schema for the query parameters used to filter resource classes."""
17-
18-
class Config:
19-
"""Configuration."""
20-
21-
extra = "ignore"
22-
23-
cpu: float = Field(ge=0.0, default=0.0)
24-
memory: int = Field(ge=0, default=0)
25-
gpu: int = Field(ge=0, default=0)
26-
max_storage: int = Field(ge=0, default=0)

0 commit comments

Comments
 (0)