@@ -32,14 +32,18 @@ pub struct FindOptions {
3232 pub workspace_only : bool ,
3333 pub cache_directory : Option < PathBuf > ,
3434 pub kind : Option < PythonEnvironmentKind > ,
35+ pub json : bool ,
3536}
3637
3738pub fn find_and_report_envs_stdio ( options : FindOptions ) {
38- stdio:: initialize_logger ( if options. verbose {
39- log:: LevelFilter :: Trace
40- } else {
41- log:: LevelFilter :: Warn
42- } ) ;
39+ // Don't initialize logger if JSON output is requested to avoid polluting JSON
40+ if !options. json {
41+ stdio:: initialize_logger ( if options. verbose {
42+ log:: LevelFilter :: Trace
43+ } else {
44+ log:: LevelFilter :: Warn
45+ } ) ;
46+ }
4347 let now = SystemTime :: now ( ) ;
4448 let config = create_config ( & options) ;
4549 let search_scope = if options. workspace_only {
@@ -70,9 +74,12 @@ pub fn find_and_report_envs_stdio(options: FindOptions) {
7074 search_scope,
7175 ) ;
7276
73- println ! ( "Completed in {}ms" , now. elapsed( ) . unwrap( ) . as_millis( ) )
77+ if !options. json {
78+ println ! ( "Completed in {}ms" , now. elapsed( ) . unwrap( ) . as_millis( ) )
79+ }
7480}
7581
82+
7683fn create_config ( options : & FindOptions ) -> Configuration {
7784 let mut config = Configuration :: default ( ) ;
7885
@@ -120,77 +127,94 @@ fn find_envs(
120127 Some ( SearchScope :: Global ( kind) ) => Some ( kind) ,
121128 _ => None ,
122129 } ;
123- let stdio_reporter = Arc :: new ( stdio:: create_reporter ( options. print_list , kind) ) ;
124- let reporter = CacheReporter :: new ( stdio_reporter. clone ( ) ) ;
125130
126- let summary = find_and_report_envs ( & reporter, config, locators, environment, search_scope) ;
127- if options. report_missing {
128- // By now all conda envs have been found
129- // Spawn conda
130- // & see if we can find more environments by spawning conda.
131- let _ = conda_locator. find_and_report_missing_envs ( & reporter, None ) ;
132- let _ = poetry_locator. find_and_report_missing_envs ( & reporter, None ) ;
133- }
131+ if options. json {
132+ // Use JSON reporter
133+ let json_reporter = Arc :: new ( pet_reporter:: json:: create_reporter ( ) ) ;
134+ let reporter = CacheReporter :: new ( json_reporter. clone ( ) ) ;
134135
135- if options. print_summary {
136- let summary = summary. lock ( ) . unwrap ( ) ;
137- if !summary. locators . is_empty ( ) {
138- println ! ( ) ;
139- println ! ( "Breakdown by each locator:" ) ;
140- println ! ( "--------------------------" ) ;
141- for locator in summary. locators . iter ( ) {
142- println ! ( "{:<20} : {:?}" , format!( "{:?}" , locator. 0 ) , locator. 1 ) ;
143- }
144- println ! ( )
136+ let _ = find_and_report_envs ( & reporter, config, locators, environment, search_scope) ;
137+ if options. report_missing {
138+ let _ = conda_locator. find_and_report_missing_envs ( & reporter, None ) ;
139+ let _ = poetry_locator. find_and_report_missing_envs ( & reporter, None ) ;
145140 }
146141
147- if !summary. breakdown . is_empty ( ) {
148- println ! ( "Breakdown for finding Environments:" ) ;
149- println ! ( "-----------------------------------" ) ;
150- for item in summary. breakdown . iter ( ) {
151- println ! ( "{:<20} : {:?}" , item. 0 , item. 1 ) ;
152- }
153- println ! ( ) ;
142+ // Output JSON
143+ json_reporter. output_json ( ) ;
144+ } else {
145+ // Use stdio reporter
146+ let stdio_reporter = Arc :: new ( stdio:: create_reporter ( options. print_list , kind) ) ;
147+ let reporter = CacheReporter :: new ( stdio_reporter. clone ( ) ) ;
148+
149+ let summary = find_and_report_envs ( & reporter, config, locators, environment, search_scope) ;
150+ if options. report_missing {
151+ // By now all conda envs have been found
152+ // Spawn conda
153+ // & see if we can find more environments by spawning conda.
154+ let _ = conda_locator. find_and_report_missing_envs ( & reporter, None ) ;
155+ let _ = poetry_locator. find_and_report_missing_envs ( & reporter, None ) ;
154156 }
155157
156- let summary = stdio_reporter. get_summary ( ) ;
157- if !summary. managers . is_empty ( ) {
158- println ! ( "Managers:" ) ;
159- println ! ( "---------" ) ;
160- for ( k, v) in summary
161- . managers
162- . clone ( )
163- . into_iter ( )
164- . map ( |( k, v) | ( format ! ( "{k:?}" ) , v) )
165- . collect :: < BTreeMap < String , u16 > > ( )
166- {
167- println ! ( "{k:<20} : {v:?}" ) ;
158+ if options. print_summary {
159+ let summary = summary. lock ( ) . unwrap ( ) ;
160+ if !summary. locators . is_empty ( ) {
161+ println ! ( ) ;
162+ println ! ( "Breakdown by each locator:" ) ;
163+ println ! ( "--------------------------" ) ;
164+ for locator in summary. locators . iter ( ) {
165+ println ! ( "{:<20} : {:?}" , format!( "{:?}" , locator. 0 ) , locator. 1 ) ;
166+ }
167+ println ! ( )
168168 }
169- println ! ( )
170- }
171- if !summary. environments . is_empty ( ) {
172- let total = summary
173- . environments
174- . clone ( )
175- . iter ( )
176- . fold ( 0 , |total, b| total + b. 1 ) ;
177- println ! ( "Environments ({total}):" ) ;
178- println ! ( "------------------" ) ;
179- for ( k, v) in summary
180- . environments
181- . clone ( )
182- . into_iter ( )
183- . map ( |( k, v) | {
184- (
185- k. map ( |v| format ! ( "{v:?}" ) ) . unwrap_or ( "Unknown" . to_string ( ) ) ,
186- v,
187- )
188- } )
189- . collect :: < BTreeMap < String , u16 > > ( )
190- {
191- println ! ( "{k:<20} : {v:?}" ) ;
169+
170+ if !summary. breakdown . is_empty ( ) {
171+ println ! ( "Breakdown for finding Environments:" ) ;
172+ println ! ( "-----------------------------------" ) ;
173+ for item in summary. breakdown . iter ( ) {
174+ println ! ( "{:<20} : {:?}" , item. 0 , item. 1 ) ;
175+ }
176+ println ! ( ) ;
177+ }
178+
179+ let summary = stdio_reporter. get_summary ( ) ;
180+ if !summary. managers . is_empty ( ) {
181+ println ! ( "Managers:" ) ;
182+ println ! ( "---------" ) ;
183+ for ( k, v) in summary
184+ . managers
185+ . clone ( )
186+ . into_iter ( )
187+ . map ( |( k, v) | ( format ! ( "{k:?}" ) , v) )
188+ . collect :: < BTreeMap < String , u16 > > ( )
189+ {
190+ println ! ( "{k:<20} : {v:?}" ) ;
191+ }
192+ println ! ( )
193+ }
194+ if !summary. environments . is_empty ( ) {
195+ let total = summary
196+ . environments
197+ . clone ( )
198+ . iter ( )
199+ . fold ( 0 , |total, b| total + b. 1 ) ;
200+ println ! ( "Environments ({total}):" ) ;
201+ println ! ( "------------------" ) ;
202+ for ( k, v) in summary
203+ . environments
204+ . clone ( )
205+ . into_iter ( )
206+ . map ( |( k, v) | {
207+ (
208+ k. map ( |v| format ! ( "{v:?}" ) ) . unwrap_or ( "Unknown" . to_string ( ) ) ,
209+ v,
210+ )
211+ } )
212+ . collect :: < BTreeMap < String , u16 > > ( )
213+ {
214+ println ! ( "{k:<20} : {v:?}" ) ;
215+ }
216+ println ! ( )
192217 }
193- println ! ( )
194218 }
195219 }
196220}
0 commit comments