Пример #1
0
 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}
Пример #2
0
 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}
Пример #3
0
 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}
Пример #4
0
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
Пример #5
0
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
Пример #6
0
 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}
Пример #7
0
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
Пример #8
0
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
Пример #9
0
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
Пример #10
0
 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}
Пример #11
0
 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"]
Пример #12
0
 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
Пример #13
0
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
Пример #14
0
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
Пример #15
0
 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
Пример #16
0
 def test_meaning_none(self):
     name = NameDefinition(name="name1", gender=Gender.boy, meaning=None)
     assert len(name.meanings) is 0
Пример #17
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