Commit 67aae9fb authored by Jim Fulton's avatar Jim Fulton

Merge branch 'master' of github.com:zopefoundation/ZODB

Conflicts:
	CHANGES.rst
	setup.py
parents 79f7f4ac 2d6773cd
...@@ -16,3 +16,4 @@ coverage.xml ...@@ -16,3 +16,4 @@ coverage.xml
*.egg *.egg
dist dist
testing.log testing.log
.eggs/
language: python language: python
sudo: false
python: python:
- 2.6 - 2.6
- 2.7 - 2.7
- 3.2 - 3.2
- 3.3 - 3.3
- 3.4
install: install:
- travis_retry pip install BTrees ZConfig manuel persistent six transaction zc.lockfile zdaemon zope.interface zope.testing zope.testrunner - travis_retry pip install BTrees ZConfig manuel persistent six transaction zc.lockfile zdaemon zope.interface zope.testing zope.testrunner
- travis_retry pip install -e . - travis_retry pip install -e .
......
...@@ -2,6 +2,17 @@ ...@@ -2,6 +2,17 @@
Change History Change History
================ ================
4.1.0 (unreleased)
==================
- Fix registration of custom logging level names ("BLATHER", "TRACE).
We have been registering them in the wrong order since 2004. Before
Python 3.4, the stdlib ``logging`` module masked the error by registering
them in *both* directions.
- Add support for Python 3.4.
4.0.1 (2014-07-13) 4.0.1 (2014-07-13)
================== ==================
......
include *.rst include *.rst
include *.txt include *.txt
include *.py
include *.ini
include .travis.yml
include buildout.cfg
include COPYING
recursive-include doc * recursive-include doc *
recursive-include src * recursive-include src *
......
...@@ -56,6 +56,11 @@ parser.add_option("-c", "--config-file", ...@@ -56,6 +56,11 @@ parser.add_option("-c", "--config-file",
"file to be used.")) "file to be used."))
parser.add_option("-f", "--find-links", parser.add_option("-f", "--find-links",
help=("Specify a URL to search for buildout releases")) help=("Specify a URL to search for buildout releases"))
parser.add_option("--allow-site-packages",
action="store_true", default=False,
help=("Let bootstrap.py use existing site packages"))
parser.add_option("--setuptools-version",
help="use a specific setuptools version")
options, args = parser.parse_args() options, args = parser.parse_args()
...@@ -63,30 +68,40 @@ options, args = parser.parse_args() ...@@ -63,30 +68,40 @@ options, args = parser.parse_args()
###################################################################### ######################################################################
# load/install setuptools # load/install setuptools
to_reload = False
try: try:
import pkg_resources if options.allow_site_packages:
import setuptools import setuptools
except ImportError: import pkg_resources
ez = {}
try:
from urllib.request import urlopen from urllib.request import urlopen
except ImportError: except ImportError:
from urllib2 import urlopen from urllib2 import urlopen
# XXX use a more permanent ez_setup.py URL when available. ez = {}
exec(urlopen('https://bitbucket.org/pypa/setuptools/raw/0.7.2/ez_setup.py' exec(urlopen('https://bootstrap.pypa.io/ez_setup.py').read(), ez)
).read(), ez)
setup_args = dict(to_dir=tmpeggs, download_delay=0)
ez['use_setuptools'](**setup_args)
if to_reload: if not options.allow_site_packages:
reload(pkg_resources) # ez_setup imports site, which adds site packages
import pkg_resources # this will remove them from the path to ensure that incompatible versions
# This does not (always?) update the default working set. We will # of setuptools are not in the path
# do it. import site
for path in sys.path: # inside a virtualenv, there is no 'getsitepackages'.
# We can't remove these reliably
if hasattr(site, 'getsitepackages'):
for sitepackage_path in site.getsitepackages():
sys.path[:] = [x for x in sys.path if sitepackage_path not in x]
setup_args = dict(to_dir=tmpeggs, download_delay=0)
if options.setuptools_version is not None:
setup_args['version'] = options.setuptools_version
ez['use_setuptools'](**setup_args)
import setuptools
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: if path not in pkg_resources.working_set.entries:
pkg_resources.working_set.add_entry(path) pkg_resources.working_set.add_entry(path)
...@@ -119,10 +134,15 @@ if version is None and not options.accept_buildout_test_releases: ...@@ -119,10 +134,15 @@ if version is None and not options.accept_buildout_test_releases:
_final_parts = '*final-', '*final' _final_parts = '*final-', '*final'
def _final_version(parsed_version): def _final_version(parsed_version):
try:
return not parsed_version.is_prerelease
except AttributeError:
# Older setuptools
for part in parsed_version: for part in parsed_version:
if (part[:1] == '*') and (part not in _final_parts): if (part[:1] == '*') and (part not in _final_parts):
return False return False
return True return True
index = setuptools.package_index.PackageIndex( index = setuptools.package_index.PackageIndex(
search_path=[setuptools_path]) search_path=[setuptools_path])
if find_links: if find_links:
...@@ -149,8 +169,7 @@ cmd.append(requirement) ...@@ -149,8 +169,7 @@ cmd.append(requirement)
import subprocess import subprocess
if subprocess.call(cmd, env=dict(os.environ, PYTHONPATH=setuptools_path)) != 0: if subprocess.call(cmd, env=dict(os.environ, PYTHONPATH=setuptools_path)) != 0:
raise Exception( raise Exception(
"Failed to execute command:\n%s", "Failed to execute command:\n%s" % repr(cmd)[1:-1])
repr(cmd)[1:-1])
###################################################################### ######################################################################
# Import and run buildout # Import and run buildout
......
...@@ -20,7 +20,7 @@ to application logic. ZODB includes features such as a plugable storage ...@@ -20,7 +20,7 @@ to application logic. ZODB includes features such as a plugable storage
interface, rich transaction support, and undo. interface, rich transaction support, and undo.
""" """
VERSION = "4.0.1" VERSION = "4.1.0dev"
import os import os
import sys import sys
...@@ -52,6 +52,7 @@ Programming Language :: Python :: 2.7 ...@@ -52,6 +52,7 @@ Programming Language :: Python :: 2.7
Programming Language :: Python :: 3 Programming Language :: Python :: 3
Programming Language :: Python :: 3.2 Programming Language :: Python :: 3.2
Programming Language :: Python :: 3.3 Programming Language :: Python :: 3.3
Programming Language :: Python :: 3.4
Programming Language :: Python :: Implementation :: CPython Programming Language :: Python :: Implementation :: CPython
Topic :: Database Topic :: Database
Topic :: Software Development :: Libraries :: Python Modules Topic :: Software Development :: Libraries :: Python Modules
......
...@@ -43,5 +43,5 @@ __all__ = ["BLATHER", "TRACE"] ...@@ -43,5 +43,5 @@ __all__ = ["BLATHER", "TRACE"]
BLATHER = 15 BLATHER = 15
TRACE = 5 TRACE = 5
logging.addLevelName("BLATHER", BLATHER) logging.addLevelName(BLATHER, "BLATHER")
logging.addLevelName("TRACE", TRACE) logging.addLevelName(TRACE, "TRACE")
...@@ -70,8 +70,6 @@ from ZODB.utils import u64, oid_repr, get_pickle_metadata ...@@ -70,8 +70,6 @@ from ZODB.utils import u64, oid_repr, get_pickle_metadata
from ZODB.serialize import get_refs from ZODB.serialize import get_refs
from ZODB.POSException import POSKeyError from ZODB.POSException import POSKeyError
VERBOSE = 0
# There's a problem with oid. 'data' is its pickle, and 'serial' its # There's a problem with oid. 'data' is its pickle, and 'serial' its
# serial number. 'missing' is a list of (oid, class, reason) triples, # serial number. 'missing' is a list of (oid, class, reason) triples,
# explaining what the problem(s) is(are). # explaining what the problem(s) is(are).
...@@ -94,6 +92,7 @@ def report(oid, data, serial, missing): ...@@ -94,6 +92,7 @@ def report(oid, data, serial, missing):
print() print()
def main(path=None): def main(path=None):
verbose = 0
if path is None: if path is None:
import sys import sys
import getopt import getopt
...@@ -101,7 +100,7 @@ def main(path=None): ...@@ -101,7 +100,7 @@ def main(path=None):
opts, args = getopt.getopt(sys.argv[1:], "v") opts, args = getopt.getopt(sys.argv[1:], "v")
for k, v in opts: for k, v in opts:
if k == "-v": if k == "-v":
VERBOSE += 1 verbose += 1
path, = args path, = args
...@@ -127,7 +126,7 @@ def main(path=None): ...@@ -127,7 +126,7 @@ def main(path=None):
except POSKeyError: except POSKeyError:
undone[oid] = 1 undone[oid] = 1
except: except:
if VERBOSE: if verbose:
traceback.print_exc() traceback.print_exc()
noload[oid] = 1 noload[oid] = 1
......
...@@ -10,7 +10,7 @@ from __future__ import print_function ...@@ -10,7 +10,7 @@ from __future__ import print_function
import ZODB import ZODB
from ZODB.FileStorage import FileStorage from ZODB.FileStorage import FileStorage
from ZODB.utils import U64, get_pickle_metadata from ZODB.utils import U64, get_pickle_metadata
from ZODB.referencesf import referencesf from ZODB.serialize import referencesf
from six.moves import filter from six.moves import filter
def find_paths(root, maxdist): def find_paths(root, maxdist):
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
Usage: %(program)s [options] Usage: %(program)s [options]
Where: Where:
Exactly one of -B or -R must be specified: Exactly one of -B, -R, or -V must be specified:
-B / --backup -B / --backup
Backup current ZODB file. Backup current ZODB file.
......
...@@ -141,17 +141,16 @@ def connectionDebugInfo(): ...@@ -141,17 +141,16 @@ def connectionDebugInfo():
>>> c3 = db.open(before=c1.root()._p_serial) >>> c3 = db.open(before=c1.root()._p_serial)
>>> info = db.connectionDebugInfo() >>> info = db.connectionDebugInfo()
>>> import pprint >>> info = sorted(info, key=lambda i: str(i['opened']))
>>> pprint.pprint(sorted(info, key=lambda i: str(i['opened'])), width=1) >>> before = [x['before'] for x in info]
[{'before': None, >>> opened = [x['opened'] for x in info]
'info': 'test info (2)', >>> infos = [x['info'] for x in info]
'opened': '2008-12-04T20:40:44Z (1.40s)'}, >>> before
{'before': '\x03zY\xd8\xc0m9\xdd', [None, '\x03zY\xd8\xc0m9\xdd', None]
'info': ' (0)', >>> opened
'opened': '2008-12-04T20:40:45Z (0.30s)'}, ['2008-12-04T20:40:44Z (1.40s)', '2008-12-04T20:40:45Z (0.30s)', None]
{'before': None, >>> infos
'info': ' (0)', ['test info (2)', ' (0)', ' (0)']
'opened': None}]
>>> time.time = real_time >>> time.time = real_time
......
[tox] [tox]
envlist = py26,py27,py32,py33,simple envlist = py26,py27,py32,py33,py34,simple
[testenv] [testenv]
commands = commands =
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment