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": "Ly", "ru": "Ли"}},
{"languages": {"en": "Mai", "ru": "Маи"}},
{"languages": {"en": "Mal", "ru": "Маль"}},
{"languages": {"en": "Mal", "ru": "Мал"}},
{"languages": {"en": "Mara", "ru": "Мара"}},
{"languages": {"en": "My", "ru": "Ми"}},
{"languages": {"en": "Na", "ru": "На"}},
@ -127,7 +127,7 @@
{"languages": {"en": "Ya", "ru": "Йа"}},
{"languages": {"en": "Za", "ru": "За"}},
{"languages": {"en": "Zy", "ru": "Зи"}}],
"male_suffixes": [{"languages": {"en": "ae", "ru": "аэ"}},
"male_suffixes": [{"languages": {"en": "ae", "ru": ["аэ", "аэ", "аэ", "аэ", "аэ", "аэ", "аы", "аы", "аы", "аы", "аы", "аы"] }},
{"languages": {"en": "nae", "ru": "наэ"}},
{"languages": {"en": "ael", "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 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):
@ -26,7 +29,7 @@ class FromListGenerator(BaseGenerator):
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)
raise exceptions.NoNamesLoadedFromListError(source=self.SOURCE)
@staticmethod
def _get_cache_key(genders):

View file

@ -2,7 +2,10 @@
import json
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):
@ -26,13 +29,29 @@ class Template(object):
number *= len(tables[slug])
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):
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]
languages = { lang:self.merge_forms(forms, record['languages'][lang]) for lang, forms in languages.iteritems()}
genders = dict( (gender, languages) for gender in self.genders)
return Name(self.native_language, {'genders': genders})
@ -92,7 +111,7 @@ class FromTablesGenerator(BaseGenerator):
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) )
raise exceptions.WrongTemplateStructureError(genders=genders, soruce=self.SOURCE)
def get_name_simple(self, gender=GENDER.MALE, language=LANGUAGE.NATIVE):
name = self.get_name(genders=[gender])

View file

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

View file

@ -4,7 +4,7 @@
"native_language": "en",
"languages": ["en", "ru"],
"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": "Adalstein", "ru": "Адалстейн", "ru_ext": "Адалстėн"}}},
{"genders": {"m": {"en": "Adils", "ru": "Адилс", "ru_ext": "Адилс"}}},

View file

@ -1,4 +1,6 @@
# 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 *

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"}},
{"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": "'"}}]}
}
}

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
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_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():
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'])