[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