I'm happy to report that I've just completed another two weeks of sponsored Twisted development. As usual, the issue tracker directed most of my work. I spent time on new development aimed at resolving tickets and I reviewed changes proposed by other developers with that aim.
All told, 59 tickets got some attention that they would not have received without the sponsored development. The result was 36 closed tickets and 17 other tickets unblocked for other developers to resume work on. Over the coming days or weeks a few more tickets will probably be resolved as a result of this work, as developers (including myself) respond to review feedback.
This work is made possible by the sponsorship of individuals and organizations which have donated to the Twisted project, part of the Software Freedom Conservancy, a not-for-profit organization that helps promote, improve, and develop open source software. Thanks!
Apart from working to resolve tickets in the issue tracker, I also did some work on infrastructure. I:
- cleaned up our BuildBot master configuration and published it
- implemented improved error reporting for our API documentation build automation
- converted the subversion repository for the Twisted website to bzr and made it public
- moved some Windows build infrastructure to a new host with better network connectivity to try to reduce spurious build failures
For more details about a ticket, see <http://tm.tl/NNNN>.
The tickets I reviewed, with tickets now closed in bold:
#78 - abortConnection() method for transports
#2674 - t.i.defer.inlineCallbacks documentation issues
#2675 - Test timeout policy should be decided by runner
#3077 - twistd --help plugin list isn't alphabetized
#3078 - Dynamic ZSH tab completion for any commands using t.p.usage
#3350 - make each peer register as a producer in portforward
#3453 - twisted.web._auth.digest mostly ignores the value of the uri field
#3896 - Passing a unicode object to request.write corrupts the entire response
#3926 - twisted.positioning -- a better positioning framework
#4159 - Add pre-exec hook to spawnProcess
#4519 - Delay parsing of request body until Request.args is accessed
#4751 - t.c.telnet.ITelnetProtocol.unhandledSubnegotiation doesn't reflect reality
#4849 - Add stream compression to twisted.words.jabber
#5024 - MSI buildbot patches version to avoid breaking distutils MSI builder, but does it in the wrong place
#5040 - twisted.web.template is lacking patterns
#5044 - Client documentation should use explicit buildProtocol()s rather than magic "protocol = MyProtocol" on factories
#5085 - Accept IPv6 address literals (with embedded scope ids) in IReactorTCP.connectTCP
#5139 - Replace usage of os.path.walk in favor of twisted.python.filepath.FilePath.walk
#5156 - no ambiguous antecedents (plugins documentation edition)
#5192 - 100-continue support for twisted.web.client.Agent
#5194 - log.msg can fail if someone removes an observer at the wrong time
#5250 - finger15.tac patch
#5252 - Manhole should support CTRL-A and CTRL-E for home/end
#5253 - Add support for input history persistence in twisted.conch.manhole
#5263 - add multipart/form-data support to twisted.web.client.Agent for easy form posts
#5267 - allow twisted.internet.ssl.[Private]Certificate (and friends) to be backed with TLSLite rather than pyOpenSSL
#5271 - trial test method timeout support is fragile
#5275 - t.w.template does not always properly escape comments
#5279 - pass mode to FilePath.createDirectory()
#5282 - ILogObserver, log.msg, log.err, and logging.html are insufficiently stern about log observer thread safety
#5283 - opt_user unused in manhole twistd plugin
#5285 - win32eventreactor misses disconnect events that happen too soon
#5286 - twisted.web.template documentation doesn't cover very basic use-case of rendering more than one of something
#5288 - twisted.web.template.Tag.fillSlots documentation doesn't mention it returns self
#5301 - test_tcp_internals.PlatformAssumptionsTestCase fails when we leak fds
#5312 - Create some release automation for building Sphinx documentation
And tickets I developed:
#581 - CopiedFailure.getTraceback should include the result of CopiedFailure.getErrorMessage even if unsafeTracebacks is not set
#745 - writeSequence not well-tested
#1946 - ErrorHolder is basically untested
#2838 - _dumbwin32proc.Process does not implement IProcessTransport completely
#4603 - names should handle unknown records
#4666 - t.i.task.Cooperator scheduler objects must return an IDelayedCall
#4671 - sometimes I want to have some constant values that are part of a set
#5040 - twisted.web.template is lacking patterns
#5062 - ProtocolWrapper masks the name of the wrapped protocol in the logs
#5075 - IntNStringReceiver copies too much data in dataReceived, causing AMP to be slow
#5140 - Deprecate twisted.scripts.tkunzip
#5158 - Installing on Pypy fails because of CPython-specific extension modules
#5233 - win32eventreactor doesn't notice TCP connection is lost in certain (hopefully rare) cases
#5237 - Add SFTP example
#5273 - Improve the API documentation for MultiService.addService to clarify its use in comparison to Service.setServiceParent
#5278 - When connecting with endpoints, the application factory used is neither started nor stopped, and irrelevant start/stop messages are logged instead
#5285 - win32eventreactor misses disconnect events that happen too soon
#5291 - twisted.trial TestCase should support assertDictEqual from Python 2.7 unittest
#5292 - Listening ports used with wrapping factories could log better start messages
#5293 - Remove mktap and corresponding twistd options (mktap is broken in trunk)
#5299 - udp.Port schedules connectionLost call in the global reactor
#5303 - Default transport implementation doesn't write out bytes immediately
#5304 - Win32Reactor.spawnProcess is redundant
#5308 - Make UDP ports identify themselves when stopping
#5316 - Incorrect API link in twisted.web.proxy.Proxy docstring