name forms

This commit is contained in:
Tiendil 2014-01-27 15:11:07 +03:00
parent 7c92b5d193
commit 9254045ec1
15 changed files with 351 additions and 159 deletions

5
pynames/base.py Normal file
View file

@ -0,0 +1,5 @@
# coding: utf-8
class BaseGenerator(object):
pass

View file

@ -82,7 +82,7 @@
{"languages": {"en": "Lue", "ru": "Луэ"}}, {"languages": {"en": "Lue", "ru": "Луэ"}},
{"languages": {"en": "Ly", "ru": "Ли"}}, {"languages": {"en": "Ly", "ru": "Ли"}},
{"languages": {"en": "Mai", "ru": "Маи"}}, {"languages": {"en": "Mai", "ru": "Маи"}},
{"languages": {"en": "Mal", "ru": "Маль"}}, {"languages": {"en": "Mal", "ru": "Мал"}},
{"languages": {"en": "Mara", "ru": "Мара"}}, {"languages": {"en": "Mara", "ru": "Мара"}},
{"languages": {"en": "My", "ru": "Ми"}}, {"languages": {"en": "My", "ru": "Ми"}},
{"languages": {"en": "Na", "ru": "На"}}, {"languages": {"en": "Na", "ru": "На"}},
@ -127,7 +127,7 @@
{"languages": {"en": "Ya", "ru": "Йа"}}, {"languages": {"en": "Ya", "ru": "Йа"}},
{"languages": {"en": "Za", "ru": "За"}}, {"languages": {"en": "Za", "ru": "За"}},
{"languages": {"en": "Zy", "ru": "Зи"}}], {"languages": {"en": "Zy", "ru": "Зи"}}],
"male_suffixes": [{"languages": {"en": "ae", "ru": "аэ"}}, "male_suffixes": [{"languages": {"en": "ae", "ru": ["аэ", "аэ", "аэ", "аэ", "аэ", "аэ", "аы", "аы", "аы", "аы", "аы", "аы"] }},
{"languages": {"en": "nae", "ru": "наэ"}}, {"languages": {"en": "nae", "ru": "наэ"}},
{"languages": {"en": "ael", "ru": "аель"}}, {"languages": {"en": "ael", "ru": "аель"}},
{"languages": {"en": "aer", "ru": "аер"}}, {"languages": {"en": "aer", "ru": "аер"}},

30
pynames/exceptions.py Normal file
View file

@ -0,0 +1,30 @@
# coding: utf-8
class PynamesError(Exception):
MSG = None
def __init__(self, **kwargs):
super(PynamesError, self).__init__(self.MSG % kwargs)
class NoDefaultNameValue(PynamesError):
MSG = u'Name: can not get default value for name with data: %(raw_data)r'
class FromListGeneratorError(PynamesError):
pass
class NoNamesLoadedFromListError(FromListGeneratorError):
MSG = u'no names loaded from "%(source)s"'
class FromTablesGeneratorError(PynamesError):
pass
class WrongTemplateStructureError(FromTablesGeneratorError):
MSG = u'wrong template structure - cannot choose template for genders %(genders)r with template source: "%(source)s"'
class NotEqualFormsLengths(FromTablesGeneratorError):
MSG = u'not equal forms lengths: [%(left)r] and [%(right)r]'

View file

@ -2,7 +2,10 @@
import json import json
import random import random
from .generators import GENDER, LANGUAGE, Name, BaseGenerator, PynamesException from pynames.relations import GENDER, LANGUAGE
from pynames.names import Name
from pynames.base import BaseGenerator
from pynames import exceptions
class FromListGenerator(BaseGenerator): class FromListGenerator(BaseGenerator):
@ -26,7 +29,7 @@ class FromListGenerator(BaseGenerator):
self.names_list.append(Name(self.native_language, name_data)) self.names_list.append(Name(self.native_language, name_data))
if not self.names_list: if not self.names_list:
raise PynamesException('FromListGenerator: no names loaded from "%s"' % self.SOURCE) raise exceptions.NoNamesLoadedFromListError(source=self.SOURCE)
@staticmethod @staticmethod
def _get_cache_key(genders): def _get_cache_key(genders):

View file

@ -2,7 +2,10 @@
import json import json
import random import random
from .generators import GENDER, LANGUAGE, Name, BaseGenerator, PynamesException from pynames.relations import GENDER, LANGUAGE
from pynames.names import Name
from pynames.base import BaseGenerator
from pynames import exceptions
class Template(object): class Template(object):
@ -26,13 +29,29 @@ class Template(object):
number *= len(tables[slug]) number *= len(tables[slug])
return number return number
@classmethod
def merge_forms(cls, left, right):
if not isinstance(left, basestring):
if not isinstance(right, basestring):
if len(left) != len(right):
raise exceptions.NotEqualFormsLengths(left=left, right=right)
return [l+r for l, r in zip(left, right)]
else:
return [l+right for l in left]
else:
if not isinstance(right, basestring):
return [left+r for r in right]
else:
return left + right
def get_name(self, tables): 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: for slug in self.template:
record = random.choice(tables[slug]) record = random.choice(tables[slug])
for lang in languages: languages = { lang:self.merge_forms(forms, record['languages'][lang]) for lang, forms in languages.iteritems()}
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}) return Name(self.native_language, {'genders': genders})
@ -92,7 +111,7 @@ class FromTablesGenerator(BaseGenerator):
continue continue
return template.get_name(self.tables) 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) ) raise exceptions.WrongTemplateStructureError(genders=genders, soruce=self.SOURCE)
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]) name = self.get_name(genders=[gender])

