|
4 | 4 | from __future__ import annotations |
5 | 5 |
|
6 | 6 | import dataclasses |
| 7 | +import enum |
| 8 | +import json |
7 | 9 | import typing as ty |
8 | 10 | import warnings |
9 | 11 |
|
10 | 12 | from migas.config import Config, logger, telemetry_enabled |
11 | 13 | from migas.request import request |
12 | 14 |
|
13 | | -FREE = '"{}"' # FREE text fields |
14 | | -FIXED = '{}' # FIXED text fields |
| 15 | +class QueryParamType(enum.Enum): |
| 16 | + LITERAL = enum.auto() |
| 17 | + TEXT = enum.auto() |
| 18 | + |
15 | 19 | ERROR = '[migas-py] An error occurred.' |
16 | 20 |
|
17 | 21 |
|
@@ -48,23 +52,23 @@ class AddBreadcrumb(Operation): |
48 | 52 | operation_type = "mutation" |
49 | 53 | operation_name = "add_breadcrumb" |
50 | 54 | 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, |
55 | 59 | "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, |
62 | 66 | }, |
63 | 67 | "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, |
68 | 72 | }, |
69 | 73 | } |
70 | 74 | fingerprint = True |
@@ -114,21 +118,21 @@ class AddProject(Operation): |
114 | 118 | operation_name = "add_project" |
115 | 119 | query_args = { |
116 | 120 | "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, |
132 | 136 | }, |
133 | 137 | } |
134 | 138 | fingerprint = True |
@@ -174,20 +178,20 @@ class CheckProject(Operation): |
174 | 178 | operation_type = "query" |
175 | 179 | operation_name = "check_project" |
176 | 180 | 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, |
191 | 195 | } |
192 | 196 | selections = ('success', 'flagged', 'latest', 'message') |
193 | 197 |
|
@@ -216,10 +220,10 @@ class GetUsage(Operation): |
216 | 220 | operation_type = 'query' |
217 | 221 | operation_name = 'get_usage' |
218 | 222 | 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, |
223 | 227 | } |
224 | 228 |
|
225 | 229 |
|
@@ -273,8 +277,15 @@ def _parse_format_params(params: dict, query_args: dict) -> str: |
273 | 277 | val = params[qarg] |
274 | 278 | if isinstance(val, bool): |
275 | 279 | 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}') |
278 | 289 |
|
279 | 290 | elif isinstance(qval, dict): |
280 | 291 | vals = _parse_format_params(params, qval) |
|
0 commit comments