1{ lib
2, stdenv
3, buildPythonPackage
4, pythonOlder
5, fetchPypi
6, fetchpatch
7, python
8, appdirs
9, attrs
10, automat
11, bcrypt
12, constantly
13, contextvars
14, cryptography
15, git
16, glibcLocales
17, h2
18, hyperlink
19, idna
20, incremental
21, priority
22, pyasn1
23, pyhamcrest
24, pynacl
25, pyopenssl
26, pyserial
27, service-identity
28, setuptools
29, typing-extensions
30, zope_interface
31
32 # for passthru.tests
33, cassandra-driver
34, klein
35, magic-wormhole
36, scrapy
37, treq
38, txaio
39, txamqp
40, txrequests
41, txtorcon
42, thrift
43, nixosTests
44}:
45
46buildPythonPackage rec {
47 pname = "twisted";
48 version = "22.8.0";
49 format = "setuptools";
50
51 disabled = pythonOlder "3.6";
52
53 src = fetchPypi {
54 pname = "Twisted";
55 inherit version;
56 extension = "tar.gz";
57 hash = "sha256-5bYN458tHaFT++GHTYhf4/y9sh/MRG+nWaU+j8NRO+0=";
58 };
59
60 patches = [
61 (fetchpatch {
62 name = "fix-test_openFileDescriptors.patch";
63 url = "https://github.com/twisted/twisted/commit/47f47634940141466177261b20bb43c300531e38.patch";
64 hash = "sha256-wacnF166PnZHXJEqTlPZUdDILJIVHOcnC2a34SQumvs=";
65 })
66 ];
67
68 __darwinAllowLocalNetworking = true;
69
70 propagatedBuildInputs = [
71 attrs
72 automat
73 constantly
74 hyperlink
75 incremental
76 setuptools
77 typing-extensions
78 zope_interface
79 ];
80
81 postPatch = ''
82 echo 'ListingTests.test_localeIndependent.skip = "Timezone issue"'>> src/twisted/conch/test/test_cftp.py
83 echo 'ListingTests.test_newFile.skip = "Timezone issue"'>> src/twisted/conch/test/test_cftp.py
84 echo 'ListingTests.test_newSingleDigitDayOfMonth.skip = "Timezone issue"'>> src/twisted/conch/test/test_cftp.py
85 echo 'ListingTests.test_oldFile.skip = "Timezone issue"'>> src/twisted/conch/test/test_cftp.py
86 echo 'ListingTests.test_oldSingleDigitDayOfMonth.skip = "Timezone issue"'>> src/twisted/conch/test/test_cftp.py
87
88 echo 'UNIXTestsBuilder_AsyncioSelectorReactorTests.test_sendFileDescriptorTriggersPauseProducing.skip = "sendFileDescriptor producer was not paused"'>> src/twisted/internet/test/test_unix.py
89 echo 'UNIXTestsBuilder_SelectReactorTests.test_sendFileDescriptorTriggersPauseProducing.skip = "sendFileDescriptor producer was not paused"'>> src/twisted/internet/test/test_unix.py
90
91 echo 'FileObserverTests.test_getTimezoneOffsetEastOfUTC.skip = "mktime argument out of range"'>> src/twisted/test/test_log.py
92 echo 'FileObserverTests.test_getTimezoneOffsetWestOfUTC.skip = "mktime argument out of range"'>> src/twisted/test/test_log.py
93 echo 'FileObserverTests.test_getTimezoneOffsetWithoutDaylightSavingTime.skip = "tuple differs, values not"'>> src/twisted/test/test_log.py
94
95 echo 'MulticastTests.test_joinLeave.skip = "No such device"'>> src/twisted/test/test_udp.py
96 echo 'MulticastTests.test_loopback.skip = "No such device"'>> src/twisted/test/test_udp.py
97 echo 'MulticastTests.test_multicast.skip = "Reactor was unclean"'>> src/twisted/test/test_udp.py
98 echo 'MulticastTests.test_multiListen.skip = "No such device"'>> src/twisted/test/test_udp.py
99
100 # fails since migrating to libxcrypt
101 echo 'HelperTests.test_refuteCryptedPassword.skip = "OSError: Invalid argument"' >> src/twisted/conch/test/test_checkers.py
102
103 # not packaged
104 substituteInPlace src/twisted/test/test_failure.py \
105 --replace "from cython_test_exception_raiser import raiser # type: ignore[import]" "raiser = None"
106 '' + lib.optionalString stdenv.isLinux ''
107 echo 'PTYProcessTestsBuilder_EPollReactorTests.test_openFileDescriptors.skip = "invalid syntax"'>> src/twisted/internet/test/test_process.py
108 echo 'PTYProcessTestsBuilder_PollReactorTests.test_openFileDescriptors.skip = "invalid syntax"'>> src/twisted/internet/test/test_process.py
109 echo 'UNIXTestsBuilder_EPollReactorTests.test_sendFileDescriptorTriggersPauseProducing.skip = "sendFileDescriptor producer was not paused"'>> src/twisted/internet/test/test_unix.py
110 echo 'UNIXTestsBuilder_PollReactorTests.test_sendFileDescriptorTriggersPauseProducing.skip = "sendFileDescriptor producer was not paused"'>> src/twisted/internet/test/test_unix.py
111
112 # Patch t.p._inotify to point to libc. Without this,
113 # twisted.python.runtime.platform.supportsINotify() == False
114 substituteInPlace src/twisted/python/_inotify.py --replace \
115 "ctypes.util.find_library(\"c\")" "'${stdenv.cc.libc}/lib/libc.so.6'"
116 '' + lib.optionalString (stdenv.isAarch64 && stdenv.isDarwin) ''
117 echo 'AbortConnectionTests_AsyncioSelectorReactorTests.test_fullWriteBufferAfterByteExchange.skip = "Timeout after 120 seconds"' >> src/twisted/internet/test/test_tcp.py
118 echo 'AbortConnectionTests_AsyncioSelectorReactorTests.test_resumeProducingAbort.skip = "Timeout after 120 seconds"' >> src/twisted/internet/test/test_tcp.py
119 '';
120
121 # Generate Twisted's plug-in cache. Twisted users must do it as well. See
122 # http://twistedmatrix.com/documents/current/core/howto/plugin.html#auto3
123 # and http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=477103 for details.
124 postFixup = ''
125 $out/bin/twistd --help > /dev/null
126 '';
127
128 checkInputs = [
129 git
130 glibcLocales
131 pyhamcrest
132 ]
133 ++ passthru.optional-dependencies.conch
134 # not supported on aarch64-darwin: https://github.com/pyca/pyopenssl/issues/873
135 ++ lib.optionals (!(stdenv.isDarwin && stdenv.isAarch64)) passthru.optional-dependencies.tls;
136
137 checkPhase = ''
138 export SOURCE_DATE_EPOCH=315532800
139 export PATH=$out/bin:$PATH
140 # race conditions when running in paralell
141 ${python.interpreter} -m twisted.trial twisted
142 '';
143
144 passthru = {
145 optional-dependencies = rec {
146 conch = [ appdirs bcrypt cryptography pyasn1 ];
147 conch_nacl = conch ++ [ pynacl ];
148 contextvars = lib.optionals (pythonOlder "3.7") [ contextvars ];
149 http2 = [ h2 priority ];
150 serial = [ pyserial ];
151 tls = [ idna pyopenssl service-identity ];
152 };
153
154 tests = {
155 inherit
156 cassandra-driver
157 klein
158 magic-wormhole
159 scrapy
160 treq
161 txaio
162 txamqp
163 txrequests
164 txtorcon
165 thrift;
166 inherit (nixosTests) buildbot matrix-synapse;
167 };
168 };
169
170 meta = with lib; {
171 homepage = "https://github.com/twisted/twisted";
172 description = "Twisted, an event-driven networking engine written in Python";
173 longDescription = ''
174 Twisted is an event-driven networking engine written in Python
175 and licensed under the MIT license.
176 '';
177 license = licenses.mit;
178 maintainers = with maintainers; [ SuperSandro2000 ];
179 };
180}