Merge pull request #4 from imposeren/ironkingdoms

гобберы, огруны, тролкины и прочие из IronKingdoms; FromCSVTablesGenerator
This commit is contained in:
Aliaksei Yaletski 2015-02-22 14:12:02 +02:00
commit 219b810cfe
30 changed files with 1089 additions and 57 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View 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'),
]

View file

@ -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,,
1 male_firstname female_firstname surname
2 Alain Alanna Ainsworth
3 Alger Alexia Aleman
4 Alnor Alley Alkott
5 Alvy Amery Applewhite
6 Amery Ashlan Ashburn
7 Ansel Ashley Ashcroft
8 Anson Bailey Atchley
9 Ard Betilda Atwood
10 Arias Brona Bainbridge
11 Ardin Cammy Bancroft
12 Arkin Canice Bannister
13 Arland Cara Barrington
14 Artis Caylan Barton
15 Baen Cecily Baskin
16 Bain Creena Belker
17 Bairn Dara Bingley
18 Barden Darsey Blackburn
19 Barigan Delaney Blackwood
20 Barlowe Derry Boggs
21 Bartley Desle Borloch
22 Bayden Devlin Borne
23 Beck Dunla Bradner
24 Bergin Elatha Brasher
25 Birk Elspeth Briarford
26 Bixler Emma Brisbane
27 Blayde Enda Broadnax
28 Blythe Erris Brocker
29 Bolden Evelyn Calligan
30 Boren Gale Calvirt
31 Bors Gwen Cosgrave
32 Bowden Haley Darkmantle
33 Brandel Henna Denby
34 Brill Islene Denisson
35 Brock Jenett Dryden
36 Brone Jordan Dumas
37 Brue Juliana Dunford
38 Brunner Katerine Durst
39 Bryson Kealey Ellsworth
40 Cacey Kearey Falk
41 Caine Keavey Fenwick
42 Cam Kelsey Forsythe
43 Camden Kiltey Fullet
44 Casner Lorna Gadock
45 Cobb Matilda Galbraith
46 Creedan Meara Gant
47 Creel Morna Gately
48 Crowle Muriel Gilfin
49 Dalmer Nally Gilroy
50 Dardan Orla Grayden
51 Degar Renny Grimes
52 Delp Rosaleen Hadley
53 Dexer Rowan Haightley
54 Dextrel Sabina Halstead
55 Dorn Shay Hartcliff
56 Dowd Stianna Helstrom
57 Doyle Tara Helwick
58 Druce Torey Hitch
59 Dugger Tressa Hornbeck
60 Dunley Una Hurst
61 Durwin Vora Ironside
62 Eckert Wren Keightley
63 Egan Keller
64 Elias Kendrick
65 Elgin Kerrigan
66 Ennis Kerswell
67 Everett Kinnet
68 Fane Kirkston
69 Fargas Kurgan
70 Finch Langworth
71 Fitch Lynch
72 Gade Mallett
73 Gadsden Mallory
74 Galt Millward
75 Garrett Montfort
76 Garrick Mosley
77 Godwin Murdoch
78 Griffon Norwick
79 Gum Oberen
80 Gunner Oldham
81 Hamil Pendrake
82 Harlan Raelthorne
83 Hawke Ratcliff
84 Heremon Redgrave
85 Icabod Rhinehart
86 Jagger Rolfe
87 Jarok Rusling
88 Jonas Scarrow
89 Julian Shaw
90 Kade Skarholt
91 Kell Sunbright
92 Kerne Talbot
93 Kerr Tolbert
94 Leto Versh
95 Lon Villius
96 Mago Voyle
97 Malek Wadock
98 Milo Whitefield
99 Nash
100 Nolan
101 Odger
102 Olson
103 Pandor
104 Perth
105 Phineas
106 Radnor
107 Regan
108 Retho
109 Reynard
110 Rowe
111 Rudd
112 Scarle
113 Sebastian
114 Sorley
115 Timeck
116 Ulfass
117 Vahn
118 Victor
119 Vidor
120 Vinter
121 Waldron
122 Wolfe
123 Wyatt

