[Checkins] SVN: z3c.datagenerator/trunk/ Preparing release 2.0.0

Stephen Richter cvs-admin at zope.org
Wed Feb 6 16:38:14 UTC 2013


Log message for revision 129153:
  Preparing release 2.0.0

Changed:
  _U  z3c.datagenerator/trunk/
  U   z3c.datagenerator/trunk/CHANGES.txt
  A   z3c.datagenerator/trunk/bootstrap3.py
  U   z3c.datagenerator/trunk/buildout.cfg
  U   z3c.datagenerator/trunk/setup.py
  A   z3c.datagenerator/trunk/src/z3c/datagenerator/README3.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
  U   z3c.datagenerator/trunk/src/z3c/datagenerator/tests/test_doc.py
  A   z3c.datagenerator/trunk/tox.ini

-=-

Property changes on: z3c.datagenerator/trunk
___________________________________________________________________
Modified: svn:ignore
   - .installed.cfg
bin
develop-eggs
parts

   + .installed.cfg
bin
develop-eggs
dist
parts
.tox
__pycache__


Modified: z3c.datagenerator/trunk/CHANGES.txt
===================================================================
--- z3c.datagenerator/trunk/CHANGES.txt	2013-02-06 14:54:41 UTC (rev 129152)
+++ z3c.datagenerator/trunk/CHANGES.txt	2013-02-06 16:38:13 UTC (rev 129153)
@@ -2,12 +2,14 @@
 CHANGES
 =======
 
-1.0.1 (unreleased)
+2.0.0 (2013-02-06)
 ------------------
 
-- Nothing changed yet.
+- Feature: Support for Python 3.
 
+- Bug: Make sure that all files are closed properly.
 
+
 1.0.0 (2013-02-06)
 ------------------
 

