twisted: upgraded package to upstream

Upgraded dev-python/twisted to version 16.6.0-r3 on amd64, arm

It's needed by factory unittest.

BUG=chromium:999876
TEST=update_chroot

Change-Id: I3a21fd3604e84a078103b866fc118706d889e96e
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/overlays/portage-stable/+/2212084
Reviewed-by: Mike Frysinger <vapier@chromium.org>
Tested-by: Yilin Yang (kerker) <kerker@chromium.org>
Commit-Queue: Yilin Yang (kerker) <kerker@chromium.org>
diff --git a/dev-python/twisted/Manifest b/dev-python/twisted/Manifest
new file mode 100644
index 0000000..a19f928
--- /dev/null
+++ b/dev-python/twisted/Manifest
@@ -0,0 +1,2 @@
+DIST Twisted-16.6.0.tar.bz2 2979747 BLAKE2B 898e0a0fa3ae8547a801b09118423ec8ad80727dd6d034e3f8a151f084eff5a3fc560f2eb9e76c452a14ec90b36d93e14d3bbb388010c3c5c01fd1c4d5ca16bb SHA512 0b8de0ec7f64457f76c396fced64b366b8e63c6e000a5edc6c6388cd917fb2f95711918cd8edda39e0aa77e2cd32b5d775d23630a5ad10fc013c18f8316300cf
+DIST twisted-regen-cache.gz 911 BLAKE2B ffd3fcda6c67ffe6fd3ef581c8d507548396b66ed0708e9a5c790095e579c0d5f0f71596acf05712989da2ddef2b8d437eca973bc4d80ef8a9fa852915f38305 SHA512 95a9b931c73017d16d1b5e6b41345dddffe62b6af1a8e93b5e40d06d3d15be17b0dd0181c767ffeeb791534d463764ef9e066fa6c2ee2ac4b53c86d1da8fce03
diff --git a/dev-python/twisted/files/test_main.patch b/dev-python/twisted/files/test_main.patch
new file mode 100644
index 0000000..bfef404
--- /dev/null
+++ b/dev-python/twisted/files/test_main.patch
@@ -0,0 +1,73 @@
+From 2c3c28f5dbbd61bcfa5c548d1d423fffbaf2132d Mon Sep 17 00:00:00 2001
+From: Brian Dolbec <dolsen@gentoo.org>
+Date: Fri, 31 Mar 2017 09:32:18 -0700
+Subject: [PATCH] tests/test_main.py: Fix test_twisted to handle differntly
+ sorted options
+
+Some systems retuned the usage with '__main__.py' instead of the command 'trial'
+So, substitute that out if it exists.
+The options returned via python can be a different sort order than is output via the
+command --help.  So break up the lines into a list and check equality, lines are neither
+missing or extra.
+---
+ src/twisted/test/test_main.py | 34 ++++++++++++++++++++++++++++++++--
+ 1 file changed, 32 insertions(+), 2 deletions(-)
+
+diff --git a/src/twisted/test/test_main.py b/src/twisted/test/test_main.py
+index 572769018..b010a389e 100644
+--- a/src/twisted/test/test_main.py
++++ b/src/twisted/test/test_main.py
+@@ -18,6 +18,10 @@ from twisted.trial.unittest import TestCase
+ 
+ class MainTests(TestCase):
+     """Test that twisted scripts can be invoked as modules."""
++    # this test just does not work correctly on Gentoo
++    # the output has '__main__.py' instead of 'trial'
++    # I have only been able to get 2.7 working correctly
++    # with replacing the value with what is expected.
+     def test_twisted(self):
+         """Invoking python -m twisted should execute twist."""
+         cmd = sys.executable
+@@ -28,11 +32,37 @@ class MainTests(TestCase):
+ 
+         def processEnded(ign):
+             f = p.outF
+-            output = f.getvalue().replace(b'\r\n', b'\n')
++            # Some systems may return __main__.py instead of the command name expected
++            output = f.getvalue().replace(b'\r\n', b'\n').replace(b"__main__.py", b"trial")
+ 
+             options = TwistOptions()
+             message = '{}\n'.format(options).encode('utf-8')
+-            self.assertEqual(output, message)
++            # NOTE: python may return the  options in a different order
++            # than is output via the command --help option
++            # so we must break up the text and compare that lines
++            # are not missing or extra from what is expected
++            a = output.split(b'\n')
++            b = message.split(b'\n')
++            extras = []
++            missing = []
++            equal_len = (len(a) == len(b))
++            for i in a:
++                if i not in b:
++                    extras.append(i)
++            for i in b:
++                if i not in a:
++                    missing.append(i)
++
++            self.assertTrue(equal_len,
++                msg="Usage reported a different number of lines than expected")
++            self.assertTrue(extras == [],
++                msg="Usage returned these extra lines not expected: %s"
++                    % '\n'.join(extras)
++            )
++            self.assertTrue(missing == [],
++                msg="Usage was missing these expected lines: %s"
++                    % '\n'.join(missing)
++            )
+         return d.addCallback(processEnded)
+ 
+     def test_twisted_import(self):
+-- 
+2.12.1
+
diff --git a/dev-python/twisted/files/trial b/dev-python/twisted/files/trial
new file mode 100644
index 0000000..8da5886
--- /dev/null
+++ b/dev-python/twisted/files/trial
@@ -0,0 +1,22 @@
+#!/usr/bin/env python
+# Copyright (c) Twisted Matrix Laboratories.
+# See LICENSE for details.
+import os, sys
+
+try:
+    import _preamble
+except ImportError:
+    try:
+        sys.exc_clear()
+    except AttributeError:
+        # exc_clear() (and the requirement for it) has been removed from Py3
+        pass
+
+# begin chdir armor
+sys.path[:] = map(os.path.abspath, sys.path)
+# end chdir armor
+
+sys.path.insert(0, os.path.abspath(os.getcwd()))
+
+from twisted.scripts.trial import run
+run()
diff --git a/dev-python/twisted/files/twistd.conf b/dev-python/twisted/files/twistd.conf
new file mode 100644
index 0000000..53788cd
--- /dev/null
+++ b/dev-python/twisted/files/twistd.conf
@@ -0,0 +1,7 @@
+
+# These are passed to twistd.
+# TWISTD_OPTS="--no_save --logfile=/var/log/twistd -y /etc/twistd.tac"
+# TWISTD_OPTS="--no_save --logfile=/var/log/twistd -f /etc/twistd.tap"
+
+# Make any additions to PYTHONPATH the twistd needs here.
+# PYTHONPATH="/path/to/extra/python/modules"
diff --git a/dev-python/twisted/files/twistd.init b/dev-python/twisted/files/twistd.init
new file mode 100644
index 0000000..b031b00
--- /dev/null
+++ b/dev-python/twisted/files/twistd.init
@@ -0,0 +1,25 @@
+#!/sbin/openrc-run
+
+depend() {
+	need net
+}
+
+start() {
+	if [ -z "${TWISTD_OPTS}" ]; then
+		eerror "TWISTD_OPTS is not set!"
+		eerror "You need to configure twistd in /etc/conf.d/twistd."
+		return 1
+	fi
+	export PYTHONPATH
+	ebegin "Starting twistd"
+	start-stop-daemon --start --quiet --pidfile /var/run/twistd.pid \
+		--exec /usr/bin/twistd -- --pidfile /var/run/twistd.pid \
+			${TWISTD_OPTS}
+	eend $? "Failed to start twistd"
+}
+
+stop() {
+	ebegin "Stopping twistd"
+	start-stop-daemon --stop --quiet --pidfile /var/run/twistd.pid 
+	eend $? "Failed to stop twistd"
+}
diff --git a/dev-python/twisted/files/twisted-16.5.0-respect_TWISTED_DISABLE_WRITING_OF_PLUGIN_CACHE.patch b/dev-python/twisted/files/twisted-16.5.0-respect_TWISTED_DISABLE_WRITING_OF_PLUGIN_CACHE.patch
new file mode 100644
index 0000000..ed1a468
--- /dev/null
+++ b/dev-python/twisted/files/twisted-16.5.0-respect_TWISTED_DISABLE_WRITING_OF_PLUGIN_CACHE.patch
@@ -0,0 +1,11 @@
+--- src/twisted/plugin.py
++++ src/twisted/plugin.py
+@@ -180,7 +180,7 @@
+             if pluginKey not in existingKeys:
+                 del dropinDotCache[pluginKey]
+                 needsWrite = True
+-        if needsWrite:
++        if needsWrite and os.environ.get("TWISTED_DISABLE_WRITING_OF_PLUGIN_CACHE") is None:
+             try:
+                 dropinPath.setContent(pickle.dumps(dropinDotCache))
+             except:
diff --git a/dev-python/twisted/files/twisted-16.6.0-test-fixes.patch b/dev-python/twisted/files/twisted-16.6.0-test-fixes.patch
new file mode 100644
index 0000000..3ce04aa
--- /dev/null
+++ b/dev-python/twisted/files/twisted-16.6.0-test-fixes.patch
@@ -0,0 +1,282 @@
+From 91b6d8b5b9d602152fb7148c6e2921463b93a8a5 Mon Sep 17 00:00:00 2001
+From: Brian Dolbec <dolsen@gentoo.org>
+Date: Fri, 31 Mar 2017 10:55:32 -0700
+Subject: [PATCH] twisted test overrides
+
+---
+ src/twisted/internet/test/test_gireactor.py |  3 ++-
+ src/twisted/pair/test/test_ethernet.py      |  9 +++++++++
+ src/twisted/pair/test/test_ip.py            |  8 ++++++++
+ src/twisted/pair/test/test_rawudp.py        | 10 +++++++++-
+ src/twisted/pair/test/test_tuntap.py        | 16 ++++++++++++++++
+ src/twisted/python/test/test_dist3.py       |  2 ++
+ src/twisted/test/test_ident.py              |  5 ++++-
+ src/twisted/test/test_plugin.py             |  6 ++++++
+ src/twisted/test/test_policies.py           |  5 +++++
+ src/twisted/test/test_udp.py                |  6 ++++++
+ 10 files changed, 67 insertions(+), 3 deletions(-)
+
+diff --git a/src/twisted/internet/test/test_gireactor.py b/src/twisted/internet/test/test_gireactor.py
+index 43147fdce..6333218e7 100644
+--- a/src/twisted/internet/test/test_gireactor.py
++++ b/src/twisted/internet/test/test_gireactor.py
+@@ -39,6 +39,7 @@ from twisted.python.compat import _PY3
+ if gireactor is None:
+     skip = "gtk3/gi not importable"
+ 
++EMERGE_TEST_OVERRIDE = os.environ.get("EMERGE_TEST_OVERRIDE", False)
+ 
+ 
+ class GApplicationRegistrationTests(ReactorBuilder, TestCase):
+@@ -103,7 +104,7 @@ class GApplicationRegistrationTests(ReactorBuilder, TestCase):
+ 
+         self.runReactor(app, reactor)
+ 
+-    if gtk3reactor is None:
++    if gtk3reactor is None or EMERGE_TEST_OVERRIDE:
+         test_gtkApplicationActivate.skip = (
+             "Gtk unavailable (may require running with X11 DISPLAY env set)")
+ 
+diff --git a/src/twisted/pair/test/test_ethernet.py b/src/twisted/pair/test/test_ethernet.py
+index a4c3a5d19..fe9c57151 100644
+--- a/src/twisted/pair/test/test_ethernet.py
++++ b/src/twisted/pair/test/test_ethernet.py
+@@ -1,11 +1,16 @@
+ # Copyright (c) Twisted Matrix Laboratories.
+ # See LICENSE for details.
++
++import os
++
+ from twisted.trial import unittest
+ 
+ from twisted.python import components
+ from twisted.pair import ethernet, raw
+ from zope.interface import implementer
+ 
++EMERGE_TEST_OVERRIDE = os.environ.get("EMERGE_TEST_OVERRIDE", False)
++
+ 
+ @implementer(raw.IRawPacketProtocol)
+ class MyProtocol:
+@@ -221,3 +226,7 @@ class EthernetTests(unittest.TestCase):
+                 raise
+         else:
+             raise AssertionError('addProto must raise an exception for bad protocols')
++
++
++if EMERGE_TEST_OVERRIDE:
++    EthernetTests.skip = "This test does not work via FEATURES=test emerge twisted"
+diff --git a/src/twisted/pair/test/test_ip.py b/src/twisted/pair/test/test_ip.py
+index 0f192a357..0a99658ef 100644
+--- a/src/twisted/pair/test/test_ip.py
++++ b/src/twisted/pair/test/test_ip.py
+@@ -1,11 +1,16 @@
+ # Copyright (c) Twisted Matrix Laboratories.
+ # See LICENSE for details.
++
++import os
++
+ from twisted.trial import unittest
+ 
+ from twisted.python import components
+ from twisted.pair import ip, raw
+ from zope import interface
+ 
++EMERGE_TEST_OVERRIDE = os.environ.get("EMERGE_TEST_OVERRIDE", False)
++
+ 
+ @interface.implementer(raw.IRawDatagramProtocol)
+ class MyProtocol:
+@@ -432,3 +437,6 @@ class IPTests(unittest.TestCase):
+                 raise
+         else:
+             raise AssertionError('addProto must raise an exception for bad protocols')
++
++if EMERGE_TEST_OVERRIDE:
++    IPTests.skip = "This test does not work via FEATURES=test emerge twisted"
+diff --git a/src/twisted/pair/test/test_rawudp.py b/src/twisted/pair/test/test_rawudp.py
+index 15aae10f1..dade38618 100644
+--- a/src/twisted/pair/test/test_rawudp.py
++++ b/src/twisted/pair/test/test_rawudp.py
+@@ -1,12 +1,17 @@
+ # Copyright (c) Twisted Matrix Laboratories.
+ # See LICENSE for details.
+-
+ #
++
++import os
++
+ from twisted.trial import unittest
+ 
+ from twisted.internet import protocol
+ from twisted.pair import rawudp
+ 
++EMERGE_TEST_OVERRIDE = os.environ.get("EMERGE_TEST_OVERRIDE", False)
++
++
+ class MyProtocol(protocol.DatagramProtocol):
+     def __init__(self, expecting):
+         self.expecting = list(expecting)
+@@ -325,3 +330,6 @@ class RawUDPTests(unittest.TestCase):
+                 raise
+         else:
+             raise AssertionError('addProto must raise an exception for bad protocols')
++
++if EMERGE_TEST_OVERRIDE:
++    RawUDPTests.skip = "This test does not work via FEATURES=test emerge twisted"
+diff --git a/src/twisted/pair/test/test_tuntap.py b/src/twisted/pair/test/test_tuntap.py
+index 5e2da6e0f..53e03a008 100644
+--- a/src/twisted/pair/test/test_tuntap.py
++++ b/src/twisted/pair/test/test_tuntap.py
+@@ -64,6 +64,7 @@ if platformSkip is None:
+ else:
+     skip = platformSkip
+ 
++EMERGE_TEST_OVERRIDE = os.environ.get("EMERGE_TEST_OVERRIDE", False)
+ 
+ 
+ @implementer(IReactorFDSet)
+@@ -1417,3 +1418,18 @@ class RealIOSystemTests(IOSystemTestsMixin, SynchronousTestCase,
+     """
+     General L{_IInputOutputSystem} tests applied to L{_RealSystem}.
+     """
++
++if EMERGE_TEST_OVERRIDE:
++    RealIOSystemTests.skip = "This test does not work via FEATURES=test emerge twisted"
++    MemoryIOSystemTests.skip = "This test does not work via FEATURES=test emerge twisted"
++    TapTests.skip = "This test does not work via FEATURES=test emerge twisted"
++    TunTests.skip = "This test does not work via FEATURES=test emerge twisted"
++    TunnelAddressEqualityTests.skip = "This test does not work via FEATURES=test emerge twisted"
++    TunnelAddressTests.skip = "This test does not work via FEATURES=test emerge twisted"
++    TuntapPortTests.skip = "This test does not work via FEATURES=test emerge twisted"
++    TunnelTests.skip = "This test does not work via FEATURES=test emerge twisted"
++    FakeTapDeviceTests.skip = "This test does not work via FEATURES=test emerge twisted"
++    FakeTapDeviceWithPITests.skip = "This test does not work via FEATURES=test emerge twisted"
++    FakeTunDeviceTests.skip = "This test does not work via FEATURES=test emerge twisted"
++    RealDeviceWithProtocolInformationTests.skip = "This test does not work via FEATURES=test emerge twisted"
++    RealDeviceWithoutProtocolInformationTests.skip = "This test does not work via FEATURES=test emerge twisted"
+diff --git a/src/twisted/python/test/test_dist3.py b/src/twisted/python/test/test_dist3.py
+index 3ce2bdd60..494674bc7 100644
+--- a/src/twisted/python/test/test_dist3.py
++++ b/src/twisted/python/test/test_dist3.py
+@@ -53,3 +53,5 @@ class ModulesToInstallTests(TestCase):
+         test_exist.skip = "Only on Python 2"
+     else:
+         test_notexist.skip = "Only on Python 3"
++
++ModulesToInstallTests.skip = "This is an upstream distribution test only"
+diff --git a/src/twisted/test/test_ident.py b/src/twisted/test/test_ident.py
+index d86b840e5..3cc40261f 100644
+--- a/src/twisted/test/test_ident.py
++++ b/src/twisted/test/test_ident.py
+@@ -12,7 +12,7 @@ from twisted.protocols import ident
+ from twisted.python import failure
+ from twisted.internet import error
+ from twisted.internet import defer
+-from twisted.python.compat import NativeStringIO
++from twisted.python.compat import NativeStringIO, _PY3
+ 
+ from twisted.trial import unittest
+ from twisted.test.proto_helpers import StringTransport
+@@ -216,6 +216,9 @@ class ProcMixinTests(unittest.TestCase):
+         """
+         L{ident.ProcServerMixin.lookup} uses the Linux TCP process table.
+         """
++        if not _PY3:
++            # test is broken in py2.7
++            return
+         open_calls = []
+ 
+         def mocked_open(*args, **kwargs):
+diff --git a/src/twisted/test/test_plugin.py b/src/twisted/test/test_plugin.py
+index a23caa72b..a6d61858c 100644
+--- a/src/twisted/test/test_plugin.py
++++ b/src/twisted/test/test_plugin.py
+@@ -29,6 +29,8 @@ else:
+         On python 2, import caches don't need to be invalidated.
+         """
+ 
++EMERGE_TEST_OVERRIDE = os.environ.get("EMERGE_TEST_OVERRIDE", False)
++
+ 
+ 
+ class ITestPlugin(Interface):
+@@ -327,6 +329,8 @@ class PluginTests(unittest.TestCase):
+         attainable, but an error should be logged to show that the cache
+         couldn't be updated.
+         """
++        if EMERGE_TEST_OVERRIDE:
++            return
+         # Generate the cache
+         plugin.getCache(self.module)
+ 
+@@ -580,6 +584,8 @@ class DeveloperSetupTests(unittest.TestCase):
+         provide useful coverage on Windows due to the different meaning of
+         "read-only directory".
+         """
++        if EMERGE_TEST_OVERRIDE:
++            return
+         self.unlockSystem()
+         self.sysplug.child('newstuff.py').setContent(pluginFileContents('one'))
+         self.lockSystem()
+diff --git a/src/twisted/test/test_policies.py b/src/twisted/test/test_policies.py
+index 3d92633d6..c08809a66 100644
+--- a/src/twisted/test/test_policies.py
++++ b/src/twisted/test/test_policies.py
+@@ -7,6 +7,8 @@ Test code for policies.
+ 
+ from __future__ import division, absolute_import
+ 
++import os
++
+ from zope.interface import Interface, implementer, implementedBy
+ 
+ from twisted.python.compat import NativeStringIO
+@@ -23,6 +25,7 @@ try:
+ except ImportError:
+     import __builtin__ as builtins
+ 
++EMERGE_TEST_OVERRIDE = os.environ.get("EMERGE_TEST_OVERRIDE", False)
+ 
+ 
+ class SimpleProtocol(protocol.Protocol):
+@@ -883,6 +886,8 @@ class LoggingFactoryTests(unittest.TestCase):
+         automatically opens a unique log file for that protocol and attaches
+         the logfile to the built protocol.
+         """
++        if EMERGE_TEST_OVERRIDE:
++            return
+         open_calls = []
+         open_rvalues = []
+ 
+diff --git a/src/twisted/test/test_udp.py b/src/twisted/test/test_udp.py
+index 6cf4583b2..86b513704 100644
+--- a/src/twisted/test/test_udp.py
++++ b/src/twisted/test/test_udp.py
+@@ -8,6 +8,8 @@ Tests for implementations of L{IReactorUDP} and L{IReactorMulticast}.
+ 
+ from __future__ import division, absolute_import
+ 
++import os
++
+ from twisted.trial import unittest
+ 
+ from twisted.python.compat import intToBytes
+@@ -15,6 +17,8 @@ from twisted.internet.defer import Deferred, gatherResults, maybeDeferred
+ from twisted.internet import protocol, reactor, error, defer, interfaces, udp
+ from twisted.python import runtime
+ 
++EMERGE_TEST_OVERRIDE = os.environ.get("EMERGE_TEST_OVERRIDE", False)
++
+ 
+ class Mixin:
+ 
+@@ -699,3 +703,5 @@ if not interfaces.IReactorUDP(reactor, None):
+     ReactorShutdownInteractionTests.skip = "This reactor does not support UDP"
+ if not interfaces.IReactorMulticast(reactor, None):
+     MulticastTests.skip = "This reactor does not support multicast"
++elif EMERGE_TEST_OVERRIDE:
++    MulticastTests.skip = "This reactor test does not work via FEATURES=test emerge twisted"
+-- 
+2.12.1
+
diff --git a/dev-python/twisted/files/utf8_overrides.patch b/dev-python/twisted/files/utf8_overrides.patch
new file mode 100644
index 0000000..41f48ce
--- /dev/null
+++ b/dev-python/twisted/files/utf8_overrides.patch
@@ -0,0 +1,64 @@
+From f8b2e95cc9bd1cbae565e1b4d576950961edc9a7 Mon Sep 17 00:00:00 2001
+From: Brian Dolbec <dolsen@gentoo.org>
+Date: Fri, 31 Mar 2017 09:40:16 -0700
+Subject: [PATCH] UTF8 test overrides:  The DaemonizeTests SafeStrTests tests
+ may need to be run independantly
+
+Some other tests may leave python in a state that returns a different form of the b'\\u2022'
+bytestring (b'\xe2\x80\xa2') which causes the tests to fail.
+In StafeStrTests, the returned 't\\xfcst' != 't\xc3\xbcst' originally sent, but is just
+the unicode equivalent.
+
+This adds an environment override which can be used to skip these test during a full
+"trial twisted" run.  The DaemonizeTests, SafeStrTests can then be run independantly
+with a clean python interpreter.
+---
+ src/twisted/test/test_reflect.py | 6 ++++++
+ src/twisted/test/test_twistd.py  | 3 +++
+ 2 files changed, 9 insertions(+)
+
+diff --git a/src/twisted/test/test_reflect.py b/src/twisted/test/test_reflect.py
+index ff0c7fc9e..0c13b949b 100644
+--- a/src/twisted/test/test_reflect.py
++++ b/src/twisted/test/test_reflect.py
+@@ -19,6 +19,9 @@ from twisted.python.reflect import (
+     accumulateMethods, prefixedMethods, prefixedMethodNames,
+     addMethodNamesToDict, fullyQualifiedName)
+ 
++UTF8_OVERRIDES = os.environ.get("UTF8_OVERRIDES", False)
++
++
+ 
+ class Base(object):
+     """
+@@ -553,6 +556,9 @@ class SafeStrTests(TestCase):
+         x = b't\xc3\xbcst'
+         self.assertEqual(reflect.safe_str(x), x)
+ 
++    if UTF8_OVERRIDES:
++        test_workingUtf8_2.skip = "test_workingUtf8_2 requires to be run independantly of other tests"
++
+ 
+     def test_workingUtf8_3(self):
+         """
+diff --git a/src/twisted/test/test_twistd.py b/src/twisted/test/test_twistd.py
+index b74fe4a08..d55be16b9 100644
+--- a/src/twisted/test/test_twistd.py
++++ b/src/twisted/test/test_twistd.py
+@@ -78,6 +78,7 @@ if getattr(os, 'setuid', None) is None:
+ else:
+     setuidSkip = None
+ 
++UTF8_OVERRIDES = os.environ.get("UTF8_OVERRIDES", False)
+ 
+ 
+ def patchUserDatabase(patch, user, uid, group, gid):
+@@ -1913,3 +1914,5 @@ class DaemonizeTests(unittest.TestCase):
+ 
+ if _twistd_unix is None:
+     DaemonizeTests.skip = "twistd unix support not available"
++elif UTF8_OVERRIDES:
++    DaemonizeTests.skip = "twistd.DaemonizeTests testing needs to be run separately"
+-- 
+2.12.1
+
diff --git a/dev-python/twisted/metadata.xml b/dev-python/twisted/metadata.xml
new file mode 100644
index 0000000..055660d
--- /dev/null
+++ b/dev-python/twisted/metadata.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
+<pkgmetadata>
+	<maintainer type="project">
+		<email>python@gentoo.org</email>
+		<name>Python</name>
+	</maintainer>
+	<upstream>
+		<maintainer>
+			<email>twisted-python@twistedmatrix.com</email>
+			<name>Twisted Matrix Laboratories</name>
+		</maintainer>
+		<remote-id type="pypi">Twisted</remote-id>
+	</upstream>
+	<use>
+		<flag name="conch">include Twisted SSHv2 implementation</flag>
+		<flag name="http2">include http2 support</flag>
+		<flag name="serial">include serial port support</flag>
+	</use>
+	<longdescription>Twisted is an event-based framework for internet
+		applications, supporting Python 2.7 and Python 3.3+. It includes
+		modules for many different purposes, including the following:
+
+twisted.web: HTTP clients and servers, HTML templating, and a WSGI server
+twisted.conch: SSHv2 and Telnet clients and servers and terminal emulators
+twisted.words: Clients and servers for IRC, XMPP, and other IM protocols
+twisted.mail: IMAPv4, POP3, SMTP clients and servers
+twisted.positioning: Tools for communicating with NMEA-compatible GPS receivers
+twisted.names: DNS client and tools for making your own DNS servers
+twisted.trial: A unit testing framework that integrates well with Twisted-based code.
+	</longdescription>
+</pkgmetadata>
diff --git a/dev-python/twisted/twisted-16.6.0-r3.ebuild b/dev-python/twisted/twisted-16.6.0-r3.ebuild
new file mode 100644
index 0000000..007bc80
--- /dev/null
+++ b/dev-python/twisted/twisted-16.6.0-r3.ebuild
@@ -0,0 +1,185 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+PYTHON_COMPAT=( python2_7 python3_6)
+PYTHON_REQ_USE="threads(+)"
+
+inherit eutils flag-o-matic distutils-r1 versionator
+
+TWISTED_PN="Twisted"
+TWISTED_P="${TWISTED_PN}-${PV}"
+TWISTED_RELEASE=$(get_version_component_range 1-2 "${PV}")
+
+DESCRIPTION="An asynchronous networking framework written in Python"
+HOMEPAGE="https://www.twistedmatrix.com/trac/"
+SRC_URI="https://twistedmatrix.com/Releases/${TWISTED_PN}"
+SRC_URI="${SRC_URI}/${TWISTED_RELEASE}/${TWISTED_P}.tar.bz2
+	https://dev.gentoo.org/~mgorny/dist/twisted-regen-cache.gz"
+
+# Dropped keywords due to new deps not keyworded
+#KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~m68k ~ppc ~ppc64 ~s390 ~sh ~x86 ~ia64-hpux ~x86-interix ~amd64-linux ~x86-linux ~ppc-macos ~x64-macos ~x86-macos ~sparc-solaris ~sparc64-solaris ~x64-solaris ~x86-solaris"
+KEYWORDS="*"
+
+LICENSE="MIT"
+SLOT="0"
+IUSE="conch crypt http2 serial +soap test"
+RESTRICT="!test? ( test )"
+
+RDEPEND="
+	>=dev-python/incremental-16.10.1[${PYTHON_USEDEP}]
+	>=dev-python/zope-interface-4.0.2[${PYTHON_USEDEP}]
+	conch? (
+		dev-python/pyasn1[${PYTHON_USEDEP}]
+		>=dev-python/cryptography-0.9.1[${PYTHON_USEDEP}]
+		>=dev-python/appdirs-1.4.0[${PYTHON_USEDEP}]
+	)
+	crypt? (
+		>=dev-python/pyopenssl-16.0.0[${PYTHON_USEDEP}]
+		dev-python/service_identity[${PYTHON_USEDEP}]
+		>=dev-python/idna-0.6[${PYTHON_USEDEP}]
+	)
+	serial? ( dev-python/pyserial[${PYTHON_USEDEP}] )
+	soap? ( $(python_gen_cond_dep 'dev-python/soappy[${PYTHON_USEDEP}]' python2_7) )
+	http2? (
+		>=dev-python/hyper-h2-2.5.0[${PYTHON_USEDEP}]
+		<dev-python/hyper-h2-3.0.0[${PYTHON_USEDEP}]
+		>=dev-python/priority-1.1.0[${PYTHON_USEDEP}]
+		<dev-python/priority-2.0[${PYTHON_USEDEP}]
+	)
+	>=dev-python/constantly-15.1.0[${PYTHON_USEDEP}]
+	!dev-python/twisted-core
+	!dev-python/twisted-conch
+	!dev-python/twisted-lore
+	!dev-python/twisted-mail
+	!dev-python/twisted-names
+	!dev-python/twisted-news
+	!dev-python/twisted-pair
+	!dev-python/twisted-runner
+	!dev-python/twisted-words
+	!dev-python/twisted-web
+"
+DEPEND="
+	>=dev-python/incremental-16.10.1[${PYTHON_USEDEP}]
+	test? (
+		dev-python/gmpy[${PYTHON_USEDEP}]
+		dev-python/pyasn1[${PYTHON_USEDEP}]
+		>=dev-python/cryptography-0.9.1[${PYTHON_USEDEP}]
+		>=dev-python/appdirs-1.4.0[${PYTHON_USEDEP}]
+		>=dev-python/pyopenssl-0.13[${PYTHON_USEDEP}]
+		dev-python/service_identity[${PYTHON_USEDEP}]
+		dev-python/idna[${PYTHON_USEDEP}]
+		dev-python/pyserial[${PYTHON_USEDEP}]
+		>=dev-python/constantly-15.1.0[${PYTHON_USEDEP}]
+	)
+"
+
+PATCHES=(
+	# Respect TWISTED_DISABLE_WRITING_OF_PLUGIN_CACHE variable.
+	"${FILESDIR}/${PN}-16.5.0-respect_TWISTED_DISABLE_WRITING_OF_PLUGIN_CACHE.patch"
+	"${FILESDIR}/test_main.patch"
+	"${FILESDIR}/utf8_overrides.patch"
+	"${FILESDIR}/${PN}-16.6.0-test-fixes.patch"
+)
+
+S=${WORKDIR}/${TWISTED_P}
+
+python_prepare_all() {
+	# disable tests that don't work in our sandbox
+	# and other test failures due to our conditions
+	if use test ; then
+		# Remove since this is an upstream distribution test for making releases
+		rm src/twisted/python/test/test_release.py || die "rm src/twisted/python/test/test_release.py FAILED"
+	fi
+	distutils-r1_python_prepare_all
+}
+
+python_compile() {
+	if ! python_is_python3; then
+		# Needed to make the sendmsg extension work
+		# (see https://twistedmatrix.com/trac/ticket/5701 )
+		local -x CFLAGS="${CFLAGS} -fno-strict-aliasing"
+		local -x CXXFLAGS="${CXXFLAGS} -fno-strict-aliasing"
+	fi
+
+	distutils-r1_python_compile
+}
+
+python_test() {
+	distutils_install_for_testing
+
+	export EMERGE_TEST_OVERRIDE=1
+	export UTF8_OVERRIDES=1
+	# workaround for the eclass not installing the entry points
+	# in the test environment.  copy the old 16.3.2 start script
+	# to run the tests with
+	cp "${FILESDIR}"/trial "${TEST_DIR}" || die
+	chmod +x "${TEST_DIR}"/trial || die
+
+	pushd "${TEST_DIR}" > /dev/null || die
+
+	if ! "${TEST_DIR}"/trial twisted; then
+		die "Tests failed with ${EPYTHON}"
+	fi
+	# due to an anomoly in the tests, python doesn't return the correct form
+	# of the escape sequence. So run those test separately with a clean python interpreter
+	export UTF8_OVERRIDES=0
+	if ! "${TEST_DIR}"/trial twisted.test.test_twistd.DaemonizeTests; then
+		die "DaemonizeTests failed with ${EPYTHON}"
+	fi
+	if ! "${TEST_DIR}"/trial twisted.test.test_reflect.SafeStrTests; then
+		die "SafeStrTests failed with ${EPYTHON}"
+	fi
+
+	popd > /dev/null || die
+}
+
+python_install() {
+	distutils-r1_python_install
+
+	cd "${D%/}$(python_get_sitedir)" || die
+
+	# own the dropin.cache so we don't leave orphans
+	touch twisted/plugins/dropin.cache || die
+
+	python_doscript "${WORKDIR}"/twisted-regen-cache
+}
+
+python_install_all() {
+	distutils-r1_python_install_all
+
+	newconfd "${FILESDIR}/twistd.conf" twistd
+	newinitd "${FILESDIR}/twistd.init" twistd
+}
+
+python_postinst() {
+	twisted-regen-cache || die
+}
+
+pkg_postinst() {
+	python_foreach_impl python_postinst
+
+	einfo "Install complete"
+	if use test ; then
+		einfo ""
+		einfo "Some tests have been disabled during testing due to"
+		einfo "known incompatibilities with the emerge sandboxes and/or"
+		einfo "not runnable as the root user."
+		einfo "For a complete test suite run on the code."
+		einfo "Run the tests as a normal user for each python it is installed to."
+		einfo "  ie:  $ python3.6 /usr/bin/trial twisted"
+		einfo "There are a few known python-2.7 errors due to some unicode issues"
+		einfo "which are different in Gentoo installed python-2.7"
+	fi
+}
+
+python_postrm() {
+	rm -f "${ROOT%/}$(python_get_sitedir)/twisted/plugins/dropin.cache" || die
+}
+
+pkg_postrm() {
+	# if we're removing the last version, remove the cache file
+	if [[ ! ${REPLACING_VERSIONS} ]]; then
+		python_foreach_impl python_postrm
+	fi
+}
diff --git a/metadata/md5-cache/dev-python/twisted-16.6.0-r3 b/metadata/md5-cache/dev-python/twisted-16.6.0-r3
new file mode 100644
index 0000000..b6c7b7f
--- /dev/null
+++ b/metadata/md5-cache/dev-python/twisted-16.6.0-r3
@@ -0,0 +1,15 @@
+DEFINED_PHASES=compile configure install postinst postrm prepare test
+DEPEND=>=dev-python/incremental-16.10.1[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] test? ( dev-python/gmpy[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/pyasn1[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] >=dev-python/cryptography-0.9.1[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] >=dev-python/appdirs-1.4.0[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] >=dev-python/pyopenssl-0.13[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/service_identity[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/idna[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/pyserial[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] >=dev-python/constantly-15.1.0[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] ) python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[threads(+)] ) python_targets_python3_6? ( dev-lang/python:3.6[threads(+)] ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/setuptools[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)]
+DESCRIPTION=An asynchronous networking framework written in Python
+EAPI=5
+HOMEPAGE=https://www.twistedmatrix.com/trac/
+IUSE=conch crypt http2 serial +soap test python_targets_python2_7 python_targets_python3_6
+KEYWORDS=*
+LICENSE=MIT
+RDEPEND=>=dev-python/incremental-16.10.1[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] >=dev-python/zope-interface-4.0.2[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] conch? ( dev-python/pyasn1[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] >=dev-python/cryptography-0.9.1[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] >=dev-python/appdirs-1.4.0[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] ) crypt? ( >=dev-python/pyopenssl-16.0.0[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] dev-python/service_identity[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] >=dev-python/idna-0.6[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] ) serial? ( dev-python/pyserial[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] ) soap? ( python_targets_python2_7? ( dev-python/soappy[python_targets_python2_7(-)?,-python_single_target_python2_7(-)] ) ) http2? ( >=dev-python/hyper-h2-2.5.0[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] <dev-python/hyper-h2-3.0.0[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] >=dev-python/priority-1.1.0[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] <dev-python/priority-2.0[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] ) >=dev-python/constantly-15.1.0[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)] !dev-python/twisted-core !dev-python/twisted-conch !dev-python/twisted-lore !dev-python/twisted-mail !dev-python/twisted-names !dev-python/twisted-news !dev-python/twisted-pair !dev-python/twisted-runner !dev-python/twisted-words !dev-python/twisted-web python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7[threads(+)] ) python_targets_python3_6? ( dev-lang/python:3.6[threads(+)] ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_6(-)]
+REQUIRED_USE=|| ( python_targets_python2_7 python_targets_python3_6 )
+RESTRICT=!test? ( test )
+SLOT=0
+SRC_URI=https://twistedmatrix.com/Releases/Twisted/16.6/Twisted-16.6.0.tar.bz2 https://dev.gentoo.org/~mgorny/dist/twisted-regen-cache.gz
+_eclasses_=distutils-r1	198e3b9ddb55ae36b2a50b07ca2877ef	estack	43ddf5aaffa7a8d0482df54d25a66a1f	eutils	06133990e861be0fe60c2b428fd025d9	flag-o-matic	5d5921a298e95441da2f85be419894c0	multibuild	40fe59465edacd730c644ec2bc197809	multilib	b2f01ad412baf81650c23fcf0975fa33	multiprocessing	e32940a7b2a9992ad217eccddb84d548	python-r1	ce1cd23cfdc1848e8e32743efe34f299	python-utils-r1	931c328767d245c08a16a3f87be9ce9c	toolchain-funcs	209edad4a5c4812e7b2f8021650974f0	versionator	26ca8a8bd95d6a74122c08ba98a4ee72	xdg-utils	ff2ff954e6b17929574eee4efc5152ba
+_md5_=b522541430cb2cb852833f4530393224