gh-12 Сформировать пакет и выложить в PyPI

This commit is contained in:
Tiendil 2015-06-07 20:37:30 +03:00
parent e276a08467
commit bc496f64be
8 changed files with 188 additions and 159 deletions

1
.gitignore vendored
View file

@ -1,3 +1,4 @@
*.pyc
*~
*.egg-info
dist

View file

@ -1,2 +1,3 @@
global-include *.json
global-include *.csv
global-include *.rst

135
README.md
View file

@ -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
View 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

View file

@ -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

View file

@ -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:
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')

View file

@ -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 = []

View file

@ -3,16 +3,31 @@ import setuptools
setuptools.setup(
name='Pynames',
version = '0.1.0',
author = 'Aleksey Yeletsky',
author_email = 'a.eletsky@gmail.com',
packages = setuptools.find_packages(),
version='0.2.0',
description='name generation library',
long_description = open('README.rst').read(),
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
test_suite = 'tests',
author='Aleksey Yeletsky <Tiendil>',
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'],
# package_data = { '': ['*.json'] }
include_package_data=True,
test_suite = 'tests',
)