@@ -26,7 +26,9 @@ use read_python_file::read_python_file;
2626
2727#[ derive( Debug , Clone , new) ]
2828pub struct PackageSpec {
29+ #[ new( into) ]
2930 name : String ,
31+ #[ new( into) ]
3032 directory : PathBuf ,
3133}
3234
@@ -409,3 +411,60 @@ fn calculate_thread_counts() -> ThreadCounts {
409411 module_parsing : num_threads,
410412 }
411413}
414+
415+ #[ cfg( test) ]
416+ mod tests {
417+ use super :: * ;
418+ use crate :: test_utils:: { DEFAULT_MTIME , TempFileSystemBuilder } ;
419+ use map_macro:: hash_set;
420+
421+ #[ test]
422+ fn test_discover_modules_happy_path ( ) {
423+ const SOME_MTIME : i64 = 12340000 ;
424+
425+ let temp_fs = TempFileSystemBuilder :: new (
426+ r#"
427+ mypackage/
428+ __init__.py
429+ not-a-python-file.txt
430+ .hidden
431+ foo/
432+ __init__.py
433+ one.py
434+ two/
435+ __init__.py
436+ green.py
437+ blue.py
438+ "# ,
439+ )
440+ . with_file_mtime_map ( [ ( "mypackage/foo/one.py" , SOME_MTIME ) ] )
441+ . build ( )
442+ . unwrap ( ) ;
443+
444+ let result = discover_and_parse_modules (
445+ & [ PackageSpec :: new ( "mypackage" , temp_fs. join ( "mypackage" ) ) ] ,
446+ None ,
447+ )
448+ . unwrap ( ) ;
449+
450+ assert_eq ! ( result. len( ) , 6 ) ;
451+ assert_eq ! (
452+ result
453+ . iter( )
454+ . map( |p| (
455+ p. module. name. as_str( ) ,
456+ p. module. is_package,
457+ p. module. mtime_secs
458+ ) )
459+ . collect:: <HashSet <_>>( ) ,
460+ hash_set! {
461+ ( "mypackage" , true , DEFAULT_MTIME ) ,
462+ ( "mypackage.foo" , true , DEFAULT_MTIME ) ,
463+ ( "mypackage.foo.one" , false , SOME_MTIME ) ,
464+ ( "mypackage.foo.two" , true , DEFAULT_MTIME ) ,
465+ ( "mypackage.foo.two.green" , false , DEFAULT_MTIME ) ,
466+ ( "mypackage.foo.two.blue" , false , DEFAULT_MTIME ) ,
467+ }
468+ ) ;
469+ }
470+ }
0 commit comments