View 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,,
1 male_firstname female_firstname surname
2 Admon Anlost Belgre
3 Arlack Bredine Blackheel
4 Barl Burnev Blackitt
5 Bartan Cathro Darrow
6 Bindar Celath Dolgren
7 Brogan Crelyth Domack
8 Bullin Crieda Dorgun
9 Decklin Darlave Durkin
10 Dragar Dira Fortros
11 Dunarl Garline Gherke
12 Durg Gedine Hardwick
13 Durke Geduve Icehold
14 Ecken Girta Lugro
15 Freitag Gorina Netweaver
16 Galtar Heleth Olghrd
17 Gamack Hiln Oreblood
18 Gerhard Magrat Redhammer
19 Gidrick Marba Rothrock
20 Golrick Mendine Serric
21 Gruhn Nollos Sigmur
22 Guvul Sartine Softshadow
23 Havelock Torlith Steadfast
24 Hedwig Uhlith Stoneground
25 Herne Ulave Torgun
26 Holdur Vetta Urdro
27 Jaldun Whitnock
28 Jurg Wroughthammer
29 Kalmon
30 Lossock
31 Redgar
32 Theldor
33 Tholrick
34 Tholrick
35 Thorne

View file

@ -0,0 +1,2 @@
languages,native_language
en,en
1 languages native_language
2 en en

View 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 "
1 gobber_first_name_male gobber_first_name_female gobber_descriptive gobber_descriptive_meaning
2 Ad Agghi ag untouchable, noisy or annoying
3 Ant Ala ak untouchable, noisy or annoying
4 Az Anh agen tough, stubborn
5 Boll Ano aken tough, stubborn
6 Bert Ara aggan bloodthirsty, gullible
7 Bork Atra akkan bloodthirsty, gullible
8 Dag Bel ahun always ready, lascivious or sadistic
9 Dar Da alog wise or clever, meek
10 Gek Dar alok wise or clever, meek
11 Gork Enda amun skilled camouflager, unimportant
12 Gort Gan aneg ferocious, irrational & gluttonous
13 Gul Gara anek ferocious, irrational & gluttonous
14 Gun Geka anen stealthy, nervous or insecure
15 Hek Gola anheg toolmaker, old & senile
16 Hok Gomm anhek toolmaker, old & senile
17 Kanh Gren ano adept or nimble, weak
18 Kug Grend arag powerful, smells horrible
19 Lan Kat arak powerful, smells horrible
20 Lok Lom atol good friend, leader in battle
21 Mo Mari dara healthy or long lived, conservative
22 Mog Meg egga radiant, manic
23 Nat Nan ekka radiant, manic
24 Nun Rala eleg precise, pretty & delicate
25 Ork Ren elek precise, pretty & delicate
26 Oz Sele emun efficient, aggressive
27 Pok Tere gamun quiet and withdrawn, maniacal
28 Poon Ugga gana exceptional, obese
29 Rak Ula gar fish, provider
30 Ranh Vel garda bold, uncouth & vulgar
31 Tak Walu gekan craftsman or artist, fickle
32 Thak Wikk heleg heroic, domineering
33 Tok helek heroic, domineering
34 Tot holdt cave or hole, fortress
35 Tun kam dexterous, cowardly
36 Tur kan sly, unrelaible
37 Un meleg restrained, maudlin & morbid
38 Vog melek restrained, maudlin & morbid
39 Vorg obalt prankster, hardhearted
40 Zhag omog animal friend, good cook
41 omok animal friend, good cook
42 ona healer or brewer, eccentric
43 onan strong, loner
44 oran distinguished, strange
45 ralog clever and creative, impractical
46 ralok clever and creative, impractical
47 rel observant, quiet and passive
48 uladar innovative, cheater
49 ulag intense, aloof
50 ulak intense, aloof
51 ulug insatiable, unstoppable
52 uluk insatiable, unstoppable
53 uman faithful and determined, fanatical
54 uren dreamer, sickly
55 vi shrewd, scavenger

View file

@ -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
1 template_name probability genders template
2 gobber_male 1 m gobber_first_name_male;-;gobber_first_name_female;-;gobber_first_name_male;-;gobber_descriptive
3 gobber_male 1 f gobber_first_name_female;-;gobber_first_name_female;-;gobber_first_name_male;-;gobber_descriptive

View file

@ -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,
1 male_firstname female_firstname surname
2 Alcyr Aesha Alcyan
3 Avross Alyssa Asir
4 Bres Caelyth Breir
5 Callael Cytyss Ellowuyr
6 Callis Dahlia Ferryll
7 Cinsyr Edrea Graccys
8 Cyvross Falcir Hallyr
9 Erryll Feen Heryllith
10 Felcyr Gaelyr Larisar
11 Glyssor Hellith Lloryrr
12 Gossyr Lorimir Luynmyr
13 Laconfir Lothwyn Lyorys
14 Lani Meryll Menellyth
15 Lissor Miir Raefyll
16 Neriwhen Renyll Reyvrese
17 Pelyth Sacyl Ryssyll
18 Rillis Shael Syvas
19 Sarlos Sillith Vrir
20 Shas Tanyr Waelen
21 Thale Tathir Wyldiss
22 Tryiss Tenae Wyllothyr
23 Tylth Velwhin
24 Vyros Veryth
25 Vystral Ystith

View 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,,,,,
1 male_firstname female_firstname surname khadoran_surname_traditional surname_male_suffix surname_female_suffix
2 Aika Akina Abrosim Abrosimovich evich ovna
3 Aleksi Akilina Adka Adkevich ovich evna
4 Alexandr Aleksa Agrimko Alekseevich
5 Alexei Anana Aleksy Aleshkovich
6 Aliosha Anastasia Aleshko Baborevich
7 Ambroz Anikita Antonidka Borgevich
8 Andrei Bazhina Babora Csaborovich
9 Balsnoch Britt Belavdon Dvorevich
10 Barak Cesta Berzhin Dvorovich
11 Bladko Cestina Blizbor Durgevich
12 Boris Corinna Bolovan Faltinovich
13 Borja Dalika Borga Grishkevich
14 Chasek Darzha Csabor Grishkovich
15 Costi Elina Dementskov Karakovich
16 Culamir Eliska Dvora Kutsovich
17 Dahlrif Elka Durga Ladislavovich
18 Dalmat Gridia Faltin Lovotovich
19 Dmitri Gubina Grishka Loukevich
20 Dobrinya Ihrin Grychkin Loukovich
21 Dorek Ilyana Gubin Lozarevich
22 Dragash Ivona Istori Lozarovich
23 Drago Kasia Karakov Makarovich
24 Falko Katerina Koposin Mileshkovich
25 Fedko Katia Krasnovo Mrovkovich
26 Fedor Klenka Kutsov Orlovich
27 Fodor Ksana Ladislav Padorinovich
28 Gasan Laika Lichko Petrokovich
29 Ghita Lariana Lovot Radazarevich
30 Giza Ludmila Louka Szetkovich
31 Gorash Malana Lozar Ushkovich
32 Goraz Marfa Makara Varnekovich
33 Gorian Marina Makarin Venianminovich
34 Grigor Marta Makarov Vilimovich
35 Grigory Mia Mikita Zavorovich
36 Iagan Mikhaila Mileshka Zhinovich
37 Iakhno Milena Mrovka
38 Iakshen Misha Nagorka
39 Igor Myrra Nazarko
40 Ilya Nastasja Neshka
41 Ivan Natalya Orlov
42 Ivash Nikita Osokin
43 Ivdan Ninete Ostyvik
44 Jachemir Ondreiana Padorin
45 Jarosch Riksa Petrok
46 Josef Siri Petru
47 Kachalo Sivasha Raboshich
48 Kigir Sofia Rachlavsky
49 Kirbitei Sonja Radazar
50 Kohan Stefka Rostov
51 Kosara Tahni Starov
52 Ladimir Tara Stasvite
53 Levanid Tatyana Szetka
54 Loshka Vjera Ushka
55 Luka Yelena Tiudiaminov
56 Malash Zelmira Toshiana
57 Malko Zori Varnek
58 Michal Venianminov
59 Michka Vilimov
60 Mikhail Vislovski
61 Mikolo Zavor
62 Mishka Zeitsev
63 Negomir Zhina
64 Nekras Zhivo
65 Nikolei
66 Olekse
67 Pachek
68 Petrov
69 Pytor
70 Radomir
71 Radu
72 Rajko
73 Ruskin
74 Sadko
75 Sergei
76 Servath
77 Solovei
78 Stoyan
79 Valerian
80 Vasily
81 Vasiuk
82 Vasko
83 Vladjimir
84 Vojin
85 Volkh
86 Yakov
87 Yaro
88 Yuri
89 Yurik

View 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
1 template_name probability genders template
2 fullname_male_1 7 m male_firstname; ;surname
3 fullname_male_2 3 m male_firstname; ;khadoran_surname_traditional
4 fullname_female_1 7 f female_firstname; ;surname
5 fullname_female_2 3 f female_firstname; ;khadoran_surname_traditional

View 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
1 male_firstname female_firstname surname
2 Borok Bekken Ammok
3 Bosh Beleg Assag
4 Dunuk Dekri Berok
5 Gantak Garka Hammerhand
6 Gorgol Ilka Hedlok
7 Gorlu Jessen Halghat
8 Kuluk Kelen Ironbiter
9 Kogul Kinik Ironside
10 Lagdor Krishka Korsuk
11 Lorgrul Rengan Kulghat
12 Monon Rilik Longspear
13 Natak Tilka Nokter
14 Oknot Torin Oakknee
15 Tokol Vilin Skullsplitter
16 Tuluk Stonehand
17 Zorok Strongarm
18 Thagrosh
19 Thologhat
20 Turnok
21 Urgark
22 Warbiter

View 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,,
1 male_firstname female_firstname surname
2 Alayn Alanna Albyn
3 Algyr Alexia Alyr
4 Alnor Alley Anthys
5 Alvy Amery Badrigio
6 Amery Ashlan Boudewyn
7 Ansyl Ashley Bracsio
8 Anson Bailey Bralazzi
9 Ard Betilda Bray
10 Aryas Brona Chalerio
11 Ardyn Cammy Claeys
12 Arkyn Canice Culpyn
13 Arland Cara Denys
14 Artys Caylan Dimiani
15 Bayn Cecily Donaes
16 Bayn Creena Dormio
17 Bayrn Dara Du
18 Bardyn Darsey Dunlyfe
19 Barygan Delaney Dyvacci
20 Barlowe Derry Dyvarc
21 Bartley Desle Elyse
22 Bayden Devlin Faryll
23 Beck Dunla Feryse
24 Byrgyn Elatha Fiscani
25 Byrk Elspeth Florys
26 Byxler Emma Gervaes
27 Blayde Enda Ghelyt
28 Blythe Erris Gilfyn
29 Boldyn Evylyn Glaeys
30 Boren Gale Gossyn
31 Bors Gwyn Govaes
32 Bowdyn Haley Granzio
33 Brandyl Henna Gustyn
34 Bryll Islene Gylbert
35 Brock Jenytt Gyrart
36 Brone Jordan Henryn
37 Brue Juliana Hengys
38 Brunnyr Katerine Lamsyn
39 Bryson Kealey Laurenyns
40 Cacey Kearey Lowys
41 Cayne Keavey Lymos
42 Cam Kelsey Lynyse
43 Camdyn Kiltey Mancario
44 Casnyr Lorna Martyn
45 Cobb Matilda Matys
46 Creedan Meara Mirassi
47 Creel Morna Morosini
48 Crowly Muriel Moysarc
49 Dalmyr Nally Niclaeys
50 Dardan Orla Petrozzi
51 Degar Rynny Polaro
52 Delp Rosaleen Rimbaldi
53 Dexer Rowan Rovissi
54 Dextrel Sabina Sanlyfe
55 Dorn Shay Tadirir
56 Dowd Stianna Torys
57 Doyle Tara Trivassi
58 Druce Torey Vandyse
59 Dugger Tryssa Viadro
60 Dunley Una Viscario
61 Durwyn Vora Weyne
62 Eckert Wryn Wulfe
63 Egan Wythsten
64 Elyas Yrnyse
65 Elgyn
66 Ennys
67 Everytt
68 Fane
69 Fargas
70 Fynch
71 Fytch
72 Gade
73 Gadsdyn
74 Galt
75 Garrytt
76 Garryck
77 Godwyn
78 Gryffon
79 Gum
80 Gunnyr
81 Hamyl
82 Harlan
83 Hawke
84 Herymon
85 Icabod
86 Jagger
87 Jarok
88 Jonas
89 Julyan
90 Kade
91 Kell
92 Kerne
93 Kerr
94 Lyto
95 Lon
96 Mago
97 Malyk
98 Mylo
99 Nash
100 Nolan
101 Odgyr
102 Olson
103 Pandor
104 Perth
105 Phyneas
106 Radnor
107 Rygan
108 Rytho
109 Reynard
110 Rowe
111 Rudd
112 Scarle
113 Sybastyan
114 Sorley
115 Tymyck
116 Ulfass
117 Vahn
118 Vyctor
119 Vydor
120 Vynter
121 Waldron
122 Wolfe
123 Wyatt

View file

@ -0,0 +1,3 @@
template_name,probability,genders,template
fullname_male,1,m,male_firstname; ;surname
fullname_female,1,f,female_firstname; ;surname
1 template_name probability genders template
2 fullname_male 1 m male_firstname; ;surname
3 fullname_female 1 f female_firstname; ;surname

View file

@ -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
1 male_firstname female_firstname surname
2 Aidan Aideen Aghamore
3 Ardan Ansleigh Bain
4 Bastian Beara Bartley
5 Blake Boand Beene
6 Bradig Brennan Berrigan
7 Branduff Caelan Blathmac
8 Brogan Caitlin Bradigan
9 Brosnan Carleigh Bray
10 Byrleigh Carolan Brenn
11 Cagneigh Clancy Burney
12 Colm Dana Byrne
13 Conleth Devlin Carrock
14 Conor Eithne Cathmore
15 Cormick Evlin Corcoran
16 Cronan Gillian Corley
17 Cullin Jelyan Cronan
18 Darian Jerilyn Decklan
19 Darragh Kaelin Deorain
20 Decklan Keehan Derrigan
21 Deegan Kennan Donovan
22 Dermid Kenseigh Doyle
23 Dermot Kerin Dromore
24 Dougal Kerry Duff
25 Dougan Kileigh Duffock
26 Durgan Lacy Duggan
27 Eilish Leigan Dunne
28 Fergus Lennon Enabarr
29 Finnegan Mara Fagan
30 Flynn Meara Finnian
31 Gervin Megan Finnigan
32 Gorman Milish Gafneagh
33 Gralan Niall Garrity
34 Hagan Nivin Gilmore
35 Hanagan Paddy Glasneagh
36 Hogan Regan Gormleigh
37 Ian Roshean Gowan
38 Keegan Shannon Grady
39 Killian Teagan Grath
40 Kirwin Tiernan Hugh
41 Larkin Hurlough
42 Lonan Kaddock
43 Lorcan Kain
44 Lorgan Kannock
45 Luan Kavanaugh
46 Mairtin Kerneigh
47 Morgan Keehan
48 Nolan Kerrigan
49 Odran Kilbride
50 Olan Kildair
51 Ossian Lattimore
52 Piran Leegan
53 Quinn Lochlan
54 Quinlan Lowreigh
55 Rogan Lynch
56 Ronan Madigan
57 Ryleigh Melroane
58 Moriarty
59 Mrrough
60 Rathleagh
61 Reardan
62 Riordan
63 Roane
64 Ryland
65 Scully
66 Sheridan
67 Scorleagh
68 Torcail
69 Turlough
70 Vain
71 Waddock
72 Wain

