33import  click 
44import  sys 
55
6- from  typing  import  List , Optional 
6+ from  typing  import  List , Optional ,  TYPE_CHECKING 
77
88from  cycode  import  __version__ 
9+ from  cycode .cli .consts  import  NO_ISSUES_STATUS_CODE , ISSUE_DETECTED_STATUS_CODE 
910from  cycode .cli .models  import  Severity 
1011from  cycode .cli .config  import  config 
1112from  cycode .cli  import  code_scanner 
1415from  cycode .cli .user_settings .user_settings_commands  import  set_credentials , add_exclusions 
1516from  cycode .cli .auth .auth_command  import  authenticate 
1617from  cycode .cli .utils  import  scan_utils 
18+ from  cycode .cli .utils .progress_bar  import  get_progress_bar 
1719from  cycode .cyclient  import  logger 
20+ from  cycode .cli .utils .progress_bar  import  logger  as  progress_bar_logger 
1821from  cycode .cyclient .cycode_client_base  import  CycodeClientBase 
1922from  cycode .cyclient .models  import  UserAgentOptionScheme 
2023from  cycode .cyclient .scan_config .scan_config_creator  import  create_scan_client 
2124
25+ if  TYPE_CHECKING :
26+     from  cycode .cyclient .scan_client  import  ScanClient 
27+ 
2228CONTEXT  =  dict ()
23- ISSUE_DETECTED_STATUS_CODE  =  1 
24- NO_ISSUES_STATUS_CODE  =  0 
2529
2630
2731@click .group ( 
@@ -106,25 +110,41 @@ def code_scan(context: click.Context, scan_type, client_id, secret, show_secret,
106110        context .obj ["soft_fail" ] =  config ["soft_fail" ]
107111
108112    context .obj ["scan_type" ] =  scan_type 
113+ 
114+     # save backward compatability with old style command 
109115    if  output  is  not None :
110-         # save backward compatability with old style command 
111116        context .obj ["output" ] =  output 
117+         if  output  ==  "json" :
118+             context .obj ["no_progress_meter" ] =  True 
119+ 
112120    context .obj ["client" ] =  get_cycode_client (client_id , secret )
113121    context .obj ["severity_threshold" ] =  severity_threshold 
114122    context .obj ["monitor" ] =  monitor 
115123    context .obj ["report" ] =  report 
124+ 
116125    _sca_scan_to_context (context , sca_scan )
117126
127+     context .obj ["progress_bar" ] =  get_progress_bar (hidden = context .obj ["no_progress_meter" ])
128+     context .obj ["progress_bar" ].start ()
129+ 
118130    return  1 
119131
120132
121133@code_scan .result_callback () 
122134@click .pass_context  
123- def  finalize (context : click .Context , * args , ** kwargs ):
124-     if  context .obj ["soft_fail" ]:
135+ def  finalize (context : click .Context , * _ , ** __ ):
136+     progress_bar  =  context .obj .get ('progress_bar' )
137+     if  progress_bar :
138+         progress_bar .stop ()
139+ 
140+     if  context .obj ['soft_fail' ]:
125141        sys .exit (0 )
126142
127-     sys .exit (ISSUE_DETECTED_STATUS_CODE  if  _should_fail_scan (context ) else  NO_ISSUES_STATUS_CODE )
143+     exit_code  =  NO_ISSUES_STATUS_CODE 
144+     if  _should_fail_scan (context ):
145+         exit_code  =  ISSUE_DETECTED_STATUS_CODE 
146+ 
147+     sys .exit (exit_code )
128148
129149
130150@click .group ( 
@@ -139,6 +159,9 @@ def finalize(context: click.Context, *args, **kwargs):
139159@click .option ( 
140160    "--verbose" , "-v" , is_flag = True , default = False , help = "Show detailed logs" , 
141161) 
162+ @click .option ( 
163+     '--no-progress-meter' , is_flag = True , default = False , help = 'Do not show the progress meter' , 
164+ ) 
142165@click .option ( 
143166    '--output' , 
144167    default = 'text' , 
@@ -153,23 +176,29 @@ def finalize(context: click.Context, *args, **kwargs):
153176) 
154177@click .version_option (__version__ , prog_name = "cycode" ) 
155178@click .pass_context  
156- def  main_cli (context : click .Context , verbose : bool , output : str , user_agent : Optional [str ]):
179+ def  main_cli (context : click .Context , verbose : bool , no_progress_meter :  bool ,  output : str , user_agent : Optional [str ]):
157180    context .ensure_object (dict )
158181    configuration_manager  =  ConfigurationManager ()
159182
160183    verbose  =  verbose  or  configuration_manager .get_verbose_flag ()
161184    context .obj ['verbose' ] =  verbose 
185+     # TODO(MarshalX): rework setting the log level for loggers 
162186    log_level  =  logging .DEBUG  if  verbose  else  logging .INFO 
163187    logger .setLevel (log_level )
188+     progress_bar_logger .setLevel (log_level )
164189
165190    context .obj ['output' ] =  output 
191+     if  output  ==  'json' :
192+         no_progress_meter  =  True 
193+ 
194+     context .obj ['no_progress_meter' ] =  no_progress_meter 
166195
167196    if  user_agent :
168197        user_agent_option  =  UserAgentOptionScheme ().loads (user_agent )
169198        CycodeClientBase .enrich_user_agent (user_agent_option .user_agent_suffix )
170199
171200
172- def  get_cycode_client (client_id , client_secret ) :
201+ def  get_cycode_client (client_id :  str , client_secret :  str )  ->   'ScanClient' :
173202    if  not  client_id  or  not  client_secret :
174203        client_id , client_secret  =  _get_configured_credentials ()
175204        if  not  client_id :
0 commit comments