Hello community, here is the log from the commit of package python-Epsilon for openSUSE:Factory checked in at 2018-07-06 10:40:58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-Epsilon (Old) and /work/SRC/openSUSE:Factory/.python-Epsilon.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-Epsilon" Fri Jul 6 10:40:58 2018 rev:8 rq:620273 version:0.7.2 Changes: -------- --- /work/SRC/openSUSE:Factory/python-Epsilon/python-Epsilon.changes 2018-06-08 23:14:52.649338233 +0200 +++ /work/SRC/openSUSE:Factory/.python-Epsilon.new/python-Epsilon.changes 2018-07-06 10:41:14.879308112 +0200 @@ -1,0 +2,19 @@ +Mon Jul 2 14:54:56 UTC 2018 - [email protected] + +- Apply upstream patches 01_df6d0f2bd0.patch and 02_5c11436751159.patch + for making tests pass. + Originally from https://github.com/twisted/epsilon/pull/31 + +------------------------------------------------------------------- +Sun Jun 24 06:32:04 UTC 2018 - [email protected] + +- Upgrade to 0.7.2: + * certcreate should now be installed properly. + * An asRFC1123 method was added to extime.Time. + * As Twisted is dropping Python 2.6, Epsilon will also not support + 2.6 from the next release. + * epsilon.benchmark now uses /proc/self/mounts instead of relying on + /etc/mtab which is often wrong, or does not even exist. + * Fixed a test that interacted badly with Twisted 15.4.0. + +------------------------------------------------------------------- Old: ---- Epsilon-0.7.1.tar.gz New: ---- 01_df6d0f2bd0.patch 02_5c11436751159.patch Epsilon-0.7.2.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-Epsilon.spec ++++++ --- /var/tmp/diff_new_pack.iboXML/_old 2018-07-06 10:41:15.315307593 +0200 +++ /var/tmp/diff_new_pack.iboXML/_new 2018-07-06 10:41:15.315307593 +0200 @@ -21,16 +21,20 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-Epsilon -Version: 0.7.1 +Version: 0.7.2 Release: 0 Summary: Divmod utility package License: MIT Group: Development/Languages/Python URL: https://github.com/twisted/epsilon Source0: https://files.pythonhosted.org/packages/source/E/Epsilon/Epsilon-%{version}.tar.gz +# PATCH-FIX-UPSTREAM https://github.com/twisted/epsilon/pull/31 +Patch0: 01_df6d0f2bd0.patch +Patch1: 02_5c11436751159.patch BuildRequires: %{python_module Twisted >= 13.2.0} BuildRequires: %{python_module devel} BuildRequires: %{python_module pyOpenSSL >= 0.13} +BuildRequires: %{python_module service_identity} BuildRequires: %{python_module setuptools} BuildRequires: fdupes BuildRequires: python-rpm-macros @@ -57,6 +61,8 @@ %prep %setup -q -n Epsilon-%{version} # fix end-of-line +%patch0 -p1 +%patch1 -p1 sed -i 's/\r//' NAME.txt %build @@ -68,14 +74,11 @@ %python_expand %fdupes %{buildroot}%{$python_sitelib} %check -# Tests fail for some incompatibility with the current version of -# Twisted -# https://github.com/twisted/epsilon/issues/25 -# python_exec setup.py test +%python_exec setup.py test %files %{python_files} %license LICENSE -%doc README NAME.txt NEWS.txt +%doc README.rst NAME.txt NEWS.rst %{_bindir}/certcreate %{python_sitelib}/* ++++++ 01_df6d0f2bd0.patch ++++++ >From df6d0f2bd0f13606ceaed7b85ba0a03a15c8d9fe Mon Sep 17 00:00:00 2001 From: Tristan Seligmann <[email protected]> Date: Sun, 24 Jun 2018 12:51:48 +0200 Subject: [PATCH] Make discoverCurrentWorkingDevice more lenient. --- epsilon/scripts/benchmark.py | 16 ++++++++++------ epsilon/test/test_benchmark.py | 11 +++++++++++ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/epsilon/scripts/benchmark.py b/epsilon/scripts/benchmark.py index 8b35bdd..2dae1c7 100644 --- a/epsilon/scripts/benchmark.py +++ b/epsilon/scripts/benchmark.py @@ -412,19 +412,23 @@ def reportResults(results): -def discoverCurrentWorkingDevice(): +def discoverCurrentWorkingDevice(procMounts='/proc/self/mounts'): """ Return a short string naming the device which backs the current working directory, ie C{/dev/hda1}. """ possibilities = [] cwd = os.getcwd() - for L in file('/proc/self/mounts'): - parts = L.split() - if cwd.startswith(parts[1]): - possibilities.append((len(parts[1]), parts[0])) + with file(procMounts, 'rb') as f: + for L in f: + parts = L.split() + if cwd.startswith(parts[1]): + possibilities.append((len(parts[1]), parts[0])) possibilities.sort() - return possibilities[-1][-1] + try: + return possibilities[-1][-1] + except IndexError: + return '<unknown>' diff --git a/epsilon/test/test_benchmark.py b/epsilon/test/test_benchmark.py index c938822..0681ee9 100644 --- a/epsilon/test/test_benchmark.py +++ b/epsilon/test/test_benchmark.py @@ -445,3 +445,14 @@ def testProcessStopTimingCommand(self): p.stopTiming = lambda: stopped.append(None) self.mock.proto.childDataReceived(p.BACKCHANNEL_OUT, p.STOP) self.assertEquals(stopped, [None]) + + + +class DiscoverDeviceTests(unittest.TestCase): + def test_emptyMounts(self): + p = filepath.FilePath(self.mktemp()) + p.makedirs() + m = p.child('mounts') + m.touch() + self.assertEquals( + benchmark.discoverCurrentWorkingDevice(m.path), '<unknown>') ++++++ 02_5c11436751159.patch ++++++ >From 5c11436751159d31d3b07c4633e5d48c402871f1 Mon Sep 17 00:00:00 2001 From: Tristan Seligmann <[email protected]> Date: Sun, 24 Jun 2018 12:58:08 +0200 Subject: [PATCH] Update changelog. --- NEWS.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/NEWS.rst b/NEWS.rst index b7d5fb5..2d69391 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -1,3 +1,8 @@ +0.7.3 (2018-06-24): + Minor: + + - Make ``epsilon.benchmark`` handle ``/proc/self/mounts`` more leniently. + 0.7.2 (2018-06-24): Minor: ++++++ Epsilon-0.7.1.tar.gz -> Epsilon-0.7.2.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Epsilon-0.7.1/.coveragerc new/Epsilon-0.7.2/.coveragerc --- old/Epsilon-0.7.1/.coveragerc 1970-01-01 01:00:00.000000000 +0100 +++ new/Epsilon-0.7.2/.coveragerc 2017-09-26 08:11:57.000000000 +0200 @@ -0,0 +1,9 @@ +[run] +branch = True +source = + epsilon + +[report] +exclude_lines = + pragma: no cover +show_missing = True diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Epsilon-0.7.1/.gitattributes new/Epsilon-0.7.2/.gitattributes --- old/Epsilon-0.7.1/.gitattributes 1970-01-01 01:00:00.000000000 +0100 +++ new/Epsilon-0.7.2/.gitattributes 2015-10-10 13:53:21.000000000 +0200 @@ -0,0 +1 @@ +epsilon/_version.py export-subst diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Epsilon-0.7.1/.gitignore new/Epsilon-0.7.2/.gitignore --- old/Epsilon-0.7.1/.gitignore 1970-01-01 01:00:00.000000000 +0100 +++ new/Epsilon-0.7.2/.gitignore 2017-09-26 08:11:57.000000000 +0200 @@ -0,0 +1,3 @@ +*.egg-info/ +.coverage +.tox/ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Epsilon-0.7.1/.travis.yml new/Epsilon-0.7.2/.travis.yml --- old/Epsilon-0.7.1/.travis.yml 1970-01-01 01:00:00.000000000 +0100 +++ new/Epsilon-0.7.2/.travis.yml 2018-06-19 00:30:53.000000000 +0200 @@ -0,0 +1,32 @@ +sudo: false + +language: "python" + +branches: + only: + - master + +matrix: + include: + - python: 2.7.13 + env: TOXENV=py27 + - python: pypy2.7-5.8.0 + env: TOXENV=pypy + +install: + - pip install -U pip setuptools wheel + - pip install tox codecov + +script: + - tox + +after_success: + - codecov + +notifications: + email: false + irc: + channels: "chat.freenode.net#divmod" + template: + - "%{repository}@%{branch} - %{author}: %{message} (%{build_url})" + use_notice: true diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Epsilon-0.7.1/Epsilon.egg-info/PKG-INFO new/Epsilon-0.7.2/Epsilon.egg-info/PKG-INFO --- old/Epsilon-0.7.1/Epsilon.egg-info/PKG-INFO 2015-10-10 15:54:51.000000000 +0200 +++ new/Epsilon-0.7.2/Epsilon.egg-info/PKG-INFO 2018-06-24 08:15:20.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: Epsilon -Version: 0.7.1 +Version: 0.7.2 Summary: A set of utility modules used by Divmod projects Home-page: https://github.com/twisted/epsilon Author: UNKNOWN diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Epsilon-0.7.1/Epsilon.egg-info/SOURCES.txt new/Epsilon-0.7.2/Epsilon.egg-info/SOURCES.txt --- old/Epsilon-0.7.1/Epsilon.egg-info/SOURCES.txt 2015-10-10 15:54:51.000000000 +0200 +++ new/Epsilon-0.7.2/Epsilon.egg-info/SOURCES.txt 2018-06-24 08:15:20.000000000 +0200 @@ -1,10 +1,17 @@ +.coveragerc +.gitattributes +.gitignore +.travis.yml LICENSE MANIFEST.in NAME.txt -NEWS.txt -README +NEWS.rst +README.rst +requirements-testing.txt setup.cfg setup.py +testhotfix +tox.ini versioneer.py Epsilon.egg-info/PKG-INFO Epsilon.egg-info/SOURCES.txt @@ -13,6 +20,18 @@ Epsilon.egg-info/top_level.txt bin/benchmark bin/certcreate +doc/amp-auth.xhtml +doc/amp-routes.xhtml +doc/index.xhtml +doc/stylesheet.css +doc/template.tpl +doc/listings/amp/amp_auth_client.py +doc/listings/amp/amp_auth_server.py +doc/listings/amp/auth_client.py +doc/listings/amp/auth_server.py +doc/listings/amp/route_client.py +doc/listings/amp/route_server.py +doc/listings/amp/route_setup.py epsilon/__init__.py epsilon/_version.py epsilon/ampauth.py diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Epsilon-0.7.1/Epsilon.egg-info/requires.txt new/Epsilon-0.7.2/Epsilon.egg-info/requires.txt --- old/Epsilon-0.7.1/Epsilon.egg-info/requires.txt 2015-10-10 15:54:51.000000000 +0200 +++ new/Epsilon-0.7.2/Epsilon.egg-info/requires.txt 2018-06-24 08:15:20.000000000 +0200 @@ -1,2 +1,3 @@ +zope.interface Twisted>=13.2.0 PyOpenSSL>=0.13 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Epsilon-0.7.1/NEWS.rst new/Epsilon-0.7.2/NEWS.rst --- old/Epsilon-0.7.1/NEWS.rst 1970-01-01 01:00:00.000000000 +0100 +++ new/Epsilon-0.7.2/NEWS.rst 2018-06-24 08:14:46.000000000 +0200 @@ -0,0 +1,139 @@ +0.7.2 (2018-06-24): + Minor: + + - Fix ``epsilon.benchmark`` compatibility with newer *Twisted* versions. + - Add explicit dependency on ``zope.interface``. + +0.7.1 (2015-10-10): + Major: + + - *certcreate* should now be installed properly. + - An ``asRFC1123`` method was added to ``extime.Time``. + - As *Twisted* is dropping Python 2.6, Epsilon will also not support 2.6 from + the next release. + + Minor: + + - ``epsilon.benchmark`` now uses ``/proc/self/mounts`` instead of relying on + ``/etc/mtab`` which is often wrong, or does not even exist. + - Fixed a test that interacted badly with *Twisted* 15.4.0. + - Updated the metadata in *setup.py*. + +0.7.0 (2014-01-15): + Major: + + - Only *Python* 2.6 and 2.7 are supported now. 2.4, 2.5 is deprecated. + - setup.py now uses setuptools, and stores its dependencies. This + means you no longer need to manually install dependencies. + - *setup.py* no longer requires *Twisted* for *egg_info*, making it easier + to install *Epsilon* using *pip*. + - Significant improvements to *PyPy* support. *PyPy* is now a supported + platform, with CI support. + - ``epsilon.release`` is now removed. It relied on a bunch of machinery + specific to *Divmod* that no longer existed. + - ``epsilon.sslverify`` is now removed. Use ``twisted.internet.ssl`` instead. + - ``epsilon.asTwistedVersion`` takes a string version (``"1.2.3"``) and + turns it into a ``twisted.python.versions.Version``. + + Minor: + + - Several deprecation warnings have been cleaned up. + +0.6.0 (2009-11-25): + - Disable loopback hotfix on *Twisted* 8.2 and newer. + - Remove the implementation of ``Cooperator`` and use *Twisted*'s + implementation instead. + - Use *Twisted*'s ``deferLater`` implementation. + - Add a service for communicating via *stdio*. + - Add a ``precision`` argument to ``Time.asHumanly`` to control the precision + of the returned string. + +0.5.12 (2008-12-09): + - Added support for *AMP* authentication via one-time pads. + +0.5.11 (2008-10-02): + - ``epsilon.amprouter`` added, providing support for multiplexing + unrelated *AMP* communications over the same connection. + +0.5.10 (2008-08-12): + - Added the ``epsilon.caseless`` module, with case-insensitive string + wrappers. + - Better ``repr()`` for ``epsilon.structlike.record`` added. + - ``epsilon.juice`` now uses ``twisted.internet.ssl`` instead of + ``epsilon.sslverify``. + +0.5.9 (2008-01-18): + - No noted changes. + +0.5.8 (2007-11-27): + - ``extime.Time.asHumanly`` no longer shows a time of day for all-day + timestamps. + +0.5.7 (2007-04-27): + - ``view.SlicedView`` added, allowing slicing and indexing of large + sequences without copying. + +0.5.6 (2006-11-20): + - Added a ``--quiet`` option to *Epsilon's* *certcreate* and use it in a few + unit tests to avoid spewing garbage during test runs. + +0.5.5 (2006-10-21): + - ``extime.Time`` now accepts RFC2822-like dates with invalid fields: it + rounds them to the nearest valid value. + +0.5.4 (2006-10-17): + - ``extime.Time`` now accepts RFC2822-like dates with no timezone. + +0.5.3 (2006-09-20): + - ``structlike.Record`` now raises ``TypeError`` on unexpected args. + +0.5.2 (2006-09-12): + - ``extime.Time`` now avoids ``time_t`` overflow bugs. + +0.5.1 (2006-06-22): + - Added hotfix for ``twisted.test.proto_helpers.StringTransport``. + +0.5.0 (2006-06-12): + - Replaced ``'%y'`` with ``'%Y'`` in ``Time.asHumanly`` output - the year is + now four digits, rather than two. + - Added new ``epsilon.structlike`` functionality for simple record. + - All uses of ``defer.wait`` and ``deferredResult`` were removed from the tests. + - Added ``epsilon.juice``, an asynchronous messaging protocol slated for + inclusion in *Twisted*. Improved a few features, such as the ``repr`` of + ``JuiceBox`` instances. This was moved from *Vertex*. + - Added ``epsilon.sslverify``, a set of utilities for dealing with + *PyOpenSSL* using simple high-level objects, performing operations such as + signing and verifying certificates. This was also moved from *Vertex*, and + slated for inclusion in *Twisted*. + - Added ``epsilon.spewer``, a prettier version of the spewer in + ``twisted.python.util``. + - Added *benchmark* tool for measuring and reporting run-times of python + programs. + +0.4.0 (2005-12-20): + - Disabled crazy ``sys.modules`` hackery in ``test_setuphelper``. + - Added module for creating a directory structure from a string template. + - Added support for *now* to ``Time.fromHumanly``. + - Added a structured *hotfix* system to abstract and formalize monkey + patches and version testing logic away from code which requires it. + +0.3.2 (2005-11-05): + - Added automatic support for *Twisted* plugins to ``autosetup``. + +0.3.1 (2005-11-02): + - Removed bogus dependency on *Axiom*. + +0.3.0 (2005-11-02): + - Added ``SchedulingService``, an ``IService`` implementation, to + ``epsilon.cooperator``. + - Added ``autosetup``, a utility to actually include files in *distutils* + releases, to ``epsilon.setuphelper``. + +0.2.1 (2005-10-25): + - Added ``short`` to ``epsilon.versions.Version``. + - Fixed *setup.py* to use ``epsilon.version.short`` rather than static + string. + +0.2.0 (2005-10-25): + - Added ``epsilon.modal.ModalType``, metaclass for writing classes that + behave in some respects like state machines. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Epsilon-0.7.1/NEWS.txt new/Epsilon-0.7.2/NEWS.txt --- old/Epsilon-0.7.1/NEWS.txt 2015-10-10 15:53:30.000000000 +0200 +++ new/Epsilon-0.7.2/NEWS.txt 1970-01-01 01:00:00.000000000 +0100 @@ -1,113 +0,0 @@ -0.7.0 (2014-01-15): - Major: - - - Only Python 2.6 and 2.7 are supported now. 2.4, 2.5 is deprecated. - - setup.py now uses setuptools, and stores its dependencies. This - means you no longer need to manually install dependencies. - - setup.py no longer requires Twisted for egg_info, making it easier - to install Epsilon using pip. - - Significant improvements to PyPy support. PyPy is now a supported - platform, with CI support. - - epsilon.release is now removed. It relied on a bunch of machinery - specific to divmod that no longer existed. - - epsilon.sslverify is now removed. Use twisted.internet.ssl instead. - - epsilon.asTwistedVersion takes a string version ("1.2.3") and - turns it into a twisted.python.versions.Version. - - Minor: - - - Several deprecation warnings have been cleaned up. - -0.6.0 (2009-11-25): - - Disable loopback hotfix on Twisted 8.2 and newer. - - Remove the implementation of Cooperator and use Twisted's implementation - instead. - - Use Twisted's deferLater implementation. - - Add a service for communicating via stdio. - - Add a `precision` argument to `Time.asHumanly` to control the precision - of the returned string. - -0.5.12 (2008-12-09): - - Added support for AMP authentication via one-time pads. - -0.5.11 (2008-10-02): - - epsilon.amprouter added, providing support for multiplexing - unrelated AMP communications over the same connection. - -0.5.10 (2008-08-12): - - Added the epsilon.caseless module, with case-insensitive string - wrappers. - - Better repr() for epsilon.structlike.record added. - - epsilon.juice now uses twisted.internet.ssl instead of epsilon.sslverify. - -0.5.9 (2008-01-18): - -0.5.8 (2007-11-27): - - extime.Time.asHumanly() no longer shows a time of day for all-day timestamps. - -0.5.7 (2007-04-27): - - view.SlicedView added, allowing slicing and indexing of large - sequences without copying. - -0.5.6 (2006-11-20): - - Added a --quiet option to Epsilon's certcreate and use it in a few unit - tests to avoid spewing garbage during test runs. - -0.5.5 (2006-10-21): - - extime.Time now accepts RFC2822-like dates with invalid fields: it - rounds them to the nearest valid value. - -0.5.4 (2006-10-17): - - extime.Time now accepts RFC2822-like dates with no timezone. - -0.5.3 (2006-09-20): - - structlike.Record now raises TypeError on unexpected args. - -0.5.2 (2006-09-12): - - extime.Time now avoids time_t overflow bugs. - -0.5.1 (2006-06-22): - - Added hotfix for twisted.test.proto_helpers.StringTransport. - -0.5.0 (2006-06-12): - - Replaced '%y' with '%Y' in Time.asHumanly() output - the year is now - four digits, rather than two. - - Added new 'epsilon.structlike' functionality for simple record. - - All uses of defer.wait and deferredResult were removed from the tests. - - Added epsilon.juice, an asynchronous messaging protocol slated for - inclusion in Twisted. Improved a few features, such as the repr() of - JuiceBox instances. This was moved from Vertex. - - Added epsilon.sslverify, a set of utilities for dealing with PyOpenSSL - using simple high-level objects, performing operations such as signing and - verifying certificates. This was also moved from Vertex, and slated for - inclusion in Twisted. - - Added epsilon.spewer, a prettier version of the spewer in - twisted.python.util. - - Added "benchmark" tool for measuring and reporting run-times of python - programs. - -0.4.0 (2005-12-20): - - Disabled crazy sys.modules hackery in test_setuphelper - - Added module for creating a directory structure from a string template - - Added support for 'now' to Time.fromHumanly() - - Added a structured "hotfix" system to abstract and formalize monkey - patches and version testing logic away from code which requires it. - -0.3.2 (2005-11-05): - - Added automatic support for Twisted plugins to autosetup - -0.3.1 (2005-11-02): - - Removed bogus dependency on Axiom. - -0.3.0 (2005-11-02): - - Added SchedulingService, an IService implementation, to epsilon.cooperator - - Added autosetup, a utility to actually include files in distutils releases, - to epsilon.setuphelper - -0.2.1 (2005-10-25): - - Added 'short()' to epsilon.versions.Version - - fixed setup.py to use epsilon.version.short() rather than static string. - -0.2.0 (2005-10-25): - - Added epsilon.modal.ModalType, metaclass for writing classes that - behave in some respects like state machines diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Epsilon-0.7.1/PKG-INFO new/Epsilon-0.7.2/PKG-INFO --- old/Epsilon-0.7.1/PKG-INFO 2015-10-10 15:54:51.000000000 +0200 +++ new/Epsilon-0.7.2/PKG-INFO 2018-06-24 08:15:20.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: Epsilon -Version: 0.7.1 +Version: 0.7.2 Summary: A set of utility modules used by Divmod projects Home-page: https://github.com/twisted/epsilon Author: UNKNOWN diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Epsilon-0.7.1/README new/Epsilon-0.7.2/README --- old/Epsilon-0.7.1/README 2015-01-24 22:02:05.000000000 +0100 +++ new/Epsilon-0.7.2/README 1970-01-01 01:00:00.000000000 +0100 @@ -1,9 +0,0 @@ - -Divmod Epsilon -============== - -Epsilon is a set of utility modules, commonly used by all Divmod projects. - -This is intended mainly as a support package for code used by Divmod projects, -and not as an external library. However, it contains many useful modules and -you can feel free to use them! diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Epsilon-0.7.1/README.rst new/Epsilon-0.7.2/README.rst --- old/Epsilon-0.7.1/README.rst 1970-01-01 01:00:00.000000000 +0100 +++ new/Epsilon-0.7.2/README.rst 2018-06-24 05:11:06.000000000 +0200 @@ -0,0 +1,9 @@ + +Divmod Epsilon +============== + +Epsilon is a set of utility modules, commonly used by all Divmod projects. + +This is intended mainly as a support package for code used by Divmod projects, +and not as an external library. However, it contains many useful modules and +you can feel free to use them! diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Epsilon-0.7.1/doc/amp-auth.xhtml new/Epsilon-0.7.2/doc/amp-auth.xhtml --- old/Epsilon-0.7.1/doc/amp-auth.xhtml 1970-01-01 01:00:00.000000000 +0100 +++ new/Epsilon-0.7.2/doc/amp-auth.xhtml 2015-01-24 22:02:05.000000000 +0100 @@ -0,0 +1,115 @@ +<?xml version="1.0"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <title>AMP Authentication</title> + </head> + <body> + <h1>AMP Authentication</h1> + + <h2>Overview</h2> + + <p> + <code class="API">epsilon.ampauth</code> integrates Twisted Cred with + <code>twisted.protocols.amp</code>, providing support for selecting a + <code>IBoxReceiver</code> based on the result of a Cred login. + </p> + + <p> + Readers should familiarize themselves with the following concepts in + order to understand all sections of this document: + </p> + + <ul> + <li> + Twisted <a + href="http://twistedmatrix.com/projects/core/documentation/howto/clients.html">TCP + clients</a> and <a + href="http://twistedmatrix.com/projects/core/documentation/howto/servers.html">TCP + servers</a> + </li> + <li> + <a href="http://twistedmatrix.com/projects/core/documentation/howto/defer.html"> + Using Deferreds + </a> + </li> + <li> + Twisted <code class="API" base="twisted.protocols.amp">AMP</code> + </li> + <li> + <a href="http://twistedmatrix.com/projects/core/documentation/howto/cred.html"> + Twisted Cred + </a> + </li> + </ul> + + <h2>Servers</h2> + + <p> + <code class="API" base="epsilon.ampauth">CredAMPServerFactory</code> + is a factory for the <code class="API" + base="epsilon.ampauth">CredReceiver</code> protocol, an + <code>AMP</code> subclass which implements responders for commands + which allow a client to prove their identity. It uses a + <code>Portal</code> to handle these commands and retrieve an <code + class="API" base="twisted.protocols.amp">IBoxReceiver</code> which + will be used to handle all further AMP boxes it receives. + </p> + + <a href="listings/amp/auth_server.py" class="py-listing"> + AMP server with authentication + </a> + + <p> + <code>Add</code> and <code>Adder</code> together define a simple AMP + protocol for adding two integers together. <code>AdditionRealm</code> + provides the necessary integration between this AMP protocol and Cred, + creating new <code>Adder</code> instances whenever an + <code>IBoxReceiver</code> is requested - which will be whenever a client + attempts to authenticate itself to the server. + </p> + + <h2>Clients</h2> + + <p> + AMP clients can authenticate with an AMP server using <code class="API" + base="epsilon.ampauth">login</code>. <code>login</code> takes a + connected AMP instance and a credentials object as arguments and returns + a <code>Deferred</code> which fires when authentication finishes. + </p> + + <a href="listings/amp/auth_client.py" class="py-listing"> + Authenticating AMP client + </a> + + <p> + The TCP connection is set up as usual, and the <code>Add</code> command + is also issued in the usual way. The only change from a normal AMP + client is the use of <code>login</code> after a connection has been set + up but before any commands are issued. + </p> + + <h2>One-Time Pad Authentication</h2> + + <p> + <code class="API">epsilon.ampauth</code> includes an <code class="API" + base="twisted.cred.checkers">CredentialsChecker</code> for validating + one-time pads: <code class="API" + base="epsilon.ampauth">OneTimePadChecker</code>. If this checker is + registered with the portal, clients may use the <code class="API" + base="epsilon.ampauth">OTPLogin</code> command to authenticate. + </p> + + <a href="listings/amp/amp_auth_server.py" class="py-listing"> + AMP server with OTP authentication + </a> + + <p></p> + + <a href="listings/amp/amp_auth_client.py" class="py-listing"> + OTP-authenticating AMP client + </a> + </body> +</html> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Epsilon-0.7.1/doc/amp-routes.xhtml new/Epsilon-0.7.2/doc/amp-routes.xhtml --- old/Epsilon-0.7.1/doc/amp-routes.xhtml 1970-01-01 01:00:00.000000000 +0100 +++ new/Epsilon-0.7.2/doc/amp-routes.xhtml 2015-01-24 22:02:05.000000000 +0100 @@ -0,0 +1,180 @@ +<?xml version="1.0"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <title>AMP Routes</title> + </head> + <body> + <h1>AMP Routes</h1> + + <h2>Overview</h2> + + <p> + Normally, an AMP connection is between two <code class="API" + base="twisted.protocols.amp">AMP</code> instances; each instance receives + all AMP boxes sent by the other side and handles them by interpreting + them as commands, responses to commands, or in some other way. This + typically means that the logic for handling boxes on each side of the + connection is completely defined by a single object. Sometimes it is + useful to allow multiple objects, perhaps of different types, to + participate in defining this logic. + </p> + + <p> + <code>epsilon.amprouter</code> implements utilities which allow an + arbitrary number of objects, providers of <code>IBoxReceiver</code> (for + example, instances of <code>AMP</code>), to define how received AMP boxes + are interpreted. This is useful to multiplex unrelated <code>AMP</code> + instances over a single TCP connection, to split up a single AMP protocol + into multiple simpler protocols, and for many other purposes. + </p> + + <p> + Readers should familiarize themselves with the following concepts in + order to understand all sections of this document: + </p> + + <ul> + <li> + Twisted <a + href="http://twistedmatrix.com/projects/core/documentation/howto/clients.html">TCP + clients</a> and <a + href="http://twistedmatrix.com/projects/core/documentation/howto/servers.html">TCP + servers</a> + </li> + <li> + <a href="http://twistedmatrix.com/projects/core/documentation/howto/defer.html"> + Using Deferreds + </a> + </li> + <li> + Twisted <code class="API" base="twisted.protocols.amp">AMP</code> + </li> + </ul> + + <h2>Routers</h2> + + <p> + When working with routes, the object primarily of interest will be a <a + class="API" base="epsilon.amprouter">Router</a> instance. Each AMP + client and server will have a <code>Router</code> instance which they can + use to create new routes. They will use its <code class="API" + base="epsilon.amprouter">Router.bindRoute</code> method to set up + whatever routes they require. + </p> + + <h2>Servers</h2> + + <p> + <code>epsilon.amprouter</code> does not define a command for creating new + routes because different applications have different requirements for how + new routes are set up. An application may want to negotiate about the + <code>IBoxReceiver</code> implementation which is associated with a + route, it may want to supply initial arguments to that object, it may + want to do version negotiation, and so on. The first thing an + application using routes must do, then, is to define a way to create new + routes. Consider the following example which allows routes to be created + with a <code>NewRoute</code> AMP command and associates them with a + parameterized <code>IBoxReceiver</code> implementation. + </p> + + <a href="listings/amp/route_setup.py" class="py-listing"> + Creation of new routes + </a> + + <p> + <code>AMPRouteServerFactory.buildProtocol</code> creates new + <code>RoutingAMP</code> instances, each with a new <code>Router</code>. + The <code>Router</code> instance will become the <code>RoutingAMP</code> + instance's <code>boxReceiver</code> attribute. This is important for two + reasons. First, it allows the router to work by causing all AMP boxes + received from the connection to be delivered to the router to be + dispatched appropriately. Second, it gives the <code>RoutingAMP</code> + instance a reference to the <code>Router</code> instance; this is + necessary so that new routes can be created. + </p> + + <p> + After creating the <code>Router</code> and <code>RoutingAMP</code>, + <code>buildProtocol</code> also sets up the <code>RoutingAMP</code> + instance to be the default receiver by binding it to the + <code>None</code>. All AMP boxes without routing information will be + delivered to the default receiver. This is important because it allows + the <code>NewRoute</code> command to be handled by the + <code>RoutingAMP</code> instance. + </p> + + <p> + <code>RoutingAMP</code>'s <code>NewRoute</code> responder uses + <code>self.boxReceiver</code>, the <code>Router</code> instance provided + by the factory, to <em>bind</em> the return value of + <code>self.factory.routeProtocol()</code> to a new route. Then, it + connects the route to the identifier specified in the + <code>NewRoute</code> command. Finally, it returns the identifier of the + route it has just created. Once this has happened, the route is + completely set up on the server. + </p> + + <p> + Finally, the <code>connect</code> function wraps up the necessary calls + to routing methods and a use of the <code>NewRoute</code> command to form + the client side of the setup. + </p> + + <p> + First, let's look at an example of using <code>AMPRouteServerFactory</code> and + <code>RoutingAMP</code> to run a server. + </p> + + <a href="listings/amp/route_server.py" class="py-listing"> + Routed counters server + </a> + + <p> + In this example, a simple counting protocol is hooked up to the server. + Each route which is created is associated with a new instance of this + protocol. The protocol does just one simple thing, it keeps track of how + many times the <code>Count</code> command is issued to it and returns + this value in the response to that command. + </p> + + <p> + Next we'll look at how a client can connect to this server, create new + routes, and issue commands over them. + </p> + + <h2>Clients</h2> + + <p> + Just as servers must, clients must first set up a route before they can + send boxes over it. A client uses the same methods as the server, + <code>Router.bindRoute</code> and <code>Route.connectTo</code>, to set up + a new route. Here's an example which makes one TCP connection to an AMP + server, sets up three routes, and then issues multiple commands over each + of them. + </p> + + <a href="listings/amp/route_client.py" class="py-listing"> + Routed counters client + </a> + + <p> + Note first how <code>main</code> creates an <code>AMP</code> with a + <code>Router</code> instance. Note also how <code>makeRoutes</code> + binds and connects the protocol to the default route. This mirrors the + route setup which was done on the server and is necessary for the same + reasons. + </p> + + <p> + Once an AMP connection is set up and the default route is bound, + <code>makeRoutes</code> uses the previously defined <code>connect</code> + function to establish three new routes. Each route is associated with a + <code>CountClient</code> instance which will issue several count commands + and report the results. The results of each command are tracked so that + when they have all been received the client can exit. + </p> + </body> +</html> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Epsilon-0.7.1/doc/index.xhtml new/Epsilon-0.7.2/doc/index.xhtml --- old/Epsilon-0.7.1/doc/index.xhtml 1970-01-01 01:00:00.000000000 +0100 +++ new/Epsilon-0.7.2/doc/index.xhtml 2015-01-24 22:02:05.000000000 +0100 @@ -0,0 +1,21 @@ +<?xml version="1.0"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <title>Index</title> + </head> + <body> + <h1>Index</h1> + + <ul class="toc"> + <li> + <a href="amp-auth.xhtml">AMP Authentication</a> + </li> + <li> + <a href="amp-routes.xhtml">AMP Routes</a> + </li> + </ul> + </body> +</html> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Epsilon-0.7.1/doc/listings/amp/amp_auth_client.py new/Epsilon-0.7.2/doc/listings/amp/amp_auth_client.py --- old/Epsilon-0.7.1/doc/listings/amp/amp_auth_client.py 1970-01-01 01:00:00.000000000 +0100 +++ new/Epsilon-0.7.2/doc/listings/amp/amp_auth_client.py 2015-01-24 22:02:05.000000000 +0100 @@ -0,0 +1,42 @@ +# Copyright (c) 2008 Divmod. See LICENSE for details. + +""" +An AMP client which connects to and authenticates with an AMP server using OTP, +then issues a command. +""" + +from twisted.internet.protocol import ClientCreator +from twisted.cred.credentials import UsernamePassword +from twisted.protocols.amp import AMP + +from epsilon.react import react +from epsilon.ampauth import OTPLogin + +from auth_server import Add + + +def add(proto): + return proto.callRemote(Add, left=17, right=33) + + +def display(result): + print result + + +def otpLogin(client): + client.callRemote(OTPLogin, pad='pad') + return client + + +def main(reactor): + cc = ClientCreator(reactor, AMP) + d = cc.connectTCP('localhost', 7805) + d.addCallback(otpLogin) + d.addCallback(add) + d.addCallback(display) + return d + + +if __name__ == '__main__': + from twisted.internet import reactor + react(reactor, main, []) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Epsilon-0.7.1/doc/listings/amp/amp_auth_server.py new/Epsilon-0.7.2/doc/listings/amp/amp_auth_server.py --- old/Epsilon-0.7.1/doc/listings/amp/amp_auth_server.py 1970-01-01 01:00:00.000000000 +0100 +++ new/Epsilon-0.7.2/doc/listings/amp/amp_auth_server.py 2015-01-24 22:02:05.000000000 +0100 @@ -0,0 +1,76 @@ +# Copyright (c) 2008 Divmod. See LICENSE for details. + +""" +An AMP server which requires authentication of its clients before exposing an +addition command. +""" + +from sys import stdout + +from twisted.python.log import startLogging, msg +from twisted.internet import reactor +from twisted.cred.portal import Portal +from twisted.protocols.amp import IBoxReceiver, Command, Integer, AMP + +from epsilon.ampauth import CredAMPServerFactory, OneTimePadChecker + + +class Add(Command): + """ + An example of an application-defined command which should be made available + to clients after they successfully authenticate. + """ + arguments = [("left", Integer()), + ("right", Integer())] + + response = [("sum", Integer())] + + + +class Adder(AMP): + """ + An example of an application-defined AMP protocol, the responders defined + by which should only be available to clients after they have successfully + authenticated. + """ + def __init__(self, avatarId): + AMP.__init__(self) + self.avatarId = avatarId + + + @Add.responder + def add(self, left, right): + msg("Adding %d to %d for %s" % (left, right, self.avatarId)) + return {'sum': left + right} + + + +class AdditionRealm(object): + """ + An example of an application-defined realm. + """ + def requestAvatar(self, avatarId, mind, *interfaces): + """ + Create Adder avatars for any IBoxReceiver request. + """ + if IBoxReceiver in interfaces: + return (IBoxReceiver, Adder(avatarId), lambda: None) + raise NotImplementedError() + + + +def main(): + """ + Start the AMP server and the reactor. + """ + startLogging(stdout) + checker = OneTimePadChecker({'pad': 0}) + realm = AdditionRealm() + factory = CredAMPServerFactory(Portal(realm, [checker])) + reactor.listenTCP(7805, factory) + reactor.run() + + +if __name__ == '__main__': + main() + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Epsilon-0.7.1/doc/listings/amp/auth_client.py new/Epsilon-0.7.2/doc/listings/amp/auth_client.py --- old/Epsilon-0.7.1/doc/listings/amp/auth_client.py 1970-01-01 01:00:00.000000000 +0100 +++ new/Epsilon-0.7.2/doc/listings/amp/auth_client.py 2015-01-24 22:02:05.000000000 +0100 @@ -0,0 +1,37 @@ +# Copyright (c) 2008 Divmod. See LICENSE for details. + +""" +An AMP client which connects to and authenticates with an AMP server, then +issues a command. +""" + +from twisted.internet.protocol import ClientCreator +from twisted.cred.credentials import UsernamePassword +from twisted.protocols.amp import AMP + +from epsilon.react import react +from epsilon.ampauth import login + +from auth_server import Add + + +def add(proto): + return proto.callRemote(Add, left=17, right=33) + + +def display(result): + print result + + +def main(reactor): + cc = ClientCreator(reactor, AMP) + d = cc.connectTCP('localhost', 7805) + d.addCallback(login, UsernamePassword("testuser", "examplepass")) + d.addCallback(add) + d.addCallback(display) + return d + + +if __name__ == '__main__': + from twisted.internet import reactor + react(reactor, main, []) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Epsilon-0.7.1/doc/listings/amp/auth_server.py new/Epsilon-0.7.2/doc/listings/amp/auth_server.py --- old/Epsilon-0.7.1/doc/listings/amp/auth_server.py 1970-01-01 01:00:00.000000000 +0100 +++ new/Epsilon-0.7.2/doc/listings/amp/auth_server.py 2015-01-24 22:02:05.000000000 +0100 @@ -0,0 +1,77 @@ +# Copyright (c) 2008 Divmod. See LICENSE for details. + +""" +An AMP server which requires authentication of its clients before exposing an +addition command. +""" + +from sys import stdout + +from twisted.python.log import startLogging, msg +from twisted.internet import reactor +from twisted.cred.checkers import InMemoryUsernamePasswordDatabaseDontUse +from twisted.cred.portal import Portal +from twisted.protocols.amp import IBoxReceiver, Command, Integer, AMP + +from epsilon.ampauth import CredAMPServerFactory + + +class Add(Command): + """ + An example of an application-defined command which should be made available + to clients after they successfully authenticate. + """ + arguments = [("left", Integer()), + ("right", Integer())] + + response = [("sum", Integer())] + + + +class Adder(AMP): + """ + An example of an application-defined AMP protocol, the responders defined + by which should only be available to clients after they have successfully + authenticated. + """ + def __init__(self, avatarId): + AMP.__init__(self) + self.avatarId = avatarId + + + @Add.responder + def add(self, left, right): + msg("Adding %d to %d for %s" % (left, right, self.avatarId)) + return {'sum': left + right} + + + +class AdditionRealm(object): + """ + An example of an application-defined realm. + """ + def requestAvatar(self, avatarId, mind, *interfaces): + """ + Create Adder avatars for any IBoxReceiver request. + """ + if IBoxReceiver in interfaces: + return (IBoxReceiver, Adder(avatarId), lambda: None) + raise NotImplementedError() + + + +def main(): + """ + Start the AMP server and the reactor. + """ + startLogging(stdout) + checker = InMemoryUsernamePasswordDatabaseDontUse() + checker.addUser("testuser", "examplepass") + realm = AdditionRealm() + factory = CredAMPServerFactory(Portal(realm, [checker])) + reactor.listenTCP(7805, factory) + reactor.run() + + +if __name__ == '__main__': + main() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Epsilon-0.7.1/doc/listings/amp/route_client.py new/Epsilon-0.7.2/doc/listings/amp/route_client.py --- old/Epsilon-0.7.1/doc/listings/amp/route_client.py 1970-01-01 01:00:00.000000000 +0100 +++ new/Epsilon-0.7.2/doc/listings/amp/route_client.py 2015-01-24 22:02:05.000000000 +0100 @@ -0,0 +1,60 @@ +# Copyright (c) 2008 Divmod. See LICENSE for details. + +import random + +from twisted.internet.defer import Deferred, gatherResults +from twisted.internet.protocol import ClientCreator +from twisted.protocols.amp import AMP + +from epsilon.react import react +from epsilon.amprouter import Router + +from route_setup import connect +from route_server import Count + + +def display(value, id): + print id, value + + +class CountClient(AMP): + def __init__(self, identifier): + AMP.__init__(self) + self.identifier = identifier + self.finished = Deferred() + + def startReceivingBoxes(self, sender): + AMP.startReceivingBoxes(self, sender) + + counts = [] + for i in range(random.randrange(1, 5)): + d = self.callRemote(Count) + d.addCallback(display, self.identifier) + counts.append(d) + gatherResults(counts).chainDeferred(self.finished) + + + +def makeRoutes(proto, router): + router.bindRoute(proto, None).connectTo(None) + + finish = [] + for i in range(3): + client = CountClient(i) + finish.append(connect(proto, router, client)) + finish.append(client.finished) + return gatherResults(finish) + + + +def main(reactor): + router = Router() + cc = ClientCreator(reactor, AMP, router) + d = cc.connectTCP('localhost', 7805) + d.addCallback(makeRoutes, router) + return d + + +if __name__ == '__main__': + from twisted.internet import reactor + react(reactor, main, []) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Epsilon-0.7.1/doc/listings/amp/route_server.py new/Epsilon-0.7.2/doc/listings/amp/route_server.py --- old/Epsilon-0.7.1/doc/listings/amp/route_server.py 1970-01-01 01:00:00.000000000 +0100 +++ new/Epsilon-0.7.2/doc/listings/amp/route_server.py 2015-01-24 22:02:05.000000000 +0100 @@ -0,0 +1,37 @@ +# Copyright (c) 2008 Divmod. See LICENSE for details. + +from sys import stdout + +from twisted.python.log import startLogging +from twisted.protocols.amp import Integer, Command, AMP +from twisted.internet import reactor + +from route_setup import AMPRouteServerFactory + + +class Count(Command): + response = [('value', Integer())] + + + +class Counter(AMP): + _valueCounter = 0 + + @Count.responder + def count(self): + self._valueCounter += 1 + return {'value': self._valueCounter} + + + +def main(): + startLogging(stdout) + serverFactory = AMPRouteServerFactory() + serverFactory.routeProtocol = Counter + reactor.listenTCP(7805, serverFactory) + reactor.run() + + + +if __name__ == '__main__': + main() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Epsilon-0.7.1/doc/listings/amp/route_setup.py new/Epsilon-0.7.2/doc/listings/amp/route_setup.py --- old/Epsilon-0.7.1/doc/listings/amp/route_setup.py 1970-01-01 01:00:00.000000000 +0100 +++ new/Epsilon-0.7.2/doc/listings/amp/route_setup.py 2015-01-24 22:02:05.000000000 +0100 @@ -0,0 +1,49 @@ +# Copyright (c) 2008 Divmod. See LICENSE for details. + +import operator + +from twisted.internet.protocol import ServerFactory +from twisted.protocols.amp import Unicode, Command, AMP + +from epsilon.amprouter import Router + + +class NewRoute(Command): + arguments = [('name', Unicode())] + response = [('name', Unicode())] + + + +class RoutingAMP(AMP): + @NewRoute.responder + def newRoute(self, name): + route = self.boxReceiver.bindRoute(self.factory.routeProtocol()) + route.connectTo(name) + return {'name': route.localRouteName} + + + +class AMPRouteServerFactory(ServerFactory): + protocol = RoutingAMP + routeProtocol = None + + def buildProtocol(self, addr): + router = Router() + proto = self.protocol(router) + proto.factory = self + default = router.bindRoute(proto, None) + default.connectTo(None) + return proto + + + +def connect(proto, router, receiver): + route = router.bindRoute(receiver) + d = proto.callRemote(NewRoute, name=route.localRouteName) + d.addCallback(operator.getitem, 'name') + d.addCallback(lambda name: route.connectTo(name)) + def connectionFailed(err): + route.unbind() + return err + d.addErrback(connectionFailed) + return d diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Epsilon-0.7.1/doc/stylesheet.css new/Epsilon-0.7.2/doc/stylesheet.css --- old/Epsilon-0.7.1/doc/stylesheet.css 1970-01-01 01:00:00.000000000 +0100 +++ new/Epsilon-0.7.2/doc/stylesheet.css 2015-01-24 22:02:05.000000000 +0100 @@ -0,0 +1,129 @@ +body +{ + margin-left: 2em; + margin-right: 2em; + border: 0px; + padding: 0px; + font-family: sans-serif; +} + +pre +{ + padding: 1em; + font-family: Neep Alt, Courier New, Courier; + font-size: 12pt; + border: thin black solid; +} + +.python +{ + background-color: #dddddd; +} + +.py-listing, .html-listing, .listing +{ + margin: 1ex; + border: thin solid black; + background-color: #eee; +} + +.py-listing pre, .html-listing pre, .listing pre +{ + margin: 0px; + border: none; + border-bottom: thin solid black; +} + +.py-listing .python +{ + margin-top: 0; + margin-bottom: 0; + border: none; + border-bottom: thin solid black; +} + +.py-src-comment +{ + color: #1111CC +} + +.py-src-keyword +{ + color: #3333CC; + font-weight: bold; +} + +.py-src-parameter +{ + color: #000066; + font-weight: bold; +} + +.py-src-identifier +{ + color: #CC0000 +} + +.py-src-string +{ + color: #115511 +} + +.py-src-endmarker +{ + display: block; /* IE hack; prevents following line from being sucked into the py-listing box. */ +} + +hr +{ + display: inline; +} + +ul +{ + padding: 0px; + margin: 0px; + margin-left: 1em; + padding-left: 1em; + border-left: 1em; +} + +li +{ + padding: 2px; +} + +dt +{ + font-weight: bold; + margin-left: 1ex; +} + +dd +{ + margin-bottom: 1em; +} + +div.note +{ + background-color: #FFFFCC; + margin-top: 1ex; + margin-left: 5%; + margin-right: 5%; + padding-top: 1ex; + padding-left: 5%; + padding-right: 5%; + border: thin black solid; +} + +.caption +{ + text-align: center; + padding-top: 0.5em; + padding-bottom: 0.5em; +} + +.filename +{ + font-style: italic; +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Epsilon-0.7.1/doc/template.tpl new/Epsilon-0.7.2/doc/template.tpl --- old/Epsilon-0.7.1/doc/template.tpl 1970-01-01 01:00:00.000000000 +0100 +++ new/Epsilon-0.7.2/doc/template.tpl 2015-01-24 22:02:05.000000000 +0100 @@ -0,0 +1,23 @@ +<?xml version="1.0"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml" lang="en"> + <head> + <title> + Epsilon: + </title> + <link type="text/css" rel="stylesheet" href="stylesheet.css" /> + </head> + + <body bgcolor="white"> + <h1 class="title"></h1> + <div class="toc"></div> + <div class="body"> + + </div> + + <p><a href="index.html">Index</a></p> + <span class="version">Version: </span> + </body> +</html> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Epsilon-0.7.1/epsilon/_version.py new/Epsilon-0.7.2/epsilon/_version.py --- old/Epsilon-0.7.1/epsilon/_version.py 2015-10-10 15:54:51.000000000 +0200 +++ new/Epsilon-0.7.2/epsilon/_version.py 2018-06-24 08:15:20.000000000 +0200 @@ -11,8 +11,8 @@ { "dirty": false, "error": null, - "full-revisionid": "a36710813df371d41a839d97f15e9580a8807034", - "version": "0.7.1" + "full-revisionid": "1168ca87dc8e78c179934a35d86b7874938c6bcd", + "version": "0.7.2" } ''' # END VERSION_JSON diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Epsilon-0.7.1/epsilon/scripts/benchmark.py new/Epsilon-0.7.2/epsilon/scripts/benchmark.py --- old/Epsilon-0.7.1/epsilon/scripts/benchmark.py 2015-10-10 13:53:21.000000000 +0200 +++ new/Epsilon-0.7.2/epsilon/scripts/benchmark.py 2018-06-19 00:30:53.000000000 +0200 @@ -377,12 +377,8 @@ read_ms = None write_ms = None - twisted_version = twisted.version._getSVNVersion() - if twisted_version is None: - twisted_version = twisted.version.short() - epsilon_version = epsilon.version._getSVNVersion() - if epsilon_version is None: - epsilon_version = epsilon.version.short() + twisted_version = twisted.version.short() + epsilon_version = epsilon.version.short() Results( version=STATS_VERSION, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Epsilon-0.7.1/requirements-testing.txt new/Epsilon-0.7.2/requirements-testing.txt --- old/Epsilon-0.7.1/requirements-testing.txt 1970-01-01 01:00:00.000000000 +0100 +++ new/Epsilon-0.7.2/requirements-testing.txt 2015-01-24 22:02:05.000000000 +0100 @@ -0,0 +1,2 @@ +# Requirements for running the test suite using tox +coverage diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Epsilon-0.7.1/setup.cfg new/Epsilon-0.7.2/setup.cfg --- old/Epsilon-0.7.1/setup.cfg 2015-10-10 15:54:51.000000000 +0200 +++ new/Epsilon-0.7.2/setup.cfg 2018-06-24 08:15:20.000000000 +0200 @@ -9,5 +9,4 @@ [egg_info] tag_build = tag_date = 0 -tag_svn_revision = 0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Epsilon-0.7.1/setup.py new/Epsilon-0.7.2/setup.py --- old/Epsilon-0.7.1/setup.py 2015-10-10 13:53:21.000000000 +0200 +++ new/Epsilon-0.7.2/setup.py 2018-06-24 05:11:06.000000000 +0200 @@ -10,6 +10,7 @@ url="https://github.com/twisted/epsilon", install_requires=[ + "zope.interface", "Twisted>=13.2.0", "PyOpenSSL>=0.13" ], diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Epsilon-0.7.1/testhotfix new/Epsilon-0.7.2/testhotfix --- old/Epsilon-0.7.1/testhotfix 1970-01-01 01:00:00.000000000 +0100 +++ new/Epsilon-0.7.2/testhotfix 2015-01-24 22:02:05.000000000 +0100 @@ -0,0 +1,8 @@ +#!/usr/bin/python +from epsilon import hotfix +from twisted.python import filepath +orig_a = filepath.FilePath('a') +hotfix.require('twisted', 'filepath_copyTo') +new_a = filepath.FilePath('a') +print orig_a == new_a +print orig_a.temporarySibling() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Epsilon-0.7.1/tox.ini new/Epsilon-0.7.2/tox.ini --- old/Epsilon-0.7.1/tox.ini 1970-01-01 01:00:00.000000000 +0100 +++ new/Epsilon-0.7.2/tox.ini 2017-09-26 08:11:57.000000000 +0200 @@ -0,0 +1,11 @@ +[tox] +envlist = {py27,pypy} + +[testenv] +deps = + . + coverage +commands = + coverage run -m twisted.trial \ + --temp-directory={envdir}/_trial {posargs:epsilon} + coverage report --rcfile={toxinidir}/.coveragerc
