mirror of
https://github.com/Tiendil/pynames.git
synced 2025-09-21 20:30:48 +02:00
name forms
This commit is contained in:
parent
7c92b5d193
commit
9254045ec1
15 changed files with 351 additions and 159 deletions
5
pynames/base.py
Normal file
5
pynames/base.py
Normal file
|
@ -0,0 +1,5 @@
|
|||
# coding: utf-8
|
||||
|
||||
|
||||
class BaseGenerator(object):
|
||||
pass
|
|
@ -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
30
pynames/exceptions.py
Normal 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]'
|
|
@ -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):
|
||||
|
|
|
@ -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])
|
||||
|
|
|
@ -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__()
|
|
@ -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": "Адилс"}}},
|
||||
|
|
|
@ -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 *
|
||||
|
|
28
pynames/tests/fixtures/test_from_list_generator__with_forms.json
vendored
Normal file
28
pynames/tests/fixtures/test_from_list_generator__with_forms.json
vendored
Normal 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"}}}
|
||||
]
|
||||
}
|
|
@ -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": "'"}}]}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
89
pynames/tests/test_from_list_generator.py
Normal file
89
pynames/tests/test_from_list_generator.py
Normal 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)
|
93
pynames/tests/test_from_tables_generator.py
Normal file
93
pynames/tests/test_from_tables_generator.py
Normal 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)
|
|
@ -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 = []
|
||||
|
|
41
pynames/tests/test_name.py
Normal file
41
pynames/tests/test_name.py
Normal 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'])
|
Loading…
Add table
Add a link
Reference in a new issue