Added: z3c.datagenerator/trunk/bootstrap3.py
===================================================================
--- z3c.datagenerator/trunk/bootstrap3.py	                        (rev 0)
+++ z3c.datagenerator/trunk/bootstrap3.py	2013-02-06 16:38:13 UTC (rev 129153)
@@ -0,0 +1,165 @@
+##############################################################################
+#
+# Copyright (c) 2006 Zope Foundation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Bootstrap a buildout-based project
+
+Simply run this script in a directory containing a buildout.cfg.
+The script accepts buildout command-line options, so you can
+use the -c option to specify an alternate configuration file.
+"""
+
+import os, shutil, sys, tempfile
+from optparse import OptionParser
+
+tmpeggs = tempfile.mkdtemp()
+
+usage = '''\
+[DESIRED PYTHON FOR BUILDOUT] bootstrap.py [options]
+
+Bootstraps a buildout-based project.
+
+Simply run this script in a directory containing a buildout.cfg, using the
+Python that you want bin/buildout to use.
+
+Note that by using --setup-source and --download-base to point to
+local resources, you can keep this script from going over the network.
+'''
+
+parser = OptionParser(usage=usage)
+parser.add_option("-v", "--version", help="use a specific zc.buildout version")
+
+parser.add_option("-t", "--accept-buildout-test-releases",
+                  dest='accept_buildout_test_releases',
+                  action="store_true", default=False,
+                  help=("Normally, if you do not specify a --version, the "
+                        "bootstrap script and buildout gets the newest "
+                        "*final* versions of zc.buildout and its recipes and "
+                        "extensions for you.  If you use this flag, "
+                        "bootstrap and buildout will get the newest releases "
+                        "even if they are alphas or betas."))
+parser.add_option("-c", "--config-file",
+                   help=("Specify the path to the buildout configuration "
+                         "file to be used."))
+parser.add_option("-f", "--find-links",
+                   help=("Specify a URL to search for buildout releases"))
+
+
+options, args = parser.parse_args()
+
+######################################################################
+# load/install distribute
+
+to_reload = False
+try:
+    import pkg_resources, setuptools
+    if not hasattr(pkg_resources, '_distribute'):
+        to_reload = True
+        raise ImportError
+except ImportError:
+    ez = {}
+
+    try:
+        from urllib.request import urlopen
+    except ImportError:
+        from urllib2 import urlopen
+
+    exec(urlopen('http://python-distribute.org/distribute_setup.py').read(), ez)
+    setup_args = dict(to_dir=tmpeggs, download_delay=0, no_fake=True)
+    ez['use_setuptools'](**setup_args)
+
+    if to_reload:
+        reload(pkg_resources)
+    import pkg_resources
+    # This does not (always?) update the default working set.  We will
+    # do it.
+    for path in sys.path:
+        if path not in pkg_resources.working_set.entries:
+            pkg_resources.working_set.add_entry(path)
+
+######################################################################
+# Install buildout
+
+ws  = pkg_resources.working_set
+
+cmd = [sys.executable, '-c',
+       'from setuptools.command.easy_install import main; main()',
+       '-mZqNxd', tmpeggs]
+
+find_links = os.environ.get(
+    'bootstrap-testing-find-links',
+    options.find_links or
+    ('http://downloads.buildout.org/'
+     if options.accept_buildout_test_releases else None)
+    )
+if find_links:
+    cmd.extend(['-f', find_links])
+
+distribute_path = ws.find(
+    pkg_resources.Requirement.parse('distribute')).location
+
+requirement = 'zc.buildout'
+version = options.version
+if version is None and not options.accept_buildout_test_releases:
+    # Figure out the most recent final version of zc.buildout.
+    import setuptools.package_index
+    _final_parts = '*final-', '*final'
+    def _final_version(parsed_version):
+        for part in parsed_version:
+            if (part[:1] == '*') and (part not in _final_parts):
+                return False
+        return True
+    index = setuptools.package_index.PackageIndex(
+        search_path=[distribute_path])
+    if find_links:
+        index.add_find_links((find_links,))
+    req = pkg_resources.Requirement.parse(requirement)
+    if index.obtain(req) is not None:
+        best = []
+        bestv = None
+        for dist in index[req.project_name]:
+            distv = dist.parsed_version
+            if _final_version(distv):
+                if bestv is None or distv > bestv:
+                    best = [dist]
+                    bestv = distv
+                elif distv == bestv:
+                    best.append(dist)
+        if best:
+            best.sort()
+            version = best[-1].version
+if version:
+    requirement = '=='.join((requirement, version))
+cmd.append(requirement)
+
+import subprocess
+if subprocess.call(cmd, env=dict(os.environ, PYTHONPATH=distribute_path)) != 0:
+    raise Exception(
+        "Failed to execute command:\n%s",
+        repr(cmd)[1:-1])
+
+######################################################################
+# Import and run buildout
+
+ws.add_entry(tmpeggs)
+ws.require(requirement)
+import zc.buildout.buildout
+
+if not [a for a in args if '=' not in a]:
+    args.append('bootstrap')
+
+# if -c was provided, we push it back into args for buildout' main function
+if options.config_file is not None:
+    args[0:0] = ['-c', options.config_file]
+
+zc.buildout.buildout.main(args)
+shutil.rmtree(tmpeggs)


Property changes on: z3c.datagenerator/trunk/bootstrap3.py
___________________________________________________________________
Added: svn:keywords
   + Id

Modified: z3c.datagenerator/trunk/buildout.cfg
===================================================================
--- z3c.datagenerator/trunk/buildout.cfg	2013-02-06 14:54:41 UTC (rev 129152)
+++ z3c.datagenerator/trunk/buildout.cfg	2013-02-06 16:38:13 UTC (rev 129153)
@@ -1,12 +1,8 @@
 [buildout]
 develop = .
-parts = test coverage
+parts = test
 
 [test]
 recipe = zc.recipe.testrunner
 eggs = z3c.datagenerator [test]
 
-[coverage]
-recipe = zc.recipe.egg
-eggs = z3c.coverage
-

Modified: z3c.datagenerator/trunk/setup.py
===================================================================
--- z3c.datagenerator/trunk/setup.py	2013-02-06 14:54:41 UTC (rev 129152)
+++ z3c.datagenerator/trunk/setup.py	2013-02-06 16:38:13 UTC (rev 129153)
@@ -20,7 +20,7 @@
 
 setup (
     name='z3c.datagenerator',
-    version='1.0.1.dev0',
+    version='2.0.0',
     author = "Stephan Richter and the Zope Community",
     author_email = "zope3-dev at zope.org",
     description = "Datagenerator for Testing and Sample Data",
@@ -42,23 +42,23 @@
         'Topic :: Utilities',
         'Programming Language :: Python',
         'Programming Language :: Python :: 2.6',
-        'Programming Language :: Python :: 2.7'],
+        'Programming Language :: Python :: 2.7',
+        'Programming Language :: Python :: 3.3'],
     url = 'http://cheeseshop.python.org/pypi/z3c.datagenerator',
     packages = find_packages('src'),
     include_package_data = True,
     package_dir = {'':'src'},
     namespace_packages = ['z3c'],
     extras_require = dict(
-        test = [
-            'zope.testing',
-            'z3c.coverage',
-            ],
+        test = ['zope.testing'],
         ),
     install_requires = [
         'setuptools',
+        'six',
         'zope.interface',
         'zope.schema',
         ],
     zip_safe = False,
+    tests_require = ['zope.testing'],
     test_suite = 'z3c.datagenerator.tests.test_doc.test_suite',
 )

Added: z3c.datagenerator/trunk/src/z3c/datagenerator/README3.txt
===================================================================
--- z3c.datagenerator/trunk/src/z3c/datagenerator/README3.txt	                        (rev 0)
+++ z3c.datagenerator/trunk/src/z3c/datagenerator/README3.txt	2013-02-06 16:38:13 UTC (rev 129153)
@@ -0,0 +1,226 @@
+===============
+Data Generators
+===============
+
+:Note: This is the Python 3 version of the documentation. The random number
+       generator changed, so that the output will differ!
+
+Data Generators are meant to create data for your application quickly. They
+are most useful for generating sample data. Sample Data, in turn, allows you
+to test your application with much more realistic data volumes and is
+considered for some development groups as essential as tests themselves.
+
+An essential part of this package is a consistent hash generator.  Verify
+its output.
+
+  >>> from z3c.datagenerator import generator
+  >>> generator.consistent_hash('seed') == 1149756166
+  True
+  >>> generator.consistent_hash('') == 0
+  True
+  >>> generator.consistent_hash('0') == 4108050209
+  True
+
+
+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, 9, 25)
+  >>> gen.getMany(2)
+  [datetime.date(2012, 11, 29), datetime.date(2012, 4, 16)]
+
+
+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()
+  'ID5073*3888*7417'
+  >>> gen.getMany(3)
+  ['ID035*4940*3819', 'ID4152*7603*585', 'ID6058*7872*7015']
+
+
+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()
+  "O'Doherty"
+  >>> gen.getMany(3)
+  ['Black', 'Tan', 'Rivera']
+
+
+First Name Generator
+--------------------
+
+This generator creates first names from a predefined set.
+
+  >>> gen = demographics.FirstNameGenerator('seed')
+
+  >>> gen.get()
+  'Al'
+  >>> gen.getMany(3)
+  ['Amy', 'Sean', 'Malgorzata']
+
+
+SSN Generator
+-------------
+
+This generator creates valid US social security numbers (SSN).
+
+  >>> gen = demographics.SSNDataGenerator('seed')
+
+  >>> gen.get()
+  '982-17-1631'
+  >>> gen.getMany(3)
+  ['508-91-7006', '122-35-9428', '914-91-0060']
+
+
+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()
+  ('451 Archer Lane', 'Clarksburg', 'MI', '04382')
+  >>> gen.getMany(1)
+  [('1970 Ninth Lane Apt. 25', 'Chatham', 'MO', '48781')]
+
+You can also get all components by themselves:
+
+  >>> gen.getStreet()
+  '82 Morton Circle'
+  >>> gen.getCity()
+  'Maynard'
+  >>> gen.getState()
+  'VT'
+  >>> gen.getZip()
+  '60332'
+
+
+US Phone Number Generator
+-------------------------
+
+This generator creates correctly formatted US-style phone numbers.
+
+  >>> gen = demographics.PhoneDataGenerator('seed')
+
+  >>> gen.get()
+  '998-100-5657'
+  >>> gen.getMany(3)
+  ['651-167-3489', '890-004-8393', '172-875-9973']
+
+
+You can also force the area code to be "555", which is a dummy area code.
+
+  >>> gen = demographics.PhoneDataGenerator('seed', True)
+  >>> gen.get()
+  '555-899-1588'
+
+
+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.128.170.133'
+  >>> gen.getMany(3)
+  ['174.045.216.212', '210.131.039.157', '237.098.199.244']
+
+
+Username Generator
+------------------
+
+This generator creates usernames from real names.
+
+  >>> gen = net.UsernameDataGenerator('seed')
+
+  >>> gen.get()
+  'aodoherty'
+  >>> gen.getMany(3)
+  ['ablack', 'stan', 'mrivera']
+
+You can also pass in the first and last name to the generator method.
+
+  >>> gen.get('Stephan', 'Richter')
+  'srichter'
+
+Let's change the pattern:
+
+  >>> gen = net.UsernameDataGenerator(
+  ...     'seed', u'%(firstName).s%(lastName)s.%(number)s')
+  >>> gen.get()
+  'odoherty.16'
+
+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()
+  'aodoherty at averages.jobs'
+  >>> gen.getMany(3)
+  ['ablack at actresses.biz', 'stan at overwhelmingly.mil', 'mrivera at wile.cat']
+
+You can also pass in the username to the generator method.
+
+  >>> gen.get('srichter')
+  'srichter at sander.museum'


Property changes on: z3c.datagenerator/trunk/src/z3c/datagenerator/README3.txt
___________________________________________________________________
Added: svn:eol-style
   + native

Modified: z3c.datagenerator/trunk/src/z3c/datagenerator/demographics.py
===================================================================
--- z3c.datagenerator/trunk/src/z3c/datagenerator/demographics.py	2013-02-06 14:54:41 UTC (rev 129152)
+++ z3c.datagenerator/trunk/src/z3c/datagenerator/demographics.py	2013-02-06 16:38:13 UTC (rev 129153)
@@ -13,6 +13,7 @@
 ##############################################################################
 """Demographics Data Generators"""
 __docformat__ = "reStructuredText"
+import io
 import os
 import random
 import zope.interface
@@ -47,7 +48,7 @@
 
     def getMany(self, number):
         """Select a set of values from the values list and return them."""
-        return [self.get() for count in xrange(number)]
+        return [self.get() for count in range(number)]
 
 
 class AddressDataGenerator(object):
@@ -63,17 +64,21 @@
         self.random = random.Random(generator.consistent_hash(seed+'address'))
         path = os.path.dirname(__file__)
 
-        file = open(os.path.join(path, self.streetNamesFile), 'r')
-        self.streetNames = [unicode(e.strip()) for e in file.readlines()]
+        with io.open(os.path.join(path, self.streetNamesFile), 'r',
+                  encoding='latin-1') as file:
+            self.streetNames = [e.strip() for e in file.readlines()]
 
-        file = open(os.path.join(path, self.streetPostfixFile), 'r')
-        self.streetPostfix = [unicode(e.strip()) for e in file.readlines()]
+        with io.open(os.path.join(path, self.streetPostfixFile), 'r',
+                     encoding='latin-1') as file:
+            self.streetPostfix = [e.strip() for e in file.readlines()]
 
-        file = open(os.path.join(path, self.citiesFile), 'r')
-        self.cities = [unicode(e.strip()) for e in file.readlines()]
+        with io.open(os.path.join(path, self.citiesFile), 'r',
+                     encoding='latin-1') as file:
+            self.cities = [e.strip() for e in file.readlines()]
 
-        file = open(os.path.join(path, self.statesFile), 'r')
-        self.states = [unicode(e.strip()) for e in file.readlines()]
+        with io.open(os.path.join(path, self.statesFile), 'r',
+                     encoding='latin-1') as file:
+            self.states = [e.strip() for e in file.readlines()]
 
     def getStreet(self):
         street = u'%i ' % self.random.randint(1, 2000)
@@ -98,7 +103,7 @@
 
     def getMany(self, number):
         """Select a set of values from the values list and return them."""
-        return [self.get() for count in xrange(number)]
+        return [self.get() for count in range(number)]
 
 
 class PhoneDataGenerator(object):
@@ -119,4 +124,4 @@
 
     def getMany(self, number):
         """Select a set of values from the values list and return them."""
-        return [self.get() for count in xrange(number)]
+        return [self.get() for count in range(number)]

Modified: z3c.datagenerator/trunk/src/z3c/datagenerator/generator.py
===================================================================
--- z3c.datagenerator/trunk/src/z3c/datagenerator/generator.py	2013-02-06 14:54:41 UTC (rev 129152)
+++ z3c.datagenerator/trunk/src/z3c/datagenerator/generator.py	2013-02-06 16:38:13 UTC (rev 129153)
@@ -16,6 +16,7 @@
 import csv
 import datetime
 import math
+import io
 import os
 import random
 from zlib import crc32
@@ -23,16 +24,15 @@
 
 from z3c.datagenerator import interfaces
 
-
 def consistent_hash(buf):
     # Produce a hash of a string that behaves consistently in Python 32 and
     # 64 bit.  The "& 0xffffffff" interprets negative numbers as positive.
-    return crc32(buf) & 0xffffffff
+    return crc32(buf.encode('UTF-8')) & 0xffffffff
 
 
+ at zope.interface.implementer(interfaces.IDataGenerator)
 class VocabularyDataGenerator(object):
     """Vocabulary-based data generator"""
-    zope.interface.implements(interfaces.IDataGenerator)
 
     def __init__(self, seed, vocabulary):
         self.random = random.Random(consistent_hash(seed))
@@ -48,9 +48,9 @@
                 for term in self.random.sample(self.vocabulary, number)]
 
 
+ at zope.interface.implementer(interfaces.IFileBasedGenerator)
 class FileDataGenerator(object):
     """Base functionality for a file data generator."""
-    zope.interface.implements(interfaces.IFileBasedGenerator)
 
     path = os.path.dirname(__file__)
 
@@ -72,9 +72,9 @@
 
     def _read(self, filename):
         fullpath = os.path.join(self.path, filename)
-        reader = csv.reader(file(fullpath), delimiter=';')
-        return [[unicode(cell) for cell in row]
-                for row in reader]
+        with io.open(fullpath, 'r', encoding='latin-1') as file:
+            reader = csv.reader(file, delimiter=';')
+            return [[cell for cell in row] for row in reader]
 
 
 class TextDataGenerator(FileDataGenerator):
@@ -82,13 +82,13 @@
 
     def _read(self, filename):
         fullpath = os.path.join(self.path, filename)
-        return [unicode(e.strip(), encoding='latin-1')
-                for e in open(fullpath, 'r').readlines()]
+        with io.open(fullpath, 'r', encoding='latin-1') as file:
+            return [e.strip() for e in file.readlines()]
 
 
+ at zope.interface.implementer(interfaces.IDateDataGenerator)
 class DateDataGenerator(object):
     """A date data generator."""
-    zope.interface.implements(interfaces.IDateDataGenerator)
 
     def __init__(self, seed, start=None, end=None):
         self.random = random.Random(consistent_hash(seed+'date'))
@@ -104,7 +104,7 @@
 
     def getMany(self, number):
         """Select a set of values from the values list and return them."""
-        return [self.get() for count in xrange(number)]
+        return [self.get() for count in range(number)]
 
 
 class IdDataGenerator(object):
@@ -130,9 +130,9 @@
         value = self.prefix
         value += self.separator.join(
             self._num_format % randint(0, self.max_value)
-            for idx in xrange(self.numbers))
+            for idx in range(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)]
+        return [self.get() for count in range(number)]

Modified: z3c.datagenerator/trunk/src/z3c/datagenerator/net.py
===================================================================
--- z3c.datagenerator/trunk/src/z3c/datagenerator/net.py	2013-02-06 14:54:41 UTC (rev 129152)
+++ z3c.datagenerator/trunk/src/z3c/datagenerator/net.py	2013-02-06 16:38:13 UTC (rev 129153)
@@ -20,9 +20,9 @@
 from z3c.datagenerator import demographics, generator, interfaces
 
 
+ at zope.interface.implementer(interfaces.IDataGenerator)
 class IPv4DataGenerator(object):
     """IPv4 generator."""
-    zope.interface.implements(interfaces.IDataGenerator)
 
     def __init__(self, seed):
         self.random = random.Random(generator.consistent_hash(seed+'ip'))
@@ -35,12 +35,12 @@
 
     def getMany(self, number):
         """Select a set of values from the values list and return them."""
-        return [self.get() for count in xrange(number)]
+        return [self.get() for count in range(number)]
 
 
+ at zope.interface.implementer(interfaces.IDataGenerator)
 class UsernameDataGenerator(object):
     """Username generator."""
-    zope.interface.implements(interfaces.IDataGenerator)
 
     pattern = u'%(firstInitial)s%(lastName)s'
 
@@ -51,27 +51,25 @@
         if pattern:
             self.pattern = pattern
 
-
     def get(self, firstName=None, lastName=None):
         """Select a value from the values list and return it."""
         fname = firstName or self.firstNames.get()
         lname = lastName or self.lastNames.get()
         return self.pattern % {
-            'firstName':     fname.lower(),
-            'lastName':      lname.lower(),
+            'firstName':     ''.join(c for c in fname.lower() if c.isalnum()),
+            'lastName':      ''.join(c for c in lname.lower() if c.isalnum()),
             'firstInitial':  fname[0].lower(),
             'lastInitial':   lname[0].lower(),
             'number':        self.random.randint(1, 100)}
 
-
     def getMany(self, number):
         """Select a set of values from the values list and return them."""
-        return [self.get() for count in xrange(number)]
+        return [self.get() for count in range(number)]
 
 
+ at zope.interface.implementer(interfaces.IDataGenerator)
 class EMailDataGenerator(object):
     """E-Mail generator."""
-    zope.interface.implements(interfaces.IDataGenerator)
 
     wordsFile = 'words.txt'
     tldsFile = 'gTLD.csv'
@@ -95,4 +93,4 @@
 
     def getMany(self, number):
         """Select a set of values from the values list and return them."""
-        return [self.get() for count in xrange(number)]
+        return [self.get() for count in range(number)]

Modified: z3c.datagenerator/trunk/src/z3c/datagenerator/tests/test_doc.py
===================================================================
--- z3c.datagenerator/trunk/src/z3c/datagenerator/tests/test_doc.py	2013-02-06 14:54:41 UTC (rev 129152)
+++ z3c.datagenerator/trunk/src/z3c/datagenerator/tests/test_doc.py	2013-02-06 16:38:13 UTC (rev 129153)
@@ -11,19 +11,16 @@
 # FOR A PARTICULAR PURPOSE.
 #
 ##############################################################################
-"""Test Setup
-
-$Id$
-"""
-__docformat__ = "reStructuredText"
-
+"""Test Setup"""
 import doctest
+import sys
 import unittest
 from zope.testing.doctestunit import DocFileSuite
 
 def test_suite():
+    filename = 'README3.txt' if sys.version_info[0] == 3 else 'README.txt'
     return unittest.TestSuite((
-        DocFileSuite('../README.txt',
+        DocFileSuite('../'+filename,
                      optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS,
                      ),
         ))

Added: z3c.datagenerator/trunk/tox.ini
===================================================================
--- z3c.datagenerator/trunk/tox.ini	                        (rev 0)
+++ z3c.datagenerator/trunk/tox.ini	2013-02-06 16:38:13 UTC (rev 129153)
@@ -0,0 +1,12 @@
+[tox]
+envlist =
+    py26,py27,py33,pypy
+
+[testenv]
+commands =
+    python setup.py test -q
+# without explicit deps, setup.py test will download a bunch of eggs into $PWD
+# (and it seems I can't use zope.dottedname[testing] here, so forget DRY)
+deps =
+    zope.testing
+



More information about the checkins mailing list