[Checkins] SVN: z3c.datagenerator/trunk/ - Feature: Added tests for all data generators.
Stephen Richter
cvs-admin at zope.org
Wed Feb 6 14:46:58 UTC 2013
Log message for revision 129148:
- Feature: Added tests for all data generators.
- Feature: Added an ID data generator that can generate all sorts of IDs that
could occur in systems.
- Bug: The IPv4 generator ignored the seed making the generator "unstable".
- Get ready for release.
Changed:
U z3c.datagenerator/trunk/CHANGES.txt
U z3c.datagenerator/trunk/setup.py
U z3c.datagenerator/trunk/src/z3c/datagenerator/README.txt
U z3c.datagenerator/trunk/src/z3c/datagenerator/demographics.py
U z3c.datagenerator/trunk/src/z3c/datagenerator/generator.py
U z3c.datagenerator/trunk/src/z3c/datagenerator/net.py
-=-
Modified: z3c.datagenerator/trunk/CHANGES.txt
===================================================================
--- z3c.datagenerator/trunk/CHANGES.txt 2013-02-06 08:52:42 UTC (rev 129147)
+++ z3c.datagenerator/trunk/CHANGES.txt 2013-02-06 14:46:57 UTC (rev 129148)
@@ -2,11 +2,19 @@
CHANGES
=======
-0.0.4 (unreleased)
+1.0.0 (2013-02-06)
------------------
-- Windows: ``consistent_hash`` make the return value an ``int``
+- Feature: Added tests for all data generators.
+- Feature: Added an ID data generator that can generate all sorts of IDs that
+ could occur in systems.
+
+- Feature: To properly support Windows, ``consistent_hash()`` returns an
+ integer.
+
+- Bug: The IPv4 generator ignored the seed making the generator "unstable".
+
0.0.3 (2008-12-03)
------------------
Modified: z3c.datagenerator/trunk/setup.py
===================================================================
--- z3c.datagenerator/trunk/setup.py 2013-02-06 08:52:42 UTC (rev 129147)
+++ z3c.datagenerator/trunk/setup.py 2013-02-06 14:46:57 UTC (rev 129148)
@@ -11,10 +11,7 @@
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
-"""Setup
-
-$Id:$
-"""
+"""Setup"""
import os
from setuptools import setup, find_packages
@@ -23,27 +20,29 @@
setup (
name='z3c.datagenerator',
- version='0.0.4dev',
+ version='1.0.0',
author = "Stephan Richter and the Zope Community",
author_email = "zope3-dev at zope.org",
- description = "Datagenerator for z3c.sampledata",
+ description = "Datagenerator for Testing and Sample Data",
long_description=(
read('README.txt')
+ '\n\n' +
read('CHANGES.txt')
),
license = "ZPL 2.1",
- keywords = "zope3 z3c data generator sampledata",
+ keywords = "data generator sampledata",
classifiers = [
- 'Development Status :: 4 - Beta',
- 'Environment :: Web Environment',
+ 'Development Status :: 5 - Production/Stable',
'Intended Audience :: Developers',
'License :: OSI Approved :: Zope Public License',
'Programming Language :: Python',
'Natural Language :: English',
'Operating System :: OS Independent',
- 'Topic :: Internet :: WWW/HTTP',
- 'Framework :: Zope3'],
+ 'Topic :: Software Development :: Libraries :: Python Modules',
+ 'Topic :: Utilities',
+ 'Programming Language :: Python',
+ 'Programming Language :: Python :: 2.6',
+ 'Programming Language :: Python :: 2.7'],
url = 'http://cheeseshop.python.org/pypi/z3c.datagenerator',
packages = find_packages('src'),
include_package_data = True,
Modified: z3c.datagenerator/trunk/src/z3c/datagenerator/README.txt
===================================================================
--- z3c.datagenerator/trunk/src/z3c/datagenerator/README.txt 2013-02-06 08:52:42 UTC (rev 129147)
+++ z3c.datagenerator/trunk/src/z3c/datagenerator/README.txt 2013-02-06 14:46:57 UTC (rev 129148)
@@ -10,12 +10,213 @@
An essential part of this package is a consistent hash generator. Verify
its output.
- >>> from z3c.datagenerator.generator import consistent_hash
- >>> consistent_hash('seed') == 1149756166
+ >>> from z3c.datagenerator import generator
+ >>> generator.consistent_hash('seed') == 1149756166
True
- >>> consistent_hash('') == 0
+ >>> generator.consistent_hash('') == 0
True
- >>> consistent_hash('0') == 4108050209
+ >>> generator.consistent_hash('0') == 4108050209
True
-(More tests needed, obviously.)
+
+Generic Generators
+==================
+
+Date Generator
+--------------
+
+This generator creates a date from a given range:
+
+ >>> import datetime
+ >>> gen = generator.DateDataGenerator(
+ ... 'seed',
+ ... start=datetime.date(2012, 1, 1),
+ ... end=datetime.date(2013, 1, 1))
+
+ >>> gen.get()
+ datetime.date(2012, 11, 20)
+ >>> gen.getMany(2)
+ [datetime.date(2012, 7, 11), datetime.date(2012, 8, 26)]
+
+
+ID Generator
+------------
+
+This generator can create a wide variety of IDs.
+
+ >>> gen = generator.IdDataGenerator(
+ ... 'seed',
+ ... prefix='ID',
+ ... separator='*',
+ ... numbers=3,
+ ... max_value=8000)
+
+ >>> gen.get()
+ 'ID4954*7244*4825'
+ >>> gen.getMany(3)
+ ['ID4056*571*7689', 'ID1794*3687*5166', 'ID2585*1495*6947']
+
+
+Demographics Generators
+=======================
+
+This module contains a set of every day demographics data generators.
+
+ >>> from z3c.datagenerator import demographics
+
+
+Last Name Generator
+-------------------
+
+This generator creates last names from a predefined set.
+
+ >>> gen = demographics.LastNameGenerator('seed')
+
+ >>> gen.get()
+ u'Lambert'
+ >>> gen.getMany(3)
+ [u'Oliver', u'Meyer', u'Jones']
+
+
+First Name Generator
+--------------------
+
+This generator creates first names from a predefined set.
+
+ >>> gen = demographics.FirstNameGenerator('seed')
+
+ >>> gen.get()
+ u'Agnieszka'
+ >>> gen.getMany(3)
+ [u'Lisa', u'Tony', u'Madison']
+
+
+SSN Generator
+-------------
+
+This generator creates valid US social security numbers (SSN).
+
+ >>> gen = demographics.SSNDataGenerator('seed')
+
+ >>> gen.get()
+ u'958-10-9260'
+ >>> gen.getMany(3)
+ [u'428-28-5754', u'975-01-6049', u'351-79-6709']
+
+
+US Address Generator
+--------------------
+
+This generator creates US addresses that look realistic but are completely
+randomly generated. Street and city names are selected from a pre-defined
+set. Note that you can change all the data files to generate addresses of
+other contries.
+
+ >>> gen = demographics.AddressDataGenerator('seed')
+
+ >>> gen.get()
+ (u'440 Graymalkin Cove', u'Whitefield', u'RI', u'63293')
+ >>> gen.getMany(1)
+ [(u'1963 Bryn Mahr Cove', u'Ashfield', u'NV', u'20388')]
+
+You can also get all components by themselves:
+
+ >>> gen.getStreet()
+ u'1629 Clinton Terrace'
+ >>> gen.getCity()
+ u'Farmington'
+ >>> gen.getState()
+ u'PA'
+ >>> gen.getZip()
+ u'19658'
+
+
+US Phone Number Generator
+-------------------------
+
+This generator creates correctly formatted US-style phone numbers.
+
+ >>> gen = demographics.PhoneDataGenerator('seed')
+
+ >>> gen.get()
+ u'889-666-7726'
+ >>> gen.getMany(3)
+ [u'410-163-7715', u'668-898-5122', u'868-998-6087']
+
+
+You can also force the area code to be "555", which is a dummy area code.
+
+ >>> gen = demographics.PhoneDataGenerator('seed', True)
+ >>> gen.get()
+ u'555-877-6664'
+
+Network Generators
+==================
+
+This module contains a set of computer and network related generators
+
+ >>> from z3c.datagenerator import net
+
+
+IPv4 Generator
+--------------
+
+This generator creates valid IPv4 addresses.
+
+ >>> gen = net.IPv4DataGenerator('seed')
+
+ >>> gen.get()
+ '163.085.173.022'
+ >>> gen.getMany(3)
+ ['108.209.065.019', '236.049.181.080', '075.110.011.122']
+
+
+Username Generator
+------------------
+
+This generator creates usernames from real names.
+
+ >>> gen = net.UsernameDataGenerator('seed')
+
+ >>> gen.get()
+ u'alambert'
+ >>> gen.getMany(3)
+ [u'loliver', u'tmeyer', u'mjones']
+
+You can also pass in the first and last name to the generator method.
+
+ >>> gen.get('Stephan', 'Richter')
+ u'srichter'
+
+Let's change the pattern:
+
+ >>> gen = net.UsernameDataGenerator(
+ ... 'seed', u'%(firstName).s%(lastName)s.%(number)s')
+ >>> gen.get()
+ u'lambert.13'
+
+The available variables are:
+
+* firstName
+* firstInitial
+* lastName
+* lastInitial
+* number
+
+
+E-mail Generator
+----------------
+
+This generator creates properly formatted E-mail addresses with proper TLDs.
+
+ >>> gen = net.EMailDataGenerator('seed')
+
+ >>> gen.get()
+ u'alambert at answering.edu'
+ >>> gen.getMany(3)
+ [u'loliver at acclimated.edu', u'tmeyer at skillfulness.mil', u'mjones at monks.biz']
+
+You can also pass in the username to the generator method.
+
+ >>> gen.get('srichter')
+ u'srichter at plaque.info'
Modified: z3c.datagenerator/trunk/src/z3c/datagenerator/demographics.py
===================================================================
--- z3c.datagenerator/trunk/src/z3c/datagenerator/demographics.py 2013-02-06 08:52:42 UTC (rev 129147)
+++ z3c.datagenerator/trunk/src/z3c/datagenerator/demographics.py 2013-02-06 14:46:57 UTC (rev 129148)
@@ -11,10 +11,7 @@
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
-"""Demographics Data Generators
-
-$Id$
-"""
+"""Demographics Data Generators"""
__docformat__ = "reStructuredText"
import os
import random
@@ -108,15 +105,17 @@
"""A phone data generator."""
template = u'%i-%.3i-%.4i'
+ fivesAreaCode = False
- def __init__(self, seed):
- self.random = random.Random(generator.consistent_hash(seed+'ssn'))
+ def __init__(self, seed, fivesAreaCode=False):
+ self.random = random.Random(generator.consistent_hash(seed+'phone'))
+ self.fivesAreaCode = fivesAreaCode
def get(self):
"""Compute a social security number."""
randint = self.random.randint
- return self.template %(
- randint(100, 999), randint(1, 999), randint(1, 9999))
+ areaCode = 555 if self.fivesAreaCode else randint(100, 999)
+ return self.template %(areaCode, randint(1, 999), randint(1, 9999))
def getMany(self, number):
"""Select a set of values from the values list and return them."""
Modified: z3c.datagenerator/trunk/src/z3c/datagenerator/generator.py
===================================================================
--- z3c.datagenerator/trunk/src/z3c/datagenerator/generator.py 2013-02-06 08:52:42 UTC (rev 129147)
+++ z3c.datagenerator/trunk/src/z3c/datagenerator/generator.py 2013-02-06 14:46:57 UTC (rev 129148)
@@ -11,13 +11,11 @@
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
-"""Data Generators
-
-$Id$
-"""
+"""Data Generators"""
__docformat__ = "reStructuredText"
import csv
import datetime
+import math
import os
import random
from zlib import crc32
@@ -93,7 +91,7 @@
zope.interface.implements(interfaces.IDateDataGenerator)
def __init__(self, seed, start=None, end=None):
- self.random = random.Random(consistent_hash(seed+'ssn'))
+ self.random = random.Random(consistent_hash(seed+'date'))
self.start = start or datetime.date(2000, 1, 1)
self.end = end or datetime.date(2007, 1, 1)
@@ -107,3 +105,34 @@
def getMany(self, number):
"""Select a set of values from the values list and return them."""
return [self.get() for count in xrange(number)]
+
+
+class IdDataGenerator(object):
+ """An ID data generator."""
+
+ prefix = 'ID'
+ separator = '-'
+ numbers = 4
+ max_value = 99
+
+ def __init__(self, seed, prefix='ID', separator='-', numbers=4,
+ max_value=99):
+ self.random = random.Random(consistent_hash(seed + 'id'))
+ self.prefix = prefix
+ self.separator = separator
+ self.numbers = numbers
+ self.max_value = max_value
+ self._num_format = '%.' + str(int(math.log10(self.max_value + 1))) + 'i'
+
+ def get(self):
+ """Compute a social security number."""
+ randint = self.random.randint
+ value = self.prefix
+ value += self.separator.join(
+ self._num_format % randint(0, self.max_value)
+ for idx in xrange(self.numbers))
+ return value
+
+ def getMany(self, number):
+ """Select a set of values from the values list and return them."""
+ return [self.get() for count in xrange(number)]
Modified: z3c.datagenerator/trunk/src/z3c/datagenerator/net.py
===================================================================
--- z3c.datagenerator/trunk/src/z3c/datagenerator/net.py 2013-02-06 08:52:42 UTC (rev 129147)
+++ z3c.datagenerator/trunk/src/z3c/datagenerator/net.py 2013-02-06 14:46:57 UTC (rev 129148)
@@ -11,10 +11,7 @@
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
-"""Demographics Data Generators
-
-$Id$
-"""
+"""Demographics Data Generators"""
__docformat__ = "reStructuredText"
import os
import random
@@ -33,8 +30,8 @@
def get(self):
"""Select a value from the values list and return it."""
return '%.3i.%.3i.%.3i.%.3i' %(
- random.randint(1, 255), random.randint(0, 255),
- random.randint(0, 255), random.randint(0, 255))
+ self.random.randint(1, 255), self.random.randint(0, 255),
+ self.random.randint(0, 255), self.random.randint(0, 255))
def getMany(self, number):
"""Select a set of values from the values list and return them."""
@@ -47,10 +44,12 @@
pattern = u'%(firstInitial)s%(lastName)s'
- def __init__(self, seed):
+ def __init__(self, seed, pattern=None):
self.random = random.Random(generator.consistent_hash(seed+'username'))
self.firstNames = demographics.FirstNameGenerator(seed)
self.lastNames = demographics.LastNameGenerator(seed)
+ if pattern:
+ self.pattern = pattern
def get(self, firstName=None, lastName=None):
@@ -80,7 +79,7 @@
pattern = '%(uname)s@%(domain)s%(tld)s'
def __init__(self, seed):
- self.random = random.Random(generator.consistent_hash(seed+'username'))
+ self.random = random.Random(generator.consistent_hash(seed+'enail'))
self.usernames = UsernameDataGenerator(seed)
self.words = generator.TextDataGenerator(seed, self.wordsFile)
self.tlds = generator.CSVDataGenerator(seed, self.tldsFile)
More information about the checkins
mailing list