Skip to content

Commit 4a7e383

Browse files
Merge pull request #1517 from VWS-Python/rm-types-flask
Remove types-flask dependency
2 parents 670db7c + bb3aff5 commit 4a7e383

File tree

4 files changed

+64
-38
lines changed

4 files changed

+64
-38
lines changed

pyproject.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,6 @@ dev = [
305305
"sphinxcontrib-spelling==8.0.0",
306306
"sphinx-toolbox==3.4.0",
307307
"sybil==4.0.1",
308-
"types-Flask==1.1.6",
309308
"types-PyYAML==6.0.12.8",
310309
"types-Pillow==9.4.0.17",
311310
"types-requests==2.28.11.16",

src/mock_vws/_flask_server/target_manager.py

Lines changed: 58 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@
55
import base64
66
import dataclasses
77
import datetime
8+
import json
89
from http import HTTPStatus
910
from zoneinfo import ZoneInfo
1011

11-
from flask import Flask, jsonify, request
12+
from flask import Flask, Response, request
1213
from pydantic import BaseSettings
1314

1415
from mock_vws.database import VuforiaDatabase
@@ -31,7 +32,7 @@ class TargetManagerSettings(BaseSettings):
3132
"/databases/<string:database_name>",
3233
methods=["DELETE"],
3334
)
34-
def delete_database(database_name: str) -> tuple[str, int]:
35+
def delete_database(database_name: str) -> Response:
3536
"""
3637
Delete a database.
3738
@@ -44,23 +45,26 @@ def delete_database(database_name: str) -> tuple[str, int]:
4445
if database_name == database.database_name
4546
}
4647
except ValueError:
47-
return "", HTTPStatus.NOT_FOUND
48+
return Response(response="", status=HTTPStatus.NOT_FOUND)
4849

4950
TARGET_MANAGER.remove_database(database=matching_database)
50-
return "", HTTPStatus.OK
51+
return Response(response="", status=HTTPStatus.OK)
5152

5253

5354
@TARGET_MANAGER_FLASK_APP.route("/databases", methods=["GET"])
54-
def get_databases() -> tuple[str, int]:
55+
def get_databases() -> Response:
5556
"""
5657
Return a list of all databases.
5758
"""
5859
databases = [database.to_dict() for database in TARGET_MANAGER.databases]
59-
return jsonify(databases), HTTPStatus.OK
60+
return Response(
61+
response=json.dumps(obj=databases),
62+
status=HTTPStatus.OK,
63+
)
6064

6165

6266
@TARGET_MANAGER_FLASK_APP.route("/databases", methods=["POST"])
63-
def create_database() -> tuple[str, int]:
67+
def create_database() -> Response:
6468
"""
6569
Create a new database.
6670
@@ -91,27 +95,28 @@ def create_database() -> tuple[str, int]:
9195
:status 201: The database has been successfully created.
9296
"""
9397
random_database = VuforiaDatabase()
94-
server_access_key = request.json.get(
98+
request_json = json.loads(request.data)
99+
server_access_key = request_json.get(
95100
"server_access_key",
96101
random_database.server_access_key,
97102
)
98-
server_secret_key = request.json.get(
103+
server_secret_key = request_json.get(
99104
"server_secret_key",
100105
random_database.server_secret_key,
101106
)
102-
client_access_key = request.json.get(
107+
client_access_key = request_json.get(
103108
"client_access_key",
104109
random_database.client_access_key,
105110
)
106-
client_secret_key = request.json.get(
111+
client_secret_key = request_json.get(
107112
"client_secret_key",
108113
random_database.client_secret_key,
109114
)
110-
database_name = request.json.get(
115+
database_name = request_json.get(
111116
"database_name",
112117
random_database.database_name,
113118
)
114-
state_name = request.json.get(
119+
state_name = request_json.get(
115120
"state_name",
116121
random_database.state.name,
117122
)
@@ -129,16 +134,22 @@ def create_database() -> tuple[str, int]:
129134
try:
130135
TARGET_MANAGER.add_database(database=database)
131136
except ValueError as exc:
132-
return str(exc), HTTPStatus.CONFLICT
133-
134-
return jsonify(database.to_dict()), HTTPStatus.CREATED
137+
return Response(
138+
response=str(exc),
139+
status=HTTPStatus.CONFLICT,
140+
)
141+
142+
return Response(
143+
response=json.dumps(database.to_dict()),
144+
status=HTTPStatus.CREATED,
145+
)
135146

136147

137148
@TARGET_MANAGER_FLASK_APP.route(
138149
"/databases/<string:database_name>/targets",
139150
methods=["POST"],
140151
)
141-
def create_target(database_name: str) -> tuple[str, int]:
152+
def create_target(database_name: str) -> Response:
142153
"""
143154
Create a new target in a given database.
144155
"""
@@ -147,27 +158,31 @@ def create_target(database_name: str) -> tuple[str, int]:
147158
for database in TARGET_MANAGER.databases
148159
if database.database_name == database_name
149160
]
150-
image_base64 = request.json["image_base64"]
161+
request_json = json.loads(request.data)
162+
image_base64 = request_json["image_base64"]
151163
image_bytes = base64.b64decode(s=image_base64)
152164
target = Target(
153-
name=request.json["name"],
154-
width=request.json["width"],
165+
name=request_json["name"],
166+
width=request_json["width"],
155167
image_value=image_bytes,
156-
active_flag=request.json["active_flag"],
157-
processing_time_seconds=request.json["processing_time_seconds"],
158-
application_metadata=request.json["application_metadata"],
159-
target_id=request.json["target_id"],
168+
active_flag=request_json["active_flag"],
169+
processing_time_seconds=request_json["processing_time_seconds"],
170+
application_metadata=request_json["application_metadata"],
171+
target_id=request_json["target_id"],
160172
)
161173
database.targets.add(target)
162174

163-
return jsonify(target.to_dict()), HTTPStatus.CREATED
175+
return Response(
176+
response=json.dumps(target.to_dict()),
177+
status=HTTPStatus.CREATED,
178+
)
164179

165180

166181
@TARGET_MANAGER_FLASK_APP.route(
167182
"/databases/<string:database_name>/targets/<string:target_id>",
168183
methods=["DELETE"],
169184
)
170-
def delete_target(database_name: str, target_id: str) -> tuple[str, int]:
185+
def delete_target(database_name: str, target_id: str) -> Response:
171186
"""
172187
Delete a target.
173188
"""
@@ -181,14 +196,17 @@ def delete_target(database_name: str, target_id: str) -> tuple[str, int]:
181196
new_target = dataclasses.replace(target, delete_date=now)
182197
database.targets.remove(target)
183198
database.targets.add(new_target)
184-
return jsonify(new_target.to_dict()), HTTPStatus.OK
199+
return Response(
200+
response=json.dumps(new_target.to_dict()),
201+
status=HTTPStatus.OK,
202+
)
185203

186204

187205
@TARGET_MANAGER_FLASK_APP.route(
188206
"/databases/<string:database_name>/targets/<string:target_id>",
189207
methods=["PUT"],
190208
)
191-
def update_target(database_name: str, target_id: str) -> tuple[str, int]:
209+
def update_target(database_name: str, target_id: str) -> Response:
192210
"""
193211
Update a target.
194212
"""
@@ -199,17 +217,19 @@ def update_target(database_name: str, target_id: str) -> tuple[str, int]:
199217
]
200218
target = database.get_target(target_id=target_id)
201219

202-
width = request.json.get("width", target.width)
203-
name = request.json.get("name", target.name)
204-
active_flag = request.json.get("active_flag", target.active_flag)
205-
application_metadata = request.json.get(
220+
request_json = json.loads(request.data)
221+
width = request_json.get("width", target.width)
222+
name = request_json.get("name", target.name)
223+
active_flag = request_json.get("active_flag", target.active_flag)
224+
application_metadata = request_json.get(
206225
"application_metadata",
207226
target.application_metadata,
208227
)
209228

210229
image_value = target.image_value
211-
if "image" in request.json:
212-
image_value = base64.b64decode(s=request.json["image"])
230+
request_json = json.loads(request.data)
231+
if "image" in request_json:
232+
image_value = base64.b64decode(s=request_json["image"])
213233

214234
gmt = ZoneInfo("GMT")
215235
last_modified_date = datetime.datetime.now(tz=gmt)
@@ -227,7 +247,10 @@ def update_target(database_name: str, target_id: str) -> tuple[str, int]:
227247
database.targets.remove(target)
228248
database.targets.add(new_target)
229249

230-
return jsonify(new_target.to_dict()), HTTPStatus.OK
250+
return Response(
251+
response=json.dumps(new_target.to_dict()),
252+
status=HTTPStatus.OK,
253+
)
231254

232255

233256
if __name__ == "__main__": # pragma: no cover

src/mock_vws/_flask_server/vwq.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,9 @@ class ResponseNoContentTypeAdded(Response):
9696
Some of our responses need to not have a "Content-Type" header.
9797
"""
9898

99-
default_mimetype = None
99+
# The type in Flask is incorrect.
100+
# See https://github.com/pallets/flask/pull/5034.
101+
default_mimetype = None # type: ignore[assignment]
100102

101103

102104
CLOUDRECO_FLASK_APP.response_class = ResponseNoContentTypeAdded

src/mock_vws/_flask_server/vws.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,9 @@ class ResponseNoContentTypeAdded(Response):
6767
Some of our responses need to not have a "Content-Type" header.
6868
"""
6969

70-
default_mimetype = None
70+
# The type in Flask is incorrect.
71+
# See https://github.com/pallets/flask/pull/5034.
72+
default_mimetype = None # type: ignore[assignment]
7173

7274

7375
VWS_FLASK_APP.response_class = ResponseNoContentTypeAdded

0 commit comments

Comments
 (0)