mirror of
https://github.com/Tiendil/pynames.git
synced 2025-09-22 04:40:47 +02:00
gh-12 Сформировать пакет и выложить в PyPI
This commit is contained in:
parent
e276a08467
commit
bc496f64be
8 changed files with 188 additions and 159 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1,3 +1,4 @@
|
||||||
*.pyc
|
*.pyc
|
||||||
*~
|
*~
|
||||||
*.egg-info
|
*.egg-info
|
||||||
|
dist
|
||||||
|
|
|
@ -1,2 +1,3 @@
|
||||||
global-include *.json
|
global-include *.json
|
||||||
global-include *.csv
|
global-include *.csv
|
||||||
|
global-include *.rst
|
135
README.md
135
README.md
|
@ -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]
|
|
||||||
```
|
|
124
README.rst
Normal file
124
README.rst
Normal file
|
@ -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
|
|
@ -1 +1,13 @@
|
||||||
# coding: utf-8
|
# 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
|
||||||
|
|
|
@ -7,14 +7,20 @@ import unittest
|
||||||
from pynames.utils import is_file, file_adapter
|
from pynames.utils import is_file, file_adapter
|
||||||
import pynames
|
import pynames
|
||||||
|
|
||||||
|
DJANGO_INSTALLED = False
|
||||||
|
|
||||||
|
UploadedFile = None
|
||||||
|
File = None
|
||||||
|
ContentFile = None
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from django.core.files import File
|
from django.core.files import File
|
||||||
from django.core.files.base import ContentFile
|
from django.core.files.base import ContentFile
|
||||||
from django.core.files.uploadedfile import UploadedFile
|
from django.core.files.uploadedfile import UploadedFile
|
||||||
except:
|
|
||||||
UploadedFile = None
|
DJANGO_INSTALLED = True
|
||||||
File = None
|
except ImportError:
|
||||||
ContentFile = None
|
pass
|
||||||
|
|
||||||
|
|
||||||
class TestName(unittest.TestCase):
|
class TestName(unittest.TestCase):
|
||||||
|
@ -25,12 +31,17 @@ class TestName(unittest.TestCase):
|
||||||
some_file.close()
|
some_file.close()
|
||||||
|
|
||||||
def test_is_file_on_django_files(self):
|
def test_is_file_on_django_files(self):
|
||||||
if File and UploadedFile and ContentFile:
|
if not DJANGO_INSTALLED:
|
||||||
self.assertTrue(is_file(UploadedFile('mock')))
|
return
|
||||||
self.assertTrue(is_file(File('mock')))
|
|
||||||
self.assertTrue(is_file(ContentFile('mock')))
|
self.assertTrue(is_file(UploadedFile('mock')))
|
||||||
|
self.assertTrue(is_file(File('mock')))
|
||||||
|
self.assertTrue(is_file(ContentFile('mock')))
|
||||||
|
|
||||||
def test_file_adapter(self):
|
def test_file_adapter(self):
|
||||||
|
if not DJANGO_INSTALLED:
|
||||||
|
return
|
||||||
|
|
||||||
root_dir = os.path.dirname(pynames.__file__)
|
root_dir = os.path.dirname(pynames.__file__)
|
||||||
|
|
||||||
test_file_path = os.path.join(root_dir, 'tests', 'fixtures', 'test_from_list_generator.json')
|
test_file_path = os.path.join(root_dir, 'tests', 'fixtures', 'test_from_list_generator.json')
|
||||||
|
|
|
@ -8,9 +8,9 @@ import os
|
||||||
|
|
||||||
def get_all_generators():
|
def get_all_generators():
|
||||||
|
|
||||||
from pynames.base import BaseGenerator
|
from .base import BaseGenerator
|
||||||
from pynames.from_list_generator import FromListGenerator
|
from .from_list_generator import FromListGenerator
|
||||||
from pynames.from_tables_generator import FromTablesGenerator, FromCSVTablesGenerator
|
from .from_tables_generator import FromTablesGenerator, FromCSVTablesGenerator
|
||||||
|
|
||||||
submodules = []
|
submodules = []
|
||||||
|
|
||||||
|
|
41
setup.py
41
setup.py
|
@ -2,17 +2,32 @@
|
||||||
import setuptools
|
import setuptools
|
||||||
|
|
||||||
setuptools.setup(
|
setuptools.setup(
|
||||||
name = 'Pynames',
|
name='Pynames',
|
||||||
version = '0.1.0',
|
version='0.2.0',
|
||||||
author = 'Aleksey Yeletsky',
|
description='name generation library',
|
||||||
author_email = 'a.eletsky@gmail.com',
|
long_description = open('README.rst').read(),
|
||||||
packages = setuptools.find_packages(),
|
url='https://github.com/Tiendil/pynames',
|
||||||
url = 'https://github.com/Tiendil/pynames',
|
author='Aleksey Yeletsky <Tiendil>',
|
||||||
license = 'LICENSE',
|
author_email='a.eletsky@gmail.com',
|
||||||
description = "characters' name generation library",
|
license='BSD',
|
||||||
long_description = open('README.md').read(),
|
classifiers=[
|
||||||
include_package_data = True, # setuptools-git MUST be installed
|
'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',
|
test_suite = 'tests',
|
||||||
install_requires = ['unicodecsv'],
|
)
|
||||||
# package_data = { '': ['*.json'] }
|
|
||||||
)
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue