Hello community,

here is the log from the commit of package python-transaction for 
openSUSE:Factory checked in at 2012-06-10 20:19:12
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-transaction (Old)
 and      /work/SRC/openSUSE:Factory/.python-transaction.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-transaction", Maintainer is ""

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-transaction/python-transaction.changes    
2012-03-09 21:26:53.000000000 +0100
+++ 
/work/SRC/openSUSE:Factory/.python-transaction.new/python-transaction.changes   
    2012-06-10 21:52:20.000000000 +0200
@@ -1,0 +2,20 @@
+Wed Jun  6 16:07:36 UTC 2012 - os-...@jacraig.com
+
+- Update to 1.3.0:
+  * Added Sphinx API docuementation.
+  * Added explicit support for PyPy.
+  * Dropped use of Python3-incompatible zope.interface.implements class advisor
+    in favor of zope.interface.implementer class decorator.
+  * Added support for continuous integration using tox and jenkins.
+  * Added setup.py docs alias (installs Sphinx and dependencies).
+  * Added setup.py dev alias (runs setup.py develop plus installs nose and
+    coverage).
+  * Python 3.3 compatibility.
+  * Fix "for attempt in transaction.attempts(x)" machinery, which would not
+    retry a transaction if its implicit call to .commit() itself raised a
+    transient error. Symptom: seeing conflict errors even though you thought
+    you were retrying some number of times via the "attempts" machinery (the
+    first attempt to generate an exception during commit would cause that
+    exception to be raised).
+
+-------------------------------------------------------------------

Old:
----
  transaction-1.2.0.tar.gz

New:
----
  transaction-1.3.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-transaction.spec ++++++
--- /var/tmp/diff_new_pack.dqnhxx/_old  2012-06-10 21:52:21.000000000 +0200
+++ /var/tmp/diff_new_pack.dqnhxx/_new  2012-06-10 21:52:21.000000000 +0200
@@ -11,13 +11,13 @@
 # case the license is the MIT License). An "Open Source License" is a
 # license that conforms to the Open Source Definition (Version 1.9)
 # published by the Open Source Initiative.
-#
+
 # Please submit bugfixes or comments via http://bugs.opensuse.org/
 #
 
 
 Name:           python-transaction
-Version:        1.2.0
+Version:        1.3.0
 Release:        0
 Summary:        Transaction management for Python
 License:        ZPL-2.1

++++++ transaction-1.2.0.tar.gz -> transaction-1.3.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/transaction-1.2.0/.bzrignore 
new/transaction-1.3.0/.bzrignore
--- old/transaction-1.2.0/.bzrignore    1970-01-01 01:00:00.000000000 +0100
+++ new/transaction-1.3.0/.bzrignore    2012-05-16 23:16:00.000000000 +0200
@@ -0,0 +1,7 @@
+.tox
+__pycache__
+*.egg-info
+.coverage
+nosetests.xml
+coverage.xml
+_build
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/transaction-1.2.0/CHANGES.txt 
new/transaction-1.3.0/CHANGES.txt
--- old/transaction-1.2.0/CHANGES.txt   2011-12-05 22:11:15.000000000 +0100
+++ new/transaction-1.3.0/CHANGES.txt   2012-05-16 23:17:56.000000000 +0200
@@ -1,6 +1,32 @@
 Changes
 =======
 
+1.3.0 (2012-05-16)
+------------------
+
+- Added Sphinx API docuementation.
+
+- Added explicit support for PyPy.
+
+- Dropped use of Python3-impatible ``zope.interface.implements`` class
+  advisor in favor of ``zope.interface.implementer`` class decorator.
+
+- Added support for continuous integration using ``tox`` and ``jenkins``.
+
+- Added ``setup.py docs`` alias (installs ``Sphinx`` and dependencies).
+
+- Added ``setup.py dev`` alias (runs ``setup.py develop`` plus installs
+  ``nose`` and ``coverage``).
+
+- Python 3.3 compatibility.
+
+- Fix "for attempt in transaction.attempts(x)" machinery, which would not
+  retry a transaction if its implicit call to ``.commit()`` itself raised a
+  transient error.  Symptom: seeing conflict errors even though you thought
+  you were retrying some number of times via the "attempts" machinery (the
+  first attempt to generate an exception during commit would cause that
+  exception to be raised).
+
 1.2.0 (2011-12-05)
 ------------------
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/transaction-1.2.0/PKG-INFO 
new/transaction-1.3.0/PKG-INFO
--- old/transaction-1.2.0/PKG-INFO      2011-12-05 22:14:39.000000000 +0100
+++ new/transaction-1.3.0/PKG-INFO      2012-05-16 23:18:26.000000000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: transaction
-Version: 1.2.0
+Version: 1.3.0
 Summary: Transaction management for Python
 Home-page: http://www.zope.org/Products/ZODB
 Author: Zope Corporation
@@ -21,6 +21,32 @@
         Changes
         =======
         
+        1.3.0 (2012-05-16)
+        ------------------
+        
+        - Added Sphinx API docuementation.
+        
+        - Added explicit support for PyPy.
+        
+        - Dropped use of Python3-impatible ``zope.interface.implements`` class
+          advisor in favor of ``zope.interface.implementer`` class decorator.
+        
+        - Added support for continuous integration using ``tox`` and 
``jenkins``.
+        
+        - Added ``setup.py docs`` alias (installs ``Sphinx`` and dependencies).
+        
+        - Added ``setup.py dev`` alias (runs ``setup.py develop`` plus installs
+          ``nose`` and ``coverage``).
+        
+        - Python 3.3 compatibility.
+        
+        - Fix "for attempt in transaction.attempts(x)" machinery, which would 
not
+          retry a transaction if its implicit call to ``.commit()`` itself 
raised a
+          transient error.  Symptom: seeing conflict errors even though you 
thought
+          you were retrying some number of times via the "attempts" machinery 
(the
+          first attempt to generate an exception during commit would cause that
+          exception to be raised).
+        
         1.2.0 (2011-12-05)
         ------------------
         
@@ -124,3 +150,4 @@
 Classifier: Programming Language :: Python :: 3
 Classifier: Programming Language :: Python :: 3.2
 Classifier: Programming Language :: Python :: Implementation :: CPython
