Skip to content

Commit 880920a

Browse files
authored
Merge pull request #50 from mgxd/fix/query-fmt
FIX: Add safeguards to query formulation, exception handling
2 parents e4bcd1d + e8e756d commit 880920a

File tree

2 files changed

+63
-52
lines changed

2 files changed

+63
-52
lines changed

migas/error/base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ def inspect_error(error_funcs: dict | None = None) -> dict:
2121
etb = sys.last_traceback
2222

2323
if err and etype:
24-
evalue = err.args[0]
24+
evalue = err.args[0] if err.args else str(err)
2525
ename = etype.__name__
2626

2727
if isinstance(error_funcs, dict) and ename in error_funcs:

migas/operations.py

Lines changed: 62 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,18 @@
44
from __future__ import annotations
55

66
import dataclasses
7+
import enum
8+
import json
79
import typing as ty
810
import warnings
911

1012
from migas.config import Config, logger, telemetry_enabled
1113
from migas.request import request
1214

13-
FREE = '"{}"' # FREE text fields
14-
FIXED = '{}' # FIXED text fields
15+
class QueryParamType(enum.Enum):
16+
LITERAL = enum.auto()
17+
TEXT = enum.auto()
18+
1519
ERROR = '[migas-py] An error occurred.'
1620

1721

@@ -48,23 +52,23 @@ class AddBreadcrumb(Operation):
4852
operation_type = "mutation"
4953
operation_name = "add_breadcrumb"
5054
query_args = {
51-
"project": FREE,
52-
"project_version": FREE,
53-
"language": FREE,
54-
"language_version": FREE,
55+
"project": QueryParamType.TEXT,
56+
"project_version": QueryParamType.TEXT,
57+
"language": QueryParamType.TEXT,
58+
"language_version": QueryParamType.TEXT,
5559
"ctx": {
56-
"session_id": FREE,
57-
"user_id": FREE,
58-
"user_type": FIXED,
59-
"platform": FREE,
60-
"container": FIXED,
61-
"is_ci": FIXED,
60+
"session_id": QueryParamType.TEXT,
61+
"user_id": QueryParamType.TEXT,
62+
"user_type": QueryParamType.LITERAL,
63+
"platform": QueryParamType.TEXT,
64+
"container": QueryParamType.LITERAL,
65+
"is_ci": QueryParamType.LITERAL,
6266
},
6367
"proc": {
64-
"status": FIXED,
65-
"status_desc": FREE,
66-
"error_type": FREE,
67-
"error_desc": FREE,
68+
"status": QueryParamType.LITERAL,
69+
"status_desc": QueryParamType.TEXT,
70+
"error_type": QueryParamType.TEXT,
71+
"error_desc": QueryParamType.TEXT,
6872
},
6973
}
7074
fingerprint = True
@@ -114,21 +118,21 @@ class AddProject(Operation):
114118
operation_name = "add_project"
115119
query_args = {
116120
"p": {
117-
"project": FREE,
118-
"project_version": FREE,
119-
"language": FREE,
120-
"language_version": FREE,
121-
"is_ci": FIXED,
122-
"status": FIXED,
123-
"status_desc": FREE,
124-
"error_type": FREE,
125-
"error_desc": FREE,
126-
"user_id": FREE,
127-
"session_id": FREE,
128-
"container": FIXED,
129-
"user_type": FIXED,
130-
"platform": FREE,
131-
"arguments": FREE,
121+
"project": QueryParamType.TEXT,
122+
"project_version": QueryParamType.TEXT,
123+
"language": QueryParamType.TEXT,
124+
"language_version": QueryParamType.TEXT,
125+
"is_ci": QueryParamType.LITERAL,
126+
"status": QueryParamType.LITERAL,
127+
"status_desc": QueryParamType.TEXT,
128+
"error_type": QueryParamType.TEXT,
129+
"error_desc": QueryParamType.TEXT,
130+
"user_id": QueryParamType.TEXT,
131+
"session_id": QueryParamType.TEXT,
132+
"container": QueryParamType.LITERAL,
133+
"user_type": QueryParamType.LITERAL,
134+
"platform": QueryParamType.TEXT,
135+
"arguments": QueryParamType.TEXT,
132136
},
133137
}
134138
fingerprint = True
@@ -174,20 +178,20 @@ class CheckProject(Operation):
174178
operation_type = "query"
175179
operation_name = "check_project"
176180
query_args = {
177-
"project": FREE,
178-
"project_version": FREE,
179-
"language": FREE,
180-
"language_version": FREE,
181-
"is_ci": FIXED,
182-
"status": FIXED,
183-
"status_desc": FREE,
184-
"error_type": FREE,
185-
"error_desc": FREE,
186-
"user_id": FREE,
187-
"session_id": FREE,
188-
"container": FIXED,
189-
"platform": FREE,
190-
"arguments": FREE,
181+
"project": QueryParamType.TEXT,
182+
"project_version": QueryParamType.TEXT,
183+
"language": QueryParamType.TEXT,
184+
"language_version": QueryParamType.TEXT,
185+
"is_ci": QueryParamType.LITERAL,
186+
"status": QueryParamType.LITERAL,
187+
"status_desc": QueryParamType.TEXT,
188+
"error_type": QueryParamType.TEXT,
189+
"error_desc": QueryParamType.TEXT,
190+
"user_id": QueryParamType.TEXT,
191+
"session_id": QueryParamType.TEXT,
192+
"container": QueryParamType.LITERAL,
193+
"platform": QueryParamType.TEXT,
194+
"arguments": QueryParamType.TEXT,
191195
}
192196
selections = ('success', 'flagged', 'latest', 'message')
193197

@@ -216,10 +220,10 @@ class GetUsage(Operation):
216220
operation_type = 'query'
217221
operation_name = 'get_usage'
218222
query_args = {
219-
"project": FREE,
220-
"start": FREE,
221-
"end": FREE,
222-
"unique": FIXED,
223+
"project": QueryParamType.TEXT,
224+
"start": QueryParamType.TEXT,
225+
"end": QueryParamType.TEXT,
226+
"unique": QueryParamType.LITERAL,
223227
}
224228

225229

@@ -273,8 +277,15 @@ def _parse_format_params(params: dict, query_args: dict) -> str:
273277
val = params[qarg]
274278
if isinstance(val, bool):
275279
val = str(val).lower()
276-
val = qval.format(val)
277-
query_inputs.append(f'{qarg}:{val}')
280+
281+
if qval.name == 'TEXT':
282+
fval = json.dumps(val)
283+
elif qval.name == 'LITERAL':
284+
fval = val
285+
else:
286+
logger.error('Do not know how to handle type %s', qval.name)
287+
fval = ''
288+
query_inputs.append(f'{qarg}:{fval}')
278289

279290
elif isinstance(qval, dict):
280291
vals = _parse_format_params(params, qval)

0 commit comments

Comments
 (0)