diff --git a/pynames/base.py b/pynames/base.py new file mode 100644 index 0000000..fc01ba2 --- /dev/null +++ b/pynames/base.py @@ -0,0 +1,5 @@ +# coding: utf-8 + + +class BaseGenerator(object): + pass diff --git a/pynames/elven/fixtures/dnd_names_tables.json b/pynames/elven/fixtures/dnd_names_tables.json index 393597b..f5eb38a 100644 --- a/pynames/elven/fixtures/dnd_names_tables.json +++ b/pynames/elven/fixtures/dnd_names_tables.json @@ -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": "аер"}}, diff --git a/pynames/exceptions.py b/pynames/exceptions.py new file mode 100644 index 0000000..51a8d56 --- /dev/null +++ b/pynames/exceptions.py @@ -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]' diff --git a/pynames/from_list_generator.py b/pynames/from_list_generator.py index 55517bb..8232c46 100644 --- a/pynames/from_list_generator.py +++ b/pynames/from_list_generator.py @@ -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): diff --git a/pynames/from_tables_generator.py b/pynames/from_tables_generator.py index 9e9f791..d72c4fd 100644 --- a/pynames/from_tables_generator.py +++ b/pynames/from_tables_generator.py @@ -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]) diff --git a/pynames/generators.py b/pynames/names.py similarity index 59% rename from pynames/generators.py rename to pynames/names.py index 1216e76..6ebd6e2 100644 --- a/pynames/generators.py +++ b/pynames/names.py @@ -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__() diff --git a/pynames/scandinavian/fixtures/scandinavian_names_list.json b/pynames/scandinavian/fixtures/scandinavian_names_list.json index 8ce5f13..4bea0b9 100644 --- a/pynames/scandinavian/fixtures/scandinavian_names_list.json +++ b/pynames/scandinavian/fixtures/scandinavian_names_list.json @@ -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": "Адилс"}}}, diff --git a/pynames/tests/__init__.py b/pynames/tests/__init__.py index 958b740..7aa2008 100644 --- a/pynames/tests/__init__.py +++ b/pynames/tests/__init__.py @@ -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 * diff --git a/pynames/tests/fixtures/test_from_list_generator__with_forms.json b/pynames/tests/fixtures/test_from_list_generator__with_forms.json new file mode 100644 index 0000000..be5c741 --- /dev/null +++ b/pynames/tests/fixtures/test_from_list_generator__with_forms.json @@ -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"}}} + ] +} diff --git a/pynames/tests/fixtures/test_from_tables_generator.json b/pynames/tests/fixtures/test_from_tables_generator.json index 7d1d3f4..cc8fc08 100644 --- a/pynames/tests/fixtures/test_from_tables_generator.json +++ b/pynames/tests/fixtures/test_from_tables_generator.json @@ -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": "'"}}]} -} \ No newline at end of file +} diff --git a/pynames/tests/test.py b/pynames/tests/test.py deleted file mode 100644 index 9d8dc48..0000000 --- a/pynames/tests/test.py +++ /dev/null @@ -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) diff --git a/pynames/tests/test_from_list_generator.py b/pynames/tests/test_from_list_generator.py new file mode 100644 index 0000000..35b7e10 --- /dev/null +++ b/pynames/tests/test_from_list_generator.py @@ -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) diff --git a/pynames/tests/test_from_tables_generator.py b/pynames/tests/test_from_tables_generator.py new file mode 100644 index 0000000..6a53e28 --- /dev/null +++ b/pynames/tests/test_from_tables_generator.py @@ -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) diff --git a/pynames/tests/test_generators.py b/pynames/tests/test_generators.py index f75082d..d08abff 100644 --- a/pynames/tests/test_generators.py +++ b/pynames/tests/test_generators.py @@ -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 = [] diff --git a/pynames/tests/test_name.py b/pynames/tests/test_name.py new file mode 100644 index 0000000..19182c0 --- /dev/null +++ b/pynames/tests/test_name.py @@ -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'])