More accurate test dependencies#7261
Conversation
📝 WalkthroughWalkthroughThis PR refactors test discovery and dependency resolution in the library update scripts. Changes include broadening test name matching patterns, updating type annotations to return frozensets, simplifying string manipulation using removeprefix/removesuffix, and expanding heuristics for deriving library names from test names. Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Possibly related PRs
Suggested labels
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 3✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
scripts/update_lib/deps.py (1)
119-136:⚠️ Potential issue | 🔴 Critical
frozensetreturn type breaks.discard()calls on result; causesAttributeErrorat runtime.
parse_lib_imports()andparse_test_imports()are annotated to returnfrozenset[str], but callers immediately call.discard()on the returned object (lines 1425, 1437). Sincefrozensetdoes not have a.discard()method, this raisesAttributeErrorwhen parsing succeeds.Additionally, the early-return statements (lines 132, 122) return
set()instead offrozenset(), creating a type mismatch with the declared return type.Fix: (1) Change early returns to
frozenset(), (2) wrapparse_lib_imports()calls withset()at call sites that mutate the result:imports = set(parse_lib_imports(content)) imports.discard(entry.stem)🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@scripts/update_lib/deps.py` around lines 119 - 136, parse_lib_imports and parse_test_imports are annotated to return frozenset but currently return mutable set() on the early path and callers call .discard() on the result, causing AttributeError; fix by making the functions consistently return frozenset on the early-return path (replace set() with frozenset()) and do not change the return type at the function level, and update call sites that need to mutate the result (places that call .discard() on parse_lib_imports/parse_test_imports results) to wrap the returned frozenset in set(...) before mutating (e.g., imports = set(parse_lib_imports(content))); keep references to ImportVisitor, parse_lib_imports, and parse_test_imports so you can locate the code to change.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Outside diff comments:
In `@scripts/update_lib/deps.py`:
- Around line 119-136: parse_lib_imports and parse_test_imports are annotated to
return frozenset but currently return mutable set() on the early path and
callers call .discard() on the result, causing AttributeError; fix by making the
functions consistently return frozenset on the early-return path (replace set()
with frozenset()) and do not change the return type at the function level, and
update call sites that need to mutate the result (places that call .discard() on
parse_lib_imports/parse_test_imports results) to wrap the returned frozenset in
set(...) before mutating (e.g., imports = set(parse_lib_imports(content))); keep
references to ImportVisitor, parse_lib_imports, and parse_test_imports so you
can locate the code to change.
struct(20 dependents) | 2026-01-21test_struct(7 TODO)stat(14 dependents) | 2026-02-14test_statkeyword(7 dependents) | 2024-06-21test_keywordreprlib(7 dependents) | 2026-01-21test_reprlib(2 TODO)__future__(6 dependents) | 2024-04-23test_future_stmt(8 TODO)annotationlib(6 dependents) | 2026-02-24test_annotationlibtoken(5 dependents) | 2026-01-22bisect(5 dependents) | 2023-12-24test_bisecttty(2 dependents) | 2026-01-05test_tty(2 TODO)stringprep(1 dependents) | 2019-12-21test_stringprep__hello__| 2023-02-25__phello__| 2023-02-25colorsys| 2025-04-21test_colorsysthis| 2019-06-22os(85 dependents) | 2026-02-03test_os(2 TODO)test_popenre(59 dependents) | 2026-01-20test_re(14 TODO)types(40 dependents) | 2026-02-18test_types(10 TODO)collections(37 dependents) | 2026-02-14 Δ61test_collections(3 TODO)test_deque(3 TODO)test_defaultdict(1 TODO)test_ordered_dict(8 TODO)argparse(29 dependents) | 2026-02-07test_argparsesocket(17 dependents) | 2026-02-01test_socket(16 TODO)enum(16 dependents) | 2026-02-15test_enum(4 TODO)weakref(16 dependents) | 2026-01-30test_weakref(20 TODO)test_weaksetabc(15 dependents) | 2025-06-29test_abc(1 TODO)copy(14 dependents) | 2026-02-10test_copyoperator(14 dependents) | 2026-01-23test_operatorgetopt(10 dependents) | 2026-02-08test_getoptbase64(10 dependents) | 2026-01-19test_base64_colorize(9 dependents) | 2026-01-17test__colorizepickle(9 dependents) | 2026-02-05 Δ8test_pickle(21 TODO)test_picklebuffer(12 TODO)test_pickletools(8 TODO)posixpath(9 dependents) | 2026-02-13test_posixpathtextwrap(8 dependents) | 2026-01-30test_textwrapfnmatch(8 dependents) | 2026-02-13test_fnmatchcodecs(8 dependents) | 2026-01-31test_codecs(12 TODO)test_codeccallbacks(9 TODO)test_codecencodings_cn(4 TODO)test_codecencodings_hk(1 TODO)test_codecencodings_iso2022(5 TODO)test_codecencodings_jp(7 TODO)test_codecencodings_kr(3 TODO)test_codecencodings_tw(1 TODO)test_codecmaps_cn(3 TODO)test_codecmaps_hk(1 TODO)test_codecmaps_jp(6 TODO)test_codecmaps_kr(3 TODO)test_codecmaps_tw(3 TODO)test_charmapcodectest_multibytecodec(untracked)pathlib(8 dependents) | 2026-02-13test_pathliblocale(7 dependents) | 2025-08-20 Δ11test_localetest__localerandom(7 dependents) | 2024-11-11 Δ149test_randomcopyreg(6 dependents) | 2026-01-24test_copyregsignal(6 dependents) | 2024-04-26test_signal(1 TODO)dataclasses(6 dependents) | 2026-02-08test_dataclasses(10 TODO)bz2(6 dependents) | 2026-01-19test_bz2(1 TODO)heapq(5 dependents) | 2026-01-18test_heapqjson(5 dependents) | 2026-01-18 Δ14test_json(14 TODO)webbrowser(4 dependents) | 2025-04-21 Δ49test_webbrowserglob(4 dependents) | 2026-02-13test_globsocketserver(4 dependents) | 2026-01-03test_socketserver(1 TODO)code(4 dependents) | 2026-02-01test_code(11 TODO)test_code_module(3 TODO)hmac(4 dependents) | 2026-02-15test_hmac(14 TODO)lzma(4 dependents) | 2026-01-19test_lzma(13 TODO)gzip(4 dependents) | 2026-01-19test_gzipcodeop(3 dependents) | 2026-02-07test_codeop(4 TODO)numbers(3 dependents) | 2025-09-11test_abstract_numberscontextvars(3 dependents) | 2026-01-18ntpath(3 dependents) | 2026-01-25test_ntpathrlcompleter(3 dependents) | 2025-07-17test_rlcompleter(1 TODO)compression(3 dependents) | 2026-01-19zipfile(3 dependents) | 2026-02-24test_zipfile(15 TODO)test_zipfile64genericpath(2 dependents) | 2025-08-04test_genericpath_ios_support(2 dependents) | 2025-03-10html(2 dependents) | 2026-02-15test_htmltest_htmlparseroptparse(2 dependents) | 2026-01-30test_optparsebdb(2 dependents) | 2025-12-30 Δ271test_bdb(9 TODO)cmd(2 dependents) | 2026-01-24test_cmdquopri(2 dependents) | 2026-01-24test_quoprisite(2 dependents) | 2026-01-17 Δ29test_site(4 TODO)plistlib(2 dependents) | 2026-01-04 Δ2test_plistlib(6 TODO)mimetypes(2 dependents) | 2026-01-21test_mimetypespstats(2 dependents)test_pstats(untracked)py_compile(2 dependents) | 2026-01-30test_py_compile(3 TODO)encodings(2 dependents) | 2026-02-06ipaddress(1 dependents) | 2026-01-18test_ipaddresscsv(1 dependents) | 2026-02-18test_csv(27 TODO)netrc(1 dependents) | 2025-08-20test_netrcfilecmp(1 dependents) | 2026-01-03test_filecmpfractions(1 dependents) | 2026-01-30test_fractions(2 TODO)opcode(1 dependents) | 2026-02-27 Δ382test__opcode(2 TODO)test_opcodespyclbr(1 dependents) | 2025-07-25test_pyclbr(2 TODO)dbm(1 dependents) | 2026-01-01test_dbm(2 TODO)test_dbm_dumbtest_dbm_gnu(untracked)test_dbm_ndbm(untracked)test_dbm_sqlite3getpass(1 dependents) | 2026-02-08test_getpasssqlite3(1 dependents) | 2026-01-19test_sqlite3(78 TODO)tarfile(1 dependents) | 2026-02-27test_tarfilezipimport(1 dependents) | 2026-01-24test_zipimport(2 TODO)test_zipimport_support(untracked)graphlib| 2026-01-18test_graphlib_apple_support| 2025-03-10fileinput| 2025-04-30test_fileinputnturl2path| 2026-01-25test_nturl2pathzipapp| 2025-08-06 Δ14test_zipapp_android_support| 2025-10-22 Δ7symtable| 2026-01-30test_symtable(17 TODO)pty| 2026-01-05 Δ51test_pty(4 TODO)modulefindertest_modulefinder(untracked)timeit| 2026-02-01test_timeittomllib| 2026-02-08test_tomllibcursestest_curses(untracked)xmlrpc| 2026-02-14test_xmlrpc(5 TODO)test_docxmlrpcwarnings(58 dependents) | 2026-01-18test_warnings(12 TODO)io(56 dependents) | 2026-02-13test_io(21 TODO)test_bufiotest_fileio(1 TODO)test_memoryio(28 TODO)functools(37 dependents) | 2026-01-20test_functools(9 TODO)contextlib(25 dependents) | 2025-08-01test_contextlib(2 TODO)test_contextlib_async(2 TODO)threading(21 dependents) | 2026-01-18test_threading(18 TODO)test_threadedtempfiletest_threading_local(3 TODO)traceback(20 dependents) | 2026-02-06test_traceback(34 TODO)subprocess(15 dependents) | 2026-02-28test_subprocess(4 TODO)shutil(13 dependents) | 2026-02-15test_shutillinecache(12 dependents) | 2026-02-09test_linecachetokenize(11 dependents) | 2022-08-09 Δ357test_tokenize(2 TODO)datetime(11 dependents) | 2026-02-24test_datetimetest_strptime(untracked)tempfile(10 dependents) | 2026-01-04 Δ26test_tempfile(1 TODO)typing(10 dependents) | 2026-02-11test_typing(4 TODO)test_type_aliasestest_type_annotations(1 TODO)test_type_params(6 TODO)test_genericaliasssl(8 dependents) | 2025-10-28 Δ4test_ssl(21 TODO)ast(7 dependents) | 2026-02-02test_ast(54 TODO)test_unparsetest_type_comments(15 TODO)calendar(7 dependents) | 2026-01-17test_calendarselectors(6 dependents) | 2025-07-20test_selectorshashlib(6 dependents) | 2026-02-14test_hashlib(7 TODO)string(5 dependents) | 2026-01-17test_stringtest_userstringrunpy(5 dependents) | 2025-09-11test_runpy(2 TODO)difflib(4 dependents) | 2026-02-08test_difflibpprint(4 dependents) | 2026-02-06test_pprintqueue(4 dependents) | 2026-02-04test_queueshlex(4 dependents) | 2026-02-02test_shlex(4 TODO)pkgutil(4 dependents) | 2026-01-04 Δ57test_pkgutil(1 TODO)gettext(3 dependents) | 2026-01-30test_gettext(7 TODO)configparser(2 dependents) | 2026-02-07test_configparsersecrets(1 dependents) | 2025-07-17test_secretsftplib(1 dependents) | 2026-02-02test_ftplib(4 TODO)tabnanny(1 dependents) | 2026-02-02test_tabnanny(5 TODO)tracemalloc(1 dependents)test_tracemalloc(untracked)profile(1 dependents)test_profile(untracked)test_cprofile(untracked)smtplib(1 dependents) | 2025-12-19 Δ11test_smtplibtest_smtpnetantigravity| 2023-02-28pickletools| 2026-02-06shelve| 2026-01-01test_shelvepoplibtest_poplib(untracked)sched| 2025-04-21test_schedwave| 2026-02-13test_wavecompileall| 2026-02-25test_compileall(2 TODO)mailbox| 2026-02-14test_mailboxxml| 2026-02-27test_xml_etree(61 TODO)test_xml_etree_ctest_minidom(25 TODO)test_pulldom(4 TODO)test_pyexpat(29 TODO)test_sax(39 TODO)test_xml_dom_minicompattest_xml_dom_xmlbuilderinspect(19 dependents) | 2026-02-07test_inspect(46 TODO)sysconfig(6 dependents) | 2025-10-22 Δ265test_sysconfig(8 TODO)test__osx_supportctypes(6 dependents) | 2026-02-18test_ctypes(11 TODO)test_stable_abi_ctypesdis(5 dependents) | 2026-01-26test_dis(42 TODO)platform(5 dependents) | 2026-01-04 Δ124test_platformdecimal(3 dependents) | 2026-01-30test_decimal(1 TODO)email(3 dependents) | 2026-01-17 Δ238test_email(12 TODO)tkinter(2 dependents) | 2025-04-06 Δ279test_tkinter(untracked)test_ttk(untracked)test_ttk_textonly(untracked)test_tcl(untracked)test_idle(untracked)uuid(1 dependents) | 2026-02-02test_uuidstatistics(1 dependents) | 2026-02-11test_statistics(1 TODO)ensurepip| 2026-01-17test_ensurepipvenv| 2026-01-17 Δ29test_venv(4 TODO)imaplib| 2026-02-01test_imaplib(1 TODO)cProfileturtletest_turtle(untracked)wsgiref| 2026-01-03 Δ7test_wsgiref(1 TODO)http| 2026-02-27test_httplib(2 TODO)test_http_cookiejartest_http_cookiestest_httpservers(1 TODO)doctest(1 dependents) | 2026-02-11test_doctest(9 TODO)trace(1 dependents) | 2025-07-25 Δ15test_trace(14 TODO)zoneinfo| 2025-09-07 Δ24test_zoneinfo(3 TODO)logging(7 dependents) | 2025-07-20 Δ77test_logging(5 TODO)unittest(2 dependents) | 2026-01-18 Δ102test_unittest(15 TODO)urllib(1 dependents) | 2026-02-13test_urllibtest_urllib2test_urllib2_localnettest_urllib2nettest_urllibnettest_urlparsetest_urllib_responsetest_robotparserconcurrent| 2026-01-09 Δ1012test_concurrent_futures(18 TODO)test_interpreters(untracked)test__interpreters(untracked)test__interpchannels(untracked)test_crossinterp(untracked)importlib(7 dependents) | 2026-02-05test_importlib(16 TODO)multiprocessing(2 dependents) | 2026-02-04 Δ314test_multiprocessing_fork(35 TODO)test_multiprocessing_forkserver(10 TODO)test_multiprocessing_spawn(13 TODO)test_multiprocessing_main_handlingpdb(1 dependents) | 2026-02-11 Δ2601test_pdb(untracked)pydoc(4 dependents) | 2026-02-13test_pydoc(36 TODO)asyncio(2 dependents) | 2026-02-02 Δ26test_asyncio(38 TODO)_pyrepl| 2025-04-11 Δ2534idlelibStandalone Tests
test_atexit(1 TODO)_test_atexit(7 TODO)test_eintr_test_eintr(6 TODO)_test_embed_structseq(untracked)_test_gc_fast_cycles(untracked)_test_monitoring_shutdown(untracked)_test_multiprocessing(15 TODO)_test_venv_multiprocessingtest___all__test_androidtest_appletest_array(55 TODO)test_asdl_parser(untracked)test_asyncgen(4 TODO)test_audittest_augassigntest_exceptions(25 TODO)test_baseexceptiontest_except_star(1 TODO)test_exception_group(3 TODO)test_exception_hierarchy(2 TODO)test_exception_variationstest_bigaddrspacetest_bigmem(4 TODO)test_binascii(1 TODO)test_binoptest_booltest_buffer(11 TODO)test_build_details(untracked)test_builtin(25 TODO)test_bytes(17 TODO)test_c_locale_coerciontest_call(1 TODO)test_capi(untracked)test_cext(untracked)test_class(15 TODO)test_genericclasstest_subclassinittest_clinic(untracked)test_cmathtest_cmd_line(24 TODO)test_cmd_line_script(15 TODO)test_comparetest_compile(31 TODO)test_compiler_assembletest_compiler_codegentest_peepholer(31 TODO)test_complex(2 TODO)test_contains(1 TODO)test_context(6 TODO)test_coroutines(19 TODO)test_cppext(untracked)test_decorators(1 TODO)test_descr(47 TODO)test_descrtut(3 TODO)test_devpolltest_dict(6 TODO)test_dictcomps(1 TODO)test_dictviews(2 TODO)test_userdicttest_dtrace(8 TODO)test_dynamic(1 TODO)test_dynamicclassattributetest_embed(untracked)test_enumeratetest_eof(6 TODO)test_epolltest_errnotest_extcall(8 TODO)test_external_inspection(untracked)test_faulthandler(4 TODO)test_fcntltest_ioctltest_filetest_largefiletest_file_eintr(1 TODO)test_fileutils(untracked)test_finalization(untracked)test_float(6 TODO)test_strtod(6 TODO)test_flufl(4 TODO)test_fork1(1 TODO)test_format(5 TODO)test_frame(untracked)test_free_threading(untracked)test_frozentest_str(16 TODO)test_fstring(19 TODO)test_string_literals(5 TODO)test_funcattrs(6 TODO)test_gctest_gdb(untracked)test_generated_cases(untracked)test_generators(12 TODO)test_genexps(untracked)test_generator_stop(untracked)test_yield_from(6 TODO)test_getpath(untracked)test_global(3 TODO)test_grammar(18 TODO)test_grptest_hash(4 TODO)test_import(3 TODO)test_indextest_int(7 TODO)test_long(4 TODO)test_int_literaltest_isinstancetest_iter(1 TODO)test_iterlentest_itertools(6 TODO)test_keywordonlyargtest_kqueuetest_launchertest_list(5 TODO)test_listcomps(1 TODO)test_userlist(1 TODO)test_lltrace(untracked)test_longexptest_marshal(21 TODO)test_mathtest_math_propertytest_memoryview(9 TODO)test_metaclass(10 TODO)test_mmap(2 TODO)test_module(4 TODO)test_monitoring(13 TODO)test_msvcrttest_named_expressions(12 TODO)test_numeric_towertest_opcachetest_openptytest_optimizer(untracked)test_osx_envtest_patma(20 TODO)test_peg_generator(untracked)test_pep646_syntax(12 TODO)test_perf_profiler(untracked)test_perfmaps(untracked)test_pkgtest_select(3 TODO)test_poll(1 TODO)test_positional_only_arg(4 TODO)test_posix(4 TODO)test_powtest_print(6 TODO)test_propertytest_pwdtest_pyrepl(untracked)test_repltest_raisetest_range(1 TODO)test_readline(untracked)test_regrtest(10 TODO)test_remote_pdb(untracked)test_resource(2 TODO)test_richcmptest_scope(1 TODO)test_support(3 TODO)test_script_helpertest_set(5 TODO)test_setcompstest_slice(1 TODO)test_sort(2 TODO)test_source_encoding(untracked)test_startfile(untracked)test_timetest_strftimetest_structseqtest_sundrytest_super(4 TODO)test_syntax(25 TODO)test_sys(8 TODO)test_syslog(2 TODO)test_sys_setprofile(14 TODO)test_sys_settrace(52 TODO)test_termios(15 TODO)test_threadtest_thread_local_bytecode(untracked)test_threadsignalstest_timeouttest_toolstest_tstring(4 TODO)test_tuple(1 TODO)test_type_cache(untracked)test_typecheckstest_unicodedata(9 TODO)test_unicode_filetest_unicode_file_functionstest_unicode_identifiers(1 TODO)test_ucn(3 TODO)test_unarytest_univnewlinestest_unpack(1 TODO)test_unpack_ex(11 TODO)test_utf8_mode(6 TODO)test_utf8source(2 TODO)test_wait3test_wait4test_winapitest_winconsoleiotest_winregtest_winsoundtest_with(1 TODO)test_wmitest_xpickle(untracked)test_xxlimited(untracked)test_xxtestfuzz(untracked)test_zlib(2 TODO)test_zstdUntracked Files
Original Files
Summary by CodeRabbit
New Features
Refactoring