def get_full_name(taxid, names_map, ranks_map):
    """
    Generate full taxonomic lineage from a taxid
    Args:
        taxid (str): taxid
        names_map (dict[str:str]): the taxonomic names for each taxid node
        ranks_map (dict[str:str]): the parent node for each taxid
    Returns:
        taxonomy (str): full taxonomic lineage string

    """
    taxid_lineage = list()
    while True:
        taxid_lineage.append(taxid)
        if taxid not in ranks_map:
            break
        new_taxid = ranks_map[taxid]
        if taxid == new_taxid:
            break
        else:
            taxid = new_taxid

    names_lineage = list()
    for taxid in taxid_lineage:
        name = names_map[taxid]
        names_lineage.append(name)

    taxonomy = ";".join(reversed(names_lineage))
    return taxonomy