Changes in version 0.4.0 (2026-08-24) New features - the output argument of convertId2() gained the choice "entrez", now fully supporting conversion to Entrez Gene IDs in addition to Gene Symbols and Ensembl Gene IDs. output = "auto" keeps the previous behaviour: Ensembl input returns symbols, symbol input returns Ensembl IDs, Entrez input returns symbols.; "symbol", "ensembl" and "entrez" force the return type regardless of the input type. Entrez output is useful for offline, network-independent retrieval, e.g. for KEGG pathway enrichment. - todisp2() gained biomart.fallback and chunk.size as well, and now degrades gracefully: if every BioMart host fails it falls back to the data frame in lab, or to convertId2(), instead of aborting. - get.bm() now detects versioned Ensembl gene IDs (e.g. ENSG00000111199.5) in the input and stops with an informative message, since BioMart's ensembl_gene_id filter expects unversioned IDs. Bug fixes - convert.alias() checked for org.Hs.eg.db even when species = "Mouse", producing a misleading error message. - likely_symbol() returned different results above and below index_threshold: the indexed path recorded only the first alias of a matched gene, so a query naming any later alias was returned unresolved. The query itself is now trimmed as well, so a padded symbol still matches. - convertId2() aborted on input consisting entirely of NA, and on empty input. It now returns an all-NA result of the same length. - unify_gene_ids() returned NA for every hgnc_symbol when all BioMart hosts failed but the AnnotationDbi lookup succeeded. The AnnotationDbi result was recorded in a separate column and never promoted into hgnc_symbol, so the degradation to "AnnotationDbi results only" that the documentation and the verbose output describe did not actually take place. - unify_gene_ids() could abort with "NAs are not allowed in subscripted assignments" when the gene symbol column contained NA. - The deduplication filters could fabricate a row: an NA in a row-selection condition does not drop the row but yields one filled with NA, which could then be taken for the single surviving candidate of its group. One filter could also abort outright on an NA gene name. - The Ensembl-placeholder fix in the deduplication step never ran in ENSG-only mode, where there is no gene symbol column. - convert.bm() accepts both "row.names" and "rownames" as the special value of id selecting the row names. Only the former worked, while the documentation named the latter. - .with_biomart_fallback() treated a NULL return value from a successful query as a failed host, and reported an unhelpful error when no host was configured at all. - get.bm() aborted on R >= 4.2 when biom.data.set was given as a multi-element vector of user-supplied data set names. - likely_symbol() aborted when a query containing | could not be resolved. Such a query is now returned unchanged, as any other unresolved symbol is. Documentation - Documented the previous_symbol column of likely_symbol() and corrected the column list for output = "all". - Corrected the return value description of unify_gene_ids(): the intermediate lookup columns are dropped unless keep_intermediates = TRUE. Internal - Extracted the deduplication filters, the AnnotationDbi lookup helpers and the HGNC field tokeniser into documented, individually testable unexported functions. - Test helpers no longer live in R/, and BioMart availability is probed with an actual connection rather than a port-level check. - AnnotationDbi moved from Depends to Imports. The package imports everything it needs from it, so nothing changes for the functions in this package, but library(convertid) no longer attaches AnnotationDbi to the search path. Code that relied on that side effect should call library(AnnotationDbi) itself. - The test suite uses the third edition of testthat. URL and BugReports fields were added to DESCRIPTION.