def test_exclude_israeli_pure_filter(self): # test where the meaning only has the excluded meaning name1 = NameDefinition( name="name1", gender=Gender.girl, meanings=[NameMeaning("meaning1", [Region.Israel])]) name2 = NameDefinition( name="name2", gender=Gender.girl, meanings=[NameMeaning("meaning1", [Region.India])]) filtered = exclude_israeli_names({"name1": name1, "name2": name2}) assert len(filtered) is 1 assert filtered == {"name2": name2}
def test_exclude_origins_only_in_multiple(self): # assuming Spain and Latin_America both appear in the exclude_only_origins list name1 = NameDefinition( name="name1", gender=Gender.girl, meanings=[ NameMeaning("meaning1", [Region.Spain, Region.Latin_America]) ]) name2 = NameDefinition( name="name2", gender=Gender.girl, meanings=[NameMeaning("meaning1", [Region.India])]) filtered = exclude_origins_only_in({"name1": name1, "name2": name2}) assert len(filtered) is 1 assert filtered == {"name2": name2}
def test_exclude_muslim_mixed_filter(self): # test where the meaning contains the excluded meaning name1 = NameDefinition(name="name1", gender=Gender.girl, meanings=[ NameMeaning("meaning1", [Region.Muslim]), NameMeaning("meaning2", [Region.United_States]) ]) name2 = NameDefinition( name="name2", gender=Gender.girl, meanings=[NameMeaning("meaning1", [Region.India])]) filtered = exclude_muslim_names({"name1": name1, "name2": name2}) assert len(filtered) is 1 assert filtered == {"name2": name2}
def intake_mon_names( names: Dict[str, NameDefinition] = None) -> Dict[str, NameDefinition]: print(f"reading names from {meaning_of_names_filename}") number_merged = 0 number_added = 0 if names is None: names = {} with open(meaning_of_names_filename) as csvfile: csvreader = csv.DictReader(csvfile, delimiter=',', quotechar='"') for row in csvreader: if row['name'] in names and names[row['name']] is not None: existing_name = names[row['name']] existing_name.append_attrs( gender=Gender.from_str(row['gender']), origin=Region.from_str(row['origin']), meaning=row['meaning'], source=NameSource.meaning_of_names) names[row['name']] = existing_name number_merged = number_merged + 1 else: names[row['name']] = NameDefinition( name=row['name'], gender=Gender.from_str(row['gender']), origin=Region.from_str(row['origin']), meaning=row['meaning'], source=NameSource.meaning_of_names) number_added = number_added + 1 print( f"added {number_added} and merged/updated {number_merged} name definitions from the meaning-of-names.com" ) return names
def intake_ssa_names( names: Dict[str, NameDefinition] = None) -> Dict[str, NameDefinition]: print(f"reading names from {ssa_names_filename}") number_merged = 0 number_added = 0 if names is None: names = {} with open(ssa_names_filename) as csvfile: csvreader = csv.DictReader(csvfile, delimiter=',', quotechar='"') for row in csvreader: if row['name'] in names and names[row['name']] is not None: existing_name = names[row['name']] existing_name.append_attrs(gender=Gender.from_str(row['sex']), source=NameSource.ssa) names[row['name']] = existing_name number_merged = number_merged + 1 else: names[row['name']] = NameDefinition(name=row['name'], gender=Gender.from_str( row['sex']), source=NameSource.ssa) number_added = number_added + 1 print( f"added {number_added} and merged/updated {number_merged} name definitions from the SSA" ) return names
def test_palindromes(self): # test where the meaning only has the excluded meaning name1 = NameDefinition( name="name1eman", gender=Gender.girl, meanings=[NameMeaning("meaning1", [Region.Muslim])]) name2 = NameDefinition( name="name2", gender=Gender.girl, meanings=[NameMeaning("meaning1", [Region.India])]) filtered = exclude_non_palindromes({ "name1eman": name1, "name2": name2 }) assert len(filtered) is 1 assert filtered == {"name1eman": name1}
def intake_indian_names( names: Dict[str, NameDefinition] = None) -> Dict[str, NameDefinition]: print(f"reading names from {indian_names_filename}") number_merged = 0 number_added = 0 if names is None: names = {} with open(indian_names_filename) as csvfile: csvreader = csv.DictReader(csvfile, delimiter=',', quotechar='"') for row in csvreader: if row['Name'] in names and names[row['Name']] is not None: existing_name = names[row['Name']] existing_name.append_attrs( gender=Gender.from_str(row['Gender']), meaning=row['Meaning'], origin=Region.from_str(row['Language']), source=NameSource.tamilcube) names[row['Name']] = existing_name number_merged = number_merged + 1 else: names[row['Name']] = NameDefinition( name=row['Name'], gender=Gender.from_str(row['Gender']), meaning=row['Meaning'], origin=Region.from_str(row['Language']), source=NameSource.tamilcube) number_added = number_added + 1 print( f"added {number_added} and merged/updated {number_merged} Indian name definitions" ) return names
def intake_pantheon( names: Dict[str, NameDefinition] = None) -> Dict[str, NameDefinition]: print(f"reading names from {pantheon_filename}") number_merged = 0 number_added = 0 if names is None: names = {} with open(pantheon_filename) as csvfile: csvreader = csv.DictReader(csvfile, delimiter='\t', quotechar='"') for row in csvreader: person_fname = row['name'].split(' ')[0] famous_person = f"{row['occupation'].title()} {row['name']}" if person_fname in names and names[person_fname] is not None: existing_name = names[person_fname] existing_name.append_attrs( gender=Gender.from_str(row['gender']), origin=Region.from_str(row['countryName']), known_persons=famous_person, source=NameSource.pantheon) names[person_fname] = existing_name number_merged = number_merged + 1 else: names[person_fname] = NameDefinition( name=person_fname, gender=Gender.from_str(row['gender']), origin=Region.from_str(row['countryName']), known_persons=famous_person, source=NameSource.pantheon) number_added = number_added + 1 print( f"added {number_added} and merged/updated {number_merged} name definitions from the pantheon" ) return names
def read_names_json(filename: str) -> Dict[str, NameDefinition]: names = {} with open(filename) as jsonfile: data = json.load(jsonfile) number_merged = 0 for record in data: meanings_list = [] for m in record['meanings']: meanings_list.append( NameMeaning(meaning=m['meaning'], origins=m['origins'])) if record['name'] in names and names[record['name']] is not None: existing_name = names[record['name']] existing_name.append_attrs( gender=Gender.from_str(record['gender']), meanings=meanings_list, known_persons=record['known_persons'], source=record['source']) names[record['name']] = existing_name number_merged = number_merged + 1 else: names[record['name']] = NameDefinition( name=record['name'], gender=Gender.from_str(record['gender']), meanings=meanings_list, known_persons=record['known_persons'], source=record['source']) print(f"merged {number_merged} names") return names
def test_similar_name_exclude(self): name1 = NameDefinition(name="Ailin", gender=Gender.boy, source=NameSource.people_we_know) name2 = NameDefinition(name="Aaelin", gender=Gender.boy, source=NameSource.ssa) name3 = NameDefinition(name="Josh", gender=Gender.boy, source=NameSource.ssa) filtered = exclude_names_of_people_know( { "Ailin": name1, "Aaelin": name2, 'Josh': name3 }, filter_metaphones=True) assert len(filtered) is 1 assert filtered == {'Josh': name3}
def test_get_all_meanings_different_meanings(self): name = NameDefinition(name="name1", gender=Gender.boy, meaning="meaning1", origin=Region.United_States) name.add_meaning("meaning1", origin=Region.United_Kingdom) name.add_meaning("meaning2", origin=Region.India) name.add_meaning("meaning2", origin=Region.Tamil) assert name.get_all_meanings() == ["meaning1", "meaning2"]
def test_get_all_origins_different_meanings(self): name = NameDefinition(name="name1", gender=Gender.boy, meaning="meaning1", origin=Region.United_States) name.add_meaning("meaning1", origin=Region.United_Kingdom) name.add_meaning("meaning2", origin=Region.India) name.add_meaning("meaning2", origin=Region.Tamil) expected_meanings = [ Region.United_Kingdom, Region.United_States, Region.India, Region.Tamil ] expected_meanings.sort() assert name.get_all_origins() == expected_meanings
def intake_star_trek( names: Dict[str, NameDefinition] = None) -> Dict[str, NameDefinition]: print(f"reading names from {star_trek_filename}") number_merged = 0 number_added = 0 if names is None: names = {} with open(star_trek_filename) as csvfile: csvreader = csv.DictReader(csvfile, delimiter=',', quotechar='"') for row in csvreader: if len(row['First Name'].strip()) == 0: continue rank = '' if row['Rank'] and row['Rank'].lower() != "civilian": rank = row['Rank'].split(',')[0].strip() if len(rank) != 0: rank = f"{rank} " first_name = f"{row['First Name']}" character_name = f"{rank}{row['Character']} from Star Trek" if first_name in names and names[first_name] is not None: existing_name = names[first_name] existing_name.append_attrs(gender=Gender.from_str( row['Gender']), known_persons=character_name, source=NameSource.star_trek) names[first_name] = existing_name number_merged = number_merged + 1 else: names[first_name] = NameDefinition( name=first_name, gender=Gender.from_str(row['Gender']), known_persons=character_name, source=NameSource.star_trek) number_added = number_added + 1 print( f"added {number_added} and merged/updated {number_merged} name definitions from Star Trek" ) return names
def intake_countries( names: Dict[str, NameDefinition] = None) -> Dict[str, NameDefinition]: print(f"reading names from {countries_filename}") number_merged = 0 number_added = 0 if names is None: names = {} with open(countries_filename) as file: content = file.readlines() for line in content: name = line.strip() if name in names and names[name] is not None: existing_name = names[name] existing_name.append_attrs(source=NameSource.countries) names[name] = existing_name number_merged = number_merged + 1 else: names[name] = NameDefinition(name=name, source=NameSource.countries) number_added = number_added + 1 print( f"added {number_added} and merged/updated {number_merged} name definitions from the list of countries" ) return names
def test_gender_unisex_to_boy_still_unisex(self): name = NameDefinition(name="name1", gender=Gender.unisex) assert name.gender == Gender.unisex name.append_attrs(gender=Gender.boy) assert name.gender == Gender.unisex
def test_meaning_none(self): name = NameDefinition(name="name1", gender=Gender.boy, meaning=None) assert len(name.meanings) is 0
def test_gender_girl_to_unisex(self): name = NameDefinition(name="name1", gender=Gender.girl) assert name.gender == Gender.girl name.append_attrs(gender=Gender.boy) assert name.gender == Gender.unisex