+Classifier: Programming Language :: Python :: Implementation :: PyPy
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/transaction-1.2.0/docs/Makefile 
new/transaction-1.3.0/docs/Makefile
--- old/transaction-1.2.0/docs/Makefile 1970-01-01 01:00:00.000000000 +0100
+++ new/transaction-1.3.0/docs/Makefile 2012-05-16 23:16:00.000000000 +0200
@@ -0,0 +1,153 @@
+# Makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS    =
+SPHINXBUILD   = sphinx-build
+PAPER         =
+BUILDDIR      = _build
+
+# Internal variables.
+PAPEROPT_a4     = -D latex_paper_size=a4
+PAPEROPT_letter = -D latex_paper_size=letter
+ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
+# the i18n builder cannot share the environment and doctrees with the others
+I18NSPHINXOPTS  = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
+
+.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp 
epub latex latexpdf text man changes linkcheck doctest gettext
+
+help:
+       @echo "Please use \`make <target>' where <target> is one of"
+       @echo "  html       to make standalone HTML files"
+       @echo "  dirhtml    to make HTML files named index.html in directories"
+       @echo "  singlehtml to make a single large HTML file"
+       @echo "  pickle     to make pickle files"
+       @echo "  json       to make JSON files"
+       @echo "  htmlhelp   to make HTML files and a HTML help project"
+       @echo "  qthelp     to make HTML files and a qthelp project"
+       @echo "  devhelp    to make HTML files and a Devhelp project"
+       @echo "  epub       to make an epub"
+       @echo "  latex      to make LaTeX files, you can set PAPER=a4 or 
PAPER=letter"
+       @echo "  latexpdf   to make LaTeX files and run them through pdflatex"
+       @echo "  text       to make text files"
+       @echo "  man        to make manual pages"
+       @echo "  texinfo    to make Texinfo files"
+       @echo "  info       to make Texinfo files and run them through makeinfo"
+       @echo "  gettext    to make PO message catalogs"
+       @echo "  changes    to make an overview of all changed/added/deprecated 
items"
+       @echo "  linkcheck  to check all external links for integrity"
+       @echo "  doctest    to run all doctests embedded in the documentation 
(if enabled)"
+
+clean:
+       -rm -rf $(BUILDDIR)/*
+
+html:
+       $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
+       @echo
+       @echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
+
+dirhtml:
+       $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
+       @echo
+       @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
+
+singlehtml:
+       $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
+       @echo
+       @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
+
+pickle:
+       $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
+       @echo
+       @echo "Build finished; now you can process the pickle files."
+
+json:
+       $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
+       @echo
+       @echo "Build finished; now you can process the JSON files."
+
+htmlhelp:
+       $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
+       @echo
+       @echo "Build finished; now you can run HTML Help Workshop with the" \
+             ".hhp project file in $(BUILDDIR)/htmlhelp."
+
+qthelp:
+       $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
+       @echo
+       @echo "Build finished; now you can run "qcollectiongenerator" with the" 
\
+             ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
+       @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/transaction.qhcp"
+       @echo "To view the help file:"
+       @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/transaction.qhc"
+
+devhelp:
+       $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
+       @echo
+       @echo "Build finished."
+       @echo "To view the help file:"
+       @echo "# mkdir -p $$HOME/.local/share/devhelp/transaction"
+       @echo "# ln -s $(BUILDDIR)/devhelp 
$$HOME/.local/share/devhelp/transaction"
+       @echo "# devhelp"
+
+epub:
+       $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
+       @echo
+       @echo "Build finished. The epub file is in $(BUILDDIR)/epub."
+
+latex:
+       $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+       @echo
+       @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
+       @echo "Run \`make' in that directory to run these through (pdf)latex" \
+             "(use \`make latexpdf' here to do that automatically)."
+
+latexpdf:
+       $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+       @echo "Running LaTeX files through pdflatex..."
+       $(MAKE) -C $(BUILDDIR)/latex all-pdf
+       @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
+
+text:
+       $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
+       @echo
+       @echo "Build finished. The text files are in $(BUILDDIR)/text."
+
+man:
+       $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
+       @echo
+       @echo "Build finished. The manual pages are in $(BUILDDIR)/man."
+
+texinfo:
+       $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
+       @echo
+       @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
+       @echo "Run \`make' in that directory to run these through makeinfo" \
+             "(use \`make info' here to do that automatically)."
+
+info:
+       $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
+       @echo "Running Texinfo files through makeinfo..."
+       make -C $(BUILDDIR)/texinfo info
+       @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
+
+gettext:
+       $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
+       @echo
+       @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
+
+changes:
+       $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
+       @echo
+       @echo "The overview file is in $(BUILDDIR)/changes."
+
+linkcheck:
+       $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
+       @echo
+       @echo "Link check complete; look for any errors in the above output " \
+             "or in $(BUILDDIR)/linkcheck/output.txt."
+
+doctest:
+       $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
+       @echo "Testing of doctests in the sources finished, look at the " \
+             "results in $(BUILDDIR)/doctest/output.txt."
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/transaction-1.2.0/docs/api.rst 
new/transaction-1.3.0/docs/api.rst
--- old/transaction-1.2.0/docs/api.rst  1970-01-01 01:00:00.000000000 +0100
+++ new/transaction-1.3.0/docs/api.rst  2012-05-16 23:16:00.000000000 +0200
@@ -0,0 +1,85 @@
+:mod:`transaction` API Reference
+================================
+
+Interfaces
+----------
+
+.. module::  transaction.interfaces
+
+.. autointerface:: ITransactionManager
+   :members:
+   :member-order: bysource
+
+.. autointerface:: ITransaction
+   :members:
+   :member-order: bysource
+
+.. autointerface:: IDataManager
+   :members:
+   :member-order: bysource
+
+.. autointerface:: ISavepointDataManager
+   :members:
+   :member-order: bysource
+
+.. autointerface:: IDataManagerSavepoint
+   :members:
+   :member-order: bysource
+
+.. autointerface:: ISavepoint
+   :members:
+   :member-order: bysource
+
+.. autoclass:: InvalidSavepointRollbackError
+   :members:
+   :member-order: bysource
+
+.. autointerface:: ISynchronizer
+   :members:
+   :member-order: bysource
+
+.. autoclass:: TransactionError
+   :members:
+   :member-order: bysource
+
+.. autoclass:: TransactionFailedError
+   :members:
+   :member-order: bysource
+
+.. autoclass:: DoomedTransaction
+   :members:
+   :member-order: bysource
+
+.. autoclass:: TransientError
+   :members:
+   :member-order: bysource
+
+API Objects
+-----------
+
+.. module:: transaction._transaction
+
+.. autoclass:: Transaction
+   :members:
+   :member-order: bysource
+
+.. autoclass:: Savepoint
+   :members:
+   :member-order: bysource
+
+.. module:: transaction._manager
+
+.. autoclass:: TransactionManager
+   :members:
+   :member-order: bysource
+
+   .. automethod:: __enter__
+
+      Alias for :meth:`get`
+
+   .. automethod:: __exit__
+
+      On error, aborts the current transaction.  Otherwise, commits.
+.. autoclass:: ThreadTransactionManager
+   :members:
+   :member-order: bysource
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/transaction-1.2.0/docs/conf.py 
new/transaction-1.3.0/docs/conf.py
--- old/transaction-1.2.0/docs/conf.py  1970-01-01 01:00:00.000000000 +0100
+++ new/transaction-1.3.0/docs/conf.py  2012-05-16 23:16:00.000000000 +0200
@@ -0,0 +1,248 @@
+# -*- coding: utf-8 -*-
+#
+# transaction documentation build configuration file, created by
+# sphinx-quickstart on Wed May 16 16:43:53 2012.
+#
+# This file is execfile()d with the current directory set to its containing 
dir.
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+import sys, os
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#sys.path.insert(0, os.path.abspath('.'))
+
+# -- General configuration 
-----------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+#needs_sphinx = '1.0'
+
+# Add any Sphinx extension module names here, as strings. They can be 
extensions
+# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+extensions = [
+    'sphinx.ext.autodoc',
+    'sphinx.ext.doctest',
+    'sphinx.ext.todo',
+    'sphinx.ext.viewcode',
+    'repoze.sphinx.autointerface',
+]
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The encoding of source files.
+#source_encoding = 'utf-8-sig'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General information about the project.
+project = u'transaction'
+copyright = u'2012, Zope Foundation Contributors'
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+version = '1.2'
+# The full version, including alpha/beta/rc tags.
+release = '1.2'
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#language = None
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+#today_fmt = '%B %d, %Y'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+exclude_patterns = ['_build']
+
+# The reST default role (used for this markup: `text`) to use for all 
documents.
+#default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# A list of ignored prefixes for module index sorting.
+#modindex_common_prefix = []
+
+
+# -- Options for HTML output 
---------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages.  See the documentation for
+# a list of builtin themes.
+html_theme = 'default'
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further.  For a list of options available for each theme, see the
+# documentation.
+#html_theme_options = {}
+
+# Add any paths that contain custom themes here, relative to this directory.
+#html_theme_path = []
+
+# The name for this set of Sphinx documents.  If None, it defaults to
+# "<project> v<release> documentation".
+#html_title = None
+
+# A shorter title for the navigation bar.  Default is the same as html_title.
+#html_short_title = None
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+#html_logo = None
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+#html_favicon = None
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+#html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+#html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+#html_additional_pages = {}
+
+# If false, no module index is generated.
+#html_domain_indices = True
+
+# If false, no index is generated.
+#html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+#html_split_index = False
+
+# If true, links to the reST sources are added to the pages.
+#html_show_sourcelink = True
+
+# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
+#html_show_sphinx = True
+
+# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
+#html_show_copyright = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it.  The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# This is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = None
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'transactiondoc'
+
+
+# -- Options for LaTeX output 
--------------------------------------------------
+
+latex_elements = {
+# The paper size ('letterpaper' or 'a4paper').
+#'papersize': 'letterpaper',
+
+# The font size ('10pt', '11pt' or '12pt').
+#'pointsize': '10pt',
+
+# Additional stuff for the LaTeX preamble.
+#'preamble': '',
+}
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title, author, documentclass 
[howto/manual]).
+latex_documents = [
+  ('index', 'transaction.tex', u'transaction Documentation',
+   u'Zope Foundation Contributors', 'manual'),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+#latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+#latex_use_parts = False
+
+# If true, show page references after internal links.
+#latex_show_pagerefs = False
+
+# If true, show URL addresses after external links.
+#latex_show_urls = False
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+#latex_domain_indices = True
+
+
+# -- Options for manual page output 
--------------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [
+    ('index', 'transaction', u'transaction Documentation',
+     [u'Zope Foundation Contributors'], 1)
+]
+
+# If true, show URL addresses after external links.
+#man_show_urls = False
+
+
+# -- Options for Texinfo output 
------------------------------------------------
+
+# Grouping the document tree into Texinfo files. List of tuples
+# (source start file, target name, title, author,
+#  dir menu entry, description, category)
+texinfo_documents = [
+  ('index', 'transaction', u'transaction Documentation',
+   u'Zope Foundation Contributors', 'transaction', 'One line description of 
project.',
+   'Miscellaneous'),
+]
+
+# Documents to append as an appendix to all manuals.
+#texinfo_appendices = []
+
+# If false, no module index is generated.
+#texinfo_domain_indices = True
+
+# How to display URL addresses: 'footnote', 'no', or 'inline'.
+#texinfo_show_urls = 'footnote'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/transaction-1.2.0/docs/index.rst 
new/transaction-1.3.0/docs/index.rst
--- old/transaction-1.2.0/docs/index.rst        1970-01-01 01:00:00.000000000 
+0100
+++ new/transaction-1.3.0/docs/index.rst        2012-05-16 23:16:00.000000000 
+0200
@@ -0,0 +1,18 @@
+:mod:`transaction` Documentation
+================================
+
+Contents:
+
+.. toctree::
+   :maxdepth: 2
+
+   api
+
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/transaction-1.2.0/docs/make.bat 
new/transaction-1.3.0/docs/make.bat
--- old/transaction-1.2.0/docs/make.bat 1970-01-01 01:00:00.000000000 +0100
+++ new/transaction-1.3.0/docs/make.bat 2012-05-16 23:16:00.000000000 +0200
@@ -0,0 +1,190 @@
+@ECHO OFF
+
+REM Command file for Sphinx documentation
+
+if "%SPHINXBUILD%" == "" (
+       set SPHINXBUILD=sphinx-build
+)
+set BUILDDIR=_build
+set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% .
+set I18NSPHINXOPTS=%SPHINXOPTS% .
+if NOT "%PAPER%" == "" (
+       set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
+       set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS%
+)
+
+if "%1" == "" goto help
+
+if "%1" == "help" (
+       :help
+       echo.Please use `make ^<target^>` where ^<target^> is one of
+       echo.  html       to make standalone HTML files
+       echo.  dirhtml    to make HTML files named index.html in directories
+       echo.  singlehtml to make a single large HTML file
+       echo.  pickle     to make pickle files
+       echo.  json       to make JSON files
+       echo.  htmlhelp   to make HTML files and a HTML help project
+       echo.  qthelp     to make HTML files and a qthelp project
+       echo.  devhelp    to make HTML files and a Devhelp project
+       echo.  epub       to make an epub
+       echo.  latex      to make LaTeX files, you can set PAPER=a4 or 
PAPER=letter
+       echo.  text       to make text files
+       echo.  man        to make manual pages
+       echo.  texinfo    to make Texinfo files
+       echo.  gettext    to make PO message catalogs
+       echo.  changes    to make an overview over all changed/added/deprecated 
items
+       echo.  linkcheck  to check all external links for integrity
+       echo.  doctest    to run all doctests embedded in the documentation if 
enabled
+       goto end
+)
+
+if "%1" == "clean" (
+       for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
+       del /q /s %BUILDDIR%\*
+       goto end
+)
+
+if "%1" == "html" (
+       %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
+       if errorlevel 1 exit /b 1
+       echo.
+       echo.Build finished. The HTML pages are in %BUILDDIR%/html.
+       goto end
+)
+
+if "%1" == "dirhtml" (
+       %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
+       if errorlevel 1 exit /b 1
+       echo.
+       echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
+       goto end
+)
+
+if "%1" == "singlehtml" (
+       %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
+       if errorlevel 1 exit /b 1
+       echo.
+       echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
+       goto end
+)
+
+if "%1" == "pickle" (
+       %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
+       if errorlevel 1 exit /b 1
+       echo.
+       echo.Build finished; now you can process the pickle files.
+       goto end
+)
+
+if "%1" == "json" (
+       %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
+       if errorlevel 1 exit /b 1
+       echo.
+       echo.Build finished; now you can process the JSON files.
+       goto end
+)
+
+if "%1" == "htmlhelp" (
+       %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
+       if errorlevel 1 exit /b 1
+       echo.
+       echo.Build finished; now you can run HTML Help Workshop with the ^
+.hhp project file in %BUILDDIR%/htmlhelp.
+       goto end
+)
+
+if "%1" == "qthelp" (
+       %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
+       if errorlevel 1 exit /b 1
+       echo.
+       echo.Build finished; now you can run "qcollectiongenerator" with the ^
+.qhcp project file in %BUILDDIR%/qthelp, like this:
+       echo.^> qcollectiongenerator %BUILDDIR%\qthelp\transaction.qhcp
+       echo.To view the help file:
+       echo.^> assistant -collectionFile %BUILDDIR%\qthelp\transaction.ghc
+       goto end
+)
+
+if "%1" == "devhelp" (
+       %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
+       if errorlevel 1 exit /b 1
+       echo.
+       echo.Build finished.
+       goto end
+)
+
+if "%1" == "epub" (
+       %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
+       if errorlevel 1 exit /b 1
+       echo.
+       echo.Build finished. The epub file is in %BUILDDIR%/epub.
+       goto end
+)
+
+if "%1" == "latex" (
+       %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
+       if errorlevel 1 exit /b 1
+       echo.
+       echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
+       goto end
+)
+
+if "%1" == "text" (
+       %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
+       if errorlevel 1 exit /b 1
+       echo.
+       echo.Build finished. The text files are in %BUILDDIR%/text.
+       goto end
+)
+
+if "%1" == "man" (
+       %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
+       if errorlevel 1 exit /b 1
+       echo.
+       echo.Build finished. The manual pages are in %BUILDDIR%/man.
+       goto end
+)
+
+if "%1" == "texinfo" (
+       %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo
+       if errorlevel 1 exit /b 1
+       echo.
+       echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo.
+       goto end
+)
+
+if "%1" == "gettext" (
+       %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale
+       if errorlevel 1 exit /b 1
+       echo.
+       echo.Build finished. The message catalogs are in %BUILDDIR%/locale.
+       goto end
+)
+
+if "%1" == "changes" (
+       %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
+       if errorlevel 1 exit /b 1
+       echo.
+       echo.The overview file is in %BUILDDIR%/changes.
+       goto end
+)
+
+if "%1" == "linkcheck" (
+       %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
+       if errorlevel 1 exit /b 1
+       echo.
+       echo.Link check complete; look for any errors in the above output ^
+or in %BUILDDIR%/linkcheck/output.txt.
+       goto end
+)
+
+if "%1" == "doctest" (
+       %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
+       if errorlevel 1 exit /b 1
+       echo.
+       echo.Testing of doctests in the sources finished, look at the ^
+results in %BUILDDIR%/doctest/output.txt.
+       goto end
+)
+
+:end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/transaction-1.2.0/setup.cfg 
new/transaction-1.3.0/setup.cfg
--- old/transaction-1.2.0/setup.cfg     2011-12-05 22:14:39.000000000 +0100
+++ new/transaction-1.3.0/setup.cfg     2012-05-16 23:18:26.000000000 +0200
@@ -3,3 +3,13 @@
 tag_date = 0
 tag_svn_revision = 0
 
+[nosetests]
+cover-package = transaction
+nocapture = 1
+where = transaction
+cover-erase = 1
+
+[aliases]
+dev = develop easy_install transaction[testing]
+docs = develop easy_install transaction[docs]
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/transaction-1.2.0/setup.py 
new/transaction-1.3.0/setup.py
--- old/transaction-1.2.0/setup.py      2011-12-05 22:11:24.000000000 +0100
+++ new/transaction-1.3.0/setup.py      2012-05-16 23:17:56.000000000 +0200
@@ -12,7 +12,7 @@
 #
 ##############################################################################
 
-__version__ = '1.2.0'
+__version__ = '1.3.0'
 
 import os
 
@@ -41,6 +41,7 @@
         "Programming Language :: Python :: 3",
         "Programming Language :: Python :: 3.2",
         "Programming Language :: Python :: Implementation :: CPython",
+        "Programming Language :: Python :: Implementation :: PyPy",
         ],
       author="Zope Corporation",
       author_email="zodb-...@zope.org",
@@ -57,6 +58,10 @@
       install_requires=[
         'zope.interface',
         ],
+      extras_require = {
+        'docs': ['Sphinx'],
+        'testing': ['nose', 'coverage'],
+      },
       entry_points = """\
       """
       )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/transaction-1.2.0/tox.ini 
new/transaction-1.3.0/tox.ini
--- old/transaction-1.2.0/tox.ini       1970-01-01 01:00:00.000000000 +0100
+++ new/transaction-1.3.0/tox.ini       2012-05-16 23:16:00.000000000 +0200
@@ -0,0 +1,35 @@
+[tox]
+envlist = 
+# Jython support pending 2.7 support, due 2012-07-15 or so.  See:
+# http://fwierzbicki.blogspot.com/2012/03/adconion-to-fund-jython-27.html
+#    py26,py27,py32,pypy,jython,coverage
+    py26,py27,py32,pypy,coverage,docs
+
+[testenv]
+commands = 
+    python setup.py test -q
+deps = transaction
+
+[testenv:jython]
+commands = 
+   jython setup.py test -q
+
+[testenv:coverage]
+basepython =
+    python2.6
+commands = 
+    nosetests --with-xunit --with-xcoverage
+deps =
+    nose
+    coverage
+    nosexcover
+
+[testenv:docs]
+basepython =
+    python2.6
+commands = 
+    sphinx-build -b html -d docs/_build/doctrees docs docs/_build/html
+    sphinx-build -b doctest -d docs/_build/doctrees docs docs/_build/doctest
+deps =
+    Sphinx
+    repoze.sphinx.autointerface
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/transaction-1.2.0/transaction/_manager.py 
new/transaction-1.3.0/transaction/_manager.py
--- old/transaction-1.2.0/transaction/_manager.py       2011-12-05 
21:37:53.000000000 +0100
+++ new/transaction-1.3.0/transaction/_manager.py       2012-05-16 
23:16:00.000000000 +0200
@@ -16,12 +16,15 @@
 It coordinates application code and resource managers, so that they
 are associated with the right transaction.
 """
+import threading
+
+from zope.interface import implementer
 
 from transaction.weakset import WeakSet
 from transaction._transaction import Transaction
+from transaction.interfaces import ITransactionManager
 from transaction.interfaces import TransientError
 
-import threading
 
 # We have to remember sets of synch objects, especially Connections.
 # But we don't want mere registration with a transaction manager to
@@ -49,6 +52,7 @@
 # so that Transactions "see" synchronizers that get registered after the
 # Transaction object is constructed.
 
+@implementer(ITransactionManager)
 class TransactionManager(object):
 
     def __init__(self):
@@ -56,6 +60,8 @@
         self._synchs = WeakSet()
 
     def begin(self):
+        """ See ITransactionManager.
+        """
         if self._txn is not None:
             self._txn.abort()
         txn = self._txn = Transaction(self._synchs, self)
@@ -65,6 +71,8 @@
     __enter__ = lambda self: self.begin()
 
     def get(self):
+        """ See ITransactionManager.
+        """
         if self._txn is None:
             self._txn = Transaction(self._synchs, self)
         return self._txn
@@ -74,21 +82,33 @@
         self._txn = None
 
     def registerSynch(self, synch):
+        """ See ITransactionManager.
+        """
         self._synchs.add(synch)
 
     def unregisterSynch(self, synch):
+        """ See ITransactionManager.
+        """
         self._synchs.remove(synch)
 
     def isDoomed(self):
+        """ See ITransactionManager.
+        """
         return self.get().isDoomed()
 
     def doom(self):
+        """ See ITransactionManager.
+        """
         return self.get().doom()
 
     def commit(self):
+        """ See ITransactionManager.
+        """
         return self.get().commit()
 
     def abort(self):
+        """ See ITransactionManager.
+        """
         return self.get().abort()
 
     def __exit__(self, t, v, tb):
@@ -98,6 +118,8 @@
             self.abort()
 
     def savepoint(self, optimistic=False):
+        """ See ITransactionManager.
+        """
         return self.get().savepoint(optimistic)
 
     def attempts(self, number=3):
@@ -135,8 +157,15 @@
 
     def __exit__(self, t, v, tb):
         if v is None:
-            self.manager.commit()
+            try:
+                self.manager.commit()
+            except TransientError:
+                self.manager.abort()
+                return True # swallow
+            except:
+                self.manager.abort()
+                return False # don't swallow
         else:
             retry = self.manager._retryable(t, v)
             self.manager.abort()
-            return retry
+            return retry # swallow exception if True, else don't swallow
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/transaction-1.2.0/transaction/_transaction.py 
new/transaction-1.3.0/transaction/_transaction.py
--- old/transaction-1.2.0/transaction/_transaction.py   2011-12-05 
21:37:53.000000000 +0100
+++ new/transaction-1.3.0/transaction/_transaction.py   2012-05-16 
23:16:00.000000000 +0200
@@ -103,7 +103,7 @@
 import weakref
 import traceback
 
-from zope import interface
+from zope.interface import implementer
 
 from transaction.compat import reraise
 from transaction.compat import get_thread_ident
@@ -134,10 +134,10 @@
     # to commit or join this transaction will raise TransactionFailedError.
     COMMITFAILED = "Commit failed"
 
+@implementer(interfaces.ITransaction,
+             interfaces.ITransactionDeprecated)
 class Transaction(object):
 
-    interface.implements(interfaces.ITransaction,
-                         interfaces.ITransactionDeprecated)
 
 
     # Assign an index to each savepoint so we can invalidate later savepoints
@@ -192,9 +192,13 @@
         self._after_commit = []
 
     def isDoomed(self):
+        """ See ITransaction.
+        """
         return self.status is Status.DOOMED
 
     def doom(self):
+        """ See ITransaction.
+        """
         if self.status is not Status.DOOMED:
             if self.status is not Status.ACTIVE:
                 # should not doom transactions in the middle,
@@ -212,6 +216,8 @@
                 self._failure_traceback.getvalue())
 
     def join(self, resource):
+        """ See ITransaction.
+        """
         if self.status is Status.COMMITFAILED:
             self._prior_operation_failed() # doesn't return
 
@@ -253,6 +259,8 @@
         self._resources = [r for r in self._resources if r is not resource]
 
     def savepoint(self, optimistic=False):
+        """ See ITransaction.
+        """
         if self.status is Status.COMMITFAILED:
             self._prior_operation_failed() # doesn't return, it raises
 
@@ -289,6 +297,8 @@
 
 
     def register(self, obj):
+        """ See ITransaction.
+        """
         # The old way of registering transaction participants.
         #
         # register() is passed either a persisent object or a
@@ -314,6 +324,8 @@
             adapter.objects.append(obj)
 
     def commit(self):
+        """ See ITransaction.
+        """
         if self.status is Status.DOOMED:
             raise interfaces.DoomedTransaction(
                 'transaction doomed, cannot commit')
@@ -381,9 +393,13 @@
             
 
     def getBeforeCommitHooks(self):
+        """ See ITransaction.
+        """
         return iter(self._before_commit)
 
     def addBeforeCommitHook(self, hook, args=(), kws=None):
+        """ See ITransaction.
+        """
         if kws is None:
             kws = {}
         self._before_commit.append((hook, tuple(args), kws))
@@ -398,9 +414,13 @@
         self._before_commit = []
 
     def getAfterCommitHooks(self):
+        """ See ITransaction.
+        """
         return iter(self._after_commit)
 
     def addAfterCommitHook(self, hook, args=(), kws=None):
+        """ See ITransaction.
+        """
         if kws is None:
             kws = {}
         self._after_commit.append((hook, tuple(args), kws))
@@ -491,6 +511,8 @@
                                rm, exc_info=sys.exc_info())
 
     def abort(self):
+        """ See ITransaction.
+        """
         if self._savepoint2index:
             self._invalidate_all_savepoints()
 
@@ -524,6 +546,8 @@
             del t, v, tb
 
     def note(self, text):
+        """ See ITransaction.
+        """
         text = text.strip()
         if self.description:
             self.description += "\n" + text
@@ -531,9 +555,13 @@
             self.description = text
 
     def setUser(self, user_name, path="/"):
+        """ See ITransaction.
+        """
         self.user = "%s %s" % (path, user_name)
 
     def setExtendedInfo(self, name, value):
+        """ See ITransaction.
+        """
         self._extension[name] = value
 
 # TODO: We need a better name for the adapters.
@@ -672,13 +700,13 @@
     def sortKey(self):
         return self._datamanager.sortKey()
 
+@implementer(interfaces.ISavepoint)
 class Savepoint:
     """Transaction savepoint.
 
     Transaction savepoints coordinate savepoints for data managers
     participating in a transaction.
     """
-    interface.implements(interfaces.ISavepoint)
 
     valid = property(lambda self: self.transaction is not None)
 
@@ -699,6 +727,8 @@
             savepoints.append(savepoint)
 
     def rollback(self):
+        """ See ISavepoint.
+        """
         transaction = self.transaction
         if transaction is None:
             raise interfaces.InvalidSavepointRollbackError(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/transaction-1.2.0/transaction/compat.py 
new/transaction-1.3.0/transaction/compat.py
--- old/transaction-1.2.0/transaction/compat.py 2011-12-05 21:37:53.000000000 
+0100
+++ new/transaction-1.3.0/transaction/compat.py 2012-05-16 23:16:00.000000000 
+0200
@@ -78,7 +78,10 @@
 
 
 if PY3:
-    from threading import _get_ident as get_thread_ident
+    try:
+        from threading import get_ident as get_thread_ident
+    except ImportError:
+        from threading import _get_ident as get_thread_ident
 else:
     from thread import get_ident as get_thread_ident
     
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/transaction-1.2.0/transaction/tests/convenience.txt 
new/transaction-1.3.0/transaction/tests/convenience.txt
--- old/transaction-1.2.0/transaction/tests/convenience.txt     2011-12-05 
21:37:53.000000000 +0100
+++ new/transaction-1.3.0/transaction/tests/convenience.txt     2012-05-16 
23:16:00.000000000 +0200
@@ -27,12 +27,12 @@
     >>> dm.last_note
     'test 3'
 
-    >>> with transaction.manager:
+    >>> with transaction.manager: #doctest ELLIPSIS
     ...     dm['z'] = 4
     ...     xxx
     Traceback (most recent call last):
     ...
-    NameError: name 'xxx' is not defined
+    NameError: ... name 'xxx' is not defined
 
     >>> dm['z']
     3
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/transaction-1.2.0/transaction/tests/doom.txt 
new/transaction-1.3.0/transaction/tests/doom.txt
--- old/transaction-1.2.0/transaction/tests/doom.txt    2011-12-05 
21:37:53.000000000 +0100
+++ new/transaction-1.3.0/transaction/tests/doom.txt    2012-05-16 
23:16:00.000000000 +0200
@@ -26,9 +26,9 @@
 To see how it works we first need to create a stub data manager:
 
     >>> from transaction.interfaces import IDataManager
-    >>> from zope.interface import implements
-    >>> class DataManager:
-    ...     implements(IDataManager)
+    >>> from zope.interface import implementer
+    >>> @implementer(IDataManager)
+    ... class DataManager:
     ...     def __init__(self):
     ...         self.attr_counter = {}
     ...     def __getattr__(self, name):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/transaction-1.2.0/transaction/tests/savepoint.txt 
new/transaction-1.3.0/transaction/tests/savepoint.txt
--- old/transaction-1.2.0/transaction/tests/savepoint.txt       2011-12-05 
21:37:53.000000000 +0100
+++ new/transaction-1.3.0/transaction/tests/savepoint.txt       2012-05-16 
23:16:00.000000000 +0200
@@ -82,7 +82,7 @@
     ...                 print("%s %s" % ('Updated', name))
     ...     except Exception as error:
     ...         savepoint.rollback()
-    ...         print("%s %s" % ('Unexpected exception', error))
+    ...         print("%s" % ('Unexpected exception'))
 
 Now let's try applying some entries:
 
@@ -117,7 +117,7 @@
     ...     ])
     Updated bob
     Updated sally
-    Unexpected exception unsupported operand type(s) for +=: 'float' and 'str'
+    Unexpected exception
 
 Because the apply_entries used a savepoint for the entire function, it was
 able to rollback the partial changes without rolling back changes made in the
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/transaction-1.2.0/transaction/tests/savepointsample.py 
new/transaction-1.3.0/transaction/tests/savepointsample.py
--- old/transaction-1.2.0/transaction/tests/savepointsample.py  2011-12-05 
21:37:53.000000000 +0100
+++ new/transaction-1.3.0/transaction/tests/savepointsample.py  2012-05-16 
23:16:00.000000000 +0200
@@ -19,18 +19,16 @@
 See savepoint.txt in the transaction package.
 """
 
-from zope import interface
+from zope.interface import implementer
 import transaction.interfaces
 
-@interface.implementer(transaction.interfaces.IDataManager)
+@implementer(transaction.interfaces.IDataManager)
 class SampleDataManager(object):
     """Sample implementation of data manager that doesn't support savepoints
 
     This data manager stores named simple values, like strings and numbers.
     """
 
-    interface.implements(transaction.interfaces.IDataManager)
-
     def __init__(self, transaction_manager=None):
         if transaction_manager is None:
             # Use the thread-local transaction manager if none is provided:
@@ -162,15 +160,13 @@
     #
     #######################################################################
 
-@interface.implementer(transaction.interfaces.ISavepointDataManager)
+@implementer(transaction.interfaces.ISavepointDataManager)
 class SampleSavepointDataManager(SampleDataManager):
     """Sample implementation of a savepoint-supporting data manager
 
     This extends the basic data manager with savepoint support.
     """
 
-    interface.implements(transaction.interfaces.ISavepointDataManager)
-
     def savepoint(self):
         # When we create the savepoint, we save the existing database state.
         return SampleSavepoint(self, self.uncommitted.copy())
@@ -184,11 +180,9 @@
         # savepoint was done again.  IOW, copy() is necessary.
         self.uncommitted = savepoint.data.copy()
 
-@interface.implementer(transaction.interfaces.IDataManagerSavepoint)
+@implementer(transaction.interfaces.IDataManagerSavepoint)
 class SampleSavepoint:
 
-    interface.implements(transaction.interfaces.IDataManagerSavepoint)
-
     def __init__(self, data_manager, data):
         self.data_manager = data_manager
         self.data = data
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/transaction-1.2.0/transaction/tests/test_attempt.py 
new/transaction-1.3.0/transaction/tests/test_attempt.py
--- old/transaction-1.2.0/transaction/tests/test_attempt.py     1970-01-01 
01:00:00.000000000 +0100
+++ new/transaction-1.3.0/transaction/tests/test_attempt.py     2012-05-16 
23:16:00.000000000 +0200
@@ -0,0 +1,85 @@
+import unittest
+
+class TestAttempt(unittest.TestCase):
+    def _makeOne(self, manager):
+        from transaction._manager import Attempt
+        return Attempt(manager)
+
+    def test___enter__(self):
+        manager = DummyManager()
+        inst = self._makeOne(manager)
+        inst.__enter__()
+        self.assertTrue(manager.entered)
+
+    def test___exit__no_exc_no_commit_exception(self):
+        manager = DummyManager()
+        inst = self._makeOne(manager)
+        result = inst.__exit__(None, None, None)
+        self.assertFalse(result)
+        self.assertTrue(manager.committed)
+
+    def test___exit__no_exc_nonretryable_commit_exception(self):
+        manager = DummyManager(raise_on_commit=ValueError)
+        inst = self._makeOne(manager)
+        result = inst.__exit__(None, None, None)
+        self.assertFalse(result)
+
+    def 
test___exit__no_exc_abort_exception_after_nonretryable_commit_exc(self):
+        manager = DummyManager(raise_on_abort=ValueError, 
+                               raise_on_commit=KeyError)
+        inst = self._makeOne(manager)
+        self.assertRaises(ValueError, inst.__exit__, None, None, None)
+        self.assertTrue(manager.committed)
+        self.assertTrue(manager.aborted)
+        
+    def test___exit__no_exc_retryable_commit_exception(self):
+        from transaction.interfaces import TransientError
+        manager = DummyManager(raise_on_commit=TransientError)
+        inst = self._makeOne(manager)
+        result = inst.__exit__(None, None, None)
+        self.assertTrue(result)
+        self.assertTrue(manager.committed)
+        self.assertTrue(manager.aborted)
+
+    def test___exit__with_exception_value_retryable(self):
+        from transaction.interfaces import TransientError
+        manager = DummyManager()
+        inst = self._makeOne(manager)
+        result = inst.__exit__(TransientError, TransientError(), None)
+        self.assertTrue(result)
+        self.assertFalse(manager.committed)
+        self.assertTrue(manager.aborted)
+
+    def test___exit__with_exception_value_nonretryable(self):
+        manager = DummyManager()
+        inst = self._makeOne(manager)
+        result = inst.__exit__(KeyError, KeyError(), None)
+        self.assertFalse(result)
+        self.assertFalse(manager.committed)
+        self.assertTrue(manager.aborted)
+        
+class DummyManager(object):
+    entered = False
+    committed = False
+    aborted = False
+    
+    def __init__(self, raise_on_commit=None, raise_on_abort=None):
+        self.raise_on_commit = raise_on_commit
+        self.raise_on_abort = raise_on_abort
+
+    def _retryable(self, t, v):
+        from transaction._manager import TransientError
+        return issubclass(t, TransientError)
+        
+    def __enter__(self):
+        self.entered = True
+
+    def abort(self):
+        self.aborted = True
+        if self.raise_on_abort:
+            raise self.raise_on_abort
+        
+    def commit(self):
+        self.committed = True
+        if self.raise_on_commit:
+            raise self.raise_on_commit
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/transaction-1.2.0/transaction/tests/test_transaction.py 
new/transaction-1.3.0/transaction/tests/test_transaction.py
--- old/transaction-1.2.0/transaction/tests/test_transaction.py 2011-12-05 
21:37:53.000000000 +0100
+++ new/transaction-1.3.0/transaction/tests/test_transaction.py 2012-05-16 
23:16:00.000000000 +0200
@@ -36,7 +36,7 @@
     add in tests for objects which are modified multiple times,
     for example an object that gets modified in multiple sub txns.
 """
-from doctest import DocTestSuite, DocFileSuite
+from doctest import DocTestSuite, DocFileSuite, IGNORE_EXCEPTION_DETAIL
 
 import struct
 import sys
@@ -769,7 +769,8 @@
         unittest.makeSuite(Test_oid_repr),
         ))
     if sys.version_info >= (2, 6):
-        suite.addTest(DocFileSuite('convenience.txt'))
+        suite.addTest(DocFileSuite('convenience.txt',
+                      optionflags=IGNORE_EXCEPTION_DETAIL))
 
     return suite
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/transaction-1.2.0/transaction/tests/test_weakset.py 
new/transaction-1.3.0/transaction/tests/test_weakset.py
--- old/transaction-1.2.0/transaction/tests/test_weakset.py     2011-12-05 
21:37:53.000000000 +0100
+++ new/transaction-1.3.0/transaction/tests/test_weakset.py     2012-05-16 
23:16:00.000000000 +0200
@@ -28,6 +28,7 @@
         self.assertEqual(dummy2 in w, False)
 
     def test_len(self):
+        import gc
         w = WeakSet()
         d1 = Dummy()
         d2 = Dummy()
@@ -35,6 +36,7 @@
         w.add(d2)
         self.assertEqual(len(w), 2)
         del d1
+        gc.collect()
         self.assertEqual(len(w), 1)
 
     def test_remove(self):
@@ -46,6 +48,7 @@
         self.assertEqual(dummy in w, False)
 
     def test_as_weakref_list(self):
+        import gc
         w = WeakSet()
         dummy = Dummy()
         dummy2 = Dummy()
@@ -54,6 +57,7 @@
         w.add(dummy2)
         w.add(dummy3)
         del dummy3
+        gc.collect()
         L = [x() for x in w.as_weakref_list()]
         # L is a list, but it does not have a guaranteed order.
         self.assertTrue(list, type(L))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/transaction-1.2.0/transaction.egg-info/PKG-INFO 
new/transaction-1.3.0/transaction.egg-info/PKG-INFO
--- old/transaction-1.2.0/transaction.egg-info/PKG-INFO 2011-12-05 
22:14:39.000000000 +0100
+++ new/transaction-1.3.0/transaction.egg-info/PKG-INFO 2012-05-16 
23:18:25.000000000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: transaction
-Version: 1.2.0
+Version: 1.3.0
 Summary: Transaction management for Python
 Home-page: http://www.zope.org/Products/ZODB
 Author: Zope Corporation
@@ -21,6 +21,32 @@
         Changes
         =======
         
+        1.3.0 (2012-05-16)
+        ------------------
+        
+        - Added Sphinx API docuementation.
+        
+        - Added explicit support for PyPy.
+        
+        - Dropped use of Python3-impatible ``zope.interface.implements`` class
+          advisor in favor of ``zope.interface.implementer`` class decorator.
+        
+        - Added support for continuous integration using ``tox`` and 
``jenkins``.
+        
+        - Added ``setup.py docs`` alias (installs ``Sphinx`` and dependencies).
+        
+        - Added ``setup.py dev`` alias (runs ``setup.py develop`` plus installs
+          ``nose`` and ``coverage``).
+        
+        - Python 3.3 compatibility.
+        
+        - Fix "for attempt in transaction.attempts(x)" machinery, which would 
not
+          retry a transaction if its implicit call to ``.commit()`` itself 
raised a
+          transient error.  Symptom: seeing conflict errors even though you 
thought
+          you were retrying some number of times via the "attempts" machinery 
(the
+          first attempt to generate an exception during commit would cause that
+          exception to be raised).
+        
         1.2.0 (2011-12-05)
         ------------------
         
@@ -124,3 +150,4 @@
 Classifier: Programming Language :: Python :: 3
 Classifier: Programming Language :: Python :: 3.2
 Classifier: Programming Language :: Python :: Implementation :: CPython
+Classifier: Programming Language :: Python :: Implementation :: PyPy
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/transaction-1.2.0/transaction.egg-info/SOURCES.txt 
new/transaction-1.3.0/transaction.egg-info/SOURCES.txt
--- old/transaction-1.2.0/transaction.egg-info/SOURCES.txt      2011-12-05 
22:14:39.000000000 +0100
+++ new/transaction-1.3.0/transaction.egg-info/SOURCES.txt      2012-05-16 
23:18:26.000000000 +0200
@@ -1,3 +1,4 @@
+.bzrignore
 CHANGES.txt
 COPYRIGHT.txt
 LICENSE.txt
@@ -5,7 +6,14 @@
 bootstrap.py
 buildout.cfg
 ez_setup.py
+setup.cfg
 setup.py
+tox.ini
+docs/Makefile
+docs/api.rst
+docs/conf.py
+docs/index.rst
+docs/make.bat
 transaction/__init__.py
 transaction/_manager.py
 transaction/_transaction.py
@@ -27,6 +35,7 @@
 transaction/tests/savepointsample.py
 transaction/tests/test_SampleDataManager.py
 transaction/tests/test_SampleResourceManager.py
+transaction/tests/test_attempt.py
 transaction/tests/test_register_compat.py
 transaction/tests/test_savepoint.py
 transaction/tests/test_transaction.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/transaction-1.2.0/transaction.egg-info/requires.txt 
new/transaction-1.3.0/transaction.egg-info/requires.txt
--- old/transaction-1.2.0/transaction.egg-info/requires.txt     2011-12-05 
22:14:39.000000000 +0100
+++ new/transaction-1.3.0/transaction.egg-info/requires.txt     2012-05-16 
23:18:25.000000000 +0200
@@ -1 +1,8 @@
-zope.interface
\ No newline at end of file
+zope.interface
+
+[docs]
+Sphinx
+
+[testing]
+nose
+coverage
\ No newline at end of file

-- 
To unsubscribe, e-mail: opensuse-commit+unsubscr...@opensuse.org
For additional commands, e-mail: opensuse-commit+h...@opensuse.org

Reply via email to