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 *.csv
|
||||
|
|
|
@ -7,3 +7,4 @@ import pynames.korean
|
|||
import pynames.russian
|
||||
|
||||
from pynames.relations import GENDER, LANGUAGE
|
||||
from pynames.utils import get_all_generators
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
# coding: utf-8
|
||||
|
||||
|
||||
class PynamesError(Exception):
|
||||
MSG = None
|
||||
|
||||
|
@ -7,7 +8,6 @@ class PynamesError(Exception):
|
|||
super(PynamesError, self).__init__(self.MSG % kwargs)
|
||||
|
||||
|
||||
|
||||
class NoDefaultNameValue(PynamesError):
|
||||
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):
|
||||
pass
|
||||
|
||||
|
||||
class NoNamesLoadedFromListError(FromListGeneratorError):
|
||||
MSG = u'no names loaded from "%(source)s"'
|
||||
|
||||
|
@ -22,9 +23,16 @@ class NoNamesLoadedFromListError(FromListGeneratorError):
|
|||
class FromTablesGeneratorError(PynamesError):
|
||||
pass
|
||||
|
||||
|
||||
class WrongTemplateStructureError(FromTablesGeneratorError):
|
||||
MSG = u'wrong template structure - cannot choose template for genders %(genders)r with template source: "%(source)s"'
|
||||
|
||||
|
||||
class NotEqualFormsLengths(FromTablesGeneratorError):
|
||||
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
|
||||
|
||||
# python lib:
|
||||
import json
|
||||
import random
|
||||
from collections import Iterable
|
||||
|
||||
from pynames.relations import GENDER, LANGUAGE, LANGUAGE_FORMS_LANGTH
|
||||
from pynames.names import Name
|
||||
from pynames.base import BaseGenerator
|
||||
# thirdparties:
|
||||
import unicodecsv
|
||||
|
||||
# pynames:
|
||||
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):
|
||||
|
@ -45,37 +53,66 @@ class Template(object):
|
|||
return left + right
|
||||
|
||||
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:
|
||||
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})
|
||||
|
||||
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):
|
||||
|
||||
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):
|
||||
super(FromTablesGenerator, self).__init__()
|
||||
self.templates_choices = {}
|
||||
self.templates = []
|
||||
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.'
|
||||
raise NotImplementedError(error_msg)
|
||||
|
||||
with open(self.SOURCE) as f:
|
||||
with open(source) as f:
|
||||
data = json.load(f)
|
||||
self.native_language = data['native_language']
|
||||
self.languages = set(data['languages'])
|
||||
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)
|
||||
for template_name, template_data in data['templates'].items() ]
|
||||
self.templates = [
|
||||
Template(template_name, self.native_language, self.languages, template_data)
|
||||
for template_name, template_data in data['templates'].items()
|
||||
]
|
||||
self.tables = data['tables']
|
||||
|
||||
@staticmethod
|
||||
|
@ -94,7 +131,6 @@ class FromTablesGenerator(BaseGenerator):
|
|||
def _get_names_number_for_template(self):
|
||||
pass
|
||||
|
||||
|
||||
def get_names_number(self, genders=GENDER.ALL):
|
||||
templates = self._get_templates_slice(genders)
|
||||
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]:
|
||||
test.assertTrue(isinstance(record['languages'][language], list))
|
||||
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
|
||||
|
||||
from pynames.from_tables_generator import FromTablesGenerator
|
||||
from pynames.iron_kingdoms import GobberFullnameGenerator
|
||||
|
||||
FIXTURES_DIR = os.path.join(os.path.dirname(__file__), 'fixtures')
|
||||
|
||||
|
||||
class GoblinGenerator(FromTablesGenerator):
|
||||
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_tables_generator 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
|
||||
|
||||
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')
|
||||
|
||||
|
@ -91,3 +91,38 @@ class TestFromTablesGenerator(unittest.TestCase):
|
|||
name = generator.get_name(genders=[GENDER.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)
|
||||
|
||||
|
||||
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
|
||||
|
||||
import os
|
||||
import importlib
|
||||
import unittest
|
||||
|
||||
import pynames
|
||||
|
||||
from pynames.relations import GENDER
|
||||
from pynames.base import BaseGenerator
|
||||
from pynames.from_list_generator import FromListGenerator
|
||||
from pynames.from_tables_generator import FromTablesGenerator
|
||||
from pynames.utils import get_all_generators
|
||||
|
||||
|
||||
# TODO: test forms:
|
||||
|
@ -17,45 +11,10 @@ from pynames.from_tables_generator import FromTablesGenerator
|
|||
# - 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):
|
||||
pass
|
||||
|
||||
|
||||
|
||||
def create_test_method(generator_class):
|
||||
|
||||
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",
|
||||
long_description = open('README.md').read(),
|
||||
include_package_data = True, # setuptools-git MUST be installed
|
||||
test_suite = 'tests'# ,
|
||||
test_suite = 'tests',
|
||||
install_requires = ['unicodecsv'],
|
||||
# package_data = { '': ['*.json'] }
|
||||
)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue