#!/usr/bin/env python
'''Random family generator
Needs the packages "requests" and "termcolor" to work.'''
import random
import requests
from termcolor import colored, cprint
GENDERS = ['male', 'female']
BIRTHDAYS = ['January', 'February', 'March', 'April', 'May', 'June',' July', 'August', 'September', 'October', 'November', 'December']
TITLES = ['Parent', 'Sibling']
def generate_age(min_age, max_age, use_gaussian):
age = 0
if use_gaussian:
mean = (max_age + min_age) / 2
dev = (max_age - min_age) / 4
age = int(random.gauss(mean, dev))
else:
age = random.randint(min_age, max_age)
return age
def get_school_grade(age):
if age < 4 or age > 17:
return None
if age <= 5:
return 'Kindergarten'
if age <= 6:
return "1st Grade"
if age <= 7:
return "2nd Grade"
if age <= 8:
return "3rd Grade"
if age <= 13:
return "{}th Grade".format(int(age-5))
if age <= 14:
return "High School Freshman"
if age <= 15:
return "High School Sophomore"
if age <= 16:
return "High School Junior"
return "High School Senior"
def get_names(count=10, gender=None, surname=False, frequency='all'):
name_params = {
'count': count,
'with_surname': 'true' if surname else 'false',
'frequency': frequency
}
if gender and gender in GENDERS:
name_params['type'] = gender
response = requests.get('ht' + 'tp://namey.muffinlabs.com/name.json',params=name_params)
return response.json()
class Character:
def __init__(self, gender=None, age=None, age_range=None, age_gaussian=False, birthday=None, title=None, alive=True):
self.alive = alive
if gender and gender in GENDERS:
self.gender = gender
else:
self.gender = random.choice(GENDERS)
if age:
self.age = int(age)
else:
if age_range is None:
age_range = [4, 17]
self.age = generate_age(age_range[0], age_range[1], age_gaussian)
if birthday and birthday in BIRTHDAYS:
self.birthday = birthday
else:
self.birthday = random.choice(BIRTHDAYS)
if title and title in TITLES:
self.title = title
else:
self.title = TITLES[1]
if title is None or title not in TITLES:
title = TITLES[1]
self.grade = get_school_grade(self.age)
def print_title(self):
if self.gender == GENDERS[0]:
if self.title == TITLES[0]:
return 'Father'
else:
return 'Son'
else:
if self.title == TITLES[0]:
return 'Mother'
else:
return 'Daughter'
def print(self, with_names=False):
names = None
if with_names:
print(colored('Getting name list', 'red', attrs=['bold']), end='\r')
args = {
'gender': self.gender,
'surname': True if self.title == TITLES[0] else False,
}
names = get_names(**args)
print(' ' * 80, end='\r')
description = '{} ({}, {})'.format(self.print_title(), self.age, self.birthday)
if self.grade:
description += ' - {}'.format(self.grade)
if not self.alive:
description += ' (Deceased)'
cprint(description, 'blue', attrs=['bold'])
if with_names:
cprint(', '.join(names), 'green')
class Family:
def __init__(self):
self.no_children = int(random.gauss(3,1))
self.mom_alive = random.randrange(100) < 90
self.dad_alive = random.randrange(100) < 95
self.first_pregnancy_age = int(random.gauss(17, 3))
self.children = [Character() for i in range(self.no_children)]
self.children.sort(key=lambda child: child.age, reverse=True)
self.mom_age = self.first_pregnancy_age + self.children[0].age
self.dad_age = self.mom_age + int(random.gauss(6, 10))
self.mom = Character(age=self.mom_age, gender=GENDERS[1], title=TITLES[0], alive=self.mom_alive)
self.dad = Character(age=self.dad_age, gender=GENDERS[0], title=TITLES[0], alive=self.dad_alive)
def print(self, with_names=False):
self.dad.print(with_names)
self.mom.print(with_names)
for child in self.children:
child.print(with_names)
if __name__ == '__main__':
family = Family()
family.print(True)