mirror of
https://github.com/Tiendil/pynames.git
synced 2025-09-22 04:40:47 +02:00
Merge pull request #4 from imposeren/ironkingdoms
гобберы, огруны, тролкины и прочие из IronKingdoms; FromCSVTablesGenerator
This commit is contained in:
commit
219b810cfe
30 changed files with 1089 additions and 57 deletions
|
@ -1 +1,2 @@
|
||||||
global-include *.json
|
global-include *.json
|
||||||
|
global-include *.csv
|
||||||
|
|
|
@ -7,3 +7,4 @@ import pynames.korean
|
||||||
import pynames.russian
|
import pynames.russian
|
||||||
|
|
||||||
from pynames.relations import GENDER, LANGUAGE
|
from pynames.relations import GENDER, LANGUAGE
|
||||||
|
from pynames.utils import get_all_generators
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
# coding: utf-8
|
# coding: utf-8
|
||||||
|
|
||||||
|
|
||||||
class PynamesError(Exception):
|
class PynamesError(Exception):
|
||||||
MSG = None
|
MSG = None
|
||||||
|
|
||||||
|
@ -7,7 +8,6 @@ class PynamesError(Exception):
|
||||||
super(PynamesError, self).__init__(self.MSG % kwargs)
|
super(PynamesError, self).__init__(self.MSG % kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class NoDefaultNameValue(PynamesError):
|
class NoDefaultNameValue(PynamesError):
|
||||||
MSG = u'Name: can not get default value for name with data: %(raw_data)r'
|
MSG = u'Name: can not get default value for name with data: %(raw_data)r'
|
||||||
|
|
||||||
|
@ -15,6 +15,7 @@ class NoDefaultNameValue(PynamesError):
|
||||||
class FromListGeneratorError(PynamesError):
|
class FromListGeneratorError(PynamesError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class NoNamesLoadedFromListError(FromListGeneratorError):
|
class NoNamesLoadedFromListError(FromListGeneratorError):
|
||||||
MSG = u'no names loaded from "%(source)s"'
|
MSG = u'no names loaded from "%(source)s"'
|
||||||
|
|
||||||
|
@ -22,9 +23,16 @@ class NoNamesLoadedFromListError(FromListGeneratorError):
|
||||||
class FromTablesGeneratorError(PynamesError):
|
class FromTablesGeneratorError(PynamesError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class WrongTemplateStructureError(FromTablesGeneratorError):
|
class WrongTemplateStructureError(FromTablesGeneratorError):
|
||||||
MSG = u'wrong template structure - cannot choose template for genders %(genders)r with template source: "%(source)s"'
|
MSG = u'wrong template structure - cannot choose template for genders %(genders)r with template source: "%(source)s"'
|
||||||
|
|
||||||
|
|
||||||
class NotEqualFormsLengths(FromTablesGeneratorError):
|
class NotEqualFormsLengths(FromTablesGeneratorError):
|
||||||
MSG = u'not equal forms lengths: [%(left)r] and [%(right)r]'
|
MSG = u'not equal forms lengths: [%(left)r] and [%(right)r]'
|
||||||
|
|
||||||
|
|
||||||
|
class WrongCSVData(FromTablesGeneratorError):
|
||||||
|
def __init__(self, msg, **kwargs):
|
||||||
|
self.MSG = msg
|
||||||
|
super(WrongCSVData, self).__init__(**kwargs)
|
||||||
|
|
|
@ -1,11 +1,19 @@
|
||||||
# coding: utf-8
|
# coding: utf-8
|
||||||
|
|
||||||
|
# python lib:
|
||||||
import json
|
import json
|
||||||
import random
|
import random
|
||||||
|
from collections import Iterable
|
||||||
|
|
||||||
from pynames.relations import GENDER, LANGUAGE, LANGUAGE_FORMS_LANGTH
|
# thirdparties:
|
||||||
from pynames.names import Name
|
import unicodecsv
|
||||||
from pynames.base import BaseGenerator
|
|
||||||
|
# pynames:
|
||||||
from pynames import exceptions
|
from pynames import exceptions
|
||||||
|
from pynames.base import BaseGenerator
|
||||||
|
from pynames.names import Name
|
||||||
|
from pynames.relations import GENDER, LANGUAGE, LANGUAGE_FORMS_LANGTH
|
||||||
|
from pynames.utils import is_file
|
||||||
|
|
||||||
|
|
||||||
class Template(object):
|
class Template(object):
|
||||||
|
@ -45,37 +53,66 @@ class Template(object):
|
||||||
return left + right
|
return left + right
|
||||||
|
|
||||||
def get_name(self, tables):
|
def get_name(self, tables):
|
||||||
languages = dict( (lang, u'') for lang in self.languages)
|
languages = dict(
|
||||||
|
(lang, u'') for lang in self.languages
|
||||||
|
)
|
||||||
for slug in self.template:
|
for slug in self.template:
|
||||||
record = random.choice(tables[slug])
|
record = random.choice(tables[slug])
|
||||||
languages = { lang:self.merge_forms(forms, record['languages'][lang]) for lang, forms in languages.iteritems()}
|
languages = {
|
||||||
|
lang: self.merge_forms(forms, record['languages'][lang])
|
||||||
|
for lang, forms in languages.iteritems()
|
||||||
|
}
|
||||||
|
|
||||||
genders = dict( (gender, languages) for gender in self.genders)
|
genders = dict(
|
||||||
|
(gender, languages)
|
||||||
|
for gender in self.genders
|
||||||
|
)
|
||||||
|
|
||||||
return Name(self.native_language, {'genders': genders})
|
return Name(self.native_language, {'genders': genders})
|
||||||
|
|
||||||
|
def __eq__(self, other):
|
||||||
|
return (
|
||||||
|
self.native_language == other.native_language
|
||||||
|
and self.languages == other.languages
|
||||||
|
and self.probability == other.probability
|
||||||
|
and self.genders == other.genders
|
||||||
|
and self.template == other.template
|
||||||
|
)
|
||||||
|
|
||||||
|
def __hash__(self):
|
||||||
|
return hash((self.native_language, self.languages, self.probability, self.genders, ';'.join(self.template)))
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return "<pynames.from_tables_generator.Template: %s=%s>" % (self.name, self.template)
|
||||||
|
|
||||||
|
|
||||||
class FromTablesGenerator(BaseGenerator):
|
class FromTablesGenerator(BaseGenerator):
|
||||||
|
|
||||||
SOURCE = None
|
SOURCE = None
|
||||||
|
AUTOLOAD = True # you may want to set ``AUTOLOAD = False`` when subclassing table-based generator to skip soruce loading on init
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(FromTablesGenerator, self).__init__()
|
super(FromTablesGenerator, self).__init__()
|
||||||
self.templates_choices = {}
|
self.templates_choices = {}
|
||||||
self.templates = []
|
self.templates = []
|
||||||
self.tables = {}
|
self.tables = {}
|
||||||
|
if self.AUTOLOAD:
|
||||||
|
self.source_loader(self.SOURCE)
|
||||||
|
|
||||||
if self.SOURCE is None:
|
def source_loader(self, source):
|
||||||
|
if source is None:
|
||||||
error_msg = 'FromTablesGenerator: you must make subclass of FromTablesGenerator and define attribute SOURCE in it.'
|
error_msg = 'FromTablesGenerator: you must make subclass of FromTablesGenerator and define attribute SOURCE in it.'
|
||||||
raise NotImplementedError(error_msg)
|
raise NotImplementedError(error_msg)
|
||||||
|
|
||||||
with open(self.SOURCE) as f:
|
with open(source) as f:
|
||||||
data = json.load(f)
|
data = json.load(f)
|
||||||
self.native_language = data['native_language']
|
self.native_language = data['native_language']
|
||||||
self.languages = set(data['languages'])
|
self.languages = set(data['languages'])
|
||||||
self.full_forms_for_languages = set(data.get('full_forms_for_languages', set()))
|
self.full_forms_for_languages = set(data.get('full_forms_for_languages', set()))
|
||||||
self.templates = [ Template(template_name, self.native_language, self.languages, template_data)
|
self.templates = [
|
||||||
for template_name, template_data in data['templates'].items() ]
|
Template(template_name, self.native_language, self.languages, template_data)
|
||||||
|
for template_name, template_data in data['templates'].items()
|
||||||
|
]
|
||||||
self.tables = data['tables']
|
self.tables = data['tables']
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
@ -94,7 +131,6 @@ class FromTablesGenerator(BaseGenerator):
|
||||||
def _get_names_number_for_template(self):
|
def _get_names_number_for_template(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
def get_names_number(self, genders=GENDER.ALL):
|
def get_names_number(self, genders=GENDER.ALL):
|
||||||
templates = self._get_templates_slice(genders)
|
templates = self._get_templates_slice(genders)
|
||||||
number = sum([template.get_names_number(self.tables) for template in templates])
|
number = sum([template.get_names_number(self.tables) for template in templates])
|
||||||
|
@ -129,3 +165,147 @@ class FromTablesGenerator(BaseGenerator):
|
||||||
for record in self.tables[last_table]:
|
for record in self.tables[last_table]:
|
||||||
test.assertTrue(isinstance(record['languages'][language], list))
|
test.assertTrue(isinstance(record['languages'][language], list))
|
||||||
test.assertEqual(len(record['languages'][language]), LANGUAGE_FORMS_LANGTH[language])
|
test.assertEqual(len(record['languages'][language]), LANGUAGE_FORMS_LANGTH[language])
|
||||||
|
|
||||||
|
|
||||||
|
class FromCSVTablesGenerator(FromTablesGenerator):
|
||||||
|
|
||||||
|
"""Variation of :py:calss:`FromTablesGenerator` that accepts path to 3 csv files as SOURCE.
|
||||||
|
|
||||||
|
Read docs of :py:meth:`source_loader` for more details.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
def source_loader(self, source_paths, create_missing_tables=True):
|
||||||
|
"""Load source from 3 csv files.
|
||||||
|
|
||||||
|
First file should contain global settings:
|
||||||
|
|
||||||
|
* ``native_lagnauge,languages`` header on first row
|
||||||
|
* appropriate values on following rows
|
||||||
|
|
||||||
|
Example::
|
||||||
|
|
||||||
|
native_lagnauge,languages
|
||||||
|
ru,ru
|
||||||
|
,en
|
||||||
|
|
||||||
|
Second file should contain templates:
|
||||||
|
|
||||||
|
* ``template_name,probability,genders,template`` header on first row
|
||||||
|
* appropriate values on following rows (separate values with semicolon ";" in template column)
|
||||||
|
|
||||||
|
Example::
|
||||||
|
|
||||||
|
template_name,probability,genders,template
|
||||||
|
male_1,5,m,prefixes;male_suffixes
|
||||||
|
baby_1,1,m;f,prefixes;descriptive
|
||||||
|
|
||||||
|
Third file should contain tables with values for template slugs in all languages:
|
||||||
|
|
||||||
|
* first row should contain slugs with language code after colon for each
|
||||||
|
* appropriate values on following rows. Multiple forms may be specified using semicolon as separator
|
||||||
|
|
||||||
|
Example::
|
||||||
|
|
||||||
|
prefixes:ru,prefixes:en,male_suffixes:ru,male_suffixes:en,descriptive:ru,descriptive:en
|
||||||
|
Бж,Bzh,пра,pra,быстряк;быстряку,fasty
|
||||||
|
дон;дону,don,Иван;Ивану,Ivan,Иванов;Иванову,Ivanov
|
||||||
|
|
||||||
|
Note: you may use slugs without ":lang_code" suffix in csv header of tables file. Such headers will be treated as headers for native language
|
||||||
|
|
||||||
|
If tables are missing for some slug then it is automatically created with values equeal to slug itself.
|
||||||
|
So you may use some slugs without specifying tables data for them. Example for apostrophe and space:
|
||||||
|
|
||||||
|
male_1,5,m,prefixes;';male_suffixes
|
||||||
|
male_full,5,m,first_name; ;last_name
|
||||||
|
|
||||||
|
"""
|
||||||
|
if not isinstance(source_paths, Iterable) or len(source_paths) < 3:
|
||||||
|
raise TypeError('FromCSVTablesGenerator.source_loader accepts list of 3 paths as argument. Got `%s` instead' % source_paths)
|
||||||
|
self.native_language = ''
|
||||||
|
self.languages = []
|
||||||
|
self.templates = []
|
||||||
|
self.tables = {}
|
||||||
|
|
||||||
|
self.load_settings(source_paths[0])
|
||||||
|
template_slugs = self.load_templates(source_paths[1])
|
||||||
|
self.load_tables(source_paths[2])
|
||||||
|
|
||||||
|
if create_missing_tables:
|
||||||
|
self.create_missing_tables(template_slugs)
|
||||||
|
|
||||||
|
self.full_forms_for_languages = set()
|
||||||
|
|
||||||
|
def load_settings(self, settings_source):
|
||||||
|
with (settings_source if is_file(settings_source) else open(settings_source)) as settings_file:
|
||||||
|
reader = unicodecsv.DictReader(settings_file, encoding='utf-8')
|
||||||
|
for row in reader:
|
||||||
|
new_native_language = row.get('native_language', '').strip()
|
||||||
|
if new_native_language and not self.native_language:
|
||||||
|
self.native_language = new_native_language
|
||||||
|
elif self.native_language and new_native_language and self.native_language != new_native_language:
|
||||||
|
raise exceptions.WrongCSVData(
|
||||||
|
'Wrong settings csv file. Native language is already set to "%(native_language)s" but new value "%(new_value)s" is present on some row',
|
||||||
|
native_language=self.native_language,
|
||||||
|
new_value=new_native_language
|
||||||
|
)
|
||||||
|
|
||||||
|
new_language = row.get('languages', '').strip()
|
||||||
|
if new_language:
|
||||||
|
self.languages.append(new_language)
|
||||||
|
self.languages = set(self.languages)
|
||||||
|
|
||||||
|
def load_templates(self, templates_source):
|
||||||
|
template_slugs = []
|
||||||
|
|
||||||
|
with (templates_source if is_file(templates_source) else open(templates_source)) as templates_file:
|
||||||
|
reader = unicodecsv.DictReader(templates_file, encoding='utf-8')
|
||||||
|
for row in reader:
|
||||||
|
template_data = {
|
||||||
|
'probability': float(row['probability']),
|
||||||
|
'genders': row['genders'].replace(' ', '').split(';'),
|
||||||
|
'template': row['template'].split(';'),
|
||||||
|
}
|
||||||
|
self.templates.append(
|
||||||
|
Template(row['template_name'], self.native_language, self.languages, template_data)
|
||||||
|
)
|
||||||
|
template_slugs.extend(template_data['template'])
|
||||||
|
|
||||||
|
template_slugs = set(template_slugs)
|
||||||
|
return template_slugs
|
||||||
|
|
||||||
|
def load_tables(self, tables_source):
|
||||||
|
with (tables_source if is_file(tables_source) else open(tables_source)) as tables_file:
|
||||||
|
reader = unicodecsv.DictReader(tables_file, encoding='utf-8')
|
||||||
|
slugs = set([fieldname.split(':')[0] for fieldname in reader.fieldnames])
|
||||||
|
for slug in slugs:
|
||||||
|
self.tables[slug] = []
|
||||||
|
for row in reader:
|
||||||
|
for slug in slugs:
|
||||||
|
table_item = {}
|
||||||
|
for language in self.languages:
|
||||||
|
value = row.get('%s:%s' % (slug, language), '')
|
||||||
|
if not value and language == self.native_language:
|
||||||
|
value = row.get(slug, '')
|
||||||
|
if value:
|
||||||
|
if value.find(';') > 0:
|
||||||
|
value = value.split(';')
|
||||||
|
table_item.setdefault('languages', {})[language] = value
|
||||||
|
elif table_item:
|
||||||
|
# some language already present but current is missing
|
||||||
|
raise exceptions.WrongCSVData(
|
||||||
|
'Missing language "%(language)s" for table "%(slug)s" with partial datum "%(table_item)s"',
|
||||||
|
language=language, slug=slug, table_item=table_item,
|
||||||
|
)
|
||||||
|
if table_item:
|
||||||
|
self.tables[slug].append(table_item)
|
||||||
|
return
|
||||||
|
|
||||||
|
def create_missing_tables(self, template_slugs):
|
||||||
|
for slug in template_slugs:
|
||||||
|
if not self.tables.get(slug, ''):
|
||||||
|
table_item = {'languages': {}}
|
||||||
|
for language in self.languages:
|
||||||
|
table_item['languages'][language] = slug
|
||||||
|
|
||||||
|
self.tables.setdefault(slug, []).append(table_item)
|
||||||
|
|
|
@ -3,8 +3,10 @@
|
||||||
import os
|
import os
|
||||||
|
|
||||||
from pynames.from_tables_generator import FromTablesGenerator
|
from pynames.from_tables_generator import FromTablesGenerator
|
||||||
|
from pynames.iron_kingdoms import GobberFullnameGenerator
|
||||||
|
|
||||||
FIXTURES_DIR = os.path.join(os.path.dirname(__file__), 'fixtures')
|
FIXTURES_DIR = os.path.join(os.path.dirname(__file__), 'fixtures')
|
||||||
|
|
||||||
|
|
||||||
class GoblinGenerator(FromTablesGenerator):
|
class GoblinGenerator(FromTablesGenerator):
|
||||||
SOURCE = os.path.join(FIXTURES_DIR, 'goblin_names_tables.json')
|
SOURCE = os.path.join(FIXTURES_DIR, 'goblin_names_tables.json')
|
||||||
|
|
90
pynames/iron_kingdoms/__init__.py
Normal file
90
pynames/iron_kingdoms/__init__.py
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
# coding: utf-8
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
from pynames.from_tables_generator import FromCSVTablesGenerator
|
||||||
|
|
||||||
|
FIXTURES_DIR = os.path.join(os.path.dirname(__file__), 'fixtures')
|
||||||
|
|
||||||
|
|
||||||
|
class GobberFullnameGenerator(FromCSVTablesGenerator):
|
||||||
|
SOURCE = [
|
||||||
|
os.path.join(FIXTURES_DIR, 'IK_en_settings.csv'),
|
||||||
|
os.path.join(FIXTURES_DIR, 'IK_gobber_names_templates.csv'),
|
||||||
|
os.path.join(FIXTURES_DIR, 'IK_gobber_names_tables.csv'),
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class ThurianMorridaneFullnameGenerator(FromCSVTablesGenerator):
|
||||||
|
SOURCE = [
|
||||||
|
os.path.join(FIXTURES_DIR, 'IK_en_settings.csv'),
|
||||||
|
os.path.join(FIXTURES_DIR, 'IK_simple_fullname.csv'),
|
||||||
|
os.path.join(FIXTURES_DIR, 'IK_thurian_morridane_names_tables.csv'),
|
||||||
|
]
|
||||||
|
|
||||||
|
ThurianFullnameGenerator = ThurianMorridaneFullnameGenerator
|
||||||
|
MorridaneFullnameGenerator = ThurianMorridaneFullnameGenerator
|
||||||
|
|
||||||
|
|
||||||
|
class TordoranFullnameGenerator(FromCSVTablesGenerator):
|
||||||
|
SOURCE = [
|
||||||
|
os.path.join(FIXTURES_DIR, 'IK_en_settings.csv'),
|
||||||
|
os.path.join(FIXTURES_DIR, 'IK_simple_fullname.csv'),
|
||||||
|
os.path.join(FIXTURES_DIR, 'IK_tordoran_names_tables.csv'),
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class RynFullnameGenerator(FromCSVTablesGenerator):
|
||||||
|
SOURCE = [
|
||||||
|
os.path.join(FIXTURES_DIR, 'IK_en_settings.csv'),
|
||||||
|
os.path.join(FIXTURES_DIR, 'IK_simple_fullname.csv'),
|
||||||
|
os.path.join(FIXTURES_DIR, 'IK_ryn_names_tables.csv'),
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class DwarfFullnameGenerator(FromCSVTablesGenerator):
|
||||||
|
SOURCE = [
|
||||||
|
os.path.join(FIXTURES_DIR, 'IK_en_settings.csv'),
|
||||||
|
os.path.join(FIXTURES_DIR, 'IK_simple_fullname.csv'),
|
||||||
|
os.path.join(FIXTURES_DIR, 'IK_dwarf_names_tables.csv'),
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class IossanNyssFullnameGenerator(FromCSVTablesGenerator):
|
||||||
|
SOURCE = [
|
||||||
|
os.path.join(FIXTURES_DIR, 'IK_en_settings.csv'),
|
||||||
|
os.path.join(FIXTURES_DIR, 'IK_simple_fullname.csv'),
|
||||||
|
os.path.join(FIXTURES_DIR, 'IK_iossan_nyss_names_tables.csv'),
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class CaspianMidlunderSuleseFullnameGenerator(FromCSVTablesGenerator):
|
||||||
|
SOURCE = [
|
||||||
|
os.path.join(FIXTURES_DIR, 'IK_en_settings.csv'),
|
||||||
|
os.path.join(FIXTURES_DIR, 'IK_simple_fullname.csv'),
|
||||||
|
os.path.join(FIXTURES_DIR, 'IK_caspian_midlunder_sulese_names_tables.csv'),
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class KhadoranFullnameGenerator(FromCSVTablesGenerator):
|
||||||
|
SOURCE = [
|
||||||
|
os.path.join(FIXTURES_DIR, 'IK_en_settings.csv'),
|
||||||
|
os.path.join(FIXTURES_DIR, 'IK_khadoran_templates.csv'),
|
||||||
|
os.path.join(FIXTURES_DIR, 'IK_khadoran_names_tables.csv'),
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class OgrunFullnameGenerator(FromCSVTablesGenerator):
|
||||||
|
SOURCE = [
|
||||||
|
os.path.join(FIXTURES_DIR, 'IK_en_settings.csv'),
|
||||||
|
os.path.join(FIXTURES_DIR, 'IK_simple_fullname.csv'),
|
||||||
|
os.path.join(FIXTURES_DIR, 'IK_ogrun_names_tables.csv'),
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class TrollkinFullnameGenerator(FromCSVTablesGenerator):
|
||||||
|
SOURCE = [
|
||||||
|
os.path.join(FIXTURES_DIR, 'IK_en_settings.csv'),
|
||||||
|
os.path.join(FIXTURES_DIR, 'IK_simple_fullname.csv'),
|
||||||
|
os.path.join(FIXTURES_DIR, 'IK_trollkin_names_tables.csv'),
|
||||||
|
]
|
|
@ -0,0 +1,123 @@
|
||||||
|
male_firstname,female_firstname,surname
|
||||||
|
Alain,Alanna,Ainsworth
|
||||||
|
Alger,Alexia,Aleman
|
||||||
|
Alnor,Alley,Alkott
|
||||||
|
Alvy,Amery,Applewhite
|
||||||
|
Amery,Ashlan,Ashburn
|
||||||
|
Ansel,Ashley,Ashcroft
|
||||||
|
Anson,Bailey,Atchley
|
||||||
|
Ard,Betilda,Atwood
|
||||||
|
Arias,Brona,Bainbridge
|
||||||
|
Ardin,Cammy,Bancroft
|
||||||
|
Arkin,Canice,Bannister
|
||||||
|
Arland,Cara,Barrington
|
||||||
|
Artis,Caylan,Barton
|
||||||
|
Baen,Cecily,Baskin
|
||||||
|
Bain,Creena,Belker
|
||||||
|
Bairn,Dara,Bingley
|
||||||
|
Barden,Darsey,Blackburn
|
||||||
|
Barigan,Delaney,Blackwood
|
||||||
|
Barlowe,Derry,Boggs
|
||||||
|
Bartley,Desle,Borloch
|
||||||
|
Bayden,Devlin,Borne
|
||||||
|
Beck,Dunla,Bradner
|
||||||
|
Bergin,Elatha,Brasher
|
||||||
|
Birk,Elspeth,Briarford
|
||||||
|
Bixler,Emma,Brisbane
|
||||||
|
Blayde,Enda,Broadnax
|
||||||
|
Blythe,Erris,Brocker
|
||||||
|
Bolden,Evelyn,Calligan
|
||||||
|
Boren,Gale,Calvirt
|
||||||
|
Bors,Gwen,Cosgrave
|
||||||
|
Bowden,Haley,Darkmantle
|
||||||
|
Brandel,Henna,Denby
|
||||||
|
Brill,Islene,Denisson
|
||||||
|
Brock,Jenett,Dryden
|
||||||
|
Brone,Jordan,Dumas
|
||||||
|
Brue,Juliana,Dunford
|
||||||
|
Brunner,Katerine,Durst
|
||||||
|
Bryson,Kealey,Ellsworth
|
||||||
|
Cacey,Kearey,Falk
|
||||||
|
Caine,Keavey,Fenwick
|
||||||
|
Cam,Kelsey,Forsythe
|
||||||
|
Camden,Kiltey,Fullet
|
||||||
|
Casner,Lorna,Gadock
|
||||||
|
Cobb,Matilda,Galbraith
|
||||||
|
Creedan,Meara,Gant
|
||||||
|
Creel,Morna,Gately
|
||||||
|
Crowle,Muriel,Gilfin
|
||||||
|
Dalmer,Nally,Gilroy
|
||||||
|
Dardan,Orla,Grayden
|
||||||
|
Degar,Renny,Grimes
|
||||||
|
Delp,Rosaleen,Hadley
|
||||||
|
Dexer,Rowan,Haightley
|
||||||
|
Dextrel,Sabina,Halstead
|
||||||
|
Dorn,Shay,Hartcliff
|
||||||
|
Dowd,Stianna,Helstrom
|
||||||
|
Doyle,Tara,Helwick
|
||||||
|
Druce,Torey,Hitch
|
||||||
|
Dugger,Tressa,Hornbeck
|
||||||
|
Dunley,Una,Hurst
|
||||||
|
Durwin,Vora,Ironside
|
||||||
|
Eckert,Wren,Keightley
|
||||||
|
Egan,,Keller
|
||||||
|
Elias,,Kendrick
|
||||||
|
Elgin,,Kerrigan
|
||||||
|
Ennis,,Kerswell
|
||||||
|
Everett,,Kinnet
|
||||||
|
Fane,,Kirkston
|
||||||
|
Fargas,,Kurgan
|
||||||
|
Finch,,Langworth
|
||||||
|
Fitch,,Lynch
|
||||||
|
Gade,,Mallett
|
||||||
|
Gadsden,,Mallory
|
||||||
|
Galt,,Millward
|
||||||
|
Garrett,,Montfort
|
||||||
|
Garrick,,Mosley
|
||||||
|
Godwin,,Murdoch
|
||||||
|
Griffon,,Norwick
|
||||||
|
Gum,,Oberen
|
||||||
|
Gunner,,Oldham
|
||||||
|
Hamil,,Pendrake
|
||||||
|
Harlan,,Raelthorne
|
||||||
|
Hawke,,Ratcliff
|
||||||
|
Heremon,,Redgrave
|
||||||
|
Icabod,,Rhinehart
|
||||||
|
Jagger,,Rolfe
|
||||||
|
Jarok,,Rusling
|
||||||
|
Jonas,,Scarrow
|
||||||
|
Julian,,Shaw
|
||||||
|
Kade,,Skarholt
|
||||||
|
Kell,,Sunbright
|
||||||
|
Kerne,,Talbot
|
||||||
|
Kerr,,Tolbert
|
||||||
|
Leto,,Versh
|
||||||
|
Lon,,Villius
|
||||||
|
Mago,,Voyle
|
||||||
|
Malek,,Wadock
|
||||||
|
Milo,,Whitefield
|
||||||
|
Nash,,
|
||||||
|
Nolan,,
|
||||||
|
Odger,,
|
||||||
|
Olson,,
|
||||||
|
Pandor,,
|
||||||
|
Perth,,
|
||||||
|
Phineas,,
|
||||||
|
Radnor,,
|
||||||
|
Regan,,
|
||||||
|
Retho,,
|
||||||
|
Reynard,,
|
||||||
|
Rowe,,
|
||||||
|
Rudd,,
|
||||||
|
Scarle,,
|
||||||
|
Sebastian,,
|
||||||
|
Sorley,,
|
||||||
|
Timeck,,
|
||||||
|
Ulfass,,
|
||||||
|
Vahn,,
|
||||||
|
Victor,,
|
||||||
|
Vidor,,
|
||||||
|
Vinter,,
|
||||||
|
Waldron,,
|
||||||
|
Wolfe,,
|
||||||
|
Wyatt,,
|
|
35
pynames/iron_kingdoms/fixtures/IK_dwarf_names_tables.csv
Normal file
35
pynames/iron_kingdoms/fixtures/IK_dwarf_names_tables.csv
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
male_firstname,female_firstname,surname
|
||||||
|
Admon,Anlost,Belgre
|
||||||
|
Arlack,Bredine,Blackheel
|
||||||
|
Barl,Burnev,Blackitt
|
||||||
|
Bartan,Cathro,Darrow
|
||||||
|
Bindar,Celath,Dolgren
|
||||||
|
Brogan,Crelyth,Domack
|
||||||
|
Bullin,Crieda,Dorgun
|
||||||
|
Decklin,Darlave,Durkin
|
||||||
|
Dragar,Dira,Fortros
|
||||||
|
Dunarl,Garline,Gherke
|
||||||
|
Durg,Gedine,Hardwick
|
||||||
|
Durke,Geduve,Icehold
|
||||||
|
Ecken,Girta,Lugro
|
||||||
|
Freitag,Gorina,Netweaver
|
||||||
|
Galtar,Heleth,Olghrd
|
||||||
|
Gamack,Hiln,Oreblood
|
||||||
|
Gerhard,Magrat,Redhammer
|
||||||
|
Gidrick,Marba,Rothrock
|
||||||
|
Golrick,Mendine,Serric
|
||||||
|
Gruhn,Nollos,Sigmur
|
||||||
|
Guvul,Sartine,Softshadow
|
||||||
|
Havelock,Torlith,Steadfast
|
||||||
|
Hedwig,Uhlith,Stoneground
|
||||||
|
Herne,Ulave,Torgun
|
||||||
|
Holdur,Vetta,Urdro
|
||||||
|
Jaldun,,Whitnock
|
||||||
|
Jurg,,Wroughthammer
|
||||||
|
Kalmon,,
|
||||||
|
Lossock,,
|
||||||
|
Redgar,,
|
||||||
|
Theldor,,
|
||||||
|
Tholrick,,
|
||||||
|
Tholrick,,
|
||||||
|
Thorne,,
|
|
2
pynames/iron_kingdoms/fixtures/IK_en_settings.csv
Normal file
2
pynames/iron_kingdoms/fixtures/IK_en_settings.csv
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
languages,native_language
|
||||||
|
en,en
|
|
55
pynames/iron_kingdoms/fixtures/IK_gobber_names_tables.csv
Normal file
55
pynames/iron_kingdoms/fixtures/IK_gobber_names_tables.csv
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
gobber_first_name_male,gobber_first_name_female,gobber_descriptive,gobber_descriptive_meaning
|
||||||
|
Ad,Agghi,ag,"untouchable, noisy or annoying"
|
||||||
|
Ant,Ala,ak,"untouchable, noisy or annoying"
|
||||||
|
Az,Anh,agen,"tough, stubborn "
|
||||||
|
Boll,Ano,aken,"tough, stubborn"
|
||||||
|
Bert,Ara,aggan,"bloodthirsty, gullible"
|
||||||
|
Bork,Atra,akkan,"bloodthirsty, gullible"
|
||||||
|
Dag,Bel,ahun,"always ready, lascivious or sadistic"
|
||||||
|
Dar,Da,alog,"wise or clever, meek "
|
||||||
|
Gek,Dar,alok,"wise or clever, meek"
|
||||||
|
Gork,Enda,amun,"skilled camouflager, unimportant"
|
||||||
|
Gort,Gan,aneg,"ferocious, irrational & gluttonous"
|
||||||
|
Gul,Gara,anek,"ferocious, irrational & gluttonous"
|
||||||
|
Gun,Geka,anen,"stealthy, nervous or insecure"
|
||||||
|
Hek,Gola,anheg,"toolmaker, old & senile"
|
||||||
|
Hok,Gomm,anhek,"toolmaker, old & senile"
|
||||||
|
Kanh,Gren,ano,"adept or nimble, weak"
|
||||||
|
Kug,Grend,arag,"powerful, smells horrible "
|
||||||
|
Lan,Kat,arak,"powerful, smells horrible"
|
||||||
|
Lok,Lom,atol,"good friend, leader in battle"
|
||||||
|
Mo,Mari,dara,"healthy or long lived, conservative"
|
||||||
|
Mog,Meg,egga,"radiant, manic"
|
||||||
|
Nat,Nan,ekka,"radiant, manic"
|
||||||
|
Nun,Rala,eleg,"precise, pretty & delicate"
|
||||||
|
Ork,Ren,elek,"precise, pretty & delicate"
|
||||||
|
Oz,Sele,emun,"efficient, aggressive"
|
||||||
|
Pok,Tere,gamun,"quiet and withdrawn, maniacal"
|
||||||
|
Poon,Ugga,gana,"exceptional, obese"
|
||||||
|
Rak,Ula,gar,"fish, provider"
|
||||||
|
Ranh,Vel,garda,"bold, uncouth & vulgar"
|
||||||
|
Tak,Walu,gekan,"craftsman or artist, fickle"
|
||||||
|
Thak,Wikk,heleg,"heroic, domineering"
|
||||||
|
Tok,,helek,"heroic, domineering"
|
||||||
|
Tot,,holdt,"cave or hole, fortress"
|
||||||
|
Tun,,kam,"dexterous, cowardly"
|
||||||
|
Tur,,kan,"sly, unrelaible"
|
||||||
|
Un,,meleg,"restrained, maudlin & morbid"
|
||||||
|
Vog,,melek,"restrained, maudlin & morbid"
|
||||||
|
Vorg,,obalt,"prankster, hardhearted"
|
||||||
|
Zhag,,omog,"animal friend, good cook"
|
||||||
|
,,omok,"animal friend, good cook"
|
||||||
|
,,ona,"healer or brewer, eccentric"
|
||||||
|
,,onan,"strong, loner"
|
||||||
|
,,oran,"distinguished, strange"
|
||||||
|
,,ralog,"clever and creative, impractical"
|
||||||
|
,,ralok,"clever and creative, impractical"
|
||||||
|
,,rel,"observant, quiet and passive"
|
||||||
|
,,uladar,"innovative, cheater"
|
||||||
|
,,ulag,"intense, aloof"
|
||||||
|
,,ulak,"intense, aloof"
|
||||||
|
,,ulug,"insatiable, unstoppable"
|
||||||
|
,,uluk,"insatiable, unstoppable"
|
||||||
|
,,uman,"faithful and determined, fanatical"
|
||||||
|
,,uren,"dreamer, sickly"
|
||||||
|
,,vi,"shrewd, scavenger "
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
template_name,probability,genders,template
|
||||||
|
gobber_male,1,m,gobber_first_name_male;-;gobber_first_name_female;-;gobber_first_name_male;-;gobber_descriptive
|
||||||
|
gobber_male,1,f,gobber_first_name_female;-;gobber_first_name_female;-;gobber_first_name_male;-;gobber_descriptive
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
male_firstname,female_firstname,surname
|
||||||
|
Alcyr,Aesha,Alcyan
|
||||||
|
Avross,Alyssa,Asir
|
||||||
|
Bres,Caelyth,Breir
|
||||||
|
Callael,Cytyss,Ellowuyr
|
||||||
|
Callis,Dahlia,Ferryll
|
||||||
|
Cinsyr,Edrea,Graccys
|
||||||
|
Cyvross,Falcir,Hallyr
|
||||||
|
Erryll,Feen,Heryllith
|
||||||
|
Felcyr,Gaelyr,Larisar
|
||||||
|
Glyssor,Hellith,Lloryrr
|
||||||
|
Gossyr,Lorimir,Luynmyr
|
||||||
|
Laconfir,Lothwyn,Lyorys
|
||||||
|
Lani,Meryll,Menellyth
|
||||||
|
Lissor,Miir,Raefyll
|
||||||
|
Neriwhen,Renyll,Reyvrese
|
||||||
|
Pelyth,Sacyl,Ryssyll
|
||||||
|
Rillis,Shael,Syvas
|
||||||
|
Sarlos,Sillith,Vrir
|
||||||
|
Shas,Tanyr,Waelen
|
||||||
|
Thale,Tathir,Wyldiss
|
||||||
|
Tryiss,Tenae,Wyllothyr
|
||||||
|
Tylth,Velwhin,
|
||||||
|
Vyros,Veryth,
|
||||||
|
Vystral,Ystith,
|
|
89
pynames/iron_kingdoms/fixtures/IK_khadoran_names_tables.csv
Normal file
89
pynames/iron_kingdoms/fixtures/IK_khadoran_names_tables.csv
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
male_firstname,female_firstname,surname,khadoran_surname_traditional,surname_male_suffix,surname_female_suffix
|
||||||
|
Aika,Akina,Abrosim,Abrosimovich,evich,ovna
|
||||||
|
Aleksi,Akilina,Adka,Adkevich,ovich,evna
|
||||||
|
Alexandr,Aleksa,Agrimko,Alekseevich,,
|
||||||
|
Alexei,Anana,Aleksy,Aleshkovich,,
|
||||||
|
Aliosha,Anastasia,Aleshko,Baborevich,,
|
||||||
|
Ambroz,Anikita,Antonidka,Borgevich,,
|
||||||
|
Andrei,Bazhina,Babora,Csaborovich,,
|
||||||
|
Balsnoch,Britt,Belavdon,Dvorevich,,
|
||||||
|
Barak,Cesta,Berzhin,Dvorovich,,
|
||||||
|
Bladko,Cestina,Blizbor,Durgevich,,
|
||||||
|
Boris,Corinna,Bolovan,Faltinovich,,
|
||||||
|
Borja,Dalika,Borga,Grishkevich,,
|
||||||
|
Chasek,Darzha,Csabor,Grishkovich,,
|
||||||
|
Costi,Elina,Dementskov,Karakovich,,
|
||||||
|
Culamir,Eliska,Dvora,Kutsovich,,
|
||||||
|
Dahlrif,Elka,Durga,Ladislavovich,,
|
||||||
|
Dalmat,Gridia,Faltin,Lovotovich,,
|
||||||
|
Dmitri,Gubina,Grishka,Loukevich,,
|
||||||
|
Dobrinya,Ihrin,Grychkin,Loukovich,,
|
||||||
|
Dorek,Ilyana,Gubin,Lozarevich,,
|
||||||
|
Dragash,Ivona,Istori,Lozarovich,,
|
||||||
|
Drago,Kasia,Karakov,Makarovich,,
|
||||||
|
Falko,Katerina,Koposin,Mileshkovich,,
|
||||||
|
Fedko,Katia,Krasnovo,Mrovkovich,,
|
||||||
|
Fedor,Klenka,Kutsov,Orlovich,,
|
||||||
|
Fodor,Ksana,Ladislav,Padorinovich,,
|
||||||
|
Gasan,Laika,Lichko,Petrokovich,,
|
||||||
|
Ghita,Lariana,Lovot,Radazarevich,,
|
||||||
|
Giza,Ludmila,Louka,Szetkovich,,
|
||||||
|
Gorash,Malana,Lozar,Ushkovich,,
|
||||||
|
Goraz,Marfa,Makara,Varnekovich,,
|
||||||
|
Gorian,Marina,Makarin,Venianminovich,,
|
||||||
|
Grigor,Marta,Makarov,Vilimovich,,
|
||||||
|
Grigory,Mia,Mikita,Zavorovich,,
|
||||||
|
Iagan,Mikhaila,Mileshka,Zhinovich,,
|
||||||
|
Iakhno,Milena,Mrovka,,,
|
||||||
|
Iakshen,Misha,Nagorka,,,
|
||||||
|
Igor,Myrra,Nazarko,,,
|
||||||
|
Ilya,Nastasja,Neshka,,,
|
||||||
|
Ivan,Natalya,Orlov,,,
|
||||||
|
Ivash,Nikita,Osokin,,,
|
||||||
|
Ivdan,Ninete,Ostyvik,,,
|
||||||
|
Jachemir,Ondreiana,Padorin,,,
|
||||||
|
Jarosch,Riksa,Petrok,,,
|
||||||
|
Josef,Siri,Petru,,,
|
||||||
|
Kachalo,Sivasha,Raboshich,,,
|
||||||
|
Kigir,Sofia,Rachlavsky,,,
|
||||||
|
Kirbitei,Sonja,Radazar,,,
|
||||||
|
Kohan,Stefka,Rostov,,,
|
||||||
|
Kosara,Tahni,Starov,,,
|
||||||
|
Ladimir,Tara,Stasvite,,,
|
||||||
|
Levanid,Tatyana,Szetka,,,
|
||||||
|
Loshka,Vjera,Ushka,,,
|
||||||
|
Luka,Yelena,Tiudiaminov,,,
|
||||||
|
Malash,Zelmira,Toshiana,,,
|
||||||
|
Malko,Zori,Varnek,,,
|
||||||
|
Michal,,Venianminov,,,
|
||||||
|
Michka,,Vilimov,,,
|
||||||
|
Mikhail,,Vislovski,,,
|
||||||
|
Mikolo,,Zavor,,,
|
||||||
|
Mishka,,Zeitsev,,,
|
||||||
|
Negomir,,Zhina,,,
|
||||||
|
Nekras,,Zhivo,,,
|
||||||
|
Nikolei,,,,,
|
||||||
|
Olekse,,,,,
|
||||||
|
Pachek,,,,,
|
||||||
|
Petrov,,,,,
|
||||||
|
Pytor,,,,,
|
||||||
|
Radomir,,,,,
|
||||||
|
Radu,,,,,
|
||||||
|
Rajko,,,,,
|
||||||
|
Ruskin,,,,,
|
||||||
|
Sadko,,,,,
|
||||||
|
Sergei,,,,,
|
||||||
|
Servath,,,,,
|
||||||
|
Solovei,,,,,
|
||||||
|
Stoyan,,,,,
|
||||||
|
Valerian,,,,,
|
||||||
|
Vasily,,,,,
|
||||||
|
Vasiuk,,,,,
|
||||||
|
Vasko,,,,,
|
||||||
|
Vladjimir,,,,,
|
||||||
|
Vojin,,,,,
|
||||||
|
Volkh,,,,,
|
||||||
|
Yakov,,,,,
|
||||||
|
Yaro,,,,,
|
||||||
|
Yuri,,,,,
|
||||||
|
Yurik,,,,,
|
|
5
pynames/iron_kingdoms/fixtures/IK_khadoran_templates.csv
Normal file
5
pynames/iron_kingdoms/fixtures/IK_khadoran_templates.csv
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
template_name,probability,genders,template
|
||||||
|
fullname_male_1,7,m,male_firstname; ;surname
|
||||||
|
fullname_male_2,3,m,male_firstname; ;khadoran_surname_traditional
|
||||||
|
fullname_female_1,7,f,female_firstname; ;surname
|
||||||
|
fullname_female_2,3,f,female_firstname; ;khadoran_surname_traditional
|
|
22
pynames/iron_kingdoms/fixtures/IK_ogrun_names_tables.csv
Normal file
22
pynames/iron_kingdoms/fixtures/IK_ogrun_names_tables.csv
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
male_firstname,female_firstname,surname
|
||||||
|
Borok,Bekken,Ammok
|
||||||
|
Bosh,Beleg,Assag
|
||||||
|
Dunuk,Dekri,Berok
|
||||||
|
Gantak,Garka,Hammerhand
|
||||||
|
Gorgol,Ilka,Hedlok
|
||||||
|
Gorlu,Jessen,Halghat
|
||||||
|
Kuluk,Kelen,Ironbiter
|
||||||
|
Kogul,Kinik,Ironside
|
||||||
|
Lagdor,Krishka,Korsuk
|
||||||
|
Lorgrul,Rengan,Kulghat
|
||||||
|
Monon,Rilik,Longspear
|
||||||
|
Natak,Tilka,Nokter
|
||||||
|
Oknot,Torin,Oakknee
|
||||||
|
Tokol,Vilin,Skullsplitter
|
||||||
|
Tuluk,,Stonehand
|
||||||
|
Zorok,,Strongarm
|
||||||
|
,,Thagrosh
|
||||||
|
,,Thologhat
|
||||||
|
,,Turnok
|
||||||
|
,,Urgark
|
||||||
|
,,Warbiter
|
|
123
pynames/iron_kingdoms/fixtures/IK_ryn_names_tables.csv
Normal file
123
pynames/iron_kingdoms/fixtures/IK_ryn_names_tables.csv
Normal file
|
@ -0,0 +1,123 @@
|
||||||
|
male_firstname,female_firstname,surname
|
||||||
|
Alayn,Alanna,Albyn
|
||||||
|
Algyr,Alexia,Alyr
|
||||||
|
Alnor,Alley,Anthys
|
||||||
|
Alvy,Amery,Badrigio
|
||||||
|
Amery,Ashlan,Boudewyn
|
||||||
|
Ansyl,Ashley,Bracsio
|
||||||
|
Anson,Bailey,Bralazzi
|
||||||
|
Ard,Betilda,Bray
|
||||||
|
Aryas,Brona,Chalerio
|
||||||
|
Ardyn,Cammy,Claeys
|
||||||
|
Arkyn,Canice,Culpyn
|
||||||
|
Arland,Cara,Denys
|
||||||
|
Artys,Caylan,Dimiani
|
||||||
|
Bayn,Cecily,Donaes
|
||||||
|
Bayn,Creena,Dormio
|
||||||
|
Bayrn,Dara,Du
|
||||||
|
Bardyn,Darsey,Dunlyfe
|
||||||
|
Barygan,Delaney,Dyvacci
|
||||||
|
Barlowe,Derry,Dyvarc
|
||||||
|
Bartley,Desle,Elyse
|
||||||
|
Bayden,Devlin,Faryll
|
||||||
|
Beck,Dunla,Feryse
|
||||||
|
Byrgyn,Elatha,Fiscani
|
||||||
|
Byrk,Elspeth,Florys
|
||||||
|
Byxler,Emma,Gervaes
|
||||||
|
Blayde,Enda,Ghelyt
|
||||||
|
Blythe,Erris,Gilfyn
|
||||||
|
Boldyn,Evylyn,Glaeys
|
||||||
|
Boren,Gale,Gossyn
|
||||||
|
Bors,Gwyn,Govaes
|
||||||
|
Bowdyn,Haley,Granzio
|
||||||
|
Brandyl,Henna,Gustyn
|
||||||
|
Bryll,Islene,Gylbert
|
||||||
|
Brock,Jenytt,Gyrart
|
||||||
|
Brone,Jordan,Henryn
|
||||||
|
Brue,Juliana,Hengys
|
||||||
|
Brunnyr,Katerine,Lamsyn
|
||||||
|
Bryson,Kealey,Laurenyns
|
||||||
|
Cacey,Kearey,Lowys
|
||||||
|
Cayne,Keavey,Lymos
|
||||||
|
Cam,Kelsey,Lynyse
|
||||||
|
Camdyn,Kiltey,Mancario
|
||||||
|
Casnyr,Lorna,Martyn
|
||||||
|
Cobb,Matilda,Matys
|
||||||
|
Creedan,Meara,Mirassi
|
||||||
|
Creel,Morna,Morosini
|
||||||
|
Crowly,Muriel,Moysarc
|
||||||
|
Dalmyr,Nally,Niclaeys
|
||||||
|
Dardan,Orla,Petrozzi
|
||||||
|
Degar,Rynny,Polaro
|
||||||
|
Delp,Rosaleen,Rimbaldi
|
||||||
|
Dexer,Rowan,Rovissi
|
||||||
|
Dextrel,Sabina,Sanlyfe
|
||||||
|
Dorn,Shay,Tadirir
|
||||||
|
Dowd,Stianna,Torys
|
||||||
|
Doyle,Tara,Trivassi
|
||||||
|
Druce,Torey,Vandyse
|
||||||
|
Dugger,Tryssa,Viadro
|
||||||
|
Dunley,Una,Viscario
|
||||||
|
Durwyn,Vora,Weyne
|
||||||
|
Eckert,Wryn,Wulfe
|
||||||
|
Egan,,Wythsten
|
||||||
|
Elyas,,Yrnyse
|
||||||
|
Elgyn,,
|
||||||
|
Ennys,,
|
||||||
|
Everytt,,
|
||||||
|
Fane,,
|
||||||
|
Fargas,,
|
||||||
|
Fynch,,
|
||||||
|
Fytch,,
|
||||||
|
Gade,,
|
||||||
|
Gadsdyn,,
|
||||||
|
Galt,,
|
||||||
|
Garrytt,,
|
||||||
|
Garryck,,
|
||||||
|
Godwyn,,
|
||||||
|
Gryffon,,
|
||||||
|
Gum,,
|
||||||
|
Gunnyr,,
|
||||||
|
Hamyl,,
|
||||||
|
Harlan,,
|
||||||
|
Hawke,,
|
||||||
|
Herymon,,
|
||||||
|
Icabod,,
|
||||||
|
Jagger,,
|
||||||
|
Jarok,,
|
||||||
|
Jonas,,
|
||||||
|
Julyan,,
|
||||||
|
Kade,,
|
||||||
|
Kell,,
|
||||||
|
Kerne,,
|
||||||
|
Kerr,,
|
||||||
|
Lyto,,
|
||||||
|
Lon,,
|
||||||
|
Mago,,
|
||||||
|
Malyk,,
|
||||||
|
Mylo,,
|
||||||
|
Nash,,
|
||||||
|
Nolan,,
|
||||||
|
Odgyr,,
|
||||||
|
Olson,,
|
||||||
|
Pandor,,
|
||||||
|
Perth,,
|
||||||
|
Phyneas,,
|
||||||
|
Radnor,,
|
||||||
|
Rygan,,
|
||||||
|
Rytho,,
|
||||||
|
Reynard,,
|
||||||
|
Rowe,,
|
||||||
|
Rudd,,
|
||||||
|
Scarle,,
|
||||||
|
Sybastyan,,
|
||||||
|
Sorley,,
|
||||||
|
Tymyck,,
|
||||||
|
Ulfass,,
|
||||||
|
Vahn,,
|
||||||
|
Vyctor,,
|
||||||
|
Vydor,,
|
||||||
|
Vynter,,
|
||||||
|
Waldron,,
|
||||||
|
Wolfe,,
|
||||||
|
Wyatt,,
|
|
3
pynames/iron_kingdoms/fixtures/IK_simple_fullname.csv
Normal file
3
pynames/iron_kingdoms/fixtures/IK_simple_fullname.csv
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
template_name,probability,genders,template
|
||||||
|
fullname_male,1,m,male_firstname; ;surname
|
||||||
|
fullname_female,1,f,female_firstname; ;surname
|
|
|
@ -0,0 +1,72 @@
|
||||||
|
male_firstname,female_firstname,surname
|
||||||
|
Aidan,Aideen,Aghamore
|
||||||
|
Ardan,Ansleigh,Bain
|
||||||
|
Bastian,Beara,Bartley
|
||||||
|
Blake,Boand,Beene
|
||||||
|
Bradig,Brennan,Berrigan
|
||||||
|
Branduff,Caelan,Blathmac
|
||||||
|
Brogan,Caitlin,Bradigan
|
||||||
|
Brosnan,Carleigh,Bray
|
||||||
|
Byrleigh,Carolan,Brenn
|
||||||
|
Cagneigh,Clancy,Burney
|
||||||
|
Colm,Dana,Byrne
|
||||||
|
Conleth,Devlin,Carrock
|
||||||
|
Conor,Eithne,Cathmore
|
||||||
|
Cormick,Evlin,Corcoran
|
||||||
|
Cronan,Gillian,Corley
|
||||||
|
Cullin,Jelyan,Cronan
|
||||||
|
Darian,Jerilyn,Decklan
|
||||||
|
Darragh,Kaelin,Deorain
|
||||||
|
Decklan,Keehan,Derrigan
|
||||||
|
Deegan,Kennan,Donovan
|
||||||
|
Dermid,Kenseigh,Doyle
|
||||||
|
Dermot,Kerin,Dromore
|
||||||
|
Dougal,Kerry,Duff
|
||||||
|
Dougan,Kileigh,Duffock
|
||||||
|
Durgan,Lacy,Duggan
|
||||||
|
Eilish,Leigan,Dunne
|
||||||
|
Fergus,Lennon,Enabarr
|
||||||
|
Finnegan,Mara,Fagan
|
||||||
|
Flynn,Meara,Finnian
|
||||||
|
Gervin,Megan,Finnigan
|
||||||
|
Gorman,Milish,Gafneagh
|
||||||
|
Gralan,Niall,Garrity
|
||||||
|
Hagan,Nivin,Gilmore
|
||||||
|
Hanagan,Paddy,Glasneagh
|
||||||
|
Hogan,Regan,Gormleigh
|
||||||
|
Ian,Roshean,Gowan
|
||||||
|
Keegan,Shannon,Grady
|
||||||
|
Killian,Teagan,Grath
|
||||||
|
Kirwin,Tiernan,Hugh
|
||||||
|
Larkin,,Hurlough
|
||||||
|
Lonan,,Kaddock
|
||||||
|
Lorcan,,Kain
|
||||||
|
Lorgan,,Kannock
|
||||||
|
Luan,,Kavanaugh
|
||||||
|
Mairtin,,Kerneigh
|
||||||
|
Morgan,,Keehan
|
||||||
|
Nolan,,Kerrigan
|
||||||
|
Odran,,Kilbride
|
||||||
|
Olan,,Kildair
|
||||||
|
Ossian,,Lattimore
|
||||||
|
Piran,,Leegan
|
||||||
|
Quinn,,Lochlan
|
||||||
|
Quinlan,,Lowreigh
|
||||||
|
Rogan,,Lynch
|
||||||
|
Ronan,,Madigan
|
||||||
|
Ryleigh,,Melroane
|
||||||
|
,,Moriarty
|
||||||
|
,,Mrrough
|
||||||
|
,,Rathleagh
|
||||||
|
,,Reardan
|
||||||
|
,,Riordan
|
||||||
|
,,Roane
|
||||||
|
,,Ryland
|
||||||
|
,,Scully
|
||||||
|
,,Sheridan
|
||||||
|
,,Scorleagh
|
||||||
|
,,Torcail
|
||||||
|
,,Turlough
|
||||||
|
,,Vain
|
||||||
|
,,Waddock
|
||||||
|
,,Wain
|
|
76
pynames/iron_kingdoms/fixtures/IK_tordoran_names_tables.csv
Normal file
76
pynames/iron_kingdoms/fixtures/IK_tordoran_names_tables.csv
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
male_firstname,female_firstname,surname
|
||||||
|
Agnolo,Alda,Acorsi
|
||||||
|
Alvoro,Aldiana,Actavio
|
||||||
|
Amador,Anastasi,Avreu
|
||||||
|
Amario,Andrea,Balduccio
|
||||||
|
Ambro,Badess,Bandesco
|
||||||
|
Andro,Biella,Bateu
|
||||||
|
Avito,Branca,Begni
|
||||||
|
Bacar,Carlutia,Belcari
|
||||||
|
Bartal,Consola,Benzo
|
||||||
|
Barzal,Creena,Bezerra
|
||||||
|
Belchior,Danola,Borgho
|
||||||
|
Bernal,Dialta,Brancacci
|
||||||
|
Biagio,Eliana,Carvalo
|
||||||
|
Caldini,Favia,Casini
|
||||||
|
Calefo,Felice,Castra
|
||||||
|
Damasco,Fia,Corazo
|
||||||
|
Dego,Gabriele,Cravo
|
||||||
|
Falchi,Giana,Degrata
|
||||||
|
Faro,Giona,Duranti
|
||||||
|
Fernam,Giovanna,Evora
|
||||||
|
Francar,Gratia,Fariseu
|
||||||
|
Gaspar,Imelda,Florio
|
||||||
|
Gazo,Isabel,Gaspar
|
||||||
|
Gismondo,Lena,Gateu
|
||||||
|
Gozca,Loriana,Ginori
|
||||||
|
Grigori,Lorita,Goncal
|
||||||
|
Jaspar,Malatesta,Graza
|
||||||
|
Laspar,Margia,Guaspar
|
||||||
|
Lavoro,Matea,Labigio
|
||||||
|
Lionor,Mirena,Lasca
|
||||||
|
Lorio,Nicola,Lioni
|
||||||
|
Lupar,Oliveta,Mascal
|
||||||
|
Malo,Orabella,Masi
|
||||||
|
Manario,Rena,Mateu
|
||||||
|
Maro,Rosa,Mazini
|
||||||
|
Mateo,Sandrea,Nerini
|
||||||
|
Montador,Scarlata,Orafi
|
||||||
|
Nando,Selanda,Osoyro
|
||||||
|
Nicolo,Simona,Ovalho
|
||||||
|
Olivo,Stiata,Pagani
|
||||||
|
Ormano,Tadeo,Pelario
|
||||||
|
Padri,Talia,Pescar
|
||||||
|
Pascal,Tareyja,Petri
|
||||||
|
Piero,Valori,Randasi
|
||||||
|
Rafaldo,Verona,Regla
|
||||||
|
Ranal,,Rosado
|
||||||
|
Rufio,,Rubeu
|
||||||
|
Salvi,,Salo
|
||||||
|
Sighieri,,Salvestro
|
||||||
|
Stagiar,,Santoro
|
||||||
|
Vasco,,Scali
|
||||||
|
Zachar,,Scorgiani
|
||||||
|
,,Segalozo
|
||||||
|
,,Silva
|
||||||
|
,,Simtra
|
||||||
|
,,Solvo
|
||||||
|
,,Stario
|
||||||
|
,,Stradeu
|
||||||
|
,,Tavora
|
||||||
|
,,Tedesci
|
||||||
|
,,Telloso
|
||||||
|
,,Tieri
|
||||||
|
,,Torcail
|
||||||
|
,,Trovato
|
||||||
|
,,Ubaldo
|
||||||
|
,,Ulavari
|
||||||
|
,,Valoro
|
||||||
|
,,Varyo
|
||||||
|
,,Vascal
|
||||||
|
,,Vascalho
|
||||||
|
,,Versalo
|
||||||
|
,,Viteu
|
||||||
|
,,Zacharo
|
||||||
|
,,Zaspar
|
||||||
|
,,Zucco
|
|
19
pynames/iron_kingdoms/fixtures/IK_trollkin_names_tables.csv
Normal file
19
pynames/iron_kingdoms/fixtures/IK_trollkin_names_tables.csv
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
male_firstname,female_firstname,surname
|
||||||
|
Balasar,Brolas,Bloodborn
|
||||||
|
Bendek,Harthreen,Bloodbreath
|
||||||
|
Ganthak,Jata,Boomhowler
|
||||||
|
Garosh,Jennan,Delleb
|
||||||
|
Gerlak,Jussika,Dogalus
|
||||||
|
Grindar,Lassan,Doomspeaker
|
||||||
|
Holdar,Masalass,Firetongue
|
||||||
|
Horluk,Mossan,Goodhammer
|
||||||
|
Jonhot,Niolor,Gormas
|
||||||
|
Joston,Nosson,Hoagbarth
|
||||||
|
Kolor,Olos,Kavkalash
|
||||||
|
Korlar,Rossan,Lorgash
|
||||||
|
Masdun,Sollisa,Lugosh
|
||||||
|
Stershan,Sossamon,Slaughterborn
|
||||||
|
Tassar,Vasalor,Surfborn
|
||||||
|
Termen,Vatess,Stonehide
|
||||||
|
,Vessos,Toborg
|
||||||
|
,Vialoss,Tumbrog
|
|
6
pynames/iron_kingdoms/fixtures/README.rst
Normal file
6
pynames/iron_kingdoms/fixtures/README.rst
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
|
||||||
|
``IK_*_names_tables.csv`` and ``IK_*_names_tempaltes.csv`` files hold dataset for IronKingdoms names.
|
||||||
|
|
||||||
|
Iron Kingdoms and other names are property of Privateer Press
|
||||||
|
|
||||||
|
This dataset uses the name collection that was provided by Gin on the forum<http://privateerpressforums.com/showthread.php?122817-Names-in-Iron-Kingdoms> of "Privateer Press"<http://www.privateerpress.com>
|
|
@ -4,3 +4,4 @@ from pynames.tests.test_name import *
|
||||||
from pynames.tests.test_from_list_generator import *
|
from pynames.tests.test_from_list_generator import *
|
||||||
from pynames.tests.test_from_tables_generator import *
|
from pynames.tests.test_from_tables_generator import *
|
||||||
from pynames.tests.test_generators import *
|
from pynames.tests.test_generators import *
|
||||||
|
from pynames.tests.test_utils import *
|
||||||
|
|
3
pynames/tests/fixtures/test_from_csv_tables_generator_settings.csv
vendored
Normal file
3
pynames/tests/fixtures/test_from_csv_tables_generator_settings.csv
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
languages,native_language
|
||||||
|
ru,en
|
||||||
|
en,
|
|
4
pynames/tests/fixtures/test_from_csv_tables_generator_tables.csv
vendored
Normal file
4
pynames/tests/fixtures/test_from_csv_tables_generator_tables.csv
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
table1:en,table1:ru,table2:en,table2:ru,table3:en,table3:ru,table4:en,table4:ru
|
||||||
|
T1EN1,T1RU1,_m_en_1,_m_ru_1,_f_en_1,_f_ru_1;_f_ru_1_form,','
|
||||||
|
T1EN2,T1RU2,_m_en_2,_m_ru_2,,,
|
||||||
|
T1EN3,T1RU3,,,,,
|
|
4
pynames/tests/fixtures/test_from_csv_tables_generator_templates.csv
vendored
Normal file
4
pynames/tests/fixtures/test_from_csv_tables_generator_templates.csv
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
template_name,probability,genders,template
|
||||||
|
t1,2,m,table1;table2
|
||||||
|
t2,2,f,table1;table3
|
||||||
|
t3,1,m;f,table1;table2;table4;table3
|
|
|
@ -4,7 +4,7 @@ import os
|
||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
from pynames.relations import GENDER, LANGUAGE
|
from pynames.relations import GENDER, LANGUAGE
|
||||||
from pynames.from_tables_generator import FromTablesGenerator
|
from pynames.from_tables_generator import FromTablesGenerator, FromCSVTablesGenerator
|
||||||
|
|
||||||
FIXTURES_DIR = os.path.join(os.path.dirname(__file__), 'fixtures')
|
FIXTURES_DIR = os.path.join(os.path.dirname(__file__), 'fixtures')
|
||||||
|
|
||||||
|
@ -91,3 +91,38 @@ class TestFromTablesGenerator(unittest.TestCase):
|
||||||
name = generator.get_name(genders=[GENDER.FEMALE])
|
name = generator.get_name(genders=[GENDER.FEMALE])
|
||||||
self.assertTrue(name.get_for(GENDER.FEMALE, LANGUAGE.EN) in self.NAMES_EN_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)
|
self.assertEqual(name.get_forms_for(GENDER.FEMALE, LANGUAGE.EN), None)
|
||||||
|
|
||||||
|
|
||||||
|
class TestFromCSVTablesGenerator(unittest.TestCase):
|
||||||
|
|
||||||
|
class TestJSONGenerator(FromTablesGenerator):
|
||||||
|
SOURCE = os.path.join(FIXTURES_DIR, 'test_from_tables_generator.json')
|
||||||
|
|
||||||
|
class TestCSVGenerator(FromCSVTablesGenerator):
|
||||||
|
SOURCE = [
|
||||||
|
os.path.join(FIXTURES_DIR, 'test_from_csv_tables_generator_settings.csv'),
|
||||||
|
os.path.join(FIXTURES_DIR, 'test_from_csv_tables_generator_templates.csv'),
|
||||||
|
os.path.join(FIXTURES_DIR, 'test_from_csv_tables_generator_tables.csv')
|
||||||
|
]
|
||||||
|
|
||||||
|
def test_init_state_equal(self):
|
||||||
|
"""test that after init CSV and JSON generators have equal 'native_language', 'languages', 'templates', 'tables' attrubytes.
|
||||||
|
|
||||||
|
This is the only test needed because if state after init is the same then
|
||||||
|
behaviour is the same.
|
||||||
|
|
||||||
|
"""
|
||||||
|
json_generator = self.TestJSONGenerator()
|
||||||
|
csv_generator = self.TestCSVGenerator()
|
||||||
|
|
||||||
|
for attr_name in ['native_language', 'languages', 'templates', 'tables']:
|
||||||
|
try:
|
||||||
|
json_attr = getattr(json_generator, attr_name)
|
||||||
|
csv_attr = getattr(csv_generator, attr_name)
|
||||||
|
if isinstance(json_attr, list):
|
||||||
|
self.assertItemsEqual(csv_attr, json_attr)
|
||||||
|
else:
|
||||||
|
self.assertEqual(csv_attr, json_attr)
|
||||||
|
except Exception:
|
||||||
|
from nose.tools import set_trace; set_trace()
|
||||||
|
raise
|
||||||
|
|
|
@ -1,15 +1,9 @@
|
||||||
# coding: utf-8
|
# coding: utf-8
|
||||||
|
|
||||||
import os
|
|
||||||
import importlib
|
|
||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
import pynames
|
|
||||||
|
|
||||||
from pynames.relations import GENDER
|
from pynames.relations import GENDER
|
||||||
from pynames.base import BaseGenerator
|
from pynames.utils import get_all_generators
|
||||||
from pynames.from_list_generator import FromListGenerator
|
|
||||||
from pynames.from_tables_generator import FromTablesGenerator
|
|
||||||
|
|
||||||
|
|
||||||
# TODO: test forms:
|
# TODO: test forms:
|
||||||
|
@ -17,45 +11,10 @@ from pynames.from_tables_generator import FromTablesGenerator
|
||||||
# - how many items in forms (12 for russian)
|
# - how many items in forms (12 for russian)
|
||||||
|
|
||||||
|
|
||||||
def get_all_generators():
|
|
||||||
|
|
||||||
submodules = []
|
|
||||||
|
|
||||||
root_dir = os.path.dirname(pynames.__file__)
|
|
||||||
|
|
||||||
for dirname in os.listdir(root_dir):
|
|
||||||
module_path = os.path.join(root_dir, dirname)
|
|
||||||
if not os.path.isdir(module_path):
|
|
||||||
continue
|
|
||||||
|
|
||||||
try:
|
|
||||||
module_name = 'pynames.%s' % dirname
|
|
||||||
module = importlib.import_module(module_name)
|
|
||||||
submodules.append(module)
|
|
||||||
except Exception:
|
|
||||||
continue
|
|
||||||
|
|
||||||
generators = []
|
|
||||||
|
|
||||||
for module in submodules:
|
|
||||||
for generator in module.__dict__.values():
|
|
||||||
if not isinstance(generator, type) or not issubclass(generator, BaseGenerator):
|
|
||||||
continue
|
|
||||||
|
|
||||||
if generator in (FromTablesGenerator, FromListGenerator):
|
|
||||||
continue
|
|
||||||
|
|
||||||
generators.append(generator)
|
|
||||||
|
|
||||||
return generators
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class TestGenerators(unittest.TestCase):
|
class TestGenerators(unittest.TestCase):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def create_test_method(generator_class):
|
def create_test_method(generator_class):
|
||||||
|
|
||||||
def test_method(self):
|
def test_method(self):
|
||||||
|
|
29
pynames/tests/test_utils.py
Normal file
29
pynames/tests/test_utils.py
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
# coding: utf-8
|
||||||
|
|
||||||
|
import unittest
|
||||||
|
import tempfile
|
||||||
|
|
||||||
|
from pynames.utils import is_file
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
class TestName(unittest.TestCase):
|
||||||
|
|
||||||
|
def test_is_file(self):
|
||||||
|
some_file = tempfile.NamedTemporaryFile()
|
||||||
|
self.assertTrue(is_file(some_file))
|
||||||
|
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')))
|
56
pynames/utils.py
Normal file
56
pynames/utils.py
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
# coding: utf-8
|
||||||
|
|
||||||
|
import os
|
||||||
|
import importlib
|
||||||
|
|
||||||
|
import pynames
|
||||||
|
|
||||||
|
|
||||||
|
def get_all_generators():
|
||||||
|
|
||||||
|
from pynames.base import BaseGenerator
|
||||||
|
from pynames.from_list_generator import FromListGenerator
|
||||||
|
from pynames.from_tables_generator import FromTablesGenerator, FromCSVTablesGenerator
|
||||||
|
|
||||||
|
submodules = []
|
||||||
|
|
||||||
|
root_dir = os.path.dirname(pynames.__file__)
|
||||||
|
|
||||||
|
for dirname in os.listdir(root_dir):
|
||||||
|
module_path = os.path.join(root_dir, dirname)
|
||||||
|
if not os.path.isdir(module_path):
|
||||||
|
continue
|
||||||
|
|
||||||
|
try:
|
||||||
|
module_name = 'pynames.%s' % dirname
|
||||||
|
module = importlib.import_module(module_name)
|
||||||
|
submodules.append(module)
|
||||||
|
except Exception:
|
||||||
|
continue
|
||||||
|
|
||||||
|
generators = []
|
||||||
|
|
||||||
|
for module in submodules:
|
||||||
|
for generator in module.__dict__.values():
|
||||||
|
if not isinstance(generator, type) or not issubclass(generator, BaseGenerator):
|
||||||
|
continue
|
||||||
|
|
||||||
|
if generator in (FromTablesGenerator, FromListGenerator, FromCSVTablesGenerator):
|
||||||
|
continue
|
||||||
|
|
||||||
|
generators.append(generator)
|
||||||
|
|
||||||
|
return generators
|
||||||
|
|
||||||
|
|
||||||
|
def is_file(obj):
|
||||||
|
"""Retrun True is object has 'next', '__enter__' and '__exit__' methods.
|
||||||
|
|
||||||
|
Suitable to check both builtin ``file`` and ``django.core.file.File`` instances.
|
||||||
|
|
||||||
|
"""
|
||||||
|
return all(
|
||||||
|
[callable(getattr(obj, method_name, None)) for method_name in ('__enter__', '__exit__')]
|
||||||
|
+
|
||||||
|
[any([callable(getattr(obj, method_name, None)) for method_name in ('next', '__iter__')])]
|
||||||
|
)
|
3
setup.py
3
setup.py
|
@ -12,6 +12,7 @@ setuptools.setup(
|
||||||
description = "characters' name generation library",
|
description = "characters' name generation library",
|
||||||
long_description = open('README.md').read(),
|
long_description = open('README.md').read(),
|
||||||
include_package_data = True, # setuptools-git MUST be installed
|
include_package_data = True, # setuptools-git MUST be installed
|
||||||
test_suite = 'tests'# ,
|
test_suite = 'tests',
|
||||||
|
install_requires = ['unicodecsv'],
|
||||||
# package_data = { '': ['*.json'] }
|
# package_data = { '': ['*.json'] }
|
||||||
)
|
)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue