generators tests

This commit is contained in:
Tiendil 2014-01-26 15:30:04 +03:00
parent e582920703
commit 7c92b5d193
12 changed files with 69 additions and 51 deletions

View file

@ -5,3 +5,5 @@ import pynames.mongolian
import pynames.scandinavian
import pynames.korean
import pynames.russian
from pynames.generators import GENDER, LANGUAGE

View file

@ -17,10 +17,13 @@ class FromListGenerator(BaseGenerator):
error_msg = 'FromListGenerator: you must make subclass of FromListGenerator and define attribute SOURCE in it.'
raise NotImplementedError(error_msg)
with open(self.SOURCE) as f:
names_data = json.load(f)
names_data = json.load(f, encoding='utf-8')
self.native_language = names_data['native_language']
self.languages = set(names_data['languages'])
for name_data in names_data['names']:
self.names_list.append(Name(names_data['native_language'], name_data))
self.names_list.append(Name(self.native_language, name_data))
if not self.names_list:
raise PynamesException('FromListGenerator: no names loaded from "%s"' % self.SOURCE)
@ -33,18 +36,23 @@ class FromListGenerator(BaseGenerator):
key = self._get_cache_key(genders)
genders = frozenset(genders)
if key not in self.choices:
self.choices[key] = [name_record
for name_record in self.names_list
self.choices[key] = [name_record
for name_record in self.names_list
if name_record.exists_for(genders)]
return self.choices[key]
def get_names_number(self, genders=GENDER.ALL):
def get_names_number(self, genders=GENDER.ALL):
return len(self._get_slice(genders))
def get_name(self, genders=GENDER.ALL):
def get_name(self, genders=GENDER.ALL):
return random.choice(self._get_slice(genders))
def get_name_simple(self, gender=GENDER.MALE, language=LANGUAGE.NATIVE):
def get_name_simple(self, gender=GENDER.MALE, language=LANGUAGE.NATIVE):
name = self.get_name(genders=[gender])
return name.get_for(gender, language)
def test_names_consistency(self, test):
for name in self.names_list:
for gender in GENDER.ALL:
if gender in name.translations:
test.assertEqual(set(name.translations[gender].keys()) & self.languages, self.languages)

View file

@ -27,12 +27,12 @@ class Template(object):
return number
def get_name(self, tables):
languages = dict( (lang, u'') for lang in self.languages)
languages = dict( (lang, u'') for lang in self.languages)
for slug in self.template:
record = random.choice(tables[slug])
for lang in languages:
languages[lang] += record['languages'][lang]
genders = dict( (gender, languages) for gender in self.genders)
genders = dict( (gender, languages) for gender in self.genders)
return Name(self.native_language, {'genders': genders})
@ -52,9 +52,9 @@ class FromTablesGenerator(BaseGenerator):
with open(self.SOURCE) as f:
data = json.load(f)
native_language = data['native_language']
languages = data['languages']
self.templates = [ Template(template_name, native_language, languages, template_data)
self.native_language = data['native_language']
self.languages = set(data['languages'])
self.templates = [ Template(template_name, self.native_language, self.languages, template_data)
for template_name, template_data in data['templates'].items() ]
self.tables = data['tables']
@ -66,7 +66,7 @@ class FromTablesGenerator(BaseGenerator):
key = self._get_templates_cache_key(genders)
genders = frozenset(genders)
if key not in self.templates_choices:
self.templates_choices[key] = [template
self.templates_choices[key] = [template
for template in self.templates
if template.exists_for(genders)]
return self.templates_choices[key]
@ -75,27 +75,30 @@ class FromTablesGenerator(BaseGenerator):
pass
def get_names_number(self, genders=GENDER.ALL):
def get_names_number(self, genders=GENDER.ALL):
templates = self._get_templates_slice(genders)
number = sum([template.get_names_number(self.tables) for template in templates])
return number
def get_name(self, genders=GENDER.ALL):
def get_name(self, genders=GENDER.ALL):
templates = self._get_templates_slice(genders)
definition_number = sum([template.probability for template in templates])
choice = random.randint(1, definition_number)
for template in templates:
if choice > template.probability:
choice -= template.probability
continue
return template.get_name(self.tables)
raise PynamesException('FromTablesGenerator: wrong template structure - cannot choose template for genders %r with template source: "%s"' % (genders, self.SOURCE) )
def get_name_simple(self, gender=GENDER.MALE, language=LANGUAGE.NATIVE):
raise PynamesException('FromTablesGenerator: wrong template structure - cannot choose template for genders %r with template source: "%s"' % (genders, self.SOURCE) )
def get_name_simple(self, gender=GENDER.MALE, language=LANGUAGE.NATIVE):
name = self.get_name(genders=[gender])
return name.get_for(gender, language)
def test_names_consistency(self, test):
for table_name, table in self.tables.iteritems():
for record in table:
test.assertEqual(set(record['languages'].keys()) & self.languages, self.languages)

View file

@ -1,25 +1,12 @@
# coding: utf-8
from pynames.relations import GENDER, LANGUAGE
class PynamesException(Exception):
pass
class GENDER:
MALE = 'm'
FEMALE = 'f'
MF = ['m', 'f']
ALL = ['m', 'f']
class LANGUAGE:
RU = 'ru'
EN = 'en'
NATIVE = 'native'
ALL = ['ru', 'en', 'native']
class BaseGenerator(object):
pass
@ -45,7 +32,7 @@ class Name(object):
for gender in GENDER.ALL:
if gender in self.genders:
return self.translations[gender][self.native_language]
error_msg = 'Name: can not get default value for name with data: %r' % self.genders
error_msg = u'Name: can not get default value for name with data: %r' % self.genders
raise PynamesException(error_msg)
def __str__(self): return self.__unicode__()

View file

@ -2,6 +2,7 @@
"source": "http://www.gaminggeeks.org/Resources/KateMonk/",
"translation": "Wizard-worker and Swingaroo",
"native_language": "en",
"languages": ["en", "ru"],
"names": [ {"genders": {"m": {"en": "An-Kor", "ru":"Ан-Кор"}}},
{"genders": {"m": {"en": "Bong-Chol", "ru":"Бонг-Чол"}}},
{"genders": {"m": {"en": "Bum-Kun", "ru":"Бум-Кун"}}},

View file

@ -2,6 +2,7 @@
"source": "http://www.gaminggeeks.org/Resources/KateMonk/",
"translation": "Wizard-worker and Swingaroo",
"native_language": "en",
"languages": ["en", "ru"],
"names": [{"genders": {"m": {"en": "Al", "ru": "Ал"}, "f": {"en": "Al", "ru": "Ал"}}},
{"genders": {"m": {"en": "Alagh", "ru": "Алагх"}, "f": {"en": "Alagh", "ru": "Алагх"}}},
{"genders": {"m": {"en": "Altan", "ru": "Алтан"}, "f": {"en": "Altan", "ru": "Алтан"}}},

View file

@ -1,6 +1,7 @@
{
"source": "Wizard-worker",
"native_language": "ru",
"languages": ["ru"],
"names": [ {"genders": {"m": {"ru": "Ахн"}}},
{"genders": {"m": {"ru": "Ахер"}}},
{"genders": {"m": {"ru": "Авех"}}},
@ -218,7 +219,7 @@
{"genders": {"m": {"ru": "Хрох"}}},
{"genders": {"m": {"ru": "Хген"}}},
{"genders": {"m": {"ru": "Хсухон"}}},
{"genders": {"f": {"ru": "Атта"}}},
{"genders": {"f": {"ru": "Асса"}}},
@ -465,5 +466,3 @@
{"genders": {"f": {"ru": "Шушша"}}}
]
}

16
pynames/relations.py Normal file
View file

@ -0,0 +1,16 @@
# coding: utf-8
class GENDER:
MALE = 'm'
FEMALE = 'f'
MF = ['m', 'f']
ALL = ['m', 'f']
class LANGUAGE:
RU = 'ru'
EN = 'en'
NATIVE = 'native'
ALL = ['ru', 'en', 'native']

View file

@ -1,6 +1,7 @@
{
"source": "http://paganism.msk.ru/name/name.htm",
"native_language": "ru",
"languages": ["ru"],
"names": [ {"genders": {"m": {"ru": "Бажен"}, "f": {"ru": "Бажена"}}},
{"genders": {"m": {"ru": "Белослав"}, "f": {"ru": "Белослава"}}},
{"genders": {"m": {"ru": "Беримир"}}},

View file

@ -1,8 +1,9 @@
{
"source": "http://www.gaminggeeks.org/Resources/KateMonk/",
"translation": "Wizard-worker and Swingaroo",
"native_language": "ru",
"names": [
"native_language": "en",
"languages": ["en", "ru"],
"names": [
{"genders": {"m": {"en": "Adalbrikt", "ru": "Адалбрикт", "ru_ext": "Адалбрикт"}}},
{"genders": {"m": {"en": "Adalradr", "ru": "Адалрадр", "ru_ext": "Адалрадр"}}},
{"genders": {"m": {"en": "Adalstein", "ru": "Адалстейн", "ru_ext": "Адалстėн"}}},
@ -12,10 +13,10 @@
{"genders": {"m": {"en": "Aflaeg", "ru": "Афлаег", "ru_ext": "Афлäг"}}},
{"genders": {"m": {"en": "Agder", "ru": "Агдер", "ru_ext": "Агдер"}}},
{"genders": {"m": {"en": "Agdir", "ru": "Агдир", "ru_ext": "Агдир"}}},
{"genders": {"m": {"en": "Agger", "ru": "Аггер", "ru_ext": "Аггер"}}},
{"genders": {"m": {"en": "Agger", "ru": "Аггер", "ru_ext": "Аггер"}}},
{"genders": {"m": {"en": "Agmund", "ru": "Агмунд", "ru_ext": "Агмунд"}}},
{"genders": {"m": {"en": "Agmundr", "ru": "Агмундр", "ru_ext": "Агмундр"}}},
{"genders": {"m": {"en": "Anulo", "ru": "Ануло", "ru_ext": "Ануло"}}},
{"genders": {"m": {"en": "Anulo", "ru": "Ануло", "ru_ext": "Ануло"}}},
{"genders": {"m": {"en": "Agnarr", "ru": "Агнарр", "ru_ext": "Агнарр"}}},
{"genders": {"m": {"en": "Alaf", "ru": "Алаф", "ru_ext": "Алаф"}}},
{"genders": {"m": {"en": "Aleifr", "ru": "Алейфр", "ru_ext": "Алėфр"}}},
@ -73,7 +74,7 @@
{"genders": {"m": {"en": "AbjГёrn", "ru": "Абгёрн", "ru_ext": "Абгёрн"}}},
{"genders": {"m": {"en": "Asbrand", "ru": "Асбранд", "ru_ext": "Асбранд"}}},
{"genders": {"m": {"en": "Asfrith", "ru": "Асфрит", "ru_ext": "Асфриѳ"}}},
{"genders": {"m": {"en": "Asgaut"}, "ru": "Асгаут", "ru_ext": "Асгáт"}},
{"genders": {"m": {"en": "Asgaut", "ru": "Асгаут", "ru_ext": "Асгáт"}}},
{"genders": {"m": {"en": "Asgautr", "ru": "Асгаутр", "ru_ext": "Асгáтр"}}},
{"genders": {"m": {"en": "Asgeir", "ru": "Асгейр", "ru_ext": "Асгėр"}}},
{"genders": {"m": {"en": "Asgeirr", "ru": "Асгейрр", "ru_ext": "Асгėрр"}}},
@ -960,7 +961,7 @@
{"genders": {"f": {"en": "Alkai", "ru": "Алкаи", "ru_ext": "Алкаї"}}},
{"genders": {"f": {"en": "Alphege", "ru": "Алфеге", "ru-ext": "Алфеге"}}},
{"genders": {"f": {"en": "Amunde", "ru": "Амунде", "ru-ext": "Амунде"}}},
{"genders": {"f": {"en": "Amundi", "ru": "Амунди", "ru-ext": "Амунди"}}},
{"genders": {"f": {"en": "Amundi", "ru": "Амунди", "ru-ext": "Амунди"}}},
{"genders": {"f": {"en": "Api", "ru": "Апи", "ru-ext": "Апи"}}},
{"genders": {"f": {"en": "Arne", "ru": "Арне", "ru-ext": "Арне"}}},
{"genders": {"f": {"en": "Arni", "ru": "Арни", "ru-ext": "Арни"}}},
@ -1230,8 +1231,4 @@
{"genders": {"f": {"en": "Vidfari", "ru": "Видфари", "ru-ext": "Видфари"}}},
{"genders": {"f": {"en": "Viglei", "ru": "Виглей", "ru-ext": "Виглė"}}},
{"genders": {"f": {"en": "Vili", "ru": "Вили", "ru-ext": "Вили"}}}]
}

View file

@ -1,5 +1,6 @@
{
"native_language": "ru",
"languages": ["ru"],
"names": [ {"genders": {"m": {"ru": "ru_m_name_1",
"en": "en_m_name_1"}}},
@ -24,4 +25,4 @@
"f": {"ru": "ru_f_name_5",
"en": "en_f_name_5"}}}
]
}
}

View file

@ -59,6 +59,8 @@ def create_test_method(generator_class):
self.assertTrue(generator.get_name_simple())
self.assertTrue(generator.get_name())
generator.test_names_consistency(self)
test_method.__name__ = 'test_%s' % generator.__name__
return test_method