View 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
1 male_firstname female_firstname surname
2 Agnolo Alda Acorsi
3 Alvoro Aldiana Actavio
4 Amador Anastasi Avreu
5 Amario Andrea Balduccio
6 Ambro Badess Bandesco
7 Andro Biella Bateu
8 Avito Branca Begni
9 Bacar Carlutia Belcari
10 Bartal Consola Benzo
11 Barzal Creena Bezerra
12 Belchior Danola Borgho
13 Bernal Dialta Brancacci
14 Biagio Eliana Carvalo
15 Caldini Favia Casini
16 Calefo Felice Castra
17 Damasco Fia Corazo
18 Dego Gabriele Cravo
19 Falchi Giana Degrata
20 Faro Giona Duranti
21 Fernam Giovanna Evora
22 Francar Gratia Fariseu
23 Gaspar Imelda Florio
24 Gazo Isabel Gaspar
25 Gismondo Lena Gateu
26 Gozca Loriana Ginori
27 Grigori Lorita Goncal
28 Jaspar Malatesta Graza
29 Laspar Margia Guaspar
30 Lavoro Matea Labigio
31 Lionor Mirena Lasca
32 Lorio Nicola Lioni
33 Lupar Oliveta Mascal
34 Malo Orabella Masi
35 Manario Rena Mateu
36 Maro Rosa Mazini
37 Mateo Sandrea Nerini
38 Montador Scarlata Orafi
39 Nando Selanda Osoyro
40 Nicolo Simona Ovalho
41 Olivo Stiata Pagani
42 Ormano Tadeo Pelario
43 Padri Talia Pescar
44 Pascal Tareyja Petri
45 Piero Valori Randasi
46 Rafaldo Verona Regla
47 Ranal Rosado
48 Rufio Rubeu
49 Salvi Salo
50 Sighieri Salvestro
51 Stagiar Santoro
52 Vasco Scali
53 Zachar Scorgiani
54 Segalozo
55 Silva
56 Simtra
57 Solvo
58 Stario
59 Stradeu
60 Tavora
61 Tedesci
62 Telloso
63 Tieri
64 Torcail
65 Trovato
66 Ubaldo
67 Ulavari
68 Valoro
69 Varyo
70 Vascal
71 Vascalho
72 Versalo
73 Viteu
74 Zacharo
75 Zaspar
76 Zucco

View 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
1 male_firstname female_firstname surname
2 Balasar Brolas Bloodborn
3 Bendek Harthreen Bloodbreath
4 Ganthak Jata Boomhowler
5 Garosh Jennan Delleb
6 Gerlak Jussika Dogalus
7 Grindar Lassan Doomspeaker
8 Holdar Masalass Firetongue
9 Horluk Mossan Goodhammer
10 Jonhot Niolor Gormas
11 Joston Nosson Hoagbarth
12 Kolor Olos Kavkalash
13 Korlar Rossan Lorgash
14 Masdun Sollisa Lugosh
15 Stershan Sossamon Slaughterborn
16 Tassar Vasalor Surfborn
17 Termen Vatess Stonehide
18 Vessos Toborg
19 Vialoss Tumbrog

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

View file

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

View file

@ -0,0 +1,3 @@
languages,native_language
ru,en
en,
1 languages native_language
2 ru en
3 en

View 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,,,,,
1 table1:en,table1:ru,table2:en,table2:ru,table3:en,table3:ru,table4:en,table4:ru
2 T1EN1,T1RU1,_m_en_1,_m_ru_1,_f_en_1,_f_ru_1;_f_ru_1_form,','
3 T1EN2,T1RU2,_m_en_2,_m_ru_2,,,
4 T1EN3,T1RU3,,,,,

View 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
1 template_name probability genders template
2 t1 2 m table1;table2
3 t2 2 f table1;table3
4 t3 1 m;f table1;table2;table4;table3

View file

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

View file

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

View 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
View 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__')])]
)

View file

@ -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'] }
) )