View file

@ -1,14 +1,7 @@
# coding: utf-8 # coding: utf-8
from pynames.relations import GENDER, LANGUAGE from pynames.relations import GENDER, LANGUAGE
from pynames import exceptions
class PynamesException(Exception):
pass
class BaseGenerator(object):
pass
class Name(object): class Name(object):
@ -21,9 +14,27 @@ class Name(object):
self.translations = data['genders'] self.translations = data['genders']
def get_for(self, gender, language=LANGUAGE.NATIVE): def get_for(self, gender, language=LANGUAGE.NATIVE):
if language == LANGUAGE.NATIVE: if language == LANGUAGE.NATIVE:
language = self.native_language language = self.native_language
return self.translations[gender][language]
forms = self.translations[gender][language]
if not isinstance(forms, basestring):
return forms[0]
return forms
def get_forms_for(self, gender, language=LANGUAGE.NATIVE):
if language == LANGUAGE.NATIVE:
language = self.native_language
forms = self.translations[gender][language]
if not isinstance(forms, basestring):
return forms
return None
def exists_for(self, genders): def exists_for(self, genders):
return genders & self.genders return genders & self.genders
@ -32,7 +43,6 @@ class Name(object):
for gender in GENDER.ALL: for gender in GENDER.ALL:
if gender in self.genders: if gender in self.genders:
return self.translations[gender][self.native_language] return self.translations[gender][self.native_language]
error_msg = u'Name: can not get default value for name with data: %r' % self.genders raise exceptions.PynamesException(raw_data=self.genders)
raise PynamesException(error_msg)
def __str__(self): return self.__unicode__() def __str__(self): return self.__unicode__()

View file

@ -4,7 +4,7 @@
"native_language": "en", "native_language": "en",
"languages": ["en", "ru"], "languages": ["en", "ru"],
"names": [ "names": [
{"genders": {"m": {"en": "Adalbrikt", "ru": "Адалбрикт", "ru_ext": "Адалбрикт"}}}, {"genders": {"m": {"en": "Adalbrikt", "ru": ["Адалбрикт", "Адалбрикта", "Адалбрикту", "Адалбрикта", "Адалбриктом", "Адалбрикте", "Адалбрикты", "Адалбриктов", "Адалбриктам", "Адалбриктов", "Адалбриктами", "Адалбриктах"], "ru_ext": "Адалбрикт"}}},
{"genders": {"m": {"en": "Adalradr", "ru": "Адалрадр", "ru_ext": "Адалрадр"}}}, {"genders": {"m": {"en": "Adalradr", "ru": "Адалрадр", "ru_ext": "Адалрадр"}}},
{"genders": {"m": {"en": "Adalstein", "ru": "Адалстейн", "ru_ext": "Адалстėн"}}}, {"genders": {"m": {"en": "Adalstein", "ru": "Адалстейн", "ru_ext": "Адалстėн"}}},
{"genders": {"m": {"en": "Adils", "ru": "Адилс", "ru_ext": "Адилс"}}}, {"genders": {"m": {"en": "Adils", "ru": "Адилс", "ru_ext": "Адилс"}}},

View file

@ -1,4 +1,6 @@
# coding: utf-8 # coding: utf-8
from pynames.tests.test import * from pynames.tests.test_name import *
from pynames.tests.test_from_list_generator import *
from pynames.tests.test_from_tables_generator import *
from pynames.tests.test_generators import * from pynames.tests.test_generators import *

View file

@ -0,0 +1,28 @@
{
"native_language": "ru",
"languages": ["ru"],
"names": [ {"genders": {"m": {"ru": ["ru_m_name_1", "ru_m_name_1__form"],
"en": "en_m_name_1"}}},
{"genders": {"f": {"ru": ["ru_f_name_2", "ru_f_name_2__form"],
"en": "en_f_name_2"}}},
{"genders": {"f": {"ru": ["ru_f_name_3", "ru_f_name_3__form"],
"en": "en_f_name_3"}}},
{"genders": {"m": {"ru": ["ru_m_name_4", "ru_m_name_4__form"],
"en": "en_m_name_4"},
"f": {"ru": ["ru_f_name_4", "ru_f_name_4__form"],
"en": "en_f_name_4"}}},
{"genders": {"m": {"ru": ["ru_m_name_5", "ru_m_name_5__form"],
"en": "en_m_name_5"},
"f": {"ru": ["ru_f_name_5", "ru_f_name_5__form"],
"en": "en_f_name_5"}}},
{"genders": {"m": {"ru": ["ru_m_name_5", "ru_m_name_5__form"],
"en": "en_m_name_5"},
"f": {"ru": ["ru_f_name_5", "ru_f_name_5__form"],
"en": "en_f_name_5"}}}
]
}

View file

@ -19,7 +19,7 @@
"table2": [{"languages": {"en": "_m_en_1", "ru": "_m_ru_1"}}, "table2": [{"languages": {"en": "_m_en_1", "ru": "_m_ru_1"}},
{"languages": {"en": "_m_en_2", "ru": "_m_ru_2"}}], {"languages": {"en": "_m_en_2", "ru": "_m_ru_2"}}],
"table3": [{"languages": {"en": "_f_en_1", "ru": "_f_ru_1"}}], "table3": [{"languages": {"en": "_f_en_1", "ru": ["_f_ru_1", "_f_ru_1_form"]}}],
"table4": [{"languages": {"en": "'", "ru": "'"}}]} "table4": [{"languages": {"en": "'", "ru": "'"}}]}
} }

View file

@ -1,135 +0,0 @@
# coding: utf-8
import os
import unittest
from pynames.generators import Name, GENDER, LANGUAGE
from pynames.from_list_generator import FromListGenerator
from pynames.from_tables_generator import FromTablesGenerator
FIXTURES_DIR = os.path.join(os.path.dirname(__file__), 'fixtures')
class TestName(unittest.TestCase):
def test_base(self):
name = Name('ru', {'genders': {'m': {'ru': 'ru_name'}}})
self.assertEqual(unicode(name), 'ru_name')
self.assertEqual(name.get_for(GENDER.MALE, LANGUAGE.RU), 'ru_name')
self.assertEqual(name.get_for(GENDER.MALE), 'ru_name')
def test_genders(self):
name = Name('ru', {'genders': {'m': {'ru': 'ru_m_name'},
'f': {'ru': 'ru_f_name'}}})
self.assertEqual(unicode(name), 'ru_m_name')
self.assertEqual(name.get_for(GENDER.MALE, LANGUAGE.RU), 'ru_m_name')
self.assertEqual(name.get_for(GENDER.FEMALE, LANGUAGE.RU), 'ru_f_name')
def test_languages(self):
name = Name('ru', {'genders': {'m': {'ru': 'ru_m_name',
'en': 'en_m_name'},
'f': {'ru': 'ru_f_name',
'en': 'en_f_name'}}})
self.assertEqual(unicode(name), 'ru_m_name')
self.assertEqual(name.get_for(GENDER.MALE, LANGUAGE.RU), 'ru_m_name')
self.assertEqual(name.get_for(GENDER.FEMALE, LANGUAGE.RU), 'ru_f_name')
self.assertEqual(name.get_for(GENDER.MALE, LANGUAGE.EN), 'en_m_name')
self.assertEqual(name.get_for(GENDER.FEMALE, LANGUAGE.EN), 'en_f_name')
self.assertEqual(name.get_for(GENDER.MALE), 'ru_m_name')
self.assertEqual(name.get_for(GENDER.FEMALE), 'ru_f_name')
class TestFromListGenerator(unittest.TestCase):
class TestGenerator(FromListGenerator):
SOURCE = os.path.join(FIXTURES_DIR, 'test_from_list_generator.json')
NAMES_RU_MALE = ['ru_m_name_1', 'ru_m_name_4', 'ru_m_name_5', 'ru_m_name_6']
NAMES_EN_MALE = ['en_m_name_1', 'en_m_name_4', 'en_m_name_5', 'en_m_name_6']
NAMES_RU_FEMALE = ['ru_f_name_2', 'ru_f_name_3', 'ru_f_name_4', 'ru_f_name_5', 'ru_f_name_6']
NAMES_EN_FEMALE = ['en_f_name_2', 'en_f_name_3', 'en_f_name_4', 'en_f_name_5', 'en_f_name_6']
def test_not_derived(self):
self.assertRaises(NotImplementedError, FromListGenerator)
def test_wrong_path(self):
class WrongGenerator(FromListGenerator):
SOURCE = ''
self.assertRaises(IOError, WrongGenerator)
def test_base(self):
generator = self.TestGenerator()
self.assertEqual(generator.get_names_number(), 6)
self.assertTrue(generator.get_name_simple() in self.NAMES_RU_MALE)
def test_male_female_selection(self):
generator = self.TestGenerator()
self.assertEqual(generator.get_names_number(genders=[GENDER.MALE]), 4)
self.assertEqual(generator.get_names_number(genders=[GENDER.FEMALE]), 5)
def test_get_name(self):
generator = self.TestGenerator()
for i in xrange(100):
name = generator.get_name_simple(gender=GENDER.MALE, language=LANGUAGE.RU)
self.assertTrue(name in self.NAMES_RU_MALE)
for i in xrange(100):
name = generator.get_name_simple(gender=GENDER.FEMALE, language=LANGUAGE.RU)
self.assertTrue(name in self.NAMES_RU_FEMALE)
for i in xrange(100):
name = generator.get_name_simple(gender=GENDER.MALE, language=LANGUAGE.EN)
self.assertTrue(name in self.NAMES_EN_MALE)
for i in xrange(100):
name = generator.get_name_simple(gender=GENDER.FEMALE, language=LANGUAGE.EN)
self.assertTrue(name in self.NAMES_EN_FEMALE)
class TestFromTablesGenerator(unittest.TestCase):
class TestGenerator(FromTablesGenerator):
SOURCE = os.path.join(FIXTURES_DIR, 'test_from_tables_generator.json')
NAMES_RU_MALE = ["T1RU1_m_ru_1", "T1RU2_m_ru_1", "T1RU3_m_ru_1", "T1RU1_m_ru_2", "T1RU2_m_ru_2", "T1RU3_m_ru_2", "T1RU1_m_ru_1'_f_ru_1", "T1RU2_m_ru_1'_f_ru_1", "T1RU3_m_ru_1'_f_ru_1", "T1RU1_m_ru_2'_f_ru_1", "T1RU2_m_ru_2'_f_ru_1", "T1RU3_m_ru_2'_f_ru_1"]
NAMES_EN_MALE = ["T1EN1_m_en_1", "T1EN2_m_en_1", "T1EN3_m_en_1", "T1EN1_m_en_2", "T1EN2_m_en_2", "T1EN3_m_en_2", "T1EN1_m_en_1'_f_en_1", "T1EN2_m_en_1'_f_en_1", "T1EN3_m_en_1'_f_en_1", "T1EN1_m_en_2'_f_en_1", "T1EN2_m_en_2'_f_en_1", "T1EN3_m_en_2'_f_en_1"]
NAMES_RU_FEMALE = ["T1RU1_f_ru_1", "T1RU2_f_ru_1", "T1RU3_f_ru_1", "T1RU1_m_ru_1'_f_ru_1", "T1RU2_m_ru_1'_f_ru_1", "T1RU3_m_ru_1'_f_ru_1", "T1RU1_m_ru_2'_f_ru_1", "T1RU2_m_ru_2'_f_ru_1", "T1RU3_m_ru_2'_f_ru_1"]
NAMES_EN_FEMALE = ["T1EN1_f_en_1", "T1EN2_f_en_1", "T1EN3_f_en_1", "T1EN1_m_en_1'_f_en_1", "T1EN2_m_en_1'_f_en_1", "T1EN3_m_en_1'_f_en_1", "T1EN1_m_en_2'_f_en_1", "T1EN2_m_en_2'_f_en_1", "T1EN3_m_en_2'_f_en_1"]
def test_not_derived(self):
self.assertRaises(NotImplementedError, FromTablesGenerator)
def test_wrong_path(self):
class WrongGenerator(FromTablesGenerator):
SOURCE = ''
self.assertRaises(IOError, WrongGenerator)
def test_base(self):
generator = self.TestGenerator()
self.assertEqual(generator.get_names_number(), 15)
self.assertTrue(generator.get_name_simple() in self.NAMES_EN_MALE)
def test_male_female_selection(self):
generator = self.TestGenerator()
self.assertEqual(generator.get_names_number(genders=[GENDER.MALE]), 12)
self.assertEqual(generator.get_names_number(genders=[GENDER.FEMALE]), 9)
self.assertEqual(generator.get_names_number(), 15)
def test_get_name(self):
generator = self.TestGenerator()
for i in xrange(100):
name = generator.get_name_simple(gender=GENDER.MALE, language=LANGUAGE.RU)
self.assertTrue(name in self.NAMES_RU_MALE)
for i in xrange(100):
name = generator.get_name_simple(gender=GENDER.FEMALE, language=LANGUAGE.RU)
self.assertTrue(name in self.NAMES_RU_FEMALE)
for i in xrange(100):
name = generator.get_name_simple(gender=GENDER.MALE, language=LANGUAGE.EN)
self.assertTrue(name in self.NAMES_EN_MALE)
for i in xrange(100):
name = generator.get_name_simple(gender=GENDER.FEMALE, language=LANGUAGE.EN)
self.assertTrue(name in self.NAMES_EN_FEMALE)

View file

@ -0,0 +1,89 @@
# coding: utf-8
import os
import unittest
from pynames.relations import GENDER, LANGUAGE
from pynames.from_list_generator import FromListGenerator
FIXTURES_DIR = os.path.join(os.path.dirname(__file__), 'fixtures')
class TestFromListGenerator(unittest.TestCase):
class TestGenerator(FromListGenerator):
SOURCE = os.path.join(FIXTURES_DIR, 'test_from_list_generator.json')
class TestGeneratorWithForms(FromListGenerator):
SOURCE = os.path.join(FIXTURES_DIR, 'test_from_list_generator__with_forms.json')
NAMES_RU_MALE = ['ru_m_name_1', 'ru_m_name_4', 'ru_m_name_5', 'ru_m_name_6']
NAMES_EN_MALE = ['en_m_name_1', 'en_m_name_4', 'en_m_name_5', 'en_m_name_6']
NAMES_RU_FEMALE = ['ru_f_name_2', 'ru_f_name_3', 'ru_f_name_4', 'ru_f_name_5', 'ru_f_name_6']
NAMES_EN_FEMALE = ['en_f_name_2', 'en_f_name_3', 'en_f_name_4', 'en_f_name_5', 'en_f_name_6']
NAMES_RU_MALE_FORMS = ['ru_m_name_1__form', 'ru_m_name_4__form', 'ru_m_name_5__form', 'ru_m_name_6__form']
NAMES_RU_FEMALE_FORMS = ['ru_f_name_2__form', 'ru_f_name_3__form', 'ru_f_name_4__form', 'ru_f_name_5__form', 'ru_f_name_6__form']
def test_not_derived(self):
self.assertRaises(NotImplementedError, FromListGenerator)
def test_wrong_path(self):
class WrongGenerator(FromListGenerator):
SOURCE = ''
self.assertRaises(IOError, WrongGenerator)
def test_base(self):
generator = self.TestGenerator()
self.assertEqual(generator.get_names_number(), 6)
self.assertTrue(generator.get_name_simple() in self.NAMES_RU_MALE)
def test_male_female_selection(self):
generator = self.TestGenerator()
self.assertEqual(generator.get_names_number(genders=[GENDER.MALE]), 4)
self.assertEqual(generator.get_names_number(genders=[GENDER.FEMALE]), 5)
def test_get_name__simple(self):
generator = self.TestGenerator()
for i in xrange(100):
name = generator.get_name_simple(gender=GENDER.MALE, language=LANGUAGE.RU)
self.assertTrue(name in self.NAMES_RU_MALE)
for i in xrange(100):
name = generator.get_name_simple(gender=GENDER.FEMALE, language=LANGUAGE.RU)
self.assertTrue(name in self.NAMES_RU_FEMALE)
for i in xrange(100):
name = generator.get_name_simple(gender=GENDER.MALE, language=LANGUAGE.EN)
self.assertTrue(name in self.NAMES_EN_MALE)
for i in xrange(100):
name = generator.get_name_simple(gender=GENDER.FEMALE, language=LANGUAGE.EN)
self.assertTrue(name in self.NAMES_EN_FEMALE)
def test_get_name__with_forms(self):
generator = self.TestGeneratorWithForms()
for i in xrange(100):
name = generator.get_name(genders=[GENDER.MALE])
self.assertTrue(name.get_for(GENDER.MALE, LANGUAGE.RU) in self.NAMES_RU_MALE)
self.assertNotEqual(name.get_forms_for(GENDER.MALE, LANGUAGE.RU), None)
self.assertTrue(name.get_forms_for(GENDER.MALE, LANGUAGE.RU)[1] in self.NAMES_RU_MALE_FORMS)
for i in xrange(100):
name = generator.get_name(genders=[GENDER.FEMALE])
self.assertTrue(name.get_for(GENDER.FEMALE, LANGUAGE.RU) in self.NAMES_RU_FEMALE)
self.assertNotEqual(name.get_forms_for(GENDER.FEMALE, LANGUAGE.RU), None)
self.assertTrue(name.get_forms_for(GENDER.FEMALE, LANGUAGE.RU)[1] in self.NAMES_RU_FEMALE_FORMS)
for i in xrange(100):
name = generator.get_name(genders=[GENDER.MALE])
self.assertTrue(name.get_for(GENDER.MALE, LANGUAGE.EN) in self.NAMES_EN_MALE)
self.assertEqual(name.get_forms_for(GENDER.MALE, LANGUAGE.EN), None)
for i in xrange(100):
name = generator.get_name(genders=[GENDER.FEMALE])
self.assertTrue(name.get_for(GENDER.FEMALE, LANGUAGE.EN) in self.NAMES_EN_FEMALE)
self.assertEqual(name.get_forms_for(GENDER.FEMALE, LANGUAGE.EN), None)

View file

@ -0,0 +1,93 @@
# coding: utf-8
import os
import unittest
from pynames.relations import GENDER, LANGUAGE
from pynames.from_tables_generator import FromTablesGenerator
FIXTURES_DIR = os.path.join(os.path.dirname(__file__), 'fixtures')
class TestFromTablesGenerator(unittest.TestCase):
class TestGenerator(FromTablesGenerator):
SOURCE = os.path.join(FIXTURES_DIR, 'test_from_tables_generator.json')
NAMES_RU_MALE = ["T1RU1_m_ru_1", "T1RU2_m_ru_1", "T1RU3_m_ru_1", "T1RU1_m_ru_2", "T1RU2_m_ru_2", "T1RU3_m_ru_2", "T1RU1_m_ru_1'_f_ru_1", "T1RU2_m_ru_1'_f_ru_1", "T1RU3_m_ru_1'_f_ru_1", "T1RU1_m_ru_2'_f_ru_1", "T1RU2_m_ru_2'_f_ru_1", "T1RU3_m_ru_2'_f_ru_1"]
NAMES_EN_MALE = ["T1EN1_m_en_1", "T1EN2_m_en_1", "T1EN3_m_en_1", "T1EN1_m_en_2", "T1EN2_m_en_2", "T1EN3_m_en_2", "T1EN1_m_en_1'_f_en_1", "T1EN2_m_en_1'_f_en_1", "T1EN3_m_en_1'_f_en_1", "T1EN1_m_en_2'_f_en_1", "T1EN2_m_en_2'_f_en_1", "T1EN3_m_en_2'_f_en_1"]
NAMES_RU_FEMALE = ["T1RU1_f_ru_1", "T1RU2_f_ru_1", "T1RU3_f_ru_1", "T1RU1_m_ru_1'_f_ru_1", "T1RU2_m_ru_1'_f_ru_1", "T1RU3_m_ru_1'_f_ru_1", "T1RU1_m_ru_2'_f_ru_1", "T1RU2_m_ru_2'_f_ru_1", "T1RU3_m_ru_2'_f_ru_1"]
NAMES_EN_FEMALE = ["T1EN1_f_en_1", "T1EN2_f_en_1", "T1EN3_f_en_1", "T1EN1_m_en_1'_f_en_1", "T1EN2_m_en_1'_f_en_1", "T1EN3_m_en_1'_f_en_1", "T1EN1_m_en_2'_f_en_1", "T1EN2_m_en_2'_f_en_1", "T1EN3_m_en_2'_f_en_1"]
NAMES_RU_FEMALE_FORMS = ["T1RU1_f_ru_1_form", "T1RU2_f_ru_1_form", "T1RU3_f_ru_1_form", "T1RU1_m_ru_1'_f_ru_1_form", "T1RU2_m_ru_1'_f_ru_1_form", "T1RU3_m_ru_1'_f_ru_1_form", "T1RU1_m_ru_2'_f_ru_1_form", "T1RU2_m_ru_2'_f_ru_1_form", "T1RU3_m_ru_2'_f_ru_1_form"]
def test_not_derived(self):
self.assertRaises(NotImplementedError, FromTablesGenerator)
def test_wrong_path(self):
class WrongGenerator(FromTablesGenerator):
SOURCE = ''
self.assertRaises(IOError, WrongGenerator)
def test_base(self):
generator = self.TestGenerator()
self.assertEqual(generator.get_names_number(), 15)
self.assertTrue(generator.get_name_simple() in self.NAMES_EN_MALE)
def test_male_female_selection(self):
generator = self.TestGenerator()
self.assertEqual(generator.get_names_number(genders=[GENDER.MALE]), 12)
self.assertEqual(generator.get_names_number(genders=[GENDER.FEMALE]), 9)
self.assertEqual(generator.get_names_number(), 15)
def test_get_name_simple(self):
generator = self.TestGenerator()
for i in xrange(100):
name = generator.get_name_simple(gender=GENDER.MALE, language=LANGUAGE.RU)
self.assertTrue(name in self.NAMES_RU_MALE)
for i in xrange(100):
name = generator.get_name_simple(gender=GENDER.FEMALE, language=LANGUAGE.RU)
self.assertTrue(name in self.NAMES_RU_FEMALE)
for i in xrange(100):
name = generator.get_name_simple(gender=GENDER.MALE, language=LANGUAGE.EN)
self.assertTrue(name in self.NAMES_EN_MALE)
for i in xrange(100):
name = generator.get_name_simple(gender=GENDER.FEMALE, language=LANGUAGE.EN)
self.assertTrue(name in self.NAMES_EN_FEMALE)
def test_get_name__with_forms(self):
generator = self.TestGenerator()
has_none = set()
for i in xrange(100):
name = generator.get_name(genders=[GENDER.MALE])
self.assertTrue(name.get_for(GENDER.MALE, LANGUAGE.RU) in self.NAMES_RU_MALE)
has_none.add(name.get_forms_for(GENDER.MALE, LANGUAGE.RU) is None)
self.assertEqual(has_none, set([True, False]))
for i in xrange(100):
name = generator.get_name(genders=[GENDER.FEMALE])
self.assertTrue(name.get_for(GENDER.FEMALE, LANGUAGE.RU) in self.NAMES_RU_FEMALE)
self.assertNotEqual(name.get_forms_for(GENDER.FEMALE, LANGUAGE.RU), None)
self.assertTrue(name.get_forms_for(GENDER.FEMALE, LANGUAGE.RU)[1] in self.NAMES_RU_FEMALE_FORMS)
has_none = set()
for i in xrange(100):
name = generator.get_name(genders=[GENDER.MALE])
self.assertTrue(name.get_for(GENDER.MALE, LANGUAGE.EN) in self.NAMES_EN_MALE)
has_none.add(name.get_forms_for(GENDER.MALE, LANGUAGE.RU) is None)
self.assertEqual(has_none, set([True, False]))
for i in xrange(100):
name = generator.get_name(genders=[GENDER.FEMALE])
self.assertTrue(name.get_for(GENDER.FEMALE, LANGUAGE.EN) in self.NAMES_EN_FEMALE)
self.assertEqual(name.get_forms_for(GENDER.FEMALE, LANGUAGE.EN), None)

View file

@ -6,10 +6,17 @@ import unittest
import pynames import pynames
from pynames.generators import BaseGenerator, GENDER from pynames.relations import GENDER
from pynames.base import BaseGenerator
from pynames.from_list_generator import FromListGenerator from pynames.from_list_generator import FromListGenerator
from pynames.from_tables_generator import FromTablesGenerator from pynames.from_tables_generator import FromTablesGenerator
# TODO: test forms:
# - parameter, that declared, for which language forms specified
# - how many items in forms (12 for russian)
def get_all_generators(): def get_all_generators():
submodules = [] submodules = []

View file

@ -0,0 +1,41 @@
# coding: utf-8
import unittest
from pynames.relations import GENDER, LANGUAGE
from pynames.names import Name
class TestName(unittest.TestCase):
def test_base(self):
name = Name('ru', {'genders': {'m': {'ru': 'ru_name'}}})
self.assertEqual(unicode(name), 'ru_name')
self.assertEqual(name.get_for(GENDER.MALE, LANGUAGE.RU), 'ru_name')
self.assertEqual(name.get_for(GENDER.MALE), 'ru_name')
self.assertEqual(name.get_forms_for(GENDER.MALE), None)
def test_genders(self):
name = Name('ru', {'genders': {'m': {'ru': 'ru_m_name'},
'f': {'ru': 'ru_f_name'}}})
self.assertEqual(unicode(name), 'ru_m_name')
self.assertEqual(name.get_for(GENDER.MALE, LANGUAGE.RU), 'ru_m_name')
self.assertEqual(name.get_for(GENDER.FEMALE, LANGUAGE.RU), 'ru_f_name')
def test_languages(self):
name = Name('ru', {'genders': {'m': {'ru': 'ru_m_name',
'en': 'en_m_name'},
'f': {'ru': 'ru_f_name',
'en': 'en_f_name'}}})
self.assertEqual(unicode(name), 'ru_m_name')
self.assertEqual(name.get_for(GENDER.MALE, LANGUAGE.RU), 'ru_m_name')
self.assertEqual(name.get_for(GENDER.FEMALE, LANGUAGE.RU), 'ru_f_name')
self.assertEqual(name.get_for(GENDER.MALE, LANGUAGE.EN), 'en_m_name')
self.assertEqual(name.get_for(GENDER.FEMALE, LANGUAGE.EN), 'en_f_name')
self.assertEqual(name.get_for(GENDER.MALE), 'ru_m_name')
self.assertEqual(name.get_for(GENDER.FEMALE), 'ru_f_name')
def test_forms(self):
name = Name('ru', {'genders': {'m': {'ru': ['form_1', 'form_2']}}})
self.assertEqual(name.get_forms_for(GENDER.MALE), ['form_1', 'form_2'])