1
+ import json
2
+ import operator
3
+ import shutil
4
+ import sys
5
+ import urllib .error
1
6
from abc import ABC , abstractmethod
2
7
from datetime import timezone
3
8
from functools import reduce , wraps
4
9
from http import HTTPStatus
5
- import operator
6
10
from itertools import islice
7
- import json
8
- import os
9
- import sys
10
11
from pathlib import Path
11
12
from typing import Any , Callable , TypedDict , cast
12
- import urllib .error
13
13
14
14
import click
15
15
from dateutil .parser import isoparse
31
31
NEXT_TOKEN_ATTR ,
32
32
NO_CONTENT_RESPONSE_MESSAGE ,
33
33
NO_ITEMS_TO_DISPLAY_RESPONSE_MESSAGE ,
34
- JobType
34
+ JobType ,
35
+ Env ,
36
+ MODULAR_ADMIN ,
37
+ STATUS_ATTR , SUCCESS_STATUS , ERROR_STATUS , CODE_ATTR , TABLE_TITLE_ATTR ,
38
+ REVERT_TO_JSON_MESSAGE , COLUMN_OVERFLOW
35
39
)
36
- from srecli .service .logger import get_logger , get_user_logger , write_verbose_logs
40
+ from srecli .service .logger import get_logger , enable_verbose_logs
37
41
38
42
CredentialsProvider = None
39
43
try :
43
47
pass
44
48
45
49
46
- # modular cli
47
- MODULAR_ADMIN = 'modules'
48
- SUCCESS_STATUS = 'SUCCESS'
49
- ERROR_STATUS = 'FAILED'
50
- STATUS_ATTR = 'status'
51
- CODE_ATTR = 'code'
52
- TABLE_TITLE_ATTR = 'table_title'
53
- # -----------
54
-
55
50
_LOG = get_logger (__name__ )
56
- USER_LOG = get_user_logger (__name__ )
57
-
58
- REVERT_TO_JSON_MESSAGE = 'The command`s response is pretty huge and the ' \
59
- 'result table structure can be broken.\n Do you want ' \
60
- 'to show the response in the JSON format?'
61
- COLUMN_OVERFLOW = 'Column has overflown, within the table representation.'
62
51
63
52
64
53
class TableException (Exception ):
@@ -170,10 +159,12 @@ def wrapper(*args, **kwargs):
170
159
if Path (__file__ ).parents [3 ].name == MODULAR_ADMIN : # TODO check some other way
171
160
modular_mode = True
172
161
173
- json_view = kwargs .pop ('json' )
174
- verbose = kwargs .pop ('verbose' )
162
+ json_view = Env .RESPONSE_FORMAT .get () == 'json' or kwargs .get ('json' )
163
+ verbose = Env .VERBOSE .get () or kwargs .get ('verbose' ) # todo verbose can be enabled earlier if from env
164
+ kwargs .pop ('json' , None )
165
+ kwargs .pop ('verbose' , None )
175
166
if verbose :
176
- write_verbose_logs ()
167
+ enable_verbose_logs ()
177
168
ctx = cast (click .Context , click .get_current_context ())
178
169
self .update_context (ctx )
179
170
try :
@@ -204,7 +195,10 @@ def wrapper(*args, **kwargs):
204
195
items_per_column = ctx .obj ['config' ].items_per_column ,
205
196
attributes_order = self ._attributes_order
206
197
)
207
- table = printer .print (prepared )
198
+ table = printer .print (
199
+ prepared ,
200
+ raise_on_overflow = not Env .NO_PROMPT .get ()
201
+ )
208
202
except ColumnOverflow as ce :
209
203
210
204
_LOG .info (f'Awaiting user to respond to - { ce !r} .' )
@@ -253,6 +247,8 @@ def format(self, resp: CustodianResponse) -> dict:
253
247
if resp .code == HTTPStatus .NO_CONTENT :
254
248
return {MESSAGE_ATTR : NO_CONTENT_RESPONSE_MESSAGE }
255
249
elif isinstance (resp .exc , json .JSONDecodeError ):
250
+ if not resp .data and resp .code :
251
+ return {MESSAGE_ATTR : resp .code .phrase }
256
252
return {MESSAGE_ATTR : f'Invalid JSON received: { resp .exc .msg } ' }
257
253
elif isinstance (resp .exc , urllib .error .URLError ):
258
254
return {MESSAGE_ATTR : f'Cannot send a request: { resp .exc .reason } ' }
@@ -308,7 +304,7 @@ def _format_er(e):
308
304
309
305
def format (self , resp : CustodianResponse ) -> dict :
310
306
base = {
311
- CODE_ATTR : resp .code ,
307
+ CODE_ATTR : resp .code or HTTPStatus . SERVICE_UNAVAILABLE . value ,
312
308
STATUS_ATTR : SUCCESS_STATUS if resp .ok else ERROR_STATUS ,
313
309
TABLE_TITLE_ATTR : self .modular_table_title
314
310
}
@@ -399,7 +395,7 @@ def key(tpl):
399
395
else :
400
396
formatted = self ._items_table (data )
401
397
402
- overflow = formatted .index ('\n ' ) > os .get_terminal_size ().columns
398
+ overflow = formatted .index ('\n ' ) > shutil .get_terminal_size ().columns
403
399
if overflow and raise_on_overflow :
404
400
raise ColumnOverflow (table = formatted )
405
401
return formatted
@@ -465,14 +461,14 @@ def response(*args, **kwargs):
465
461
466
462
# callbacks
467
463
def convert_in_upper_case_if_present (ctx , param , value ):
468
- if isinstance (value , list | tuple ):
464
+ if isinstance (value , ( list , tuple ) ):
469
465
return [each .upper () for each in value ]
470
466
elif value :
471
467
return value .upper ()
472
468
473
469
474
470
def convert_in_lower_case_if_present (ctx , param , value ):
475
- if isinstance (value , list ):
471
+ if isinstance (value , ( list , tuple ) ):
476
472
return [each .lower () for each in value ]
477
473
elif value :
478
474
return value .lower ()
@@ -499,17 +495,6 @@ def build_account_option(**kwargs) -> Callable:
499
495
return click .option ('--account_number' , '-acc' , ** params )
500
496
501
497
502
- def build_tenant_display_name_option (** kwargs ) -> Callable :
503
- params = dict (
504
- type = str ,
505
- required = True ,
506
- help = 'The name of the target tenant group' ,
507
- callback = convert_in_lower_case_if_present
508
- )
509
- params .update (kwargs )
510
- return click .option ('--tenant_display_name' , '-tdn' , ** params )
511
-
512
-
513
498
def build_iso_date_option (* args , ** kwargs ) -> Callable :
514
499
help_iso = 'ISO 8601 format. Example: 2021-09-22T00:00:00.000000'
515
500
params = dict (type = isoparse , required = False )
@@ -563,7 +548,6 @@ def build_limit_option(**kwargs) -> Callable:
563
548
564
549
565
550
tenant_option = build_tenant_option ()
566
- tenant_display_name_option = build_tenant_display_name_option ()
567
551
account_option = build_account_option ()
568
552
569
553
optional_job_type_option = build_job_type_option ()
0 commit comments