diff --git a/.gitignore b/.gitignore index 9ed3439..f25c2db 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ *.pyc *~ *.egg-info +dist diff --git a/MANIFEST.in b/MANIFEST.in index 69f9392..4ad42ee 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,2 +1,3 @@ global-include *.json global-include *.csv +global-include *.rst \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index 874ca57..0000000 --- a/README.md +++ /dev/null @@ -1,135 +0,0 @@ -# PYNAMES - библиотека для генерации имён - -**Name generation library - [see English description here](https://github.com/Tiendil/pynames/wiki/EN_README)** - -Основное назначение библиотеки - генерация имён персонажей в играх. Например, эльфийски, дварфских, корейских, монгольских, в общем - любых. - -Библиотека легко расширяема, если Вам нужен дополнительный функционал (или дополнительные языки), свяжитесь со мной (или просто запостите issue), а лучше реализуейте и сделайте pull-запрос. - -## Пример использования - -```python -from pynames.generators import GENDER, LANGUAGE -``` - -Все генераторы разбиты по языкам (или по рассам), так, что все генераторы эльфийских имён находятся в модуле pynames.elven - -```python -from pynames.elven import DnDNamesGenerator -elven_generator = DnDNamesGenerator() -``` - -количество различных имён (мужских и женских) и для каждого пола в отдельности - -```python -In [4]: elven_generator.get_names_number() -Out[4]: 1952949936 - -In [5]: elven_generator.get_names_number(GENDER.MALE) -Out[5]: 976474968 - -In [6]: elven_generator.get_names_number(GENDER.FEMALE) -Out[6]: 976474968 -``` - -Быстрое получение просто случайного имени - -```python -In [7]: elven_generator.get_name_simple() -Out[7]: u'Elineer' - -In [8]: elven_generator.get_name_simple(GENDER.MALE) -Out[8]: u'Caslithdar' - -In [9]: elven_generator.get_name_simple(GENDER.MALE, LANGUAGE.EN) # English transcription -Out[9]: u'Mararon' - -In [10]: print elven_generator.get_name_simple(GENDER.MALE, LANGUAGE.RU) # Russian transcription -Ттомусиэл -``` - -Вместо текста можно получить объект имени с подробной информацией. - -Для имён на кирилице есть формы всех падажей и чисел. - -```python -In [11]: name = elven_generator.get_name() - -In [12]: name.translations # all translations -Out[12]: -{u'm': {u'en': u"rae'Gileleel", - u'ru': [u"\u0440\u0430\u044d'\u0413\u0438\u043b\u044c\u0435\u043b\u044d\u0435\u043b\u044c", - u"\u0440\u0430\u044d'\u0413\u0438\u043b\u044c\u0435\u043b\u044d\u0435\u043b\u044f", - u"\u0440\u0430\u044d'\u0413\u0438\u043b\u044c\u0435\u043b\u044d\u0435\u043b\u044e", - u"\u0440\u0430\u044d'\u0413\u0438\u043b\u044c\u0435\u043b\u044d\u0435\u043b\u044f", - u"\u0440\u0430\u044d'\u0413\u0438\u043b\u044c\u0435\u043b\u044d\u0435\u043b\u0435\u043c", - u"\u0440\u0430\u044d'\u0413\u0438\u043b\u044c\u0435\u043b\u044d\u0435\u043b\u0435", - u"\u0440\u0430\u044d'\u0413\u0438\u043b\u044c\u0435\u043b\u044d\u0435\u043b\u0438", - u"\u0440\u0430\u044d'\u0413\u0438\u043b\u044c\u0435\u043b\u044d\u0435\u043b\u0435\u0439", - u"\u0440\u0430\u044d'\u0413\u0438\u043b\u044c\u0435\u043b\u044d\u0435\u043b\u044f\u043c", - u"\u0440\u0430\u044d'\u0413\u0438\u043b\u044c\u0435\u043b\u044d\u0435\u043b\u0435\u0439", - u"\u0440\u0430\u044d'\u0413\u0438\u043b\u044c\u0435\u043b\u044d\u0435\u043b\u044f\u043c\u0438", - u"\u0440\u0430\u044d'\u0413\u0438\u043b\u044c\u0435\u043b\u044d\u0435\u043b\u044f\u0445"]}} - -In [13]: name.genders -Out[13]: frozenset({u'm'}) # all genders -``` - -На текущий момент реализовано два алгоритма генерации имён: - -* выбор из списка - в основном для реальных народов (например, русские языческие имена) -* табличная генерация - составление имён из частей - -Сущестующие генераторы: - -* pynames.elven.DnDNamesGenerator -* pynames.elven.WarhammerNamesGenerator -* pynames.goblin.GobberFullnameGenerator -* pynames.goblin.GoblinGenerator -* pynames.iron_kingdoms.CaspianMidlunderSuleseFullnameGenerator -* pynames.iron_kingdoms.DwarfFullnameGenerator -* pynames.iron_kingdoms.GobberFullnameGenerator == pynames.goblin.GobberFullnameGenerator -* pynames.iron_kingdoms.IossanNyssFullnameGenerator -* pynames.iron_kingdoms.KhadoranFullnameGenerator -* pynames.iron_kingdoms.OgrunFullnameGenerator -* pynames.iron_kingdoms.RynFullnameGenerator -* pynames.iron_kingdoms.ThurianMorridaneFullnameGenerator -* pynames.iron_kingdoms.TordoranFullnameGenerator -* pynames.iron_kingdoms.TrollkinFullnameGenerator -* pynames.korean.KoreanNamesGenerator -* pynames.mongolian.MongolianNamesGenerator -* pynames.orc.OrcNamesGenerator -* pynames.russian.PaganNamesGenerator -* pynames.scandinavian.ScandinavianNamesGenerator - - -Можно получить список всех классов генераторов следующим образом: - -```python -In [1]: from pynames.utils import get_all_generators - -In [2]: get_all_generators() -Out[2]: -[pynames.elven.DnDNamesGenerator, - pynames.elven.WarhammerNamesGenerator, - pynames.iron_kingdoms.OgrunFullnameGenerator, - pynames.iron_kingdoms.ThurianMorridaneFullnameGenerator, - pynames.iron_kingdoms.TordoranFullnameGenerator, - pynames.iron_kingdoms.RynFullnameGenerator, - pynames.iron_kingdoms.KhadoranFullnameGenerator, - pynames.iron_kingdoms.ThurianMorridaneFullnameGenerator, - pynames.iron_kingdoms.TrollkinFullnameGenerator, - pynames.iron_kingdoms.IossanNyssFullnameGenerator, - pynames.iron_kingdoms.CaspianMidlunderSuleseFullnameGenerator, - pynames.iron_kingdoms.GobberFullnameGenerator, - pynames.iron_kingdoms.ThurianMorridaneFullnameGenerator, - pynames.iron_kingdoms.DwarfFullnameGenerator, - pynames.russian.PaganNamesGenerator, - pynames.orc.OrcNamesGenerator, - pynames.scandinavian.ScandinavianNamesGenerator, - pynames.korean.KoreanNamesGenerator, - pynames.mongolian.MongolianNamesGenerator, - pynames.goblin.GoblinGenerator, - pynames.iron_kingdoms.GobberFullnameGenerator, - pynames.korean.KoreanNamesGenerator] -``` diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..fbb30ac --- /dev/null +++ b/README.rst @@ -0,0 +1,124 @@ +================================== +PYNAMES — names generation library +================================== + +Pynames intended for generation of all sorts of names. Currently it implements generators for character names of different races and cultures: + +* Scandinavian: traditional names; +* Russian: pagan names; +* Mongolian: traditional names; +* Korean: traditional names; +* Elven: DnD names; +* Elven: Warhammer names; +* Goblins: custom names; +* Orcs: custom names; +* Iron Kingdoms: caspian midlunder sulese; +* Iron Kingdoms: dwarf; +* Iron Kingdoms: gobber; +* Iron Kingdoms: iossan nyss; +* Iron Kingdoms: khadoran; +* Iron Kingdoms: ogrun; +* Iron Kingdoms: ryn; +* Iron Kingdoms: thurian morridane; +* Iron Kingdoms: tordoran; +* Iron Kingdoms: trollkin. + +There are two supported languages : English & Russian. Russian language names are generated with forms for every case of a noun and time. + +Currently implemented two generation algorithms: + +* ``pynames.from_list_generator`` — names are created from list of predefined words; +* ``pynames.from_table_generator`` — names are created using templates, every part of template is gotten from separate table; + +The library is easily extensible. If you need extra functionality (including new languages), please, contact me, post an issue, or just make a pull request. + +************* +Installation +************* + +:: + + pip install pynames + +************* +Usage +************* + +.. code:: python + + from pynames.generators import GENDER, LANGUAGE + +All generators are divided by "races", so that all generators of elven names are placed in the module ``pynames.generators.elven``, etc. + +.. code:: python + + from pynames.generators.elven import DnDNamesGenerator + elven_generator = DnDNamesGenerator() + +Number of different names (male and female) and for each gender separately. + +.. code:: python + + In [4]: elven_generator.get_names_number() + Out[4]: 1952949936 + + In [5]: elven_generator.get_names_number(GENDER.MALE) + Out[5]: 976474968 + + In [6]: elven_generator.get_names_number(GENDER.FEMALE) + Out[6]: 976474968 + +Fast random name generation. + +.. code:: python + + In [7]: elven_generator.get_name_simple() + Out[7]: u'Elineer' + + In [8]: elven_generator.get_name_simple(GENDER.MALE) + Out[8]: u'Caslithdar' + + In [9]: elven_generator.get_name_simple(GENDER.MALE, LANGUAGE.EN) # English + Out[9]: u'Mararon' + + In [10]: print elven_generator.get_name_simple(GENDER.MALE, LANGUAGE.RU) # Russian + Ттомусиэл + +Instead of text, you can get the Name object with additional functionality. + +.. code:: python + + In [11]: name = elven_generator.get_name() + + In [12]: name.translations # all translations + Out[12]: + {u'm': {u'en': u"ae'Angaithnyn", + u'ru': [u"\u0430\u044d'\u0410\u043d\u0433\u0430\u0438\u0442\u0442\u043d\u0438\u0438\u043d", + u"\u0430\u044d'\u0410\u043d\u0433\u0430\u0438\u0442\u0442\u043d\u0438\u0438\u043d\u0430", + u"\u0430\u044d'\u0410\u043d\u0433\u0430\u0438\u0442\u0442\u043d\u0438\u0438\u043d\u0443", + u"\u0430\u044d'\u0410\u043d\u0433\u0430\u0438\u0442\u0442\u043d\u0438\u0438\u043d\u0430", + u"\u0430\u044d'\u0410\u043d\u0433\u0430\u0438\u0442\u0442\u043d\u0438\u0438\u043d\u043e\u043c", + u"\u0430\u044d'\u0410\u043d\u0433\u0430\u0438\u0442\u0442\u043d\u0438\u0438\u043d\u0435", + u"\u0430\u044d'\u0410\u043d\u0433\u0430\u0438\u0442\u0442\u043d\u0438\u0438\u043d\u044b", + u"\u0430\u044d'\u0410\u043d\u0433\u0430\u0438\u0442\u0442\u043d\u0438\u0438\u043d\u043e\u0432", + u"\u0430\u044d'\u0410\u043d\u0433\u0430\u0438\u0442\u0442\u043d\u0438\u0438\u043d\u0430\u043c", + u"\u0430\u044d'\u0410\u043d\u0433\u0430\u0438\u0442\u0442\u043d\u0438\u0438\u043d\u043e\u0432", + u"\u0430\u044d'\u0410\u043d\u0433\u0430\u0438\u0442\u0442\u043d\u0438\u0438\u043d\u0430\u043c\u0438", + u"\u0430\u044d'\u0410\u043d\u0433\u0430\u0438\u0442\u0442\u043d\u0438\u0438\u043d\u0430\u0445"]}} + + In [13]: print u'\n'.join(name.get_forms_for(GENDER.MALE, language=LANGUAGE.RU)) + аэ'Ангаиттниин + аэ'Ангаиттниина + аэ'Ангаиттниину + аэ'Ангаиттниина + аэ'Ангаиттниином + аэ'Ангаиттниине + аэ'Ангаиттниины + аэ'Ангаиттниинов + аэ'Ангаиттниинам + аэ'Ангаиттниинов + аэ'Ангаиттниинами + аэ'Ангаиттниинах + + In [14]: name.genders + Out[14]: frozenset({u'm'}) # all genders diff --git a/pynames/generators/__init__.py b/pynames/generators/__init__.py index 57d631c..53871df 100644 --- a/pynames/generators/__init__.py +++ b/pynames/generators/__init__.py @@ -1 +1,13 @@ # coding: utf-8 +import os +import pkgutil +import importlib + +__all__ = [] + +generators_root = os.path.os.path.split(os.path.abspath(__file__))[0] + +for _, module_name, _ in pkgutil.iter_modules([generators_root]): + module = importlib.import_module('pynames.generators.' + module_name) + __all__.append(module_name) + globals()[module_name] = module diff --git a/pynames/tests/test_utils.py b/pynames/tests/test_utils.py index 8407e74..acab40a 100644 --- a/pynames/tests/test_utils.py +++ b/pynames/tests/test_utils.py @@ -7,14 +7,20 @@ import unittest from pynames.utils import is_file, file_adapter import pynames +DJANGO_INSTALLED = False + +UploadedFile = None +File = None +ContentFile = None + try: from django.core.files import File from django.core.files.base import ContentFile from django.core.files.uploadedfile import UploadedFile -except: - UploadedFile = None - File = None - ContentFile = None + + DJANGO_INSTALLED = True +except ImportError: + pass class TestName(unittest.TestCase): @@ -25,12 +31,17 @@ class TestName(unittest.TestCase): some_file.close() def test_is_file_on_django_files(self): - if File and UploadedFile and ContentFile: - self.assertTrue(is_file(UploadedFile('mock'))) - self.assertTrue(is_file(File('mock'))) - self.assertTrue(is_file(ContentFile('mock'))) + if not DJANGO_INSTALLED: + return + + self.assertTrue(is_file(UploadedFile('mock'))) + self.assertTrue(is_file(File('mock'))) + self.assertTrue(is_file(ContentFile('mock'))) def test_file_adapter(self): + if not DJANGO_INSTALLED: + return + root_dir = os.path.dirname(pynames.__file__) test_file_path = os.path.join(root_dir, 'tests', 'fixtures', 'test_from_list_generator.json') diff --git a/pynames/utils.py b/pynames/utils.py index a64d628..b7865e8 100644 --- a/pynames/utils.py +++ b/pynames/utils.py @@ -8,9 +8,9 @@ import os def get_all_generators(): - from pynames.base import BaseGenerator - from pynames.from_list_generator import FromListGenerator - from pynames.from_tables_generator import FromTablesGenerator, FromCSVTablesGenerator + from .base import BaseGenerator + from .from_list_generator import FromListGenerator + from .from_tables_generator import FromTablesGenerator, FromCSVTablesGenerator submodules = [] diff --git a/setup.py b/setup.py index 017bbe2..a5e70ad 100644 --- a/setup.py +++ b/setup.py @@ -2,17 +2,32 @@ import setuptools setuptools.setup( - name = 'Pynames', - version = '0.1.0', - author = 'Aleksey Yeletsky', - author_email = 'a.eletsky@gmail.com', - packages = setuptools.find_packages(), - url = 'https://github.com/Tiendil/pynames', - license = 'LICENSE', - description = "characters' name generation library", - long_description = open('README.md').read(), - include_package_data = True, # setuptools-git MUST be installed + name='Pynames', + version='0.2.0', + description='name generation library', + long_description = open('README.rst').read(), + url='https://github.com/Tiendil/pynames', + author='Aleksey Yeletsky ', + author_email='a.eletsky@gmail.com', + license='BSD', + classifiers=[ + 'Development Status :: 5 - Production/Stable', + + 'Intended Audience :: Developers', + + 'Topic :: Games/Entertainment', + 'Topic :: Software Development :: Libraries :: Python Modules', + + 'License :: OSI Approved :: BSD License', + + 'Programming Language :: Python :: 2', + 'Programming Language :: Python :: 2.7', + + 'Natural Language :: English', + 'Natural Language :: Russian'], + keywords=['gamedev', 'game', 'game development', 'names', 'names generation'], + packages=setuptools.find_packages(), + install_requires=['unicodecsv'], + include_package_data=True, test_suite = 'tests', - install_requires = ['unicodecsv'], - # package_data = { '': ['*.json'] } -) + )