[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