From 5f0efa39d9857aaaddf0ddb0031724310c514695 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Juge?= Date: Sun, 20 Feb 2022 14:11:40 +0100 Subject: [PATCH 1/4] Modify index to point to internal pages --- index.html | 24 ++++++++++++------------ index.rst | 20 ++++++++++++++++++++ 2 files changed, 32 insertions(+), 12 deletions(-) create mode 100644 index.rst diff --git a/index.html b/index.html index a37ebdb..e11bc12 100644 --- a/index.html +++ b/index.html @@ -30,7 +30,7 @@

Twisted

@@ -332,10 +332,10 @@

Community

Contribute

- Learn about the Twisted development process and how to contribute. + Learn about the Twisted development process and how to contribute.

- Help improve Twisted on Windows! + Help improve Twisted on Windows!

@@ -344,7 +344,7 @@

Contribute

Wiki

- Read about software using Twisted and their success stories. + Read about software using Twisted and their success stories.

@@ -353,7 +353,7 @@

Wiki

Sponsors

- Learn about the individuals and organisations that aid Twisted with donations of hardware, software, hosting and other things. + Learn about the individuals and organisations that aid Twisted with donations of hardware, software, hosting and other things.

@@ -362,7 +362,7 @@

Sponsors

Twisted Matrix Laboratories

- Find out what Twisted Matrix Laboratories is. + Find out what Twisted Matrix Laboratories is.

@@ -413,7 +413,7 @@

Follow us on Twitter

-

Report a security issue

+

Report a security issue

@@ -448,7 +448,7 @@

Join the tax-deductible. + tax-deductible.

@@ -511,10 +511,10 @@

Twisted Sponsors

- Participate in the Twisted Project Sponsorship Program! + Participate in the Twisted Project Sponsorship Program!

- For Silver Sidewinder and higher-level sponsors, we will display your logo here on the front page for one year. + For Silver Sidewinder and higher-level sponsors, we will display your logo here on the front page for one year.

diff --git a/index.rst b/index.rst new file mode 100644 index 0000000..598bd59 --- /dev/null +++ b/index.rst @@ -0,0 +1,20 @@ +.. Twisted documentation master file, created by + sphinx-quickstart on Sat Feb 19 17:21:47 2022. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to Twisted's documentation! +=================================== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` From 4f422bf6e536f01a471ad1eb15803b8575f9fdd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Juge?= Date: Sun, 20 Feb 2022 14:12:23 +0100 Subject: [PATCH 2/4] Add internal pages as RST --- content/pages/APIDocs.rst | 27 ++ content/pages/ArchivedNews.rst | 92 ++++ .../pages/BasicGuideToContributingCode.rst | 5 + content/pages/BranchPolicy.rst | 5 + content/pages/BugKeywords.rst | 10 + content/pages/CancellableDeferredUseCases.rst | 6 + content/pages/CodeReview.rst | 19 + content/pages/CommitterCheckList.rst | 46 ++ content/pages/CommunityCode.rst | 42 ++ content/pages/CompatibilityPolicy.rst | 5 + content/pages/ContributingToTwistedLabs.rst | 78 ++++ content/pages/ContributorAdvancementPath.rst | 47 ++ content/pages/DanielHenninger.rst | 15 + content/pages/Documentation/Documentation.rst | 52 +++ content/pages/Downloads.rst | 17 + content/pages/FrequentlyAskedQuestions.rst | 351 +++++++++++++++ content/pages/JonathanLange.rst | 5 + content/pages/ProjectsUsingTwisted.rst | 147 +++++++ content/pages/PythonAdvantage.rst | 13 + content/pages/ReviewProcess.rst | 276 ++++++++++++ content/pages/ReviewingDocumentation.rst | 63 +++ content/pages/Security.rst | 407 ++++++++++++++++++ content/pages/SuccessStories.rst | 275 ++++++++++++ content/pages/TSF/FoundingSponsors.rst | 71 +++ content/pages/TheTwistedShow.rst | 21 + content/pages/Twisted/TwistedAdvantage.rst | 50 +++ content/pages/Twisted/TwistedCommunity.rst | 45 ++ content/pages/Twisted/TwistedDevelopment.rst | 282 ++++++++++++ .../Twisted/TwistedMatrixLaboratories.rst | 83 ++++ content/pages/Twisted/TwistedProject.rst | 26 ++ .../Twisted/TwistedSoftwareFoundation.rst | 105 +++++ content/pages/Twisted/TwistedSponsors.rst | 38 ++ .../UltimateQualityDevelopmentSystem.rst | 174 ++++++++ content/pages/Users/index.rst | 2 + content/pages/WebDevelopmentWithTwisted.rst | 50 +++ content/pages/WhyShouldICare.rst | 29 ++ content/pages/WindowsBuilds.rst | 28 ++ 37 files changed, 3007 insertions(+) create mode 100644 content/pages/APIDocs.rst create mode 100644 content/pages/ArchivedNews.rst create mode 100644 content/pages/BasicGuideToContributingCode.rst create mode 100644 content/pages/BranchPolicy.rst create mode 100644 content/pages/BugKeywords.rst create mode 100644 content/pages/CancellableDeferredUseCases.rst create mode 100644 content/pages/CodeReview.rst create mode 100644 content/pages/CommitterCheckList.rst create mode 100644 content/pages/CommunityCode.rst create mode 100644 content/pages/CompatibilityPolicy.rst create mode 100644 content/pages/ContributingToTwistedLabs.rst create mode 100644 content/pages/ContributorAdvancementPath.rst create mode 100644 content/pages/DanielHenninger.rst create mode 100644 content/pages/Documentation/Documentation.rst create mode 100644 content/pages/Downloads.rst create mode 100644 content/pages/FrequentlyAskedQuestions.rst create mode 100644 content/pages/JonathanLange.rst create mode 100644 content/pages/ProjectsUsingTwisted.rst create mode 100644 content/pages/PythonAdvantage.rst create mode 100644 content/pages/ReviewProcess.rst create mode 100644 content/pages/ReviewingDocumentation.rst create mode 100644 content/pages/Security.rst create mode 100644 content/pages/SuccessStories.rst create mode 100644 content/pages/TSF/FoundingSponsors.rst create mode 100644 content/pages/TheTwistedShow.rst create mode 100644 content/pages/Twisted/TwistedAdvantage.rst create mode 100644 content/pages/Twisted/TwistedCommunity.rst create mode 100644 content/pages/Twisted/TwistedDevelopment.rst create mode 100644 content/pages/Twisted/TwistedMatrixLaboratories.rst create mode 100644 content/pages/Twisted/TwistedProject.rst create mode 100644 content/pages/Twisted/TwistedSoftwareFoundation.rst create mode 100644 content/pages/Twisted/TwistedSponsors.rst create mode 100644 content/pages/UltimateQualityDevelopmentSystem.rst create mode 100644 content/pages/Users/index.rst create mode 100644 content/pages/WebDevelopmentWithTwisted.rst create mode 100644 content/pages/WhyShouldICare.rst create mode 100644 content/pages/WindowsBuilds.rst diff --git a/content/pages/APIDocs.rst b/content/pages/APIDocs.rst new file mode 100644 index 0000000..653c5d3 --- /dev/null +++ b/content/pages/APIDocs.rst @@ -0,0 +1,27 @@ +Twisted API Documentation +######################### + + +This page describes how to generate the API docs for the Twisted web site. + +You will need the latest Twisted release unpacked and the latest version of pydoctor + +Steps +===== + +1. Modify template.tpl to include the Google Analytics JavaScript (which can be found in the source of any trac page). +2. Run an interactive Python session that goes something like this: + +.. code-block:: python + + >>> from twisted.python._release import APIBuilder + >>> from twisted.python.filepath import FilePath + >>> APIBuilder().build('Twisted', 'http://twistedmatrix.com/trac', + 'http://twistedmatrix.com/trac/browser/tags/releases/twisted-8.2.0', + FilePath('Twisted-8.2.0/twisted'), FilePath('apidocs')) + +Be sure to use the tag which corresponds to the version of Twisted the docs are being generated for. Note that if your working is the Twisted source directory you checked out, then ''that'' version of `APIBuilder` will be used! + +3. Upload the resulting ``apidocs`` directory to www-data@cube. Use ``tar cx apidocs | ssh www-data@twistedmatrix.com tar xv`` or something. +4. Put the apidocs directory into the appropriate location beneath vhosts/twistedmatrix.com/documents/ (eg 8.2.0/api) +5. If desired, update the ``current`` symlink. diff --git a/content/pages/ArchivedNews.rst b/content/pages/ArchivedNews.rst new file mode 100644 index 0000000..b718671 --- /dev/null +++ b/content/pages/ArchivedNews.rst @@ -0,0 +1,92 @@ +Twistery In the News +#################### + + +Twisted Announces Membership in the Software Freedom Conservancy (2008-03-16) +============================================================================= + +At PyCon 2008 we were delighted to share some good news with the Python community: the announcement of the `Twisted Software Foundation `_. Glyph had previously emailed the Twisted mail list, letting those close to the project know of this major event shortly after the paperwork was signed. Before we brought this before a more public audience, we wanted to give companies a chance to become "founding sponsors" -- and this is what has happened at PyCon. We're looking forward to issuing a formal press release about this (including info on the founding sponsors) and will have more details in the near future. + +We would like to send a special thank-you out to those sponsors who made contributions immediately. In order of contribution, they are: + +* Chris Armstrong +* Michel Pelletier +* AdytumSolutions, Inc. +* tummy.com +* Drew Perttula +* Glenn Tarbox +* Ilya Novoselov + +Read the initial announcement `here `_. If the video for the announcement made at PyCon gets published somewhere, we will post an update. + +The Twisted Show: Episode 2 (2008-02-26) +======================================== + +Yesterday, Duncan had the chance to talk with Jack Moffitt and Christopher Zorn of `Chesspark `_ about their company, their vision, and how Twisted played an integral role in their application and helped them to meet their goals. + +The interview is on `the site `_ and the feed is available `there `_. + +We're still experimenting with podcasting and feed enclosures, so please be patient with us! If you have any issues, the media files are available at `archive.org `_. + + +Twisted Matrix Laboratories Blog (2007-12-02) +============================================= + +TM Labs has a `new blog `_ ! We will be posting various items of interest that relate to development of Twisted, useful community information, and enthralling news events. Add us to your reader! + +Episode 1 of the "Twisted Show" (2007-01-22) +============================================ + +`The Twisted Show `_ is a new experiment we are trying at TM Labs in an effort to let people and business who are solving unique and/or interesting problems with Twisted share their solutions with a wide audience. + +This first installment is an interview with a few folks at `Renkoo `_ who are using Twisted to innovate meetings as part of the social media landscape. + +Twisted 2.5.0 (2007-01-11) +========================== + +Major Twisted release! Read the `release announcement `_ and click +on things on the `Downloads `_ page. + +New Twisted Site Goes Live! (2006-12-04) +======================================== + +Thanks to the efforts of the Twisted Team and the visual design and CSS skills of `Huw Wilkins `_, we have rolled out our latest version of the Twisted Matrix Labs web site. + +Enjoy! + +Apple Releases iCal Server Code (2006-08-07) +============================================ + +Apple's iCal Server is written in Twisted. Visit the `development site `_ to read more about the software and to get started with it now. + +Twisted 2.4.0 (2006-05-25) +========================== + +Including updates to Words, Web, Names, Mail, Conch, and more. See `TwistedProject `_. + +Twisted Sprint in Sydney (2006-05-19) +====================================== + +Twisted's Australian hackers are converging in Sydney on the June 3-4 weekend. If you are Australian and think you might be made of internet, find out more about the SydneySprint + +Twisted 2.2.0 (2006-02-12) +========================== + +Twisted 2.2.0 is out. See `TwistedProject `_. + +Twisted (core) 2.1.0 + First Virtual Sprint (2005-10-09) +======================================================== + +In Twisted's first virtual sprint the weekend of 2005-10-08, many people contributed to Twisted in general and helped get the Twisted 2.1.0 release out. See the Twisted project page and read about what's new. + +Australian Twisted Sprint 2005.2 (2005-08-07) +============================================= + +A Twisted Sprint will be held in Sydney Australia on the 19-21 August 2005. Topics will probably include documentation, a VFS layer (including WebDAV support), the new Axiom database, and whatever else anyone can think of. For more information, please see the Australian Twisted Sprint Wiki. + +Thanks to Linux Australia for funding this sprint. + +Twisted 2.0.1 NOW released (2005-05-25) +======================================= + +Twisted 2.0.1 is now out. This is a minor release, only including bugfixes since 2.0.0. One of the most important fixes was a bug causing many gtk GUI apps to crash. Twisted News is now properly included in the Sumo release. Enjoy. diff --git a/content/pages/BasicGuideToContributingCode.rst b/content/pages/BasicGuideToContributingCode.rst new file mode 100644 index 0000000..87fc40c --- /dev/null +++ b/content/pages/BasicGuideToContributingCode.rst @@ -0,0 +1,5 @@ +Basic Guide To Contributing Code +################################ + + +Please see `Contributing to Twisted Labs! `_ diff --git a/content/pages/BranchPolicy.rst b/content/pages/BranchPolicy.rst new file mode 100644 index 0000000..c1e0969 --- /dev/null +++ b/content/pages/BranchPolicy.rst @@ -0,0 +1,5 @@ +Branch Policy +############# + + +Please see `Ultimate Quality Development System! `_ diff --git a/content/pages/BugKeywords.rst b/content/pages/BugKeywords.rst new file mode 100644 index 0000000..1285d9a --- /dev/null +++ b/content/pages/BugKeywords.rst @@ -0,0 +1,10 @@ +Bug Keywords +############ + + +* **documentation** - bug is against the Twisted documentation +* **easy** - bug should be easy to fix and is a good ticket to start with if you want to get started contributing to Twisted +* **review** - bug is waiting for review +* **tests** - bugs against the Twisted unit test suite +* **upstream** - bug was submitted upstream and is waiting for them to resolve it +* **windows** - bug is against one of the Windows operating systems diff --git a/content/pages/CancellableDeferredUseCases.rst b/content/pages/CancellableDeferredUseCases.rst new file mode 100644 index 0000000..a69a4b8 --- /dev/null +++ b/content/pages/CancellableDeferredUseCases.rst @@ -0,0 +1,6 @@ +Cancellable Deferred Use Cases +############################## + + + +* ``twisted.web._newclient.Request.writeTo`` returns a ``Deferred`` which fires when the request has been completely written to the transport. If the connection is lost and a request is in the process of writing itself out, it should be told to stop. This could be done by canceling the ``Deferred`` returned by ``writeTo``. It is currently done by having a separate method on ``Request`` (requiring extra state tracking). diff --git a/content/pages/CodeReview.rst b/content/pages/CodeReview.rst new file mode 100644 index 0000000..6598579 --- /dev/null +++ b/content/pages/CodeReview.rst @@ -0,0 +1,19 @@ +Code Review +########### + + +Divmod uses code review for just about every change to any project. The exceptions to this are generally extremely new code which isn't seeing any use yet where the consequences of breaking things are minimal and don't outweigh the cost of developer time required by the review. + +Code review is a pretty simple process: at its heart, it is little more than reading some code written by someone else. Nevertheless, it can be useful to have a set of things on which to focus during a review: + +* Does the branch merge or the diff apply cleanly? +* Are there unit tests for the code being changed or added? +* Do the unit tests pass for you? +* Do the unit tests pass for buildbot? +* Is there documentation for new code? +* Where appropriate, has existing documentation been updated (including ChangeLog/NEWS files)? +* Does the code adhere to the coding style? + +There's the easy list. Most are mechanical checks. Don't feel bad about rejecting a branch if the answer to any of these questions is no: the problems may seem minor in isolation, but each contributes to overall poor code quality. Moreover, sometimes apparently minor problems can be hiding larger issues. + +Taking a look at the bigger picture can be a little bit harder, but it's just as important. diff --git a/content/pages/CommitterCheckList.rst b/content/pages/CommitterCheckList.rst new file mode 100644 index 0000000..dbeccc9 --- /dev/null +++ b/content/pages/CommitterCheckList.rst @@ -0,0 +1,46 @@ +Committer Checklist +################### + + + +These are things that developers with commit access to the Twisted source repository should know. The first list is of policy items (i.e., things you should or should not try to do). + +#. All development is done in branches. +#. All code committed to trunk must go through the `Review Process `_ . +#. trunk commit messages must follow the format described on `Review Process `_ so that various pieces of automation can work. +#. If you check in something that breaks `trunk `_ , revert it +#. Everything you check in to Git is licensed under `Twisted's license `_ +#. Be in the IRC channel, at least when you're going to be committing to trunk (don't feel bad about avoiding the distraction when you're trying to get stuff done though). +#. Have fun, but not too much. + +This second list includes various technical details about how you might go about doing Twisted development (and has overlap for organizational purposes): + +#. All development is done in branches + + #. Branch names must follow the naming convention so that various pieces of automation can work. + +#. trunk commit messages must follow the format described on `Review Process `_ so that various pieces of automation can work. + + #. If you check in something that breaks `trunk `_ , revert it + + #. If the bad revision was 07c854353d, + + #. ``cd ~/Projects/Twisted`` + #. ``git revert -m 1 07c854353d .`` + + #. Use "Reopens ticket:NNNN" in the commit message to re-open the corresponding ticket + #. Explain what broke and how and perhaps on which platform in the commit message + + #. If you need to re-merge the reverted branch, revert the reversion. + + #. Create a new branch or merge trunk into your branch with was previously reverted. + #. Revert again the commit containing the revert and commit the reversion: `git revert REVERT-SHA`. + #. Make your changes. + #. Push the changes for re-review + +#. If you are merging a branch into trunk, you must commit exactly the merge. You may not make extra changes in the trunk working copy after the merge. It's easiest to do this if you merge changes via the Github pull request UI. + +Other documents that overlap and supplement this information include: + +* `Working from Twisted's Code repository `_ +* `Review Process `_ diff --git a/content/pages/CommunityCode.rst b/content/pages/CommunityCode.rst new file mode 100644 index 0000000..e05d76e --- /dev/null +++ b/content/pages/CommunityCode.rst @@ -0,0 +1,42 @@ +Twisted Community Code +###################### + + +This wiki page is the home for information about projects to which we are collectively referring by the "super project" name "Twisted Community Code" (abbreviated "tx"). + +Motivation +========== + +This effort was a culmination of `this discussion `_ that occurred on the Twisted mail list (and expressed in condensed form `here `_). In summary, by creating a place where anyone can contribute whatever they want, we address the long-lamented barrier to entry for Twisted community members: + +#. what are often perceived as impossibly high standards, and +#. limitations on what projects are included in Twisted. + +The Twisted projects (Twisted Core, Twisted Web, Twisted Mail, etc.) are maintained with exacting standards, contributions to which are rigorously reviewed and held under the highest scrutiny for code quality. This places a heavy responsibility on the developer, one that may not be desired or enjoyed by all. Additionally, there are would-be contributors whose projects, though based on Twisted, were not accepted for inclusion in Twisted proper for various reasons. + +This seems to have been a good idea, as we've made a good start with three newly associated projects, even before announcing this initiative :-) + +Suggestions, Not Mandates +========================= + +We are making no proclamations about standards, adherences, etc.: community members are free to follow their own development practices, etc. We would like to encourage people to use the "tx" prefix for their projects, in the same way that "py" is used for general Python projects. For example, we would like the authors of "Twisted SNMP" and "Twisted Storage" to instead use something like "txSNMP" and "txStorage." We want the "Twisted" name to be reserved for projects that are part of Twisted proper. + +Leadership +========== + +In so much as an autonomous collective has leadership, Phil Christensen has kindly agreed to act as the point of contact for this community effort. He will maintain the community presence on Launchpad, send out announcements as necessary, and respond to inquiries, while at the same time receiving the full support of `the Labs' members `_. + +Launchpad +========= + +We are encouraging community members to use `Launchpad `_ to manage their Twisted code projects, or at the very least, mirror them. Doing so allows the project managers to assign the "tx" super project to their own, thus including them in the community of projects that use or depend on Twisted. + +The Launchpad super project site is here: + https://launchpad.net/tx + +To associate your Launchpad project with this super project, click the "Change details" link on your project overview page and type "tx" in the super project field. Your project should then show up in the list on the tx front page. + +Useful Info +=========== + +* `Bazaar with Subversion `_ diff --git a/content/pages/CompatibilityPolicy.rst b/content/pages/CompatibilityPolicy.rst new file mode 100644 index 0000000..f6f49f8 --- /dev/null +++ b/content/pages/CompatibilityPolicy.rst @@ -0,0 +1,5 @@ +Compatibility Policy +#################### + + +content moved here https://twistedmatrix.com/documents/current/core/development/policy/compatibility-policy.html diff --git a/content/pages/ContributingToTwistedLabs.rst b/content/pages/ContributingToTwistedLabs.rst new file mode 100644 index 0000000..3dcd18f --- /dev/null +++ b/content/pages/ContributingToTwistedLabs.rst @@ -0,0 +1,78 @@ +Contributing To Twisted +####################### + + +.. contents:: + +There are many ways individuals and organizations can make contributions to Twisted. + +Many open source projects are perpetually crunched for volunteer labor. Twisted is no different in this respect — we could always use more help from the community. However, we are lucky to have something that most projects don't: the ability to convert dollars directly into maintenance that benefits the project. + +When you contribute money to the Twisted project, you are directly contributing to get bugs fixed, features implemented, and tickets reviewed. +Donations are `tax-deductible `_ and can be made via `Google Checkout or Paypal `_ or directly to the `Twisted Software Foundation `_. + +Code Contributions +================== + +Overview +-------- + +* `Submitting a Patch `_, a simplified overview +* `Detailed Contribution Requirements `_, with that and more +* `Review Process `_, how contributed code is quality checked and reviewed +* `Checklist for Twisted committers `_, things that developers with commit access should know + + +Prepare +------- +* Get a GitHub account and then come back and `Login using GitHub `_ on this site + +* Intimately familiarize yourself with `The Ultimate Quality Development System `_ + +* Understand the `Developer docs `_ (how-tos, core docs, examples, API reference) + +* Twisted has a rigorous policy standards for code, documentation, and testing: + + * `Coding standard `_ + + * `Writing Style guide `_ + + * `Testing standard `_ + + * `Git Access `_ + +* Understand the `Review Process `_ code review process + +* Multiple CI services are used to automate the build process across platforms and test for breakage. Watch their feedback on each pull request page. + +Explore and Contribute +---------------------- + +* Examine some of the `sources `_ + +* Take a look at the `open tickets `_ open tickets + +* Learn the `bug keywords `_ + + * `'Easy' keyword tickets `_ are low-hanging fruit and good to get your feet wet + +* `Submit a Patch `_ + +* Learn how to apply for commit privileges with the `Contributor Advancement Path `_ + +Other Ways to Contribute +======================== + +* `Review and add documentation `_ +* `Code Reviews `_ +* Submit bug reports (you must first be `registered `_) +* Provide technical support (answer questions on `IRC and the mail lists `_) +* Sign up for a `project job `_. Help us maintain our build CI, speed center, Trac instance, and more. + +Wiki Portals +============ + +* `Infrastructure `_ +* `ContinuousIntegration `_ +* `users `_ +* `DocumentationAnalysis `_ diff --git a/content/pages/ContributorAdvancementPath.rst b/content/pages/ContributorAdvancementPath.rst new file mode 100644 index 0000000..f6e3dec --- /dev/null +++ b/content/pages/ContributorAdvancementPath.rst @@ -0,0 +1,47 @@ +How to Apply for Commit Privileges +################################## + + +To request commit privileges, please submit an application to commit@twistedmatrix.com (you must be logged in to trac in order to view this email address). The application should contain a list of 10 tickets, at least 5 of which are patches you've submitted, and at least 5 of which are code reviews you've done which have been accepted by a committer. At least 2 of your authored patches should have gone all of the way through the review process to be landed. Once you've sent in your application, a group of core contributors will review it and decide whether to grant you commit privileges. + +The following is an example application using some of glyph's commit history: + +.. code-block:: + + Hi Twisted committers, + + I would like to apply for commit privileges. My trac username is glyph. + + Code Reviews Performed + ---------------------- + 7176 - Use twisted.python.runtime in twisted.internet.serialport + 7485 - Porting t.w._newclient and t.w.t.test_newclient to Python 3 + 7624 - @inlineCallbacks ignores return values in Python3.3 and greater + 7684 - twisted.internet.endpoints._parseSSL defaults to SSLv23_METHOD, should default to None + 7702 - Remove twisted.application.internet.UDPClient. + + Patches Submitted + ----------------- + 4900 - twisted.web server sends responses without explicit Content-Type; potential XSS + 5572 - twisted.internet.tcp.Connector.getDestination has invalid epytext in it + 6751 - twisted.web._newclient.Response leaves its transport in an unpredictable state depending on how large the response body is + 7836 - LoopingCall.withCount countCallable called with 0 + 7878 - twisted.internet.process raises an exception when encoding tracebacks that occur post-fork/pre-exec and include non-ASCII characters + + Patches Accepted + ---------------- + 4900 - twisted.web server sends responses without explicit Content-Type; potential XSS + 5572 - twisted.internet.tcp.Connector.getDestination has invalid epytext in it + + Thanks! + +Directions for the Review Committee +=================================== + +The committee will use the following process when deciding to grant commit privileges: + +#. Once at least 1 committee member sponsors the application, other committers have 7 days to object to the application. + +#. If no objections are received within the 7 day period, any member of the committee may grant the applicant commit privileges. + +#. If the committee decides to grant privileges to the applicant, a committee member will make an announcement on the mailing list welcoming the new committer. If the application is denied, then the applicant will be notified privately and given an explanation. diff --git a/content/pages/DanielHenninger.rst b/content/pages/DanielHenninger.rst new file mode 100644 index 0000000..9342304 --- /dev/null +++ b/content/pages/DanielHenninger.rst @@ -0,0 +1,15 @@ +Daniel Henninger +################ + + +You probably know me more as Jadestorm than as Daniel Henninger. Either way, outside of work, I have a lot of active Jabber related projects that I am involved in. The "biggest" of them are: + +* PyAIMt (Python Jabber Transport for AIM) + +* PyICQt (Python Jabber Transport for ICQ) + +* JWGC (Jabber WindowGram Client) + +* Jabber Script Repository + +I am also the maintainer of the oscar functionality in Words, though I have not yet passed any code back to the project. (I have been working on it within PyICQt/PyAIMt, and will prep things to be returned to Twisted Words at some point in the hopefully near future) diff --git a/content/pages/Documentation/Documentation.rst b/content/pages/Documentation/Documentation.rst new file mode 100644 index 0000000..f340667 --- /dev/null +++ b/content/pages/Documentation/Documentation.rst @@ -0,0 +1,52 @@ +Documentation +############# + +:save_as: index.html + +.. _Start here: http://twistedmatrix.com/documents/current/core/howto/index.html +.. |Start here| replace:: **Start here** + +|Start here|_ , the developer guides for Twisted's core networking libraries. See also our many `examples `__ and the current `API reference `_. + +`Web Servers and Clients howtos `__ and `examples `__ . Want to use Twisted for **web development**? Please read `this page first! `_ + + +* Read our `FAQ `_. + +* Documentation for other Twisted components: + + * SSH Servers and Clients - `howtos `__ and `examples `__. + + * Email protocols: SMTP, IMAP, POP3 - `STMP client tutorial `_ and `examples `__. + + * DNS - `howtos `__ and `examples `__. + + * Instant messaging and IRC - `howtos `__ and `examples `__. + +* Twisted Core `man pages `_. + +* The complete developer guide in `PDF format `_. + + +Third Party Documentation +========================= + +Dave Peticolas has written a number of `excellent tutorials `_ on Twisted. They don't assume a lot of existing knowledge about networking or concurrency mechanisms, and as such are well-suited for new users. + +Developer Docs +============== + +* Want to contribute? We have a page dedicated to `documentation for contributors `_. +* Here are some notes about `Twisted Development `_. + +Mail Lists +========== + +* Search the `twisted `_ or `twisted-web `_ mail list archives. + +Books +===== + +* `Twisted Network Programming Essentials `_ by Abe Fettig & Jessica McKellar, published by O'Reilly. +* `Foundations of Python Network Programming `_ also covers the use of Twisted to some extent. +* `Game Programming With Python `_ covers Twisted in the chapters on programming networked games. diff --git a/content/pages/Downloads.rst b/content/pages/Downloads.rst new file mode 100644 index 0000000..9f31e07 --- /dev/null +++ b/content/pages/Downloads.rst @@ -0,0 +1,17 @@ +Downloads +######### + + +For more information about Twisted, please see the `Twisted Project `_ page. + +You can get the latest release from `PyPI Twisted `_ project page. + +You can get older releases from `PyPI archives `_ or `Twisted download site `_. + + +The recommended way is to run ``pip install Twisted``, preferably inside a virtualenv. + +If you are installing on macOS, ``pip install Twisted[macos_platform]`` will install the macOS-specific requirements. + +If you are installing on Windows, ``pip install Twisted[windows_platform]`` will install the Windows-specific requirements. + diff --git a/content/pages/FrequentlyAskedQuestions.rst b/content/pages/FrequentlyAskedQuestions.rst new file mode 100644 index 0000000..16160d7 --- /dev/null +++ b/content/pages/FrequentlyAskedQuestions.rst @@ -0,0 +1,351 @@ +Twisted FAQ +########### + + +This is a list of Frequently Asked Questions regarding Twisted. + +.. contents:: + + +General +======= + +What is Twisted? +---------------- + +See the `Twisted Project `_ + +Why should I use Twisted? +------------------------- + +See the `Twisted Advantage `_ + +I have a problem getting Twisted. +--------------------------------- + +Did you check the `Documentation HOWTO collection? `_ There are so many documents there that they might overwhelm you... try starting from the index, reading through the overviews and seeing if there seems to be a chapter which explains what you need to. You can try reading the PostScript or PDF formatted books, inside the distribution. And, remember, the source will be with you... always. + +How big is Twisted? +------------------- + +As of Twisted 15.4, the source release archive of Twisted is about 3MB. Installed normally, uncompressed, Twisted is a bit larger - about 12MB. + +Which parts of Twisted are stable? +---------------------------------- + +In general, everything which is part of a Twisted release is stable. See `CompatibilityPolicy `_ for details. + +Why doesn't Twisted follow PEP 8? +--------------------------------- + +Twisted does follow much of PEP 8 (as is documented in the `Twisted coding standard `_. However, Twisted prefers camelCase for variables, functions, and methods (whereas PEP 8 recommends underscores) because Twisted predates PEP 8 and converting the entire codebase now is infeasible. Twisted continues to use its existing naming convention for new APIs to retain consistency within the project (according to PEP 8's recommendation). + +Installation +============ + +Why am I getting ImportErrors for Twisted subpackages on my 64bit installation of RedHat/Fedora/CentOS? +-------------------------------------------------------------------------------------------------------- + +Red Hat and derived Linux distributions arrange to have certain Python libraries installed in ``/usr/lib/`` and other parts installed in ``/usr/lib64/`` This is problematic for Twisted, since it results in some of Twisted being installed in one directory and the rest installed in another. Python will load a package from only one directory. You can override this default behavior when you install Twisted by supplying the ``--install-lib`` parameter when running Twisted's ``setup.py``. + +Can I install Twisted using easy_install or pip? +------------------------------------------------ + +Yes, Twisted can be installed both using pip and easy_install, although pip is recommended. + +Core Twisted +============ + +Why does Twisted depend on Zope? +-------------------------------- + +Twisted only depends on `Zope Interface `_, an interface package which is also packaged and distributed independently from the main Zope distribution. Twisted uses Zope Interface to define and document APIs. Packages are available for all major operating systems. + +How can I access self.factory from my Protocol's __init__? +------------------------------------------------------------ + +You can't. A ``Protocol`` doesn't have a ``Factory`` when it is created. Instead, you should probably be doing that in your Protocol's ``connectionMade`` method. + +Similarly you shouldn't be doing real work, like connecting to databases, in a Factory's ``__init__`` either. Instead, do that in ``startFactory`` + +See `Writing Servers `_ and `Writing Clients `_ for more details. + +Where can I find out how to write Twisted servers? +-------------------------------------------------- + +Try `Writing Servers `_. + +How do I make Twisted talk to multiple clients / connect to multiple servers? +----------------------------------------------------------------------------- + +Twisted already does this. If you want to connect to multiple servers, call ``connectTCP`` (or similar) multiple times, and each call will result in a single outgoing connection. ``listenTCP`` will result in your factory (and therefore your protocol) being invoked for each incoming connection. + +Sometimes people ask this question when they write a function that calls ``connectTCP``, then ``reactor.run()``. You don't usually need to call ``reactor.run()`` yourself; let `twistd `_ (not "Twisted") do it. If you do need to call it yourself, call it *just once* after your initial setup. When ``reactor.run()`` exits, your program should too. + +How do I make input on one connection result in output on another? +------------------------------------------------------------------ + +This seems like it's a Twisted question, but actually it's a Python question. Each ``Protocol`` object represents one connection; you can call its ``transport.write`` to write some data to it. These are regular Python objects; you can put them into lists, dictionaries, or whatever other data structure is appropriate to your application. + +As a simple example, add a list to your factory, and in your protocol's ``connectionMade`` and ``connectionLost``, add it to and remove it from that list. Here's the Python code: + +.. code-block:: python + + from twisted.internet.protocol import Protocol, Factory + from twisted.internet import reactor + + class MultiEcho(Protocol): + def __init__(self, factory): + self.factory = factory + + def connectionMade(self): + self.factory.echoers.append(self) + + def dataReceived(self, data): + for echoer in self.factory.echoers: + echoer.transport.write(data) + + def connectionLost(self, reason): + self.factory.echoers.remove(self) + + + class MultiEchoFactory(Factory): + def __init__(self): + self.echoers = [] + + def buildProtocol(self, addr): + return MultiEcho(self) + + reactor.listenTCP(4321, MultiEchoFactory()) + reactor.run() + +Why is ``protocol.dataReceived`` called with only part of the data I called ``transport.write`` with? +----------------------------------------------------------------------------------------------------- + +TCP is a stream-oriented transport. This means that when you call ``transport.write``, the data may be broken up into arbitrarily-sized chunks for transmission over the network. There is no way for Twisted to determine how large the data originally written to the transport was. + +If you want to send a message and receive it whole on the other end of a connection, you must decide on a format for the message and parse it. For example, prefixing the message with a length or terminating it with a message boundary. Luckily, Twisted provides many different utilities for this purpose, which can automatically divide the data stream into messages for you: + +* `LineReceiver `_ +* `NetstringReceiver `_ +* `Int16StringReceiver `_ + +These are implemented as classes you inherit from rather than ``Protocol``, and implement methods other than ``dataReceived`` (such as ``stringReceived`` or ``lineReceived``). You may also want to consider a higher-level messaging protocol, to exchange messages with more structure than a simple collection of bytes. For example, the `Asynchronous Messaging Protocol `_, or `Perspective Broker `_. + +Why isn't my ``connectionLost`` method called? +---------------------------------------------- + +``connectionLost`` is called when the platform notifies Twisted that the TCP connection has been closed. TCP connections are closed in one of two ways. They can either be closed "actively" - by one side of the connection sending a close message to the other side - or they can be closed by timeout - one side deciding that the other side has taken too long to respond and interpreting this to mean that the other side is no longer paying attention to the connection. However, for the timeout case, it is important to understand that if an application is not sending data over the connection, **there is no response** to *take too long* so no timeout will ever occur. This means that if a network error disrupts a connection but the application is not sending data over it, it's possible for ``connectionLost`` to never be called. However, if the application is sending data over it, then the timeout will eventually expire. TCP uses very large timeouts in order to account for very poor networks. If you rely on TCP timeouts, expect as much as two hours (the precise amount is platform specific) to pass between when the disruption occurs and when ``connectionLost`` is called. If this is too long, you may want to use an application-level *keep alive* mechanism to discover lost connections earlier. This just involves sending simple messages back and forth over a connection. If it ever takes longer than whatever amount of time you decide is appropriate for your application to receive a response to one of these messages, consider the connection lost. + +Also, keep in mind that ``transport.loseConnection()`` may not result in the connection closing immediately, e.g. if you have writes buffered. To close the connection immediately, discarding any buffered writes, call ``transport.abortConnection()``. + +When I try to install my reactor, I get errors about a reactor already being installed. What gives? +--------------------------------------------------------------------------------------------------- + +Here's the rule - installing a reactor should always be the **first** thing you do, and I do mean first. Importing other stuff before you install the reactor can break your code. + +`Tkinter `_ and `wxPython `_ support, as they do not install a new reactor, can be done at any point, IIRC. + +``twistd`` won't load my ``tap`` file! What's this Ephemeral nonsense? +---------------------------------------------------------------------- + +When the pickled application state cannot be loaded for some reason, it is common to get a rather opaque error like so: + +.. code-block:: console + + % twistd -f test2.tap + + Failed to load application: global name 'initRun' is not defined + + +The rest of the error will try to explain how to solve this problem, but a short comment first: this error is indeed terse -- but there is probably more data available elsewhere -- namely, the ``twistd.log`` file. Open it up to see the full exception. + +The error might also look like this: + +.. code-block:: console + + Failed to load application: is not safe for unpickling + +To load a ``.tap`` file, as with any unpickling operation, all the classes used by all the objects inside it must be accessible at the time of the reload. This may require the ``PYTHONPATH`` variable to have the same directories as were available when the application was first pickled. + +A common problem occurs in single-file programs which define a few classes, then create instances of those classes for use in a server of some sort. If the class is used directly, the name of the class will be recorded in the ``.tap`` file as something like ``__main__.MyProtocol``. When the application is reloaded, it will look for the class definition in ``__main__`` which probably won't have it. The unpickling routines need to know the module name, and therefore the source file, from which the class definition can be loaded. + +The way to fix this is to import the class from the same source file that defines it: if your source file is called ``myprogram.py`` and defines a class called ``MyProtocol`` you will need to do a ``from myprogram import MyProtocol`` before (and in the same namespace as) the code that references the ``MyProtocol`` class. This makes it important to write the module cleanly: doing an ``import myprogram`` should only define classes, and should not cause any other subroutines to get run. All the code that builds the Application and saves it out to a .tap file must be inside an ``if __name__ == '__main__'`` clause to make sure it is not run twice (or more). + +When you import the class from the module using an external name, that name will be recorded in the pickled ``.tap`` file. When the ``.tap`` is reloaded by ``twistd`` it will look for ``myprogram.py`` to provide the definition of ``MyProtocol``. + +Here is a short example of this technique: + +.. code-block:: console + + # file dummy.py + from twisted.internet import protocol + class Dummy(protocol.Protocol): pass + if __name__ == '__main__': + from twisted.application import service, internet + a = service.Application("dummy") + import dummy + f = protocol.Factory() + f.protocol = dummy.Dummy # Note! Not "Dummy" + internet.TCPServer(2000, f).setServiceParent(a) + a.save() + +I get Interrupted system call errors when I use os.popen2. How do I read results from a sub-process in Twisted? +--------------------------------------------------------------------------------------------------------------- + +You should be using ``reactor.spawnProcess`` (see `interfaces.IReactorProcess.spawnProcess `_ There's also a convenience function, `getProcessOutput `_, in `twisted.internet.utils `_. + +Why don't my spawnProcess programs see my environment variables? +---------------------------------------------------------------- + +`spawnProcess `_ defaults to clearing the environment of child processes as a security feature. You can either provide a dictionary with exactly the name-value pairs you want the child to use, or you can simply pass in ``os.environ`` to inherit the complete environment. + +My exceptions and tracebacks aren't getting printed! Or My Deferred or DeferredList seems like it never fires, so my program just mysteriously hangs! What's wrong? +-------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +It really depends on what your program is doing, but the most common cause is this: it is firing -- but it's an error, not a success, and you have forgotten to add an `errback `_ , so it looks like nothing happens. Always add errbacks! + +The reason ``Deferred`` can't automatically show your errors is because a ``Deferred`` can still have callbacks and errbacks added to it even after a result is available -- so we have no reasonable place to put a logging call that wouldn't result in spurious tracebacks that are handled later on. When a deferred is garbage collected with a Failure, a traceback is automatically printed. However, if you keep a reference to your Deferred and it is never garbage collected, it's possible no traceback will be printed. But in that case, you also have a memory leak. + +For even more verbose debugging information to be printed in Failure tracebacks, set ``defer.setDebugging(True)``. + +Why does it take a long time for data I send with ``transport.write`` to arrive at the other side of the connection? +-------------------------------------------------------------------------------------------------------------------- + +Twisted TCP, UDP, and SSL transports don't buffer data before sending it. When you write data to a connection, it should show up on the other side as quickly as the network is capable of transporting it there. However, a couple things may prevent this from happening: + +* Twisted can only send data after you give up control of execution to the reactor. For example, if you have an infinite loop writing data to a transport, the data will never actually be sent since control will never leave your code and return to the reactor. +* Twisted APIs are largely not threadsafe. If you call ``transport.write`` from a thread other than the reactor thread, the behavior is undefined. This may manifest as very long delivery times, or deliveries that don't succeed until another unrelated event occurs in the system. To use Twisted APIs from a non-reactor thread, see the documentation for ``reactor.callFromThread``. + +If your program appears to send messages as expected, it might be possible that the sending program is working as expected but the receiving program is buffering the messages. Eg: your messages are buffered by a web browser, and you don't close your message. Use telnet instead. Especially as a beginner, never forget that you can only see messages indirectly through the eyes of another program. Check your receiving program! + +How do I use Deferreds to make my blocking code non-blocking? +------------------------------------------------------------- + +You don't. Deferreds don't magically turn a blocking function call into a non-blocking one. A Deferred is just a simple object that represents a deferred result, with methods to allow convenient adding of callbacks. (This is a common misunderstanding; suggestions on how to make this clearer in the `Deferred Execution `_ howto are welcome!) + +If you have blocking code that you want to use non-blockingly in Twisted, either rewrite it to be non-blocking, or run it in a thread. There is a convenience function, `deferToThread `_, to help you with the threaded approach -- but be sure to read `Using Threads in Twisted `_. + +I get ``exceptions.ValueError: signal only works in main thread`` when I try to run my Twisted program! What's wrong? +--------------------------------------------------------------------------------------------------------------------- + +The default reactor, by default, will install signal handlers to catch events like Ctrl-C, ``SIGTERM`` and so on. However, you can't install signal handlers from non-main threads in Python, which means that ``reactor.run()`` will cause an error. Pass the ``installSignalHandlers=0`` keyword argument to ``reactor.run`` to work around this. + +I'm trying to stop my program with sys.exit(), but Twisted seems to catch it! How do I exit my program? +------------------------------------------------------------------------------------------------------- + +Use ``reactor.stop()`` instead. This will cleanly shutdown the reactor. + +How do I find out the IP address of the other end of my connection? +------------------------------------------------------------------- + +The ``.transport`` object (which implements the `ITransport `_ interface) offers a pair of methods named `getPeer `_ and `getHost `_. ``getPeer`` will give you a tuple that describes the address of the system at the other end of the connection. For example: + +.. code-block:: python + + class MyProtocol(protocol.Protocol): + def connectionMade(self): + print "connection from", self.transport.getPeer() + +Why don't Twisted's network methods support Unicode objects as well as strings? +------------------------------------------------------------------------------- + +In general, such methods (e.g. `FileDescriptor `_ 's write) are designed to send bytes over the network. These methods use non-Unicode string objects as a container for the bytes that they send and receive. + +Unicode objects are not byte-based and are an abstraction used for representing strings of human readable text. In order to send Unicode strings using these methods, you should explicitly specify a byte-based encoding for them, for example: ``s.encode("utf-8")`` and explicitly decode them at the receiving end. + +Twisted cannot choose an encoding for you at this level: your encoding choice will be protocol specific and may need to be specified in the message you send (for example, HTTP headers include a encoding specification). + +For a more complete discussion of the distinction between Unicode strings and specific encodings of Unicode strings, see the following articles: + +* Glyph's `Implicit encoding is bad example `_ +* Dan Sugalski's `What the heck is: A string; `_ +* Joel Spolsky's `The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) `_. + +Why do I get a *Permission denied* error trying to write `.../site-packages/twisted/plugins/dropin.cache.new` when I use ``twistd`` or ``trial`` or some other Twisted program? +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Twisted's plugin system uses certain cache files to improve performance. These cache files are automatically updated as necessary. However, when a Twisted installation is used by processes without write permission to it (as is commonly the case for a site-wide installation), if this cache file is not up to date, attempts to rewrite it will result in this error. The solution is for the administrator (whoever performed the site install) to generate the cache. See the `Plugin Caching `_ section of the plugin documentation for details on how to regenerate this cache. + +Why can't the Twisted's reactor be restarted? +--------------------------------------------- + +There is no interesting reason. This is mainly a limitation of the current implementation, and a lack of interest on this particular feature. It's just a matter of someone spending the time on it. + +What's the best way of integrating Twisted with pygame? +------------------------------------------------------- + +Take a look at `game `_ to see an example of the world's best practice for integrating pygame and Twisted. + +Perspective Broker +================== + +How can I get the reference to a client from a Perspective? +----------------------------------------------------------- + +Firstly, the client must send a reference when it connects to the perspective broker. This can be done by passing the reference as a parameter to `pb.connect `_. + +At the server end, you must override the `Perspective.attach `_, which is called when a client attaches to a perspective. The first argument of this method is a remote reference to the client object that was passed to `pb.connect `_. + +Note that a single perspective can have many attached clients. For further information, see `Managing Clients of Perspectives `_ HOWTO and the `twisted.spread.pb `_ API docs. + +Requests and Contributing +========================= + +Twisted is cool, but I need to add more functionality. +------------------------------------------------------ + +Great! Read `our docs `_, and if you're feeling generous, contribute patches. + +I have a patch. How do I maximize the chances the Twisted developers will include it? +------------------------------------------------------------------------------------- + +There are several steps you can take to increase the chances of inclusion into Twisted: + +#. Be sure you have read and are familiar with the information and linked material `here `__ and `here `_. +#. `Open a ticket `_ for the feature you wish to add. +#. Get feedback from others on your ideas and thoughts. +#. Write ``trial`` tests for your code! +#. When providing a patch, use unified ``diff`` Either use ``svn diff`` or, better yet, make a clean checkout and use ``diff -urN`` between them. Make sure your patch applies cleanly. +#. If you post the patch to the mailing list, make sure it is inlined and without any word wrapping. + +And to whom do I send it? +------------------------- + +`Open a ticket `_ , and if it's an urgent or important issue you may want to tell the `mailing list `_ about the issue you added. + +My company would love to use Twisted, but it's missing feature X, can you implement it? +--------------------------------------------------------------------------------------- + +You have 3 options: + +#. Pay one of the Twisted developers to implement the feature. +#. Implement the feature yourself. +#. Add a feature request to our bug tracker. We will try to implement the feature, but there are no guarantees when and if this will happen. + +Documentation +============= + +Twisted really needs documentation for X, Y or Z - how come it's not documented?. +--------------------------------------------------------------------------------- + +Twisted's documentation is a work in progress, and one that we would appreciate assistance with. If you notice a gap or flaw in the documentation, please file a bug in the `Twisted Issue tracker `_ and mark it as having topic 'documentation'. Patches appreciated. Unit tests even more so. + +Communicating with us +===================== + +There's a bug in Twisted. Where do I report it? +----------------------------------------------- + +Unless it is a show-stopper bug, we usually won't roll out a new release with a fix it if it's already fixed in `Git `_, so check if it is fixed there. If it is not fixed in Git, you should add it to the `issue tracker `_, including pertinent information about the bug (hopefully as much information needed to reproduce it: OS, Git versions of any important files, Python version, code you wrote or things you did to trigger the bug, etc. If the bug appears to be severe, you should also raise it on the `mailing list `_, with a pointer to the issue already filed in the bug tracker. + +Where do I go for help? +----------------------- + +Ask for help `where the Twisted team hangs out `_. + +How do I e-mail a Twisted developer? +------------------------------------ + +First, note that in many cases this is the wrong thing to do: if you have a question about a part of Twisted, it's usually better to e-mail the mailing list. However, the preferred e-mail addresses for all Twisted developers are listed in the CREDITS file in the Subversion repository. diff --git a/content/pages/JonathanLange.rst b/content/pages/JonathanLange.rst new file mode 100644 index 0000000..c1ed547 --- /dev/null +++ b/content/pages/JonathanLange.rst @@ -0,0 +1,5 @@ +Jonathan Lange +############## + + +Maintainer of Trial. diff --git a/content/pages/ProjectsUsingTwisted.rst b/content/pages/ProjectsUsingTwisted.rst new file mode 100644 index 0000000..5a9b1a6 --- /dev/null +++ b/content/pages/ProjectsUsingTwisted.rst @@ -0,0 +1,147 @@ +Projects Using Twisted +###################### + + +Twisted is used by many open-source, academic and commercial projects. + +**Got a successful project you'd like added to this page?** Mail a brief description and an URL (if appropriate) to success at twistedmatrix dot com! + +Community Code Project +====================== + +`Twisted Community Code `_ - This is a `super project `_ hosting or mirroring many Twisted add-ons, Twisted-based libraries, etc., that are not part of the Twisted Project proper, but depend upon it. + +Libraries and Add-Ons +===================== + + * `Ampoule `_ - Ampoule is a process pool implementation written on top of Twisted Matrix. Its name comes from the use of AMP as the default communication protocol between the pool and all its children. + * `BEEPy `_ - BEEP protocol implementation for Python. + * `Corotwine `_ - Coroutine-based APIs for Twisted. Corotwine lets you use Twisted with a blocking API. + * `foolscap `_ - A Python library that implements object-capability style secure remote objects. + * `Ldaptor `_ - LDAP protocol implementation and utilities. + * `M.U.T.A.N.T `_ - A library for doing test-driven GTK user-interfaces for Twisted programs. + * `Paisley `_ - Paisley is a CouchDB client written in Python to be used within a Twisted application. + * `PyAMF `_ - Python support for the `AMF Format `_, used for RPC communication with Adobe's Flash Player + * `PyOSD `_ - module for displaying text on your X display, much like the "On Screen Displays" used on TVs and some monitors. + * `pyrad `_ - A RADIUS client/server implementation with a Twisted wrapper. + * `python-tvi955 `_ - Python-TVI955 is a partial implementation of the TVI955 terminal. It includes a parser for the computer to terminal ("server to client") protocol and an in-memory terminal emulator. + * `Qt4 Reactor `_ - Integration of Twisted and Qt4 + * `sAsync `_ - SQLAlchemy done Asynchronously. + * `RTMPy `_ - Implementation of the `RTMP Protocol `_, used for audio/video/data streaming to Adobe's Flash Player + * `Scrapy `_ - a screen scraping and web crawling framework, used to crawl websites and extract structured data from their pages. + * `Synchronous Deferred `_ - Synchronous Deferred is for authors of libraries who want to support both synchronous and asynchronous APIs. + * `TLS Lite `_ - Python TLS/SSL implementation. + * `Torc `_ - An implementation of Orc, a language for orchestrating distributed services, for the Twisted networking framework. + * `treq `_ - Python requests like API built on top of Twisted's HTTP client. + * `TwistedCronService `_ - Provides an interface for describing recurring events to be run according to a cron-like schedule. + * `TwistedSNMP `_ - PySNMP integration for Twisted. + * `twisted-x11 `_ - Experimental low-level implementation of the X11 protocol on top of twisted. This is pure python, it does not wrap libxcb or libX11. This means it does not integrate with existing libraries. It uses the xml protocol definitions from xcb, so it is pretty complete. + * `Twotp `_ - Twotp is an implementation of the Erlang node protocol written in Python using the Twisted networking engine. It makes possible to run an Erlang node in Python, like the Jinterface library of Erlang allows to do in Java. You can then call methods on an Erlang node or receive method calls. + * `txmemcache `_ - Multi-Client and Hashing utilities on top of twisted.protocols.memcache. + * `txAMQP `_ - Python library for communicating with AMQP peers and brokers using Twisted (RabbitMQ, Qpid, OpenAMQ). It also includes support for using Thrift RPC over AMQP in Twisted applications. + * `txAWS `_ - Twisted-based Asynchronous Libraries for Amazon Web Services and Eucalyptus private clouds. + * `txCobalt `_ - An async, Twisted-based Python library for Bluetooth communications. + * `txcomputegrid `_ - Twisted based compute grid. + * `txCumulus `_ - The goal of txCumulus is to provide an abstraction layer on top of other Twisted-based (Python) async cloud APIs such as txAWS and txRackspace (and possibly txComputeGrid). + * `txdnspython `_ - txdnspython is a way to use dnspython to create and manipulate DNS messages and then send those messages over the network using Twisted's asynchronous networking. + * `txEvolver `_ - txEvolver is a Twisted-based set of libraries for performing calculations of genetic algorithms as well as genetic programs in an asynchronous, distributed manner. + * `txFigleafTrial `_ - Allows you to use figleaf to generate code coverage reports with twisted.trial. + * `txFluidDB `_ - Bindings for the `FluidDB `_ HTTP interface. + * `txGenshi `_ - This project provides a small Twisted/Nevow package for running Genshi templates in the Twisted web framework, Nevow. + * `txGraylog `_ - txGraylog is a Twisted-based client for Graylog servers. It supports multiple interfaces to send log messages to the server including: TCP and UDP (using either plain text or the Gelf protocol) + * `txJSON-RPC `_ - This is the project page for creating Python JSON-RPC servers and clients using the Twisted Networking Engine. + * `txM `_ - Twisted for microcontrollers. txM aims to provide the Twisted asynchronous network programming idiom for solid-state devices without operating systems via the Python-on-a-chip Python VM. + * `txMailServer `_ - This project provides a starter mail server written using Twisted. + * `txNetTools `_ - Ping, traceroute, icmp, etc., implemented in Twisted, and a library for those who want to build their own network tools. + * `txNetFlow `_ - !NetFlow and IPFIX protocol, client, and server support in Twisted. + * `txProtoBuf `_ - Protocol buffers (http://code.google.com/p/protobuf/) RPC implemented using Twisted. + * `txRackspace `_ - An async, Twisted Python API for Rackspace Cloud. + * `txRDQ `_ - Provides a !ResizableDispatchQueue class that gives you a queue to dispatch jobs and a pool of in-progress tasks. This is a combination of a Twisted defer.DeferredQueue and a task.Cooperator. + * `txRedis `_ - A Redis client library for Twisted Python. + * `txRemoteDeploy `_ - Remote deployment for Twisted applications. + * `txSimpleDB `_ - Twisted support for Amazon's SimpleDB with the ability to develop/test against a local SimpleDB instance. + * `txSmug `_ - A Twisted wrapper for !SmugMug's API. + * `txSpore `_ - An asynchronous Spore Python API using Twisted. + * `txsshserver `_ - Extends Twisted's SSH server with some useful features for hosting Bazaar branches. Much of this code could & should be rolled back into Twisted. The project provides a playground for experimenting with new extensions, a holding area for the extensions we've already written, and a home for the things that don't really belong in Twisted. + * `txStomp `_ - txStomp is a Twisted implementation of the open protocol Stomp and allows for Twisted applications to be integrated in environments (e.g., ones that use ActiveMQ) that depend on this technology. + * `txULS `_ - Twisted Python experiments and prototyping for ultra large-scale systems. + * `txXCP `_ - This project is focused on developing an open source, Twisted-based version of Jabber XCP. + * `Wokkel `_ - Wokkel is collection of enhancements on top of the Twisted networking framework, written in Python. It mostly provides a testing ground for enhancements to the Jabber/XMPP protocol implementation as found in Twisted Words, that are meant to eventually move there. + +Applications +============ + * `apt-proxy2 `_ - caching proxy for Debian apt-get clients. + * `BuildBot `_ - a distributed building/testing framework. + * `CIA Bot `_ - notification system, used by many projects for source code checkin notification. + * `Crow's Nest `_ - collect log information from various sources and to apply some filter to them in a very modular way. + * `CVSToys `_ - CVS change notification via email, IRC and HTTP. + * `Quotient `_ - multi-protocol messaging server with tools for information management and retrieval, including a mail server (SMTP/POP3/IMAP/webmail) and much more. + * `DocmaServer `_ - batch processing server that does Word <-> XML conversion. + * `dohop.com `_ - a flight planning web site which searches many other flight databases. + * `Downpour `_ - a web-based !BitTorrent client. + * `Freevo `_ - open-source home theatre and PVR PC platform. + * `Flumotion `_ - a streaming media server. + * `Gridspy `_ - live power monitoring and analysis + * `hellanzb `_ - an application designed for \*nix environments that retrieves and processes Usenet nzb files. + * `Hep `_ - Message routing super-server. + * `Howie the Chatterbot `_ - a conversational AI. + * `Informant `_ - GNOME Panel applet for event notification. + * `Itaka `_ - an on-demand screen capture server + * `Jasmin `_ - Open source SMS gateway + * `Khashmir `_ - distributed hash table. + * `Landscape Client `_ - the Ubuntu system management agent that communicates with the Canonical Landscape management service. + * `Launchpad `_ - Cross-project collaboration for the Open Source world + * `Lunch `_ - Simple process launcher for complex distributed setup + * `MaxJax `_ - a solution for real-time web based control of any open sound control enabled sound synthesis engine. + * `msn-gateway `_ - an msn messenger gateway for mobile phones using email and web access. + * `NXLucene `_ - a standalone multi-threaded Lucene-based text indexing server. + * `Palaver `_ - multi-user chat for Jabber. + * `PETMail `_ - permission based anti-spam replacement for SMTP. + * `Pgkbot `_ - a bot for monitoring mediawiki changes. + * `Poetry `_ - Poetry is a collection of simple command line tools for working with XMPP services. It aims to provide a set of tools similar to tools like dig, curl, and man, but for interacting, configuring, and querying XMPP services. + * `Purity `_ - Python library for Pure Data dynamic patching to create audio patches. + * `pymon `_ - pymon is an open source network and process monitoring solution implemented in Twisted. Both the user interface and the software configuration are designed to be easily and rapidly deployed, saving on time and overhead often associated with other monitoring solutions. + * `Pynfo `_ - extendable multi-function IRC bot. + * `PySMS `_ - This is a Short Message Server written in python. It provides the possibility to take Messages inserted into a Database and send them over a supported protocols (currently only UCP/EMI) to a SMS Provider. + * `PythonDirector `_ - load balancing for web servers. + * `pyvncviewer `_ - a simple VNC viewer implemented in Python. + * `RdbHost `_ - !RdbHost uses Twisted for a streaming web-server. The streaming server allows users to stream large SQL 'dump' files to and from the database host using a web browser. + * `Scenic `_ - Telepresence software for wide bandwidth networks and oriented toward live performances + * `SFTPGateway `_ - SFTP to FTP gateway, allowing secure access to FTP servers. + * `Shtoom `_ - a RTP/SIP VoIP phone. + * `Solipsis `_ - a pure peer-to-peer system for a massively shared virtual world. + * `svs `_ - a framework for supporting collaborative projects that combine coding with other media. + * `Tahoe-LAFS `_ - a secure, decentralized, fault-tolerant filesystem. + * `Toonloop `_ - Software suite for performing with live frame by frame animation creation + * `TouRSSt `_ - RSS delivery system. + * `Turtl `_ - HTTP proxy whose purpose is to throttle connections to specific hostnames to avoid breaking terms of usage of those API providers (like del.icio.us, technorati and so on). + * `txLoadBalancer `_ - This is a fork of Anthony Baxter's !PythonDirector. It removes all threading and asyncore code, replacing the admin UI and the remaining threading loops with the Twisted-based analogs. It also aims to provide a developer API for those who wish to provide load-balancing services from within their Twisted applications. + * `txOpenID `_ - A Twisted OpenID server. txOpenID is an implementation of the OpenID Identity Provider specification, written using Twisted Web and Divmod's Nevow. + * `Upstage `_ - a "cyberperformance" chat system. + * `Various Libraries `_ - pcap, SNMP integration, RSS to NNTP gateway, and other programs. + * WinDictator - Dictate in the MS Windows OS, have the text typed in Linux via X faked keystroke events. + * `Zenoss `_ - open source network/systems monitoring and management + +Games +===== + * `OGC `_ - MUD client. + * `Go Siege `_ - multiplayer Go game. + * `Beyond 2 `_ - high level framework for assembling, animating, and interacting with 3D virtual environments. + * `txSpace `_ - a pseudo-MUD engine. + * `GalaxyMage `_ - a cross-platform, open-source tactical RPG with online multiplayer play. + * `OpenRTS `_ - an open source real-time strategy game with multiplayer and scenario games. + * `PyScrabble `_ - an online, multiplayer Scrabble game. + * `Poker3d `_ - a 3d poker game server and client. + * `Buyasta `_ - a MUD engine. + * `London Law `_ - an online multiplayer adaptation of the classic Scotland Yard board game. + * `Castle Combat `_ - a multiplayer game designed after the arcade game "Rampart" + +Research Projects +================= + + * `LabRAD `_ is an RPC system designed for use in scientific research labs, presently in use by `more than a dozen academic and industrial labs `_ around the world. + * `Tycoon @ HP Labs `_ is a market-based system for managing compute resources in distributed clusters. + * `pyGridWare @ Lawrence Berkeley National Labs `_ is a Python implementation of the WS-Resource framework. It includes support for WS-Addressing, WS-Notification, WS-Lifetime management, and WS-Security. + * `VIFF @ University of Aarhus, Denmark `_ is an open source Python library for implementing secure multi-party computation. + * Dharma @ UPenn: Distributed Home Agent for Robust Mobile Access. + * PySense @ MIT is an open source python library devoted to first person sensing for robots and wearables. diff --git a/content/pages/PythonAdvantage.rst b/content/pages/PythonAdvantage.rst new file mode 100644 index 0000000..b28a255 --- /dev/null +++ b/content/pages/PythonAdvantage.rst @@ -0,0 +1,13 @@ +The Python Advantage +#################### + + +According to `the web site for it `_ , which has a pretty good chance of being correct... + + Python is an interpreted, interactive, object-oriented programming language. It incorporates modules, exceptions, dynamic typing, very high level dynamic data types, and classes. Python combines remarkable power with very clear syntax. It has interfaces to many system calls and libraries, as well as to various window systems, and is extensible in C or C++. It is also usable as an extension language for applications that need a programmable interface. Finally, Python is portable: it runs on many brands of UNIX, on the Mac, and on PCs under MS-DOS, Windows, Windows NT, and OS/2. + +The advantages of using Python are too many and varied to cover them all here, and if you don't already know about it, I highly encourage you to go to the site and read about them. + +However, the chief advantage of using Python for Twisted's development is that it has enabled us to keep the code incredibly small. Python's high-level features let us express very concisely the intent of almost all of the Twisted codebase. Less code means less bugs, which means a more stable server infrastructure for you. + +All of the developers we recommend for Twisted consulting are extremely well-versed in Python. diff --git a/content/pages/ReviewProcess.rst b/content/pages/ReviewProcess.rst new file mode 100644 index 0000000..3ad5861 --- /dev/null +++ b/content/pages/ReviewProcess.rst @@ -0,0 +1,276 @@ +Twisted Code Review Process +########################### + + +`Contribute `_ > `Development `_ > Review Process + +.. contents:: + +All commits to Twisted's trunk must follow this review process. The only exception is for the `Twisted Quotes `_ file. There are no other exceptions! + +Both authors and reviewers should be intimately familiar with all requirements on this page. + +Authors: Before you get started +=============================== + +For the most part, we'd love for you to jump right in and start writing code! The code review process should catch any serious problems with your contribution, and the continuous integration system should catch most tricky cross-platform issues. It's easy to get too caught up in trying to do everything perfectly the first time and never get any code written, so you should usually err on the side of just trying something out rather than waiting for someone to tell you if it's OK. That being said, there are a few things that you should really be aware of before you write your first line of code: + +.. _ReleaseProcess: http://twisted.readthedocs.org/en/latest/core/development/policy/release-process.html +.. |ReleaseProcess| replace:: **a current pre-release** + +* Make sure you have a *clear idea of what work needs doing*. Write down your idea first; `file a ticket `_ before you write a patch. A really good ticket will give a precise description of what needs to change and why it needs changing; it avoids giving precise details of exactly *how* the code needs to change, because the patch should supply those details. A really *bad* ticket will say "here is a patch I wrote, apply it". If you're just getting started with contributing to Twisted, it would be good to find an existing ticket rather than come up with something yourself, so you have an idea how to go through the process before you start making difficult changes. You'll need to have a good description of your work for other parts of the process as well (the NEWS file, the commit message) which is another reason thinking about what you're trying to do helps. + + * Note: **if you're filing a bug because you noticed a regression in** |ReleaseProcess|_ **, make sure to mark it as a regression, add it to the release milestone, and to post something to the mailing list as well**. It's very important for us to spot regressions before they make it into a final release, so redundant communication is better in this case! + +* Try **not** to *write too much code at once* A good change really needs to be be under 1000 lines of diff for a reviewer to be able to deal with it before getting fatigued and missing things. Really, you should be aiming for things in the neighborhood of 200 lines. This is for your benefit as well as the reviewer's; we don't want you to spend weeks on a 10,000-line monster of a feature, only to have it rejected because we're not interested in having such a feature at all. + +Authors: Things your branch or patch must contain +================================================= + +* Code which follows the `coding standard `_ +* 100% unit test coverage for all modified and new code (even if it didn't have tests before) +* 100% API docstring coverage for all modified and new code (even if it didn't have docs before) +* No `CompatibilityPolicy `_ backwards-incompatible changes. Please also be sparing when adding 'public' names to the API, as they must be supported in the future. If it can start with an underscore and not be exposed publicly, it probably should. +* Appropriate new or modified "End User" guide documentation (in the form of rst files in the `docs/ `_ directory) +* A file in all relevant "newsfragments" directories describing changes which affect users (See `below <#news-files>`__) + +Authors: How to get your change reviewed +======================================== + +.. _Security: /content/pages/Security.html + +* There must be a bug in the Twisted bug tracker describing the desired outcome (See `below <#filing-bugs-and-writing-review-requests>`__). + + * **Note** For security issues, see Security_ +* Add the "review" keyword to the ticket. +* Remove the owner field by selecting the blank option next to "Assign to". + + * Alternatively, assign it to someone who has already agreed to review it. +* Write a comment with any relevant information for the reviewer. +* If you are a Twisted committer: + + * Make sure your code is in a branch. + * Make sure the 'branch' field on the ticket corresponds to the branch where the code is checked in. + * `Force a build of your branch `_. Make sure that it's **green**! + +Reviewers: How to review a change +================================= + +* Be familiar with the Twisted codebase, coding standard, and these review requirements. +* Don't be the author of the change (See `below <#who-can-review>`__). +* Make sure that it's **green**! `Trigger a build if it was not done yet `_. + + * There is one caveat to this rule. If one of the tools that we use to verify the code, such as ``pydoctor``, ``twistedchecker`` or ``pyflakes``, causes a build to fail, but for a reason that has to do with a bug in the tool rather than a problem with the code, file the bug in the tool, and then link from the bug report to the twisted ticket where you saw the spurious failure. You can `file bugs in twistedchecker here `_ , `pydoctor here `_ , or `pyflakes here `_. Don't block a branch on a tool bug, but also, don't let any spurious failures go without filing an appropriate bug on the relevant tool first. + * If the contributor lacks permission to create branches in the official Twisted repository on github (``twisted/twisted``), you will need to push it to the official Twisted repository -- after a security review -- to cause all of the CI builders to process the branch. After verifying the change is not an attack on the CI system, use ``admin/pr_as_branch`` to push the changes into the official Twisted repository. The remaining builds will be started and the results will eventually appear on the original PR. If new commits are pushed to the branch, repeat the process. + * Note any unreliable tests on the `build reliability placeholder ticket `_. +* Assign the ticket to yourself. +* Review the change, and write a detailed comment about all potential improvements to the branch (See `below <#how-to-be-a-good-reviewer>`__). +* Remove the "review" keyword from the ticket. +* Assign the ticket back to the author. +* If the change is ready for trunk, indicate so by writing "please merge" or "+1". + + * Alternatively, if the author does not have commit access to trunk, merge the change for them or add the "Cleared to land" label. + + +Authors: How to merge the change to trunk +========================================= + +* Check in the GitHub PR that all tests are green (or the failed one are just unrelated/spurious failures) +* Use the GitHub merge button to merge the request, using the GitHub default commit subject, and with the standard commit format required by Twisted. See below for details. +* Alternatively, you can use the command line and merge the change into a checkout of Twisted trunk (as a merge commit, using ``git merge --no-ff``!) and commit it. + +The commit message, when using both the GitHub button or the CLI commit, must follow this format (See `below <#the-commit-message>`__). + +.. raw:: html + +
+  Merge pull request #123 from twisted/4356-branch-name-with-trac-id
+
+  Author: <comma_separated_github_usernames>
+  Reviewer: <comma_separated_github_usernames>
+  Fixes: ticket:<ticket number>
+
+  Long description (as long as you wish)
+  
+ +.. _ReleaseProcess2: http://twisted.readthedocs.org/en/latest/core/development/policy/release-process.html +.. |ReleaseProcess2| replace:: **pre-release in progress** + +* After the change is merged wait for the `buildbots for trunks `_ to finish running. +* If there is a regression on a supported builder you should `revert your merge <#reverting-a-change>`_. +* **If this fix has implications for an ongoing** |ReleaseProcess2|_, please announce it on the mailing list so that the release manager will know. A change definitely has implications for the release process if: + * a pre-release has been issued for which there is no final release + * this ticket was a known regression and is now closed, so another pre-release should be issued + * this ticket was in the release milestone and is now closed, so another pre-release should be issued + * as part of the final review, the reviewer noticed that this is fixing something that could be considered a regression. + +In general, if there's any doubt, communicate to the mailing list. The mailing list is fairly low traffic, and so a little extra noise about interesting developments is much better than letting an important fix slip through the cracks. If you're not sure whether something qualifies as a regression or not, let the release manager know so they can decide. +* If no regression appears, you can delete the source branch. + +Details +======= + +News files +---------- + +**NB: If your pull request contains news fragments in** ``topfiles`` **directories, please run** ``admin/fix-for-towncrier.py`` **and then commit the result.** + +It is up to the authors of individual changes to write high-level descriptions for their changes. These descriptions will be aggregated into the release notes distributed with Twisted releases. If we just let each author add to the `NEWS `_ file on every commit, though, we would run into lots of spurious conflicts. To avoid this, we use `towncrier `_ to manage separate news fragments for each change. + +Changes must be accompanied by a file whose content describes that change in at least one ``newsfragments`` directory. There are ``newsfragments`` directories for each subproject (*e.g.* `src/twisted/web/newsfragments, `_ `src/twisted/names/newsfragments `_, `src/twisted/words/newsfragments `_), and one root directory (`src/twisted/newsfragments `_) for core Twisted changes. If a change affects multiple areas of Twisted, then each affected area can have a newsfragments entry to detail the relevant changes. An entry must be a file named ``.`` (eg. ``1234.bugfix``). You should replace ```` with the ticket number which is being resolved by the change (if multiple tickets are resolved, multiple files with the same contents should be added). The ```` extension is replaced by one of the following literal strings: + +============ ===== +Type Scope +============ ===== +**feature** Tickets which are adding a new feature +**bugfix** Tickets which are fixing a bug +**doc** Tickets primarily about fixing or improving documentation (any variety) +**removal** Tickets which are deprecating something or removing something which was already deprecated +**misc** Tickets which are very minor and not worth summarizing outside of the git changelog. These should be empty (their contents will be ignored) +============ ===== + +To get a sense of how the text in these files is presented to users, take a look at `the real overall news file `_ . The goal when writing the content for one of these files is to produce text that will fit well into the overall news files. + +Here are a few which should help you write good news fragments: + +* The entry SHOULD contain a high-level description of the change suitable for end users. +* When the changes touch Python code, the grammatical subject of the sentence SHOULD be a Python class/method/function/interface/variable/etc, and the verb SHOULD be something that the object does. The verb MAY be prefixed with "now". +* For bugfix, it MAY contain a reference to the version in which the bug was introduced. + +Here are some examples. Check out the root `NEWS` file for more inspiration.: + +Features: + +.. code-block:: console + + twisted.protocols.amp now raises InvalidSignature when bad arguments are passed to Command.makeArguments + +.. code-block:: console + + The new module twisted.internet.endpoints provides an interface for specifying address families separately from socket types. + +Bugfix: + +.. code-block:: console + + twisted.internet.ssl.Certificate(...).getPublicKey().keyHash() now produces a stable value regardless of OpenSSL version. Unfortunately this means that it is different than the value produced by older Twisted versions. + +.. code-block:: console + + twisted.names.secondary.SecondaryAuthority can now answer queries again (broken since 13.2.0). + +.. code-block:: console + + The SSL server string endpoint parser (twisted.internet.endpoints.serverFromString) now constructs endpoints which, by default, disable the insecure SSLv3 protocol. + +Deprecations: + +.. code-block:: console + + twisted.trial.util.findObject is now deprecated. + +.. code-block:: console + + twisted.conch.insults.colors is now deprecated in favor of twisted.conch.insults.helper. + +.. code-block:: console + + twisted.runner.procmon.ProcessMonitor's active, consistency, and consistencyDelay attributes are now deprecated. + +Removals: + +.. code-block:: console + + twisted.internet.interfaces.IReactorTime.cancelCallLater, deprecated since Twisted 2.5, has been removed. + +.. code-block:: console + + Support for versions of pyOpenSSL older than 0.10 has been removed. + +Documentation: + +.. code-block:: console + + The documentation for twisted.internet.defer.DeferredSemaphore now describes the actual usage for `limit` and `tokens` instance attributes. + +.. code-block:: console + + The docstring for twisted.conch.ssh.userauth.SSHUserAuthClient is now clearer on how the preferredOrder instance variable is handled. + +.. code-block:: console + + twisted.mail.alias now has full API documentation. + +.. code-block:: console + + The howto document page of Deferred now has documentation about cancellation. + +You don't need to worry about newlines in the file; the contents will be rewrapped when added to the NEWS files. + +Filing bugs and writing review requests +--------------------------------------- + +Tickets should be described well enough that the change is already justified and the new code should be easy enough to read that further explanations aren't necessary to understand it, but sometimes diffs themselves can be more difficult to read than either the old or new state of the code, so comments like *the implementation of foo moved from bar.py to baz.py* can sometimes make a reviewer's job easier. + +If you're a committer, please always make sure the "branch" field is current and force a build; this helps decrease review latency if the reviewer can see the diff and build results from the convenient links at the top of the ticket without waiting. + +Who can review ? +---------------- + +Changes must be reviewed by a developer other than the author of the changes. If changes are paired on, a third party must review them. If changes constitute the work of several people who worked independently, a non-author must review them. + +A reviewer need not necessarily be familiar with the specific area of Twisted being changed, but he or she should feel confident in his or her abilities to spot problems in the change. + +Twisted committers may review anyone's tickets; those submitted by other committers or those submitted by non-committer contributors. If a non-committer contributor submits a ticket that is acceptable to merge, it is the committer's responsibility to commit and merge the branch. When a committer reviews a ticket, they are responsible if there are any problems with the review. + +Non-committer contributors may review tickets which committers have submitted. When a non-committer views `review queue `_, it will ghost the rows submitted by other non-committers so they know not to review those. When a non-committer does a passing review, the committer may accept it and land their change, but they are then responsible for the adequacy of the review. So, if a non-committer does a review you feel might be incomplete, put it back into review and explain what they might have missed - this kind of reviewing-the-review is important to make sure that more people learn how to do reviews well! + + +How to be a good reviewer +------------------------- + +First, make sure all of the obvious things are accounted for. Check the "Things your branch or patch must contain" list above, and make sure each point applies to the branch. + +Use `pyflakes `_ to check the basic quality of the code. The following command will check all the files modified and added by a branch merge: + +.. code-block:: console + + git diff --staged --name-only | xargs pyflakes + +A reviewer may reject a change for various reasons, many of which are hard to quantify. Basically, use your best judgement, and don't be afraid to point out problems which don't fit into the list of branch requirements laid out in this document. + +Here are some extra things to consider while reviewing a change: +* Is the code written in a straightforward manner which will allow it to be easily maintained in the future, possibly by a developer other than the author? +* If it introduces a new feature, is that feature generally useful and have its long term implications been considered and accounted for? + + * Will it result in confusion to application developers? + * Does it encourage application code using it to be well factored and easily testable? + * Is it similar to any existing feature offered by Twisted, such that it might make sense as an extension or modification to some other piece of code, rather than an entirely new functional unit? + +* Does it require new documentation and examples? + +When you're done with the review, always say what the next step should be: for example, if the author is a committer, can they commit after making a few minor fixes? If your review feedback is more substantial, should they re-submit for another review? + +If you are officially "doing a review" - in other words, removing the review keyword - please make sure you do a complete review and look for *all* of these things, so that the author has as much feedback as possible to work with while their ticket is out of the review state. If you don't have time to do a complete review, and you just notice one or two things about the ticket, just make a comment to help the future reviewer, and don't remove the review keyword, so another reviewer might have a look. For example, say, "I just checked for a news file and I noticed there wasn't one", or, "I saw some trailing whitespace in these methods". If you remove the review keyword, you may substantially increase the amount of time that the author has to wait for a real, comprehensive review, which is very frustrating. + +The commit message +------------------ + +Several tools exist which parse commit messages to trunk, so the *Author*, *Reviewer*, and *Fixes* lines should conform to this format exactly. Multiple *Fixes* lines will close multiple tickets. *Refs* may also be used to attach the commit message to another ticket which is not being closed. The commit message should also describe the change being made in a modest amount of detail. + +Reverting a change +------------------ + +If a change set somehow introduces a test suite regression or is otherwise found to be undesirable, it is to be reverted. Any developer may revert a commit which introduces a test suite regression on a supported platform. The revert message should be as explicit as possible. If it's a failure, put the message of the error in the commit message, possibly with the identifier of the buildbot slave. If there are too many failures, it can be put in the tracker, with a reference in the message. Use the "Reopens" tag to automatically reopen the ticket: + +.. raw:: html + +
+  Revert r<revision number>: Brief description
+
+  A description of the problem, or a traceback if pertinent
+
+  Reopens: ticket:<ticket number>
+  
+ +Reverted branches are to be reviewed again before being merged. diff --git a/content/pages/ReviewingDocumentation.rst b/content/pages/ReviewingDocumentation.rst new file mode 100644 index 0000000..fd5e763 --- /dev/null +++ b/content/pages/ReviewingDocumentation.rst @@ -0,0 +1,63 @@ +Reviewing and Adding Documentation +################################## + + +The documentation may need help if: + +* Explanations are unclear +* Examples don't work or have become outdated +* The overall structure or the order in which information is presented is unintuitive +* Examples for major concepts are missing + +Note that the `example and howto documentation on the website `_ may be outdated, as it is only updated from trunk on releases. The `latest build on Read the Docs reflects current trunk `_. + +Editing example and howto documentation +======================================= + +These narrative docs live in `reStructuredText `_ (``.html``) files in subdirectories of `docs/ `_. Twisted uses the document generator `Sphinx `_ to generate the HTML files you see on the web from these ``.html`` files. After adding your changes, it's important to review your changes for correctness and to preview how they will look on the website. + +#. If you haven't already, `create your Twisted work environment `_. + +#. Make sure you have the latest version of the code + +#. Edit away! + +#. Preview your changes with Sphinx + +For example, if I made changes to `docs/core/howto/choosing-reactor.html`, I should + +``tox -e narrativedocs`` + +This generates `docs/_build/core/howto/choosing-reactor.html`, which you can view in a web browser with the command: + +``python -m webbrowser docs/_build/core/howto/choosing-reactor.html`` + +If everything looks good, submit a patch to the `.html` as described `here `_. + +Editing API Docs +================ + +The API docs are generated from the doc strings in the code by `pydoctor `_ , so to update what will be displayed in the API docs just update the doc strings. After making your changes, generate a test set of API docs to preview how they will look. + +#. If you haven't already, `create your Twisted work environment `_. + +#. Make sure you have the latest version of the code + +#. Edit away! Be sure to adhere to the docstring guidelines in the `Twisted coding standard `_. + +#. Preview your changes with pydoctor + +Generate the docs with the build-apidocs admin script like so: + +``tox -e apidocs`` + +The above produces a folder called `apidocs` in your current working directory. You can then open the docs in a web browser with the command: + +``python -m webbrowser apidocs/index.html`` + +If everything looks good, submit a patch as described `here `_. + +More +==== + +See also `DocumentationAnalysis `_ from an old Twisted documentation sprint. diff --git a/content/pages/Security.rst b/content/pages/Security.rst new file mode 100644 index 0000000..d3e6f45 --- /dev/null +++ b/content/pages/Security.rst @@ -0,0 +1,407 @@ +We appreciate your concern +########################## + + +We take security very seriously. Your input and feedback on our security is always appreciated. + +Reporting Security Issues +========================= + +**Send urgent or sensitive reports directly to security@twistedmatrix.com.** + +---- + +You may use our public key (below) to keep your message safe and please provide us with a secure way to respond. We'll get back to you as soon as we can; please bear in mind that Twisted is an all volunteer project and there may be some delay before we can respond. But please feel free to follow up if you think an unreasonable amount of time has elapsed without a response! + +Security Procedure for Developers +================================= + +The goal of the normal Twisted development procedure is to make all steps transparent and record all information at all times in a public location - either the issue tracker or a branch. + +The goal of the security variation of the Twisted development procedure is to keep track of progress resolving security issues while minimizing the window of time where information useful to attackers is available before a fix for the issue is available to Twisted users. + +This process is intended as a helpful recommendation; elements of it may be followed more or less strictly depending on the severity of the issue in question. + +#. Begin by filing a ticket which does not describe the issue and simply says 'security issue, description pending' and has the 'security' keyword. + +#. Unfortunately, we are not aware of a way to securely transmit our code to our public continuous integration systems and our code review process on Github without making the branch public. To minimize the time that this branch is available, perform some notifications first via private email. + + #. Try to find a reviewer ahead of time; agree upon a time to do the review, and push your code up such that continuous integration will be roughly complete by the time they're looking at it (roughly an hour in advance). + + #. Find a release manager to issue the security release, and coordinate with them around this time window as well; be sure they're aware that this is happening in advance. + +#. Push your code up, get it reviewed. While security fixes don't circumvent any of our usual processes, do be mindful of the fact that users are vulnerable while security fixes are pending, so as much as possible review feedback should be deferred. + +#. Backport the patch and perform the security release of the most recently released version. + +Aside from hiding the details of the issue while development is ongoing, all of the normal policies apply; security fixes require unit tests, etc. See `ReviewProcess `_ for further details. + +Our PGP key +=========== + +.. code-block:: console + + -----BEGIN PGP PUBLIC KEY BLOCK----- + Version: GnuPG v2.0.22 (Darwin) + + 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 + 2pOVp6XTYdUW + =HDSq + -----END PGP PUBLIC KEY BLOCK----- diff --git a/content/pages/SuccessStories.rst b/content/pages/SuccessStories.rst new file mode 100644 index 0000000..86a3af7 --- /dev/null +++ b/content/pages/SuccessStories.rst @@ -0,0 +1,275 @@ +SuccessStories +############## + + +**Have a success story for Twisted? Let us know! Contact success at twistedmatrix dot com** + +`ZONT Online `_ +======================================== + +ZONT Online is an online platform for monitoring and control of internet-connected smart devices. We use Twisted from the first days in 2011 to power our fully-asynchronous python backend. + +Twisted powers a wide range of our server-side tasks: user-facing and API web servers, websockets, queue workers, custom TCP/IP servers, email and push sending, 3rd-party API integrations and so on. + +We found Twisted to be mature, well-designed and having batteries included. Its networking primitives are flexible enough to build a wide range of services and to integrate with both blocking and non-blocking libraries. + +Special mention should be made about how carefully Twisted team documents its releases and maintains backward-compatibility. During the 10 years of our work with Twisted we continuously migrated through almost all Python versions from 2.7 to 3.9 and Twisted versions from 11.0.0 to 21.7.0 without notable surprises. + +-- Ilya Skriblovsky, Lead of Online Services Development, ZONT Online Ltd. + +`Battlehouse Games `_ +================================================== + +Battlehouse creates and operates massively-multiplayer strategy games for browser and desktop platforms. Our most popular titles are nearly 10 years old and have served over 4 million users. + +Twisted plays an important role in our Python-based server stack. We use Twisted to handle many protocols including HTTP, WebSockets, and SQL. The asynchronous coroutine model helps us deliver low-latency gameplay without adding too much complexity to the codebase. Across 10 years of continuous evolution, Twisted has proven to be the most stable, well-documented, and flexible low-level networking library for Python. + +-- Dan Maas, CTO, Battlehouse Games + +`LabRAD `_ +===================================== + +`LabRAD `_ is an RPC system designed for use in scientific research labs, presently in use by `more than a dozen academic and industrial labs around the world `_. + +The labrad python API has used Twisted for networking and asynchrony since around 2005, and Twisted continues to serve our needs well. Most of our servers use Python, and most LabRAD users use Python to run experiments; Twisted is an essential component for us on both the client and server sides. We particularly like the explicit coroutine style of asynchronous code made possible by the @inlineCallbacks decorator. + +-- Daniel Sank, LabRAD Project + +`Lucasfilm `_ +==================================== + +Lucasfilm has used Twisted in its business-critical production +processes since 2004. In 2009 we became sponsors of the project. + +We use Twisted to proxy database connections for our render farm, +which runs 24/7/365. In continuous deployment for six years, our +Twisted daemons have served many billions of queries. Twisted's +process spawning and monitoring capabilities are also used in numerous +automation and queuing services. In addition, its excellent, +full-featured Jabber implementation supports our person-to-person and +application-to-application messaging services. + +As a large and diverse enterprise, a key to our success with Twisted +is the professional way in which it is maintained. With a large body +of unit tests and rigorous code reviews, Twisted provides a smooth +upgrade path so that old features to continue to work and new ones +are production ready and rock-solid. + +-- Dave Peticolas, Lead Python Developer, Lucasfilm Entertainment Company Limited + +`FluidDB `_ +================================== + +At Fluidinfo, we're heavy users of Twisted. All of our infrastructure depends on it. FluidDB, our social database, is entirely built on Twisted, and we've released several core parts of it as open source: `txAMQP `_ , `txRDQ `_ and `txThrift `_. Not only that, but we have contributed to Twisted both with code and (albeit small) personal donations. + +It's not just that sponsoring was the fair the thing to do, it has also produced tremendous results in a framework crucial to our business. When you donate to the TSF it's simple math that more bugs get fixed, but also the quality of the entire Twisted project is enhanced. And when that happens, all of our products are enhanced automatically without us writing one line of code. So sponsoring is not just an act of generosity, it's an investment in Fluidinfo. Using and sponsoring Twisted has been an indispensable "force multiplier" for a growing start-up like us. + +-- Esteve Fernandez, CTO, Fluidinfo Inc. + +At Fluidinfo we chose Twisted as the basis of all internal networking for our +distributed, shared, always-writable database, FluidDB. We threw out +a year's worth of working, debugged, tested C code in order to move to Twisted. As +I often tell people, we're using Python because of Twisted, not the other +way round. I'm an unabashed Twisted fanboy. In particular, +Twisted's Deferreds are one of the most elegant and flexible +programming constructs I've ever worked with. +Plus, the Twisted community is great - not only the core developers, +but also the 180+ people constantly in #twisted in IRC. + +-- Terry Jones, CEO, Fluidinfo Inc. + +`Launchpad `_ +==================================== + +Canonical has been using Twisted as key part of Launchpad.net for over +five years now. We use Twisted to run our SSH servers, our process +pools, our package build farms, our file storage system and many other +things. Practically every time we need to glue two systems together, +we use Twisted. When we don't, we regret it later. + +-- Jonathan Lange, Product Strategist, `Canonical Ltd `_ + +`HipChat `_ +=================================== + +HipChat is a hosted group chat and IM service for businesses that uses the XMPP protocol behind the scenes. We use Twisted to power our fully clustered chat server and run many important job queue workers. + +Twisted's built-in XML support via the Twisted.Words and xmlstream modules have been life savers since XMPP is very XML heavy. They've been rock-solid and keep us from having to work with with XML directly which is a wonderful thing. + +One of the greatest time savers is the combination of Deferreds and the @defer.inlineCallbacks decorator. These allow us to write code that is asynchronous but stays easy to read and maintain. No more getting lost in a sea of callback functions. I mention it because I truly miss them when playing with Node.js, particularly Python's 'yield' and Twisted's Deferreds! I feel crippled without them. + +Bottom line: we built and launched a successful business on Twisted & Python in 6 months with no prior knowledge of either. It's a very productive environment with great performance and maintainability. What more could you want? + +-- Garret Heaton, Co-founder, `HipChat `_ + +`Justin.tv `_ +===================================== + +Justin.tv is the largest live video site on the internet. We allow anyone to broadcast live video from their PC and chat with viewers. Every second of every broadcast is archived so it can later be browsed, searched, or made into highlight clips. + +Each of Justin.tv's half a billion monthly pageviews passes through a custom Twisted caching engine. "Twice" is a caching reverse proxy with a basic templating engine. It runs as a cluster of roughly 120 processes across a dozen machines and handles peak loads of 20,000 dynamic pageviews per second. The project has been `open sourced here `_ + +-- Kyle Vogt, VP Engineering, Justin.tv, Inc. + +`TweetDeck `_ +======================================= + +TweetDeck aims to build a browser for the +real-time web. Right now we're the biggest Twitter client after the +website itself, and are rolling out full integration with Facebook and +other services. With TweetDeck you can organize real-time streams of +information into a convenient grid format that allows easy digestion. + +We use Twisted to power our backend services, specifically our new +accounts system and sync functionality we introduced recently +(http://tweetdeck.com/beta/features/take-tweetdeck-with-you/). We've +deployed our Twisted services over the Amazon cloud - specifically, we +use EC2 and SimpleDB. Writing a REST api service used by hundreds of +thousands active users was a snap with Twisted. We'll continue to use +Twisted as we broaden our server-side processing goals. + +-- Reza Lotun, Software Engineer, TweetDeck, Inc. + +`Evennia `_ +==================================== + +Evennia is a modern Python MUD/MUX/MU* server, aimed at the easy creation of text-based massively multi-user online games. We use Twisted for all our networking needs, along with `Django `_ for database abstraction and web features. The two work beautifully together. + +When developing Evennia we have found that using Twisted not only gives us great performance advantages, but also helps us to easily expand on the ways people connect to Evennia-powered games. Whereas traditional MUD servers only speak telnet, Evennia additionally comes with its own browser-based client and allows for expanding with custom game protocols in any combination. Evennia also serves the MUD’s website, alleviating the need to install and set up a third-party web server. All of this is straightforward to implement and maintain thanks to Twisted! + +-- Griatch, Maintainer, Evennia project + +NASA +==== + +My team is developing a modular application to integrate CAD/CAE/CAM tools and data and to enable collaboration among distributed teams of engineers working on NASA projects. We have selected Twisted as our framework because of its pluggable, asynchronous protocols, support for multiple interfaces and protocols per service, integration with PostgreSQL, and just generally excellent layered architecture. + +-- Stephen C. Waterbury, NASA + +`Shared Solar `_ +============================================= + +`Shared Solar `_ is a rural electrification +project providing over 3000 people with electricity in sub-Saharan +Africa (Mali and Uganda) with proposed deployments in Kenya and Haiti. +Due to the nature of the physical environments, and the model of +distributed generation, we need to have local intelligence at our +sites for the distribution of prepaid electricity and management of +the deployed infrastructure. + +This distributed/local intelligence is built using Twisted. Twisted +has helped me prototype and deploy rapidly, learn and react quickly to +on-the-ground issues as they arise, and adapt the service to +configurations using different hardware and protocols. Without the +services built around Twisted, I'm certain the project would not be as +successful - it has helped us turn otherwise static infrastructure +into something much more in very short time. + +Huge thanks to the Twisted community for their great work and making +this possible. I'd also like to acknowledge the wonderful support by +the folks on irc:#twisted. + +-- Rajesh Menon, Software Engineer, SharedSolar + +`HybridLogic `_ +=============================================== + +`Hybrid Web Cluster `_ is a load-balanced and redundant web cluster built in Twisted which supports all standard LAMP websites. + +The web cluster uses ZFS on FreeBSD for its unique ability to efficiently send differential snapshots over a network. But it is Twisted that has enabled us to turn that capability into a cluster filesystem. Everything is asynchronous, for example: + +* polling "zfs list" and "zfs mount" for filesystem state +* communicating with other nodes via XML over Spread +* reconfiguring distributed servers on-the-fly +* handling thousands of internally proxied requests over thousands of sockets simultaneously. + +Without Twisted we'd have to rely on threads, or spend valuable time writing an event loop that wouldn't be anywhere near as spectacular as Twisted's. Twisted has enabled us to focus on building phenomenal features (like seamlessly moving websites and databases between servers) instead of wasting precious resources re-inventing wheels. + +Using Twisted has been massively beneficial for us. Not only have the +experts been always on-hand in real-time on IRC, but the code quality +and the expressive power of the library is unparalleled. In particular +the combination of Perspective Broker with Deferreds make expressing +otherwise tricky distributed algorithms a pleasure. + +Twisted has been crucial at Hybrid Logic for making an awesome Hybrid Web Cluster platform that guarantees our customers' sites are fast and their data is safe at all times. + +Thank you Twisted! + +-- Luke Marsden, CTO, HybridLogic Ltd. + +PowerCard +========= + +PowerCard is the software platform we developed for `PowerCard Rewards `_ and the Original Rewards program for `Original Restaurants `_. Original Restaurants promotes unique, local restaurants by providing cooperative marketing, customer sharing, and a distinctive Rewards Card program. + +We use Twisted extensively for back-end transaction services for the loyalty rewards and gift card programs. We also used Twisted in our client-side applications installed in demanding restaurant environments. Twisted was crucial in our ability to craft solutions to interoperate with multiple restaurant POS vendors (Micros, Aloha/Radiant, Squirrel, etc.), each with differing protocols and access methods. Our choice of Python and Twisted allows us to rather easily extend our system to support new features and requests with limited amount of developer time and budget. + +Key features for us: + +* Easy implementation of custom and existing network protocols +* Consistent APIs for code sharing between client and server implementations +* Windows integration +* Client GUI applications +* Services are a snap to implement +* Community support is very helpful + +-- Lucas Taylor, CTO, PowerCard + +`Botonomy LLC `_ +====================================== + +Botonomy LLC is a small software firm in the Philadelphia area. We help small teams solve large problems. + +Our first application, `ProjectPipe `_ , is a hosted project management solution that provides midsize teams with everything that they need to manage IT projects. We have built our hosted application infrastructure atop Twisted, Nevow, PostgreSQL, and Jabber/XMPP. Twisted's multi-protocol support has been one of the key enablers of the unique technical architecture that we employ in our product offerings. + +The core Twisted development team consistently demonstrates a strong commitment to delivering robust, high quality software. Twisted's documentation is accurate and concise, and the expertise and helpfulness of the larger developer community is second-to-none. + +When evaluating the technologies on which you are staking your business, you need to evaluate both the code and the community that surrounds it. Twisted passes with flying colors in both regards. + +-- Christian Simms, Botonomy LLC + +`Reflexions Data `_ +=================================================== + +At Reflexions Data, we provide custom development services for a wide variety of clients. We recently completed work on a project for a new client; the timeframe available required us to expedite every step of the development process. Twisted allowed us to quickly implement a custom client/server protocol with a wide variety of extra functionality for free. + +The quality of the Twisted networking core is unmatched in the open- or closed-source arenas. Due largely to its asynchronous networking model, we were able to ensure our clients scalability needs would be met. + +Our experiences with the Twisted developer community were top- notch; the turnaround time on questions posted to the developer mailing list was simply amazing. We were so pleased with the results of our first professional use of the Twisted core that we plan on investigating how we can make use of the other facets of the Twisted project. + +-- Phil Christensen, Senior Developer, Reflexions Data, LLC + +`Masters of Branding `_ +========================================================== + +At Masters of Branding we use Twisted as the networking core for all of our client and server RFID software. It was by far the easiest framework to develop with, debug under, and extend for our purposes to support protocols such as SOAP, HTTP, and Macromedia Flash-compatible XML Sockets. The API and event model are both very well thought out and has accommodated all of our networking needs from database-heavy server software on Linux to (py)OpenGL visualization applications on win32. + +The ease and power of Python and Twisted really showed through when we took one of our applications developed in and for Linux and ported it to run as a Windows NT service in less than day. New users to the framework will not only be impressed by the power of the software, but also that the developer/user community responsible for it are incredibly helpful and often provide much better support in minutes or hours than you'll see from commercial shops given days or weeks. + +-- Bob Ippolito, CTO, Masters of Branding Inc. + +`Adelux `_ +================================= + +Adelux develops custom internet applications such as portals, network security tools, communication-related programs, and software that leverages other systems. + +We discovered Twisted 10 months ago, and now it is a key element of our development strategy. We have successfully used Twisted on several projects, of very different problem domains. + +We developed a highly scalable realtime application for customer support, which serves web-based clients as well as clients implemented in any of the many protocols supported by Twisted. Twisted was also used to develop targeted proxies for various applications supporting more than 15.000 users. Twisted handles the charge with no problem. + +We intend to continue using Twisted on upcoming projects, especially since integrated support for databases and new services are being added very quickly. + +We found Twisted to be powerful, comprehensible, well documented, and backed by a good helpful community. We'll use it on our next products for sure! + +-- Luc Stepniewski, Head Engineer, Adelux, France + +MC-Foo and Ldaptor +================== + +I was writing `MC Foo `_ , a networked multiuser learning Ogg/MP3 jukebox application, in C, and was frustrated about the amount of time it took to debug. I decided I should use a higher-level language. I liked how Python felt, but had never written a single line of Python. I decided it was time to learn. Five hours later, the core of my application was rewritten in Python, using Twisted for main loop and networking. Another five hours later, I had replaced my oversimplistic line-based protocols with PB, the Twisted RPC protocol. Twisted has also enabled me to easily add features such as implicit persistence into MC Foo. And it even has nice GUI integration, allowing one to do sane networking in a GUI application. + +Since then, I have created `Ldaptor `_, a pure-Python LDAP library, utilities and a web interface, as a data structure library, Twisted protocol and Twisted applications. The way how the web interface plugs in with the LDAP protocol handling still manages to amaze me. + +The developer community behind Twisted is just great, and the IRC channel is a great source of information. All in all, I feel Twisted is one of the most interesting projects on the net. + +-- Tommi Virtanen diff --git a/content/pages/TSF/FoundingSponsors.rst b/content/pages/TSF/FoundingSponsors.rst new file mode 100644 index 0000000..3e00d4f --- /dev/null +++ b/content/pages/TSF/FoundingSponsors.rst @@ -0,0 +1,71 @@ +Founding Sponsors +################# + + +We'd like to acknowledge those companies and individuals who made critical contributions to Twisted during our infancy. Thanks for helping us get on our feet. + +Companies +========= + +.. raw:: html + +
+
+ + + +
+
+
+
+ +
+
+
+
+
+ +
+ +
+ +
+
+ +
+
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+ +
+ +Individuals +=========== + +* Glenn Tarbox +* Drew Perttula +* Eino Makitalo +* David T Ripton III +* Alex Clemesha +* Karl Bartel +* Nicola Larosa +* Chris Armstrong +* Michel Pelletier +* Valentino Volonghi +* Hein-Pieter van Braam +* Ilya Novoselov +* N J Carriero diff --git a/content/pages/TheTwistedShow.rst b/content/pages/TheTwistedShow.rst new file mode 100644 index 0000000..00dbab1 --- /dev/null +++ b/content/pages/TheTwistedShow.rst @@ -0,0 +1,21 @@ +The Twisted Show +################ + + +`The Labs `_ is currently producing semi-regular podcasts that discuss the use of the Twisted networking framework within various businesses and projects around the world. We've been getting great feedback and we want to be able to share this with a wider audience. + +As part of the editing process, we will include contextual links to related material (both Twisted-centric as well as other, off-site content). Additionally, we will present "bonus" material at the end of each interview transcript (or podcast) that is intended to encourage curious readers in further play and exploration. + +**Want to be a Guest Star?** Send an email to oubiwann at adytum dot us! + +Interviews +========== + +* `Synthesis Studios `_ - Audio recording from interview on 2008.04.23 +* `Chesspark, Games and Twisted `_ - Audio recording from interview on 2008.02.25 +* `Renkoo talks Twisted `_ - Transcript from interview on 2006.12.07 + +Podcasts +======== + +Subscribe to our podcasts `here `_. diff --git a/content/pages/Twisted/TwistedAdvantage.rst b/content/pages/Twisted/TwistedAdvantage.rst new file mode 100644 index 0000000..b1c6e53 --- /dev/null +++ b/content/pages/Twisted/TwistedAdvantage.rst @@ -0,0 +1,50 @@ +The Twisted Advantage +##################### + + +Flexibility +=========== + +Twisted's codebase is small and it contains many hooks for dynamic content. With the source code and an open license, you know you'll never be in a position where you can't add a feature you need. + +Security +======== + +Twisted is written in `Python a high-level language `_, rendering it immune to the most common class of security flaw in network software, the "buffer overflow": buffer overflows have allowed worms and crackers to tamper with or disable internet servers. Twisted also takes advantage of operating-system security features whenever possible, delegating responsibility for tasks to the appropriate user to make the system more difficult to exploit. + +Stability +========= + +Thanks again to `Python's `_ error handling mechanisms, the Twisted server framework is extremely stable. Even the most bleeding-edge development servers -- those we run here at http://twistedmatrix.com -- don't crash, and rarely (if ever) need to be restarted. + +But where do these advantages help you directly? Twisted can do a lot, so it depends on what you're using it for. Let's take a look at some potential applications you might have in mind... + +Publish a Web Site +================== + +The twisted.web webserver is a scalable, small-footprint web server that's easy to configure. It's efficient enough to serve a high-traffic website, completely dynamic and reconfigureable on the fly, and simple enough to configure that you can have it set up and running in just minutes after you've downloaded it. It's also portable, so you can easily share your web content between Windows, Unix, Macintosh, and other systems, all running twisted.web. It also shares the security advantages of the rest of Twisted. + +Twisted Web scales down as well as up. Use it to share files with your friends at home or to publish large files on your enterprise intranet. + +Develop Servers at Lightning Speed... +===================================== + +Twisted integrates a large number of consistent APIs for developing new Internet services. This translates to a wide number of protocols and components that are ready to work with your new server before you've written the first line of code. + +In addition to legacy protocol support, the twisted.spread package allows developers to quickly develop new protocols and services with arbitrarily complex interfaces, prototyping new client functionality on the fly. + +What does this mean in terms of development time? If you're developing a new server, it could take literally a year off of your implementation time -- and that's just now. Twisted development is proceeding at a rapid pace, and by the time you've finished your development you may find a host of new features that you didn't have to spend a moment thinking about! + +Twisted comes under a relatively non-restrictive open-source license, making it suitable for both commercial and open-source development. + +... And Clients Too +=================== + +Unlike some other server frameworks, Twisted makes it simple to develop a client using the same code-base. Whether you are developing both a client and server in tandem with the twisted.spread package, or independently developing a client for an existing protocol, Twisted's integration with a wide variety of different graphical toolkits will allow you to run any common code completely unchanged from your server environment. + +Engage an Active Community +========================== + +Twisted has a knowledgeable, energetic, and growing developer community. Members of this community have concern over issues like those you will be facing in your custom server development and have solved those issues for themselves already within the Twisted framework. + +We (the developers of Twisted) try to use every piece of the software we write ourselves -- after all, the reason we wrote it was that we needed it! This means that if there's a bug, we're concerned about it. Twisted comes with a full set of automated acceptance tests and unit tests. diff --git a/content/pages/Twisted/TwistedCommunity.rst b/content/pages/Twisted/TwistedCommunity.rst new file mode 100644 index 0000000..ff977c1 --- /dev/null +++ b/content/pages/Twisted/TwistedCommunity.rst @@ -0,0 +1,45 @@ +Twisted Community +################# + + +For interacting with the twisted community members, you have several options: + +Mail Lists +========== + +If you want to participate in Twisted's community or development, you probably want to join the main mailing list: + +* `twisted-python `_ the main Twisted discussion list + +There are also more specific lists, if your interest is narrower: + +* `twisted-web `_ - web-specific technologies, including twisted as WSGI, twisted.web, klein, and treq +* `twisted-jabber `_ - xmpp-related projects, including twisted.words.protocols.jabber. + +You can subscribe to these mailing lists using the web interfaces linked above. + +Stack Overflow +============== + +Stack Overflow is a programming Q & A site. You can find Twisted-related questions there, often with answers: + +* https://stackoverflow.com/questions/tagged/twisted + +Real-Time Chat +============== + +Server: ``irc.libera.chat`` (more about `the Libera IRC network `_) + +For support, you can join one of several channels: + +- `#twisted `_ | `Logs `__ - support for Twisted and its ecosystem +- `#twisted.web `_ | `Logs `__ - support for Twisted Web, and ecosystem projects such as Treq, Klein and the Nevow templating system.; both for development with it and deploying it + +If you're working on Twisted, you should join the development channel. + +- `#twisted-dev `_ | `Logs `__ - for development of Twisted + +Blogs +===== + +Read `Planet Twisted `_. diff --git a/content/pages/Twisted/TwistedDevelopment.rst b/content/pages/Twisted/TwistedDevelopment.rst new file mode 100644 index 0000000..47ca21f --- /dev/null +++ b/content/pages/Twisted/TwistedDevelopment.rst @@ -0,0 +1,282 @@ +Twisted Development +################### + + +`Contribute `_ > Twisted Development + +.. contents:: + +Contributing +============ + +Twisted uses the `The Ultimate Quality Development System `_, in addition to this ReviewProcess. + +If you want to become a developer, it is important to understand that all your contributions (including those initial patches you send to the bug tracker) will have to be licenced under the `MIT License `_. + +Getting the source code +----------------------- + +You can get Twisted's source code here: + +``git clone https://github.com/twisted/twisted.git Twisted`` + +If you intend to contribute to Twisted via Git, but do not have write access to the Twisted repository, you should instead fork the project by going to https://github.com/twisted/twisted and clicking on "fork". +Then set up your local repository: + +.. code-block:: console + + git clone https://github.com//twisted.git Twisted + cd Twisted + git remote add upstream https://github.com/twisted/twisted.git + git fetch upstream + git branch -u upstream/trunk trunk + +NOTE for experienced Git users: for historical reasons, Twisted's main branch is currently named "trunk", instead of the usual "master". + +.. _creatingyourworkenvironment: + +Creating your work environment +------------------------------ + +Twisted development does not enforce any specific work/build environment. + +Twisted uses Tox for managing the environment used in the continuous testing systems (GitHub Actions, Circle CI, Travis-CI, Appveyor). + + +With Tox +~~~~~~~~ + +You will need Tox version at least 2.4. (On Ubuntu 16.04 you have 2.3.1). + +See README.md and tox.ini comments for more details. Note that some environments are for CI systems and not designed for local runs. + +Here is an example for running the test in a specific environment: + +.. code-block:: console + + $ tox -e alldeps-nocov twisted.conch.test.test_transport + $ tox -e lint,black,newsfragment,manifest-checker + +You can also use tox just to initialize the dev virtual environment and then manually active and use it: + +.. code-block:: console + + tox -e nodeps-nocov-posix --develop + . build/nodeps-nocov-posix/bin/active + trial twisted.conch.test.test_transport + + +Without Tox +~~~~~~~~~~~ + +For faster runs, you can skip tox and build a custom working environment. + +For your convenience, the setup.py file defined optional components, `dev` component being one of them. + +Here is an example of creating an environment using virtualenv. + +.. code-block:: console + + # Create base environment. + virtualenv build/ + # For Unix + . build/bin/activate + # For windows (replace .bat with .ps1 for powershell) + build/Scripts/activate.bat + pip install pypiwin32 + + # Install dev dependencies, also forcing upgrade of existing versions. + pip install -U -e '.[dev]' + # At least on my Ubuntu 16.06 the install_requires were not correctly installed, + # so I am doing a manual install based on the content of src/twisted/python/_setup.py. + pip install automat incremental constantly diff_cover + + # Use the dev tools. + # Prefix this with the path to python.exe on Windows + trial twisted.conch.test.test_transport + + # Using the coding standard guidelines validation tool... will get a lot of false positives + twistedchecker twisted.conch.ssh.transport + # On Linux/OSX there is a helper to only raise error for the diff + ./.travis/twistedchecker-trunk-diff.sh src/twisted/ + + # Static code analysis and checkers (see tox.ini for inspiration) + pyflakes twisted/conch/ssh/transport.py + git diff trunk... | admin/pycodestyle-twisted.py --diff + ./bin/admin/check-newsfragment src/twisted/ + check-manifest --ignore "docs/_build*,docs/historic/*,admin*,bin/admin*,twisted/topfiles/*.Old" + +Submitting a Patch +------------------ + +Here's a quick step-by-step guide to getting from an idea for an improvement to Twisted to something that we can integrate. First, I'll explain just the mechanics of getting your code into review, not what the code itself should do. If you actually want us to be able to use your code, you will also want to read the section below on getting your patch accepted, too! + +#. For the patch you are submitting, make sure that a `ticket exists using the "search" field above `_, and Google for the patch which you are submitting. + + #. If you can't find one, file a new ticket using the `new ticket `_ link above. See: `Tickets Management `__. + +#. Create a `fork on GitHub `_ and clone it (see `Getting the source code <#getting-the-source-code>`_ above). + +#. Create a branch in git for your code. If your ticket is **1234** and your GitHub ID is **myuserid**, you can create a branch like: + +.. code-block:: console + + git checkout trunk + git pull + git checkout -b 1234-myuserid-mychange + +#. Edit the code in the branch that you just checked out, making your awesome change to Twisted. + +#. Make sure that your patch fulfills all of the requirements of the `ReviewProcess `_, so you don't need to submit your patch many repeated times. Run ``tox -e black-reformat`` to automate the formatting. + +#. Every patch needs a `topfile news fragment `_ to tell the user what was changed + +#. Commit your changes + ``git commit -am "Changed some stuff"`` + +#. Push your changes to GitHub + ``git push 1234-myuserid-mychange`` + +#. Create a `GitHub pull request `_ for the **my-new-change** branch. Make sure that in the pull request, you put a link to the ticket that you filed above. + +#. In your ticket, put a link to the GitHub pull request. + +#. Put the ticket into review. This is accomplished by doing the following: + + #. enter the word **"review"** into the **"Keywords"** field of the ticket. (If there are other keywords already there, just add a space to separate the keyword.) + + #. Click on the "reassign to" radio button. + + #. Select the topmost, blank entry from the "reassign to" button. + + #. Optionally, add a comment explaining which patch you would like reviewed (if there are already other attached files), and explaining **what** your change does (as opposed to the **why** you want it done, which you should have put into the ticket's summary and description). + + #. Hit "submit changes". + +#. At this point, you need to wait for feedback. If your patch is very good, very simple, and obviously correct, we may just apply it, but it is ''very unlikely'' that the first draft of a patch will be accepted as-is. When a Twisted developer reviews your patch, they will re-assign the ticket to you; you can `see the list of tickets assigned to you by clicking here `_. Unfortunately, the time it takes us to deal with a ticket submitted for review is highly variable, and depends on how many other tickets are waiting review, the amount of free time that the Twisted core development team has, and how many resources we have available for `sponsored development `_. + +#. When you do receive a review comment, push changes to your branch which address that feedback, then place the ticket back in review. + +#. When placing the ticket back for review, make sure your branch is up to date with latest trunk, and that there will be no merge conflicts. + +#. Don't push your changes by rewriting the history, merge trunk into your branch. + + +Getting Your Patch Accepted +--------------------------- + +If you are interested in contributing to Twisted for the first time, consider working on an existing ticket rather than contributing a new feature. Fixes for existing problems or implementations of already-requested features will generally take priority over new ideas. Consider discussing the work you want to do with `other Twisted developers first `_. + +Familiarize yourself with project policies and coding standards and make sure your full contribution (code, test, documentation, design) adheres to it. See: `Policies <#policies>`__. + +There are a couple of tools to help with automatic policy checks. +Make sure there are no errors when running these tox environments (or equivalent checks): + +``$ tox -e lint,black,newsfragment,manifest-checker`` + +Make sure that you have written unit tests and docstrings for all code which has changed in your patch. It works best if you use test-driven development to write your patch initially, and write your tests before your code. (Believe me, if you write your tests after you write your code, we ''will'' know. It's more obvious than you think.) + +Run the full test suite ''before'' submitting your patch, and fix any problems you discover. If a reviewer notices failing tests, they may not give your code a deep look, and you may have to wait longer for a second review. See: `Tools for development <#tools-for-development>`__. + +Some users may discover that their system is unusual and Twisted's test suite **does not pass** "out of the box". If this is the case, just make sure that the **same** tests are failing for you in a pristine checkout of trunk and with your changes applied. Then, in addition to submitting your patch, please let us know about the problem with the test suite! + +Tools for Development +===================== + +There are a few useful tools for developing Twisted. Some of them are included with Twisted, some are third-party dependencies. + +Command from this section assume that you run them from withing Twisted source code checkout root. + +To run the tests, simply run `trial twisted`. Make sure you run trial command that comes with twisted source code and not the one provided by your operating system. + +To generate the narrative documentation or API documentation, see `the wiki page on Twisted documentation `_. + +After every commit to Twisted, the buildbot runs all the unit tests and reports `test results on several platforms `_. Here is a page showing only the `test results on supported platforms `_. All tests on supported platforms always pass. Watch the buildbot. Because sometimes, the buildbot watches back. + +Runtime and development dependencies +==================================== + +Required and optional dependencies are now documented inside the source code _EXTRAS_REQUIRE variable + +Some optional dependencies are not yet documented and they are presented here: + +* pygtk (or pygi or pygobject or something) is required for the gtk class of reactors +* wxpython is required for wxsupport / wxreactor +* gadfly, sqlite, pypgsql, psycopg, mysqldb, kinterbasdb (at least one) are required for twisted.enterprise.adbapi +* SOAPpy is required for Twisted Web's SOAP support +* pypam is required for twisted.cred PAM integration + +And there are some additional development tools: + +* subunit is required for trial's subunit output plugin +* cython is required to update iocpreactor and some Failure unit tests + +Tickets management +================== + +All changes to source code require a ticket. + +If you file a new ticket, please start with a clear description of **why** such a change is desirable. +We can read your attached code to find out **what** you are doing, but we can't read your mind to figure out why you want it done! + +A Twisted ticket can be of one of three types. + +* **Enhancements** are used for feature additions. These typically take the form of a new API or an expansion of an existing API. Enhancement tickets should clearly describe the desired feature. The more well specified a feature is, the more likely it is to be implemented (and importantly, the more likely it is that what is implemented will actually be what the reporter wanted!) and the easier it is to implement. Remember that the ticket is possibly the only persistent record of the feature request. If it is not self-contained and sufficiently detailed, then it will likely fail to communicate the reporter's idea, diminishing its value (possibly all the way down to zero). + +* **Defects** are used to track bugs in existing APIs. Defect tickets are easier to specify than enhancements. A defect should briefly describe the problem, but the bulk of the ticket should be a runnable program (ideally in the form of a unit test) which demonstrates the bug. + +* **Regressions** are similar to defects, but are for bugs which are introduced into APIs in newer releases of Twisted. Like defect tickets, regression tickets should have a runnable program attached to demonstrate the problem. + +* **Release blocker: regression** a ticket which blocks the release of the next Twisted version due to a regression. + +* **Release blocker: wrong release notes** a ticket which blocks the release of the next Twisted version due to a problem in the release notes. + +* **Release blocker: release process bug** a ticket which blocks the release of the next Twisted version due to a problem/issue/defect in the release process itself. + +A ticket can have attached the following official tags `BugKeywords `_. + +There are some UsefulQueries for finding issues in the tracker. + +.. _policies: + +Policies +======== + +This series of documents is designed for people who wish to contribute to the Twisted codebase. + +* `Development policies `_ + +* `Naming Conventions `_ + +* `Epytext `_ for docstrings format + +* `ReStructuredText and Sphinx `_ for narrative documentation. + +* `Security `_ + +* `Philosophy `_ + +* `Review Process `_ + +* `Contributor Advancement Path `_ + + +Wiki pages maintenance +====================== + +Changes to wiki pages don't require a ticket. + +To prevent spam-bots, newly registered accounts don't have write access for wiki pages. + +If you want to edit wiki pages, ask for write permission via one of `community communication channel `_ . Please mention your Trac username. + + +Win32 development +================= + +If you want to hack Twisted on Win32, see Ying Li's `short tutorial on setting up a Twisted win32 development environment `_; but note that it describes getting the code with Subversion and you will currently need to use Git. + +Twisted Maintenance +=================== + +You might be interested in learning about tasks related to maintaining this website? or for `releasing Twisted `_. diff --git a/content/pages/Twisted/TwistedMatrixLaboratories.rst b/content/pages/Twisted/TwistedMatrixLaboratories.rst new file mode 100644 index 0000000..580211a --- /dev/null +++ b/content/pages/Twisted/TwistedMatrixLaboratories.rst @@ -0,0 +1,83 @@ +Twisted Matrix Laboratories +########################### + + +... is a loosely-affiliated group of hackers from around the globe, working on software together. Much of this software is to facilitate interaction between geographically disparate people -- infrastructure for massively multiplayer games, personal information spaces, and other "places you can be" on the internet. Some of it is also used to target a wide array of powerful lasers in geosynchronous orbit, to prevent a massive outbreak of the whitespace-eating nanovirus from the future. + +Comprised of ninjas, rogue temporal authority enforcement agents, ancient greeks, and supernatural forces from Mesopotamia, the Labs is concerned with bringing you the highest-quality internet available anywhere south of Bordeaux (or north of Oulu). Therefore all Twisted developers are required to CLASSIFIED. + +The Matrix +========== + + **Glyph "Glyph" Lefkowitz** : glyph (at) twistedmatrix.com + electric violin + **Jean-Paul "exarkun" Calderone** : exarkun (at) twistedmatrix.com + geopolitical sociographic dissonance engine + **Christopher "radix" Armstrong** : radix (at) twistedmatrix.com + percussion + **Thomas "therve" Hervé**: therve (at) free.fr + nuclear ocarina + **Paul "z3p" Swartz** : z3p (at) twistedmatrix.com + oboe + **Allen "Dash" Short** : washort (at) twistedmatrix.com + vocals and guitar + **Jonathan "jml" Lange** : jml (at) twistedmatrix.com + pipe organ + **Ralph "ralphm" Meijer**: twisted (at) ralphm.ik.nu + vocals and timbales + **Pavel "!PenguinOfDoom" Pergamenshchik** : ppergame (at) gmail.com + electronic balalaika + **[wiki:People/DuncanMcGreggor Duncan "oubiwann" McGreggor]**: oubiwann (at) twistedmatrix.com + Calabi–Yau manifold-pipes + **Andrew "spiv" Bennetts** : andrew (at) bemusement.org + glockenspiel + **Itamar "itamar" Turner-Trauring** : itamar (at) itamarst.org + alto recorder + **Stephen "jerub" Thorne**: jerub (at) twistedmatrix.com + trumpet + **Kevin "Acapnotic" Turner** : acapnotic (at) twistedmatrix.com + trombone + **Donovan "fzZzy" Preston** : dp (at) twistedmatrix.com + bass and harmonium + **Jürgen "snibril" Hermann** : jh (at) twistedmatrix.com + synthesizer + **Moshe "vertical" Zadka** : moshez (at) twistedmatrix.com + accordion + **Benjamin Bruheim** : grolgh (at) online.no + kazoo + **Travis B. "Nafai" Hartwell** : nafai (at) twistedmatrix.com + keyboards + **Gavin "skreech" Cooper** : gavin.cooper (at) gmail.com + torque wrench + **Bob "etrepum" Ippolito** : bob (at) redivi.com + low frequency oscillator + **Jonathan D. "slyphon" Simms** : slyphon (at) twistedmatrix.com + theramin and drums + **Brian "warner" Warner** : warner (at) twistedmatrix.com + hertzian field renderer + **Mary Gardiner** : mary-twisted (at) puzzling.org + krummhorn + **Eric "teratorn" Mangold** : teratorn (at) twistedmatrix.com + serpentine bassoon + **Tommi "Tv" Virtanen** : tv (at) twistedmatrix.com + didgeridoo + **Justin "justinj" Johnson** : justinj (at) twistedmatrix.com + bass mandolin + **Sean "Riley" Riley** : sean (at) twistedmatrix.com + grand piano + **Thijs Triemstra** : info (at) collab.nl + TR-909 + **Jessica "jesstess" McKellar** : jesstess (at) mit.edu + Moog + **Laurens "lvh" Van Houtven** : lvh (at) twistedmatrix.com + SID 8580 R5 + **Amber "HawkOwl" Brown** : hawkowl (at) atleastfornow.net + kookaburra whistle + + +Extras +====== + + Jerry Hebert : jerry (at) cynics.org + Nick Moffit : nick (at) zork.org + Jeremy Fincher diff --git a/content/pages/Twisted/TwistedProject.rst b/content/pages/Twisted/TwistedProject.rst new file mode 100644 index 0000000..9c159a7 --- /dev/null +++ b/content/pages/Twisted/TwistedProject.rst @@ -0,0 +1,26 @@ +Twisted +####### + + +Twisted is a networking engine written in Python, supporting numerous protocols. It contains a web server, numerous chat clients, chat servers, mail servers, and more. + +Twisted is made up of a number of sub-projects which can be accessed individually through the `twisted projects index `_. + +Twisted is available under the `MIT Free Software licence `_. + +Downloads +========= + +See the `Downloads `_ page. + +Documentation +============= + +`All sorts of documentation `_ is available for Twisted, including a complete `API reference `_ of Twisted and all subprojects. + +Contact +======== + +Subscribe to the `twisted-python `_ mailing list or visit the #twisted channel on irc.libera.chat to ask questions. + +You can browse the `Twisted Core tickets `_. Furthermore, if you `login `_, then you can `report a bug `_ or `request a feature `_ using the issue tracker. diff --git a/content/pages/Twisted/TwistedSoftwareFoundation.rst b/content/pages/Twisted/TwistedSoftwareFoundation.rst new file mode 100644 index 0000000..3b9e57a --- /dev/null +++ b/content/pages/Twisted/TwistedSoftwareFoundation.rst @@ -0,0 +1,105 @@ +Twisted Software Foundation +########################### + + +.. _Software Freedom Conservancy: http://sfconservancy.com/ + +The name "Twisted Software Foundation" is a reference of convenience to our sponsorship by `Software Freedom Conservancy`_, a 501(c)3 non-profit organization. Conservancy has allowed us to pool organizational resources with other projects, such as Inkscape, Samba, and Wine, in order to reduce the management overhead associated with creating our own, dedicated legal entity. + +Background +========== + +At the end of January, 2008, the Twisted project finalized a sponsorship agreement with `Software Freedom Conservancy`_. For years prior to this, we had explored the options available to us for creating a foundation; due to our lack of resources, time and money, they were all prohibitively expensive. At the urging of individuals and organizations, we again explored other options. This most recent effort was a culmination of hard work over the last year between the Twisted project and the Conservancy, and we are delighted to present the results to the community: "Twisted Software Foundation". + +Goals +===== + +Our goals are simple: we want to be able to continue improving Twisted -- everything from code reviews to specialized bug fixes to paying hosting bills -- for the benefit of the community, the users of Twisted. We want sponsors to be able to make tax-deductible donations, and we want to provide a dedicated forum (initially, a sponsors-only mail list) where our sponsors can give voice to their own vision of how Twisted can be better. + +Sponsors +======== + +For a list of our current sponsors, visit here `out sponsorship page `_. + +Benefits of Sponsorship +======================= + +You (or your company) can become a Twisted Sponsor! Here are some of the benefits: + +* You (or your company) are contributing to an extraordinary open source project. + +* If you are a Silver Sidewinder or higher-level sponsor, your name and/or logo will be placed on the front page of Twisted's site for twelve months from the time of donation. + +* All sponsors will have their name and/or logo placed on Twisted's Sponsors page for twelve months from the time of donation. + +* Community consciousness of your company (and its use of Twisted) will be increased in the minds of the wider Twisted community. + +* Contributions are tax-deductible. + +Logos +===== + +Logos on the front page will only be there for the year that a sponsor has donated. Each year starts fresh again, with an opportunity to get your logo at the top by early sponsorship! + +Logo Requirements +================= + +Logos must be 160 pixels wide and 80 pixels tall. + +Sponsorship Levels +================== + +Below are the names and amounts associated with levels of sponsorship (as of May 1, 2013): + +* Diamondback: $20,000 and up + +* Platinum Python: $10,000 + +* Golden Tree Snake: $5,000 + +* Silver Sidewinder: $2,000 + +* Copperhead: $1,000 + +* Aluminum Adder: $100 + + +Non-Monetary Donations +====================== + +The Twisted Project will consider the value of non-monetary donations to the project - for example, donations of hardware, software licenses, or hosting - on a case-by-case basis. But, as a general rule, $5 worth of services will correspond to $1 of cash for sponsorship purposes. We note that non-monetary donations may not be tax-deductible; to confirm, you should seek the counsel of a qualified tax professional. In general, we suggest cash donations, as that process is much simpler. + +How to Donate +============= + +All donations to Twisted are collected by `Software Freedom Conservancy`_ , a tax-exempt 501(c)(3) organization and the corporate home of the Twisted Project. Conservancy maintains a restricted account for the Twisted Project's use. + +If you would like to participate in Twisted's Sponsorship program: please note that Aluminum Adder sponsorships are accepted only via the PayPal widget below. For sponsorships of Copperhead and higher, we welcome you to contact `accounting@sfconservancy.org` to coordinate payment methods by ACH or wire, so that we can avoid credit card fees and put more of your donation to work for Twisted! However, if you prefer PayPal, do feel free to use the PayPal widget to make your donation. + +.. raw:: html + +
+ + + + +
+ + + +
+ +If you would prefer to cut a check, you may do this as well. Make the check payable to "Software Freedom Conservancy" and write "Directed Donation for Twisted" or "Sponsorship Donation to Twisted" in the "memo" field. Checks should be sent to the following address: + +Software Freedom Conservancy, Inc. +137 MONTAGUE ST STE 380 +Brooklyn, NY 11201-3548 + +If you would prefer to make other arrangements (e.g., your corporation requires the use of a purchase order, even when donating to a charity), contact us at ``twistedsponsor@sfconservancy.org``. diff --git a/content/pages/Twisted/TwistedSponsors.rst b/content/pages/Twisted/TwistedSponsors.rst new file mode 100644 index 0000000..96d3a22 --- /dev/null +++ b/content/pages/Twisted/TwistedSponsors.rst @@ -0,0 +1,38 @@ +The Twisted Project Sponsorship Program +####################################### + + +We want to continue to invest in and improve Twisted -- for the benefit of our users, and the public at large. We can't do this without the support of our sponsors and, as a project, we want to publicly acknowledge certain donations through our revamped Twisted Project Sponsorship Program. + +For more information about becoming a Twisted Sponsor, click `here `__. + +Golden Tree Snake +================= + + +Silver Sidewinder +================= + +.. raw:: html + +

+ +Copperhead +========== + + +Aluminum Adder +============== + +.. raw:: html + +

+ +

+ +

+ +

+ + +For information on Twisted's founding sponsors, click `here `__. diff --git a/content/pages/UltimateQualityDevelopmentSystem.rst b/content/pages/UltimateQualityDevelopmentSystem.rst new file mode 100644 index 0000000..3426912 --- /dev/null +++ b/content/pages/UltimateQualityDevelopmentSystem.rst @@ -0,0 +1,174 @@ +Ultimate Quality Development System (UQDS) +########################################## + + +Divmod has been developing software for several years, and over the course of that time, we have developed a methodology, which involves a ticket discipline and a suggested use for a version control system. It is extremely lightweight and "agile", and can be combined as a component of any other methodology which breaks down work into individual tasks. + +The briefest summary of the requirements for UQDS is that every task has 3 absolutely required steps. + +* A task is created in an issue tracker and assigned to a worker. +* The worker does work, and creates a change-set to be applied to the mainline revision control system. (This can be represented as either a branch or a patch file.) +* A reviewer reviews the completed work, and provides feedback: at least one good thing about the work, at least one area that needs improvement, and a judgement as to whether the good qualities ultimately outweigh the bad, i.e. whether the branch should be merged. + +The principles involved are: + +* Most importantly, **all** work on a project must be reviewed by at least one person. In conjunction with XP's PairProgramming, this provides a minimum of 3 involved parties to every change. Especially on small teams, this eliminates the possibility of finger-pointing, and increases the whole team's awareness of the project in general. Also, it addresses an area of code-review that PairProgramming does not: i.e. a decision might make sense at the time in the microcosm of some problem being solved, but be hard to explain or justify in the context of the larger project. This provides an after-the-fact opportunity to verify that public methods are documented, debug prints are removed, and comments actually make sense to someone who wasn't present when the code is being written. +* **All** work on a project must be represented as changes to a version control system. This most popularly applies to code, but in an ideal application of this methodology, designs, documentation and even plans could be added to the repository. We are currently not quite so strict. +* **All** work on a project must be represented by tickets in a ticket tracker. If it's not in the tracker, you shouldn't be working on it. This provides a way to manage distractions and continuously re-focus on what's really important. +* **All** development is done on branches - no development is done on the ``trunk``. The ``trunk`` can be used to see branch differences, run test suites, build distributions, etc., but is not used for development. This may seem odd, but there are numerous reasons why it is a good idea (see below). + +The lifetime of a task in UQDS in practice (using `Git `_ and `Trac `_) looks something like this, with a developer ``dev`` and a reviewer ``rev``. + +* A ticket is created in the issue tracker. +* For features, a specification is attached to the ticket. For defects, reproduction instructions. +* The developer who is assigned the task "accepts" the task, by changing its state to "accepted". +* A branch is created in Git. The branch is named with the convention -[-]. (For smaller patches, or work done by non-committer developers, this and the next step can be omitted. The developer can attach a patch to the ticket instead of creating a branch.) + +.. code-block:: console + + dev@strange$ git checkout -b 123-sprocket-fire trunk + +* Development occurs to implement the feature or resolve the defect in the branch. +* When the code is deemed ready by the developer, the developer checks in their changes **on the branch** (not the trunk). +* The branch is then assigned to another developer for review. The ticket should be given the keyword "review", assigned to the reviewer and the priority set to "highest". +* The reviewer switches to the branch, then merges it locally, to review it in the context of how it will change trunk. + +.. code-block:: console + + rev@charm$ git checkout trunk + rev@charm$ git pull + rev@charm$ git merge --no-ff --no-commit 123-sprocket-fire + rev@charm$ git diff --staged + +* (If the patch does not merge cleanly, the reviewer may reassign to the developer to merge/rebase before reviewing again. Branches and patches must always be sufficiently recent that they will apply cleanly to trunk in order to be considered for review). +* The reviewer runs all automated tests. + +.. code-block:: console + + rev@charm$ trial twisted + +* The reviewer verifies that the code makes sense, has unit tests, has documentation, updates any existing documentation that is affected, and actually resolves the issue in question. +* If any more work is required, the reviewer reassigns to the developer explaining what else needs to be done in a ticket comment. The reviewer can use ``git merge --abort`` to back out of the merge if the branch changes are not acceptable. When this process has been repeated enough times that all the tests pass and the reviewer is satisfied, they re-assign to the developer for merging, and the developer merges. + +.. code-block:: console + + dev@strange$ git commit -m " + A brief description of the sprocket feature. + + Author: dev + + Reviewer: rev + + Fixes #123 + + A detailed description of the sprocket feature. + " + + dev@strange$ git branch -d 123-sprocket-fire + dev@strange$ git push -d origin 123-sprocket-fire + +* the "fixes" note in the commit message automatically resolves the ticket with a status of "fixed". Voila! Our feature is implemented and ready in trunk. + +Branch lifetimes should be short. If trunk moves very far from the branch, the branch should be rebased or merged to pick up bug fixes and feature enhancements which might be useful. Doing this also makes the final merge easier, by keeping conflicts small and bringing them to the developer's attention before they become unmanageable. + +Why Branches ? +============== + +The most recent version of source code in the repository should always be working. That makes it a lot easier to deploy fixes and tweaks quickly. However, sometimes you need to check in code to test it on a different machine, or show it to a different developer. A version control system is useful in many ways, and if you only have one branch, these purposes conflict. + +Here are some of its features. + +Keep ``trunk`` Working +---------------------- + +The most recent revision of a piece of software, that is, ``trunk@HEAD`` should always work. Any new developer should be able to check out the most recent version and immediately start working, without worrying that the build is broken this week. + +With branch-based development, features are only merged to trunk after they have been tested and reviewed by at least one other developer. + +Switch Developers Mid-Feature +----------------------------- + +If a developer gets stuck because it turns out that part of a feature is outside their expertise, they can easily put code that they know is broken into a branch, then indicate that branch to another developer and reassign the ticket, without breaking trunk. + +Provide Useful Progress Information to Management +------------------------------------------------- + +Branches directly correspond to user-facing tasks. A quick look at the list of branches should indicate to managers what is actually going on. If there are a lot of branches (more than twice the number of developers, let's say), that means that the team's efforts are getting diffuse and they need to focus more and get branches merged. If branches are being turned over quickly, it means that tasks are being completed quickly. + +Mechanism for Code Review +------------------------- + +Usually `CodeReview `_ is done by module, and only after the fact. While this practice is useful, it only raises problems that already exist, it doesn't prevent them. + +By reviewing each branch as a change, rather than a module, problems are spotted earlier on, and developers can work on any modules that are necessary for a particular task, with no worries that the maintainer won't notice - on a larger team, any module maintainers should be asked for review. + +This is also a low-friction review process. Rather than submitting a branch for review and discussing it interactively, a developer may accept a ticket, start a branch, commit a few times, finish, put the ticket into review, move on to an unrelated branch, repeat, put that branch into review, then check their assigned tickets at the end of the day and merge any branches which have been accepted before finishing for the day. + +Generate a Meaningful Changelog +------------------------------- + +Often, source control logs are riddled with nonsensical, tiny changes. "twiddled whitespace", "added a few docstrings", etc. Because it's good to commit frequently to avoid losing too much work or generating monolithic changes, this is hard to avoid. Commit messages generate a bottleneck to getting work into the repository, which is bad. + +If every branch has a clear purpose, then only ''merges'' need have useful, descriptive commit messages, and since no code is changing when a developer is doing a merge to trunk, they can take all the time they need to come up with a good message. This means that the changelog generated directly from a revision log of trunk (as opposed to the whole repository) is likely to be useful as a changelog. + +Tangentially related, commit messages for merges should include at least three pieces of information: + +* The author of the branch. +* The reviewer of the branch. +* The tickets which the branch resolves or relates to. + +Revert Useful Units +------------------- + +If something ''does'' break trunk, you can revert it with one command, rather than sifting through piles of related commit messages and trying to assemble a useful revert. It's "revision 1234", not "revision 1232, 1237, 1239, 1246, and I think maybe 1255 too, you should run the tests both ways". + +Merge When You're Merging, Not When You're Hacking +-------------------------------------------------- + +If you are working directly in trunk, any update may cause conflicts which you have to immediately resolve before you can continue working. With branches, a smaller number of developers can work on a branch, knowing that their changes won't conflict, and update regularly. + +That means you are never interrupted with an unpleasant required merge. Your code is always in the repository ''before'' you worry about merging it with other people's changes, so there is no concern that although your code was working before you were ready to commit, the merge went badly and you never committed in a working state. + +Develop on a Preferred Platform, Test on Another, Disturbing No-one +------------------------------------------------------------------- + +If a developer prefers to code in a Unix environment but needs to add a feature for Windows, they can create a branch, happily work on it under Unix, commit the changes (to the branch), go to a Windows machine and update the branch, test it, repeat etc. This allows one developer to work in private on several machines, using the revision control system in a disciplined and effective way that precludes accidents passing patches or updates between machines, and which has no impact on other developers. + +Cover yourself +-------------- + +If adding a feature or fixing a bug takes a significant amount of time, at some point you're going to want to make sure your changes so far +are backed up. If you're working on the trunk you clearly can't check them in. So you're forced to take a more manual and probably +more error-prone approach to make a backup of your local changes. If instead you're working in a branch, you can just check in your +changes so far - without disturbing the trunk. Of course if there are multiple developers working on one branch, you'll need to do something +else (like work on a branch of a branch). In the simple situation where you're alone on a branch, you can easily save your progress +so far back to the repository and have it be the backup of your work to date on the branch. + +Some Thoughts on Things I Don't Know Anything About +--------------------------------------------------- + +While this process works very well for us on Python code, more heavyweight development environments might find it even more valuable. For example, if it takes an hour-long build process and 20 minutes of testing to determine whether trunk is in a good state, branch-based development could be even more valuable. + +Even if you already have awesome automated tests, branches can speed things up immensely. Let's say Foo Co. has 30 developers and an hour long build and 20 minutes of unit tests. Jethro checks in some broken core header file to trunk and goes to lunch. The automated tests start building and running. Alice, preparing to commit, updates. She receives Jethro's broken changes. Alice, being a better developer than Jethro, runs the tests. She waits 20 minutes. The build is broken! She can't commit, since she doesn't want to break trunk. (All this while, precious hours of work are sitting on Alice's disk, not backed up in the repository...) + +Meanwhile, everyone else in the company has updated, and jethro returns from his early lunch. Thus far, 30 developers * (1 hour of build + 20 minutes of tests) = 40 man hours have been wasted. Everyone knows it was Jethro when he gets back because the build indicates failure on a revision he checks in, but now all 30 developers are standing behind his desk, waiting for him to get trunk back into a working state and test the fix so they can get back to work. That requires ''at least'' another 1:20 of time waiting for the automated tests before Alice can commit her changes. + +Much of this waiting could have been circumvented if Jethro had checked his changes into a branch, and then asked the automated test system to run tests for him, and maybe had one other developer review it for him. By the way, Buildbot has this feature, as do many other CI systems. + +Questions +========= + +* "Why branches" isn't as interesting to me (''meaning Jonathan Lange'') as "Why tickets". One of the things about UQDS that surprises people who do branch-based development is that it insists on putting all information about a change in a single ticket. Why not have feature discussion and code reviews on mailing lists, and then link to those discussions from the ticket? Or perhaps the ticket thing isn't as "core" to UQDS as branches? + * This needs to be integrated more clearly into the body of the document, but actually, tickets are ''more'' core to UQDS than branches. This is one of the reasons I changed the name from "branch based development" to "UQDS". Branches are just a mechanism for sharing work that's in progress; you can still more or less follow the ''process'' (while still taking the greater risk of losing work) just by exchanging and reviewing patches. The ticket/not-a-ticket distinction, however, is key; it's the way the whole process starts. + + At some point, someone in "management" needs to decide that it's worth spending development resources on a particular task. The particulars of who can make this decision, how it is made, when it is scheduled (etc, etc, etc) can differ in the extreme from project to project, but at some point it does need to be made. Tickets are an explicit way of recording "this is work that should happen". It's important to have an explicit, single mechanism for making this distinction, between "stuff we're just talking about" and "stuff somebody should really do some work on", specifically because of the huge number of differences between the way that these discussions are carried out on different projects. Mailing lists are good because at least the discussion is recorded, but when you are communicating with people via mailing lists, via comments on tickets, via commit messages, via IRC, via phone conversations and via in-person meetings, everyone can have a different interpretation of what should be worked on and when. + + A ticket tracker (whatever its form) is a single unambiguous place where a unit of work can be named and identified, committed to, and tracked. If your team has conventions for making these decisions on a mailing list crystal clear, and unambiguous terminology or conventions for identifying tasks, then your mailing list ''is'' a ticket tracker. On a consulting project, clarity becomes especially critical, because the client is always hoping that they can get a few extra features in for free, and will ambiguously talk in meetings about features that have not been agreed upon. In a community project it seems that vagueness is a problem that you can live with, since anyone can file tickets and decide to do some work on their own anyway; however, I've found that once you start doing the rest of UQDS, this clarity becomes especially important because it becomes more likely that someone will go off and implement something on their own, then file a ticket and not understand why it's getting rejected. A ticket provides a much clearer record of the proposal and the rejection for future developers to look at than a mailing list discussion, because structured information accompanies the comments. + + As far as your question about why to actually record these things in a specific ticket tracker, like Trac, rather than using mailing lists for the discussion and then linking to it, this is simply an issue with deficiencies of the technologies. Trac is a pain in the ass, Pipermail is a pain in the ass, bugzilla is a pain in the ass, launchpad is a pain in the ass, reviewboard is a pain in the ass, IRC log bots are a pain in the ass. Web browsers in general are a pain in the ass. These things have slightly varying levels of terribleness, but we can cope. However, the more of them that you pile on top of each other, the worse the tangle becomes. + + If you're running a UQDS project on SVN and Trac, let's say, your users must already be proficient with their web browser, the trac UI, SVN commands, 'patch' and 'diff', just to deal with the basics of the process, let alone the skills they need to actually work on the code. + + Adding a mailing list to this process means that you have now added ''at least'' an email client, the mailman UI, the pipermail UI, and a way to get from the email client UI to the message archive UI to generate links, plus some new magical markup in trac to generate appropriate-looking hyperlinks between ticket comments and email messages. (Plus, you need a new username and password!) Given a bunch of poor choices for what to do about reviews, putting discussions into the body of trac comments seems the least poor to me. + + As far as I'm concerned, though, you could follow UQDS to a T and get all the concomitant process benefits with separate technologies for tracking tasks, discussions, reviews, and specificationsm, and linking them all together. In fact, ideally, that is how it would be done, but building such a system is highly challenging, and doing it so that I'd actually think the UI was any good would probably involve being an IDE-integrated piece of client software with a very discoverable UI that offers frequent, subtle suggestions for the next thing to do. I would hope that web access to such a thing would be entirely read-only - if I fill out one more HTML form in my life, it will be too many times. --Glyph diff --git a/content/pages/Users/index.rst b/content/pages/Users/index.rst new file mode 100644 index 0000000..7a63ee4 --- /dev/null +++ b/content/pages/Users/index.rst @@ -0,0 +1,2 @@ +Placeholder for Users Directory +############################### diff --git a/content/pages/WebDevelopmentWithTwisted.rst b/content/pages/WebDevelopmentWithTwisted.rst new file mode 100644 index 0000000..4cbfef1 --- /dev/null +++ b/content/pages/WebDevelopmentWithTwisted.rst @@ -0,0 +1,50 @@ +Web Development with Twisted +############################ + + +There are a number of packages in and around Twisted that do things with the web: + +* `Twisted Web `_ provides a simple, stable HTTP server, suitable for all types of web apps and web services. It provides a flexible resource publishing API, and implements HTTP 1.0 with some 1.1 features. **Twisted Web is extremely stable.** +* `Divmod Nevow `_ is a templating toolkit that provides its own resource model and simple application server API. It requires Twisted, is fully integrated with the Twisted reactor, provides mechanisms for asynchronous page rendering, and an event-driven `COMET `_ /AJAX implementation called `"Nevow Athena" `_. Nevow uses Twisted Web, but provides its own request objects and resource model on top of it. +* `Divmod Mantissa `_ is a full-featured multi-protocol application server, with a built-in object database, authentication model based on Twisted Cred, a capability-based security model, and many more features. It integrates Nevow (and therefore Twisted Web) and a number of other Twisted-related technologies to provide a full-featured system. + +So You Want To Be A Web Developer +================================= + +Having reviewed this list, the obvious question is, *which of these tools should I use for my application???* The short answer is: "It depends." + +You can always ask about these kinds of issues on the `Twisted Web mailing list `_, but here's a cheat-sheet that you may want to read in advance, listing some of the things that you might want to be doing with Twisted and the consensus as to the correct (or multiple possible correct) solutions for each case. + + +I want a container for my WSGI application +------------------------------------------ + +In this case, **use the Twisted Web (8.2 or newer) WSGI module** (``twistd web --wsgi=application``). + +I want a web UI for my existing Twisted networking application +-------------------------------------------------------------- + +Assuming that your networking application has its own data persistence, or does not require persistence, and needs a web-based control panel or monitoring UI, you probably want to **use Nevow** Nevow provides backwards compatibility between releases (as does Twisted Web, on which it is built), just like all Twisted projects. It also provides a templating system which makes implementing user interfaces that integrate with the event loop much easier than coding directly to the Twisted Web API. Nevow also has support for the AJAX and COMET, via Nevow Athena. Athena lets you take advantage of the event loop on multiple levels; you can push events from network triggers straight out to a web page. + +I want to write a REST / WS-* interface to my Twisted application +----------------------------------------------------------------- + +In this case your best bet is to **use Twisted Web** directly. You won't need XHTML templating, so Nevow buys you little extra. + +Twisted Web already has basic support for XMLRPC and SOAP, and it is fairly straightforward to set up a web service. Twisted Web also provides various facilities for being set up behind a reverse-proxy, which is the suggested mechanism to integrate your Twisted application with an existing site. + +I Want a Web Framework +---------------------- + +AKA + +I want to write a Wiki +~~~~~~~~~~~~~~~~~~~~~~ +I want to write a blog +~~~~~~~~~~~~~~~~~~~~~~ +I want something to compare to Flask or Django or Ruby on Rails +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The short version is that this is more complicated in Twisted than in other tools at the moment. Sadly, you aren't going to find a straight-up competitor with the sort of polished web presence and easy instant integration with your SQL database and existing environment that the aforementioned products offer. + +`Divmod Mantissa `_ is a full-featured Twisted-powered application server and will likely appeal to you if you want an integrated database and other high-level framework support. diff --git a/content/pages/WhyShouldICare.rst b/content/pages/WhyShouldICare.rst new file mode 100644 index 0000000..acc0461 --- /dev/null +++ b/content/pages/WhyShouldICare.rst @@ -0,0 +1,29 @@ +What Twisted Is +############### + + +Twisted is an asynchronous framework designed specifically around networks and databases. This allows for concurrency without requiring the use of forking processes or spawning threads. Now, this obviously does not come without some additional work, especially if you're used to using one of the other methods. + +For a simple program that only is concerned about doing exactly one thing at one time, standard synchronous blocking programming will do just fine. + +Note: Getting/sending information from/to a server while displaying and repainting a GUI is actually two things. + +Python +------ + +Python is well known in the computer science industry for promoting readability, increased maintainability, and high levels of productivity. For more information see `python.org `_. + +Scalable +-------- + +On the other hand, if you put in a little more work upfront, things like scaling becomes a much easier issue. + +Note: This includes scaling up to more simultaneous requests or scaling down to lower powered systems. + +The Proof +========= + +Okay, you've made all these claims, but where's the proof? + +* `Success Stories `_ - See what others say about Twisted +* `Software that uses Twisted `_ - See who uses Twisted diff --git a/content/pages/WindowsBuilds.rst b/content/pages/WindowsBuilds.rst new file mode 100644 index 0000000..e31d4b2 --- /dev/null +++ b/content/pages/WindowsBuilds.rst @@ -0,0 +1,28 @@ +Building Twisted on Windows +########################### + + + +This contains information for building Twisted on Windows + + +Installation requirements +========================= + +You will need a standard Python 3 dev environment. See the official documentation at https://docs.python.org/3/using/windows.html + +Download Visual Studio Installer and get the following components for C++ build tools (might use newer versions): + +* MSVC v142 - VS 2019 C++ build tools +* Windows 10 SDK + +You can get Python 3 via nuget. + +Also get Git for Windows. + +Dev process +=========== + +Make sure pip script is installed with ``python -m pip install -U pip`` as the default python might be created with only the pip module and without the pip script. + +Then you can do the standard ``pip install -e .[dev]`` From a49ebcaa06ff144ce91d46aa46048ecddd8812a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Juge?= Date: Sun, 20 Feb 2022 14:12:46 +0100 Subject: [PATCH 3/4] Add sponsors logos --- .../Appropriate-Solutions-Inc.gif | Bin 0 -> 2882 bytes .../founding-sponsors-logos/Contentinople.jpg | Bin 0 -> 27614 bytes images/founding-sponsors-logos/ExpanDrive.gif | Bin 0 -> 2992 bytes .../founding-sponsors-logos/ITA_logo_160x80.jpg | Bin 0 -> 5408 bytes .../InternetEvolution.jpg | Bin 0 -> 26104 bytes images/founding-sponsors-logos/LightReading.jpg | Bin 0 -> 31068 bytes images/founding-sponsors-logos/adytum.png | Bin 0 -> 8050 bytes images/founding-sponsors-logos/allmydata.jpg | Bin 0 -> 3878 bytes images/founding-sponsors-logos/bazaar2.png | Bin 0 -> 8660 bytes images/founding-sponsors-logos/canonical.png | Bin 0 -> 6493 bytes images/founding-sponsors-logos/chesspark.png | Bin 0 -> 10366 bytes images/founding-sponsors-logos/dcitlogo.png | Bin 0 -> 10315 bytes .../divlogo4_8_w160_banner.jpg | Bin 0 -> 36785 bytes .../flumotion-logo-160x50.gif | Bin 0 -> 1243 bytes .../founding-sponsors-logos/hwebtsf160x80.png | Bin 0 -> 7292 bytes images/founding-sponsors-logos/hydra.png | Bin 0 -> 55202 bytes images/founding-sponsors-logos/lucasfilm.jpg | Bin 0 -> 7315 bytes images/founding-sponsors-logos/microsoft.png | Bin 0 -> 10449 bytes images/founding-sponsors-logos/onresolve3.png | Bin 0 -> 11089 bytes images/founding-sponsors-logos/seafelt.png | Bin 0 -> 7457 bytes .../founding-sponsors-logos/securitymetrics.png | Bin 0 -> 6238 bytes images/founding-sponsors-logos/sun.png | Bin 0 -> 13417 bytes images/founding-sponsors-logos/tummy.png | Bin 0 -> 7929 bytes images/founding-sponsors-logos/zenoss.gif | Bin 0 -> 7287 bytes .../sponsors-logos/Atlassian-hipchat-logo.png | Bin 0 -> 3661 bytes images/sponsors-logos/CouponDC.png | Bin 0 -> 6218 bytes images/sponsors-logos/Variomedia-rescaled.png | Bin 0 -> 7008 bytes images/sponsors-logos/krismis.png | Bin 0 -> 28253 bytes images/sponsors-logos/landingi-logo.png | Bin 0 -> 6150 bytes .../sponsors-logos/videdressing-logo-160x40.jpg | Bin 0 -> 3019 bytes 30 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/founding-sponsors-logos/Appropriate-Solutions-Inc.gif create mode 100644 images/founding-sponsors-logos/Contentinople.jpg create mode 100644 images/founding-sponsors-logos/ExpanDrive.gif create mode 100644 images/founding-sponsors-logos/ITA_logo_160x80.jpg create mode 100644 images/founding-sponsors-logos/InternetEvolution.jpg create mode 100644 images/founding-sponsors-logos/LightReading.jpg create mode 100644 images/founding-sponsors-logos/adytum.png create mode 100644 images/founding-sponsors-logos/allmydata.jpg create mode 100644 images/founding-sponsors-logos/bazaar2.png create mode 100644 images/founding-sponsors-logos/canonical.png create mode 100644 images/founding-sponsors-logos/chesspark.png create mode 100644 images/founding-sponsors-logos/dcitlogo.png create mode 100644 images/founding-sponsors-logos/divlogo4_8_w160_banner.jpg create mode 100644 images/founding-sponsors-logos/flumotion-logo-160x50.gif create mode 100644 images/founding-sponsors-logos/hwebtsf160x80.png create mode 100644 images/founding-sponsors-logos/hydra.png create mode 100644 images/founding-sponsors-logos/lucasfilm.jpg create mode 100644 images/founding-sponsors-logos/microsoft.png create mode 100644 images/founding-sponsors-logos/onresolve3.png create mode 100644 images/founding-sponsors-logos/seafelt.png create mode 100644 images/founding-sponsors-logos/securitymetrics.png create mode 100644 images/founding-sponsors-logos/sun.png create mode 100644 images/founding-sponsors-logos/tummy.png create mode 100644 images/founding-sponsors-logos/zenoss.gif create mode 100644 images/sponsors-logos/Atlassian-hipchat-logo.png create mode 100644 images/sponsors-logos/CouponDC.png create mode 100644 images/sponsors-logos/Variomedia-rescaled.png create mode 100644 images/sponsors-logos/krismis.png create mode 100644 images/sponsors-logos/landingi-logo.png create mode 100644 images/sponsors-logos/videdressing-logo-160x40.jpg diff --git a/images/founding-sponsors-logos/Appropriate-Solutions-Inc.gif b/images/founding-sponsors-logos/Appropriate-Solutions-Inc.gif new file mode 100644 index 0000000000000000000000000000000000000000..85a18d962c3065078dd02178ea7df0a8b2b8c76a GIT binary patch literal 2882 zcmV-I3%&G5Nk%w1VW0p|0K^{v-0STCb%$H1w64_J=<@TUqoZZ5xW>lDX=!OXIy(9M z{Wp}N6M~b8iHY#{_#}#&NS&*7w!nzM$-CR&o66FW#m#`c#Q<=G&Eez#YkvoOjSzm2 z0CU&@OWg%q;e^8Kr)+!bV{vSuh=Y=ky!wa%&>Sol4KwNhkDI!yWj9Qn_$QY zCgi+c_Sk%lfPsR8goTEK1PdDxdyS4MQ4WWbl$C=58Ul}-oD2(+mZ72^3W1oKoT+=B zpdJ7bu(7hR1_MR}7PGnryuAjqyc4FGs>NiifCCp70nN_O84*SR8yU~e7a11|1{4Dn z5fB{O*%}r_fTt)19UT{;F$=A0R;vI5b%9U#vwol4kz3H`MdA{U7~|16J9XTa8LycHI1k<=r@`3}q!WtJa==9rip&L~2BGR8LJmu0S2BW*#x_1}*u zT_6o03J7pe02(|vL0l>QW0w&U06Nn!Is(uRSrV}GKxs!Q8lF5=#g>$4R%MpyqoI-Z zfqovIIS&Sz9pxdLu}Ret55Q*C_bs>PiBXa+O0H1QbBi`alWbTx?g3_u^d_-Qz#aG--hZfB?XN z-~m`*m=OuW^f3pCyUqCj=qBi`>$>Pb0IvfN$kj{)n|pvkfpo1zwdht2Mf&2kDdbE) zgSx^1yb3JfszL(P1ONmu{TMoxvwP;C3R~AR=9P|A-eY(F9H84n4~ADb`exTG#{1 zeegggKAuNB^tlnSDDa*yUP&IB2u(;X#2G)9u4v#}fCSX%0ShogJ%Er`?GOhpK@164 zcQkSIeWDe6%OebzbW0e}H0r6*S# z)+62dC3d|3!wKagf!9Fy9K$$4U#!~`G}Waf0R_T0Q9_gn*nyt`Oe9^!ZFM~1X_ZtCuxL4+{!==j?f$V2m~C3 zP;PAhvO*bM)D?gY%&~aPJ*#t_t2a=_iyumwOa#paO#ofMWC~CaZpTYH|JVT#=5yZy z3GvL@8Sxfem@j=9*SluQE^xZyldJ|&y!O4yE~WSrWd}@POeS|$E29^L4>7(`)}?PA zaMy$>jJMu3$#Nb`Qg`b~2$-tNb_6lVh)Jvwx1C$55QpdvMd0B8sV1-|z+1yds+Mn1AC&Ik%oehneDy~P7e=1dtk;|u`!4Jw;E zf&?@`1PMsM0X|TG1hjAj2Z*zt=X`<$6yO7XCPAM0EP^`6xd8+?0Ra%;XABTp3~uTF z4eh>`k^?QUAY#Ky1t5R}0n{zS6K+5PK9J`?i#i2)F2Df}z-Sbx8qj~nvz&wG<^$9@ z)+IP+ZV7y8c_Xn?qb!sutmS=)2|wzkEh?gn&3-0~Lp&>~IU*{ba%3a*?% z23KrX&`z531%RK`U1x-Z5!dx10%bJ&I5Yg7&8Mwt@zHsuMxa`nZV_$b~y(BZe8a$ ziy+VACOO8zz44^adC<8QwVdmm=sY`m)`2EBqp=Qv0*D&gEC+PAPc4E-7bGAW(7@qh z5?L|J#jC25KsXNcVmmHd1nxcn1}HvirWXL$Shu#VM@@B&TV3%Z&~~D^-EGDX8tZ{Z z`Pmad00$iU<-8vG;YZ;10a$b>sGor8S8w_Wa8>oJr-1Bb&-&UAfW?ZVbDTR8XJ|v+ z+)t0W%$x1!TQ`2!2w?TKMV|bo5557)hrFA4@8@<~JLzbT_1M{N^PG(0`;*B1;2Cdm zW>b9f*4A^NJ@4kKgWJ#&7qp%ct$T`h1nbrxyYX92cyNdN-6Oy;;5UH3l#qK`Rtz`5 zNd&lnFQo{cvIG?uff6`@6!>i86#;fo7z(g~9N2*#_<_t~ z_=Hdxg;F?$R0xHw0SHQ%g<80UT-b$P_=R8?hGIB|WLSn~c!p@0hHAKmY}kfw_=a#8 ghjKWFbXbRWc!zkHhkCe&eAtJ6_=kYlhams}JA%^sivR!s literal 0 HcmV?d00001 diff --git a/images/founding-sponsors-logos/Contentinople.jpg b/images/founding-sponsors-logos/Contentinople.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6fd9d3a623c6ed32df4b4696ee61da2f87ba4aa9 GIT binary patch literal 27614 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 R16`B`FZt;|e^`3@e*h6m?1BIQ literal 0 HcmV?d00001 diff --git a/images/founding-sponsors-logos/ExpanDrive.gif b/images/founding-sponsors-logos/ExpanDrive.gif new file mode 100644 index 0000000000000000000000000000000000000000..f3a24767673ebbced466f70a3ffc7f7347ac63e3 GIT binary patch literal 2992 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 literal 0 HcmV?d00001 diff --git a/images/founding-sponsors-logos/ITA_logo_160x80.jpg b/images/founding-sponsors-logos/ITA_logo_160x80.jpg new file mode 100644 index 0000000000000000000000000000000000000000..070625606eb24b7c1d8b32789ad6a2a5a873c507 GIT binary patch literal 5408 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 literal 0 HcmV?d00001 diff --git a/images/founding-sponsors-logos/LightReading.jpg b/images/founding-sponsors-logos/LightReading.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eb6c7cccbfc41755e2d0319683ed02b0e6887230 GIT binary patch literal 31068 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 literal 0 HcmV?d00001 diff --git a/images/founding-sponsors-logos/adytum.png b/images/founding-sponsors-logos/adytum.png new file mode 100644 index 0000000000000000000000000000000000000000..aed0da2febd12b10e3a5fef2fe2a9ef3fbd916ad GIT binary patch literal 8050 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 ANB{r; literal 0 HcmV?d00001 diff --git a/images/founding-sponsors-logos/allmydata.jpg b/images/founding-sponsors-logos/allmydata.jpg new file mode 100644 index 0000000000000000000000000000000000000000..72c3d568f163c15b1522168c4239aafc41a641de GIT binary patch literal 3878 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 literal 0 HcmV?d00001 diff --git a/images/founding-sponsors-logos/bazaar2.png b/images/founding-sponsors-logos/bazaar2.png new file mode 100644 index 0000000000000000000000000000000000000000..563f08bd4b98d1491ba7ef902009fac8381b7e39 GIT binary patch literal 8660 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 F{{SKznnVBq literal 0 HcmV?d00001 diff --git a/images/founding-sponsors-logos/canonical.png b/images/founding-sponsors-logos/canonical.png new file mode 100644 index 0000000000000000000000000000000000000000..a96ddd4c666eedc251d3a365e792b86186addaa6 GIT binary patch literal 6493 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 DmBCRL literal 0 HcmV?d00001 diff --git a/images/founding-sponsors-logos/chesspark.png b/images/founding-sponsors-logos/chesspark.png new file mode 100644 index 0000000000000000000000000000000000000000..b604bbdb5b348b7e727fd8377e8babaa554066ac GIT binary patch literal 10366 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 literal 0 HcmV?d00001 diff --git a/images/founding-sponsors-logos/dcitlogo.png b/images/founding-sponsors-logos/dcitlogo.png new file mode 100644 index 0000000000000000000000000000000000000000..c6a7fec759749614331618350b3f320ed779bcbb GIT binary patch literal 10315 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%0DW1a}V1WBwC1qu*#FgN%%vvq#} z6SB0G#-#X#qA+KmJ86WXOWzxJ zal~D`vwzdp`?UieELh$nhsy6HinWug#y=`zm61g#cJM)K0Om56`V2F4LF!D6UmW_v z<`wG3kp1&2bXysFu$202l6ra%9336sB+?aAu`{UNYJI zfJWzA&dr&{#UZ(Ap8VOVpjCH)vz)sHP}59+`@IRABcTR4j(oO@n9ZkSrPuMJ(rM0Z zi~{n_mJb*Lhoj2Cwldl^LJ>w&^#-3jA0oeJ%)^K<@7la5{H3~Ew|{nlaBy-Oo||L6 z&^vuyME2;k>+UAr5Y;KQ=Xy?77OmL88AE8+I4j*wTL9tpH!|KO*rmkvJ?>U-`jKSa z#8>EQCjC}Mo`xHNz)rZ{3ou@^014&i->({yWa!Aq$QYQJ+YHOg98gNvlUo>ynZJ26 zUq5$Ivfy&)SY1=o6O_`nCa&Ya&*Fg^eiRrKl-pY#LH4jaE;@St=uA0ScI=d=!0hL! z+QY?9VS}JdA;gAmwdF-Z>86_}5}5>uilm|-P>sv2RH~yg`=vog}RB$w1U2Io+Ubv=uo|;?okUw+!o8H)%VwUDX9Mt}! zrupJs^}Fex@F2Z^e*p+DIySa@00PI0>nJ-Ci&0-C^|ZN=g8~o29Wd(xB z1W8Jlk_=!+&@yt;C;D3aG#!!4wvd#V_^aVPCn(`$Rd>7U(ZRvzj*i?hF)^^c016*w zl2mta%AB`#A2TuCz(iM3RaFEbFDrXXRaJF#d>matQ4#GqXm+=wEtBop#=mpT4`7@n zj0Yc8QGx6wucRcWx;hrd4i<0UPBwc9S5;NP-zh07zJLpZ<1lU!drwVi{o9&hx=Jl^ zhl3;FRRknr3YwZya3Jk!%ZEg`imIw&plp%a@XF!g;n%9Fa+4n7si~>F(o(aY*e5Xk z5)1W!Gf+`iCxpY6mgY7!>Bbhr^S5um%B*3Q0OzLHAM>j6)fNerjI?x=6dp_|jm8R8 z!Pb`OHK!6(5JpSVLZBKayprAon>FBO-Mn?H%lYt8H-s-X|Nd%j)vi&F7irQs`b`GD zrYR^c&i?i-9tQ6)krcDFWrxxI^?-(P4g=1jr@b&QFCDJEyZcpxZmD}oaj`6VHT+=V z53gXeNHHvb`6XP(;hw%LB9JGzJ4ncXFXQzP_U^TS|BZyNA|fGCe*OAM56W>CSXoo; zq6v0m6ciLhHw9jz&Z=QePTV~_E~2aA4^adLnEsr_=$~N8A$?ARB~NfFjU6J#9l3vd z<4VLh=;fw7)q$CslgPQPM9S53!LHB796lv z!G|36he#){x?0VS=#Z}pUojVvrubgaCWm~$Vd>tcx~giq^Y(1?EvhCwUyaAT~oPnCa8yg#|2wsoEON zB=Qi-dF9++2v1Q*S@|QlwRRG{ELh8nv!k9hs8lF*Dk2EnQ$7nuo& z{e=Ys@QdHvPdEex1^2qAk{tQ*@PAEANPuDTY)%tC%@j6-O*b4(&!)9^x4CW%nbWEX zJ)!-U+>Nr1wL<0AeR`wnCHJBMzy{VBM&FQinmTkA9Ns9OnwX$3UAg!{($oTzcG{z} zIfRgb49@PpIZb1Urn2&W`Nr8V;fco_=~(ngBr*%4Lg-t`qY$B=%;f4t7Ph>Nun(lD zh`GC`2llbV`psC=)#`^{ZVx`OeID~^g=vdJ@vsfTt&y3T5SWUt*hy_=^FMAM>VbNJ zJQ5-w%bB{EqM{0mc#$ud*+#es%;n^bTE7)X^Y_vamDe1ARV?Xg1Eua4W5@Z{<$s zV30*5{>+}u(mx0mO0x<*^Wa|(MOVl=Dm0_w$0I9OiG^I~)zYTl3!dPLs*hDinzMOVo1# zdAwy+SBw~aAfy-)Fo_skPi{pbwyo+mkqX=5wW>FSu^Z&EXV``3Hw&Eb{hgoAurs;f v^V)NfC*tw-!oD_pL~^El^#3=)T?i+>-AxvHPxccw^dY3gY=DYFzS&SjulK&o|9k)Mci;P1*x8vg=bSxr=FH6Q?3oF(h4~Z`Txnrt z0U?kGgfqe!f|$?vy3E7L-VkJK3oU^lhzsIG2tz0kLx4XBAqBCs;t=G8m^&5sLoAxW zK>{2s1VTs#oHT?wD=rG+`*)Hdwh7wP;Q9#C#MVHNqTuA!gh=%wVeEXV3@Y818iX-* zP{-Kf31kYKhSb&6boJD<^spKjtd^dpj-IAE1fenzKV-{5PVvvkKuyJ$f_uRS2Ld&L z%Q3wi2$>({KqyQv2NE&K1EGSP;*HK4X9rn=E6~XJl{sCPFbw1}`yn)|Odh7T5P~@X z@v~A8aT83*Y=^c%Xf7@;ZZ0%8H(H37hgV2U0F4$9lN1pV6A_UVLbHyE%Xs3~5W&aG z%g4_r$j>h*%FoX)3J3h6<0L|VhXM0CB*X(4?E5(%VbW68wH!LG#;VLn!v4M-3yC&I42`G6=a!43Pm_Zkbmp3$}(G<6Uo&^15E zbHD;{Drnt&41_o(K{R*LW{{pwiSXwVDE<(E*#@Ceta}PU#?X*s64haEr{i_s z=z_AfqsH&aA1W6wL~a<8zs`he_YM?D>aNO1wlSg8FP(?mUfehfG*yew^;KNL4s+xR|x%d@%1c=tV8{kS|Xr?UKPtSTvIMXyBD4u-?d z!UKsNWwjl$7kOIzI)dT?F7-naKH-oow|>cSmn@6LoAMp`|rdu^{*S1R3B^53^% zK!;rMxc&PB$}lLcL+p2{F8`y$J2iJ|-CX=umc3bmYl>MHGH#<1;&*@=kYC5AyO?x{>q^FOHVTQ!{7o+(jhAm4Lv&Cr~ph7LpB&T_`SFv@6Sby07l#L&?T!NH^M)`5WwmTnY& zowlVat92kV_Vq~mX(p5-wCxN-rFaRHoNYy)N9{eFVrbr}lle@#y>~NFLgZ3u<6uwr zo_8e=4qpw~lm7kV$bBZ1C=uHpVf^jhF|5rdU;mEnLCHmcR;2gvkxuh6opX5UrF{q7 zlTnv+8VCEcN8Xf_4V8xY<+(H;&(PavAueEp^YAIG8r{)+ZO?Jv!b+C}^YT=~Wy!_* z*>9r;UAUt}lf{`(z9D7D$mR9IRaw;f=q)2hIll+C98Yy-LZ%~kHaDfbD;mffxvss2 zNP)(pLX)+tDw1x??^`2ok#;v5JD>TeVdPW&r#HQd*?V&D-7e4W@$VsDXy|#c^KnQ( z$8a-+39ZRzLMtz4>-nsyy%V!Re{_k8O3+RElRAcQyJ29$pnr5~Y#kH2oA2%3*k$h* zYP+xU;nlhPudh^NU7LJ2Soc$mOsF~gDld1nFd_E0SU%NHCL*{a* zD6c--;S<$=L248=7;~7EA5w9t>e%7Kq`?{{RMgqyO?2-Z>U53HFUaU`8x|qOM;Z4Q zzm4#4h}3xNc|EI4NA7?akx+c%QOqF~|68et)>VYQ+z>ZJ*_TZJ*nhe8NRy^BO{S?d z&~sqWH?Lr1$>*r_u><<==0)Ztx#NLYH){sqGvzRQ1Xq%IE(sllBO!j_$P3>I>&shItmVSN4nXtLBicbyr+g$+x&3 zw)^b6p(*}l_*|o-D$X3@_^eh(mxvSXJ*vK;%`u6mF5w?>bnL37e|8yO zF-A~gLU9|CvRmu*LXPaMEt1M4HO)^>+VWwv;^mlMfI6g0)ID`+?Blj8^W5{Z(_M@S zFRpw)I4^BKXO`5S_S%ffn6U54>Ccqh%N1AL?Uh{@d0fFnd2`Chd8$%)#k|}L0uP7F z9?*@0BlYr~ImB?<-Hqk}_pc!WANcY!Vm=+5W2vtAYQKy4>#H}SlY4b@#>jo6{BMS| zuhtLxj4H*NGoh^`u}?*5BNjRSw`xv;AKTo#LgUkUio0-$jN1ImZf*~??4{qvH0xV0&Z!S= zyOmbZ9y+jI@%yKdVkSg4ey<-pc(5!TRDr#6XsB{n*%qnK0ztA@uSE?rA$iB2s@-x9 z;czgwD^kzJ+*QB523@6>-rV7SUScj;CBWD}^$erEM?Y|LUQ1_t*!)42%&qlC7l&;2 z_8Lm1Q%HfK&3f*%xRSB>{IEK|{tJ3KE8m`Zc;imq&TFQ}>joBl4oi>edYSQZbnP2l zSjB<`Jf)rZ_Hb@{`mS{_rSGY` zQ9uOUz1TnRO3KpQ6MKDk6rY4-Y`KE(V&$NbiwY|*aHM%K>-x$|Jf9QS?~Jisv5-*G zd1)Bmp1uzZc$T&;U*e+=Kk2NT z7R{AV9)9uC&BE|-%%Q=(H%DU6T*+BF*z9+3WrX+O#*T_S+aBD$;`mdUkI8aZ);ooj zH8&nwW!OyUc!evku2>P4|87({;m+V2leZU#o+J#dIU;&>sp0}zOs6+*Pkuu*@|#he zg<(jY?eVkb0^iJ|O2?AF<|gKqElm8V+H1U)db4Lvs3-BMRJ`P%ms4Ris`@kOwM$s5 zM%sb+H|^HOrkf9a?;JZUQz&b7f26r#?(S7it>J;8s~nW?2cpHLT<;nSHAP>|w7W|! zsLgK}P21g*cYk5xhv6ZC+<=is!QOWVM?NmjO+8mI)NVqGDa$LBIP2j+4M`{(Oz64f zSYI@l^5kg8NbM@8E*HJDa7w}DRd=q|4KCBhJ=;h3%RN&PYxupnpgg}~&?v3q^xEAE zGxyxf%o#LF-@ds%{qQOcwSj{C+qbftuWGc6U}@yaThWeo{ljC)eP6yYpsC&&R(e_^4 zDSxtWR3|_6%`h&B2|c0=#Ww{-j_Ei(eDL-wE}=r=R8igKi;tPm#SPVTWyz+}zO$Le zogQy4v?fr?Ldgp=_hn{{1{C$Go(YPUG@YL-CKVX6Dx>K^ZQ#Yh-j?<1h`S(uj;3C9>qUL)36HnYtKa(vFHC%|-9B`Se;_lc zvZ#N1i{vn=-i;o3X6Mqznmhj3k)4-oqK(P|Z&rU>+8_JIDf`0}CS-5yGEjB@US1pR zW3>Oa&hj|goCdv6?RM?4te(*wd;O!Sb&WkE`ub)E9jZbo#X~unuYB-cjNU6- z1LuFi7`l?W(bB*^g|E!?= z;Uo)Z&l60@yRf3Z&!_D}`S#e1;t)_@aS!i|+&VI}q4!;>qM~+3c9{WZ^ZG!7Uu}MU zL44(%d{v)T@{lYkY5j<7y~@sv&PJ8WvQ9_w?vl?1jeCY2n=Wc<^d;!09Wsv})yezJ zgm8r3QHjhq&1Vm;jAgbm`;{_&ykcpns6o2Rt!&xg7c&Urlm;(uNbtvk$+KXB7U++= z6)riqT{wm~aUpYm7@UXdf%7B<4UEGB12CZ^8l6m~7|LN))Z{QE3V})_Q+y2NoE$Bb zb>)nWcns#7tu}RZvops81(4|sjGfbR8!J`8P3RTv+TO_2Yd zoI$&$<<1)9)k_=q1&@o*A| z1PCXE`V$`ix>zt1AasC{j=F&=D+2TVONr_?pHdYL1bhH6 z<^P^)_@zKo4FTx?AJ-0?K`%!J74ToxAN{6KQ5_s^LwN}DcDqP{6m@q zJ;cj#e4Gu!gK^)3O!20AOpd0%8>Q`R?d;6#U|drwk+cdQNSf@vrj4948Atx^fc}@A z_8&)dZiC6O5mx!+hzZBxQvF3KV3di+2pbZEK>|-6Kb|Tk>3@CJnHVE~H;n%ng?<^w zxu*tgaL1{Ud>V8@Qb#h?2hY;@f3CLwqzuz^O~ES%`~%eeYsLQbv}Z!}3!yVeL>OpK zA~60FE&qR3K)9l&wI`5bjpu4Az@~qU?EeC+qoMgbY%Lw_pTN`F!vFi`_BYi7y1)N& z1NgOse_{d3Slyp0Z^AJC1gxX;dket*4E~2%08oV$7#6`>?0XQ4hkav_jb{LR=8>1 zw37qopYX!+>o7C%YGh((1zw5ax$GZL%@glcYHBL#;5qWgTh?E_J~ASLroC}a(ENH& z);JB1+2ilF(|Aw4bN$sl{wV9@8{w~_{uP($l1|e9QP9ab@?RyL6x2YKHS=!7!}>Px zmi65roaJoAa)bik6rLcLF$b6fC=R4O%7=Xs>O1(zFySTza$As#Sguq=00RzPD3-ff zEEB|G2dk;WmkXMM*w0F0rhtEluw>|GfdvuH0$nhd$t&x-h5{>({|BM*CTRSN2OkRt ze+!XeVb1wEjrzn&bF)GaAjYY9SZN?BOat86;DcvMas*4BAr{mUQuX!*IRPL9PH5mj zOh8T?IXVRaer*807KD>HS}ch24+x9r7m$XaAmC{B+XM9m&i-u{^ZzD~r5P@mH?$C( zpxnr1<0tGchg=O{$W;I;avsE>)#EyXodF@1JKcC%3QnR3AQ&$roP>ZM8U$s4QvxDF zWGEC0fT)lUI5i;;NEe)85Ejyg)IiJ&!b24BM}lb3xV`|{FUNG-$pCqij(}5W(-9_t zaP>{VDIoy?AO#yLhZi-3LZq+u@`FX5$hRjjupkAS3*-p=6$7XgA2<#lHY9Jx^z?ED zHE<%$62sodcQQW%pmWdz$OIDIIlzVvQiz}K!_LYBU}11_vJzHi(|B|G(5N9nKY=*F zhb$j5g+vJn1T<)K2beqf`~YAe&4&+RP*;#BBpUdhLj(ZG5%gCR$UNi7Fa*xA3iQE% z%l~%yQ6aPdM{`$4aI0y`{~2OS_aXfR;lKwl9PvIs!T1TJfB;8QIKzr=>1b=?MWqJ7 z47n!3KOuAbQfZMU0c4*^O$m$_9()HJ2Lnn@BFP&c62Jga?ocor{~L687L^758J*Y5 z$CMgCrAa45ltgGv*;aOMLSy$ItSJzor*I8HBSy$ItSJzor*I8HBSy$J8maFUd8_s<24g*0> z;6%W$Gy;$bm|UQO2?P>^f$Sh(5NCjs&WeG_6iDP>U|=9q$YEmA0e)u^$N)qT0v(8_ zkge=3?BQ1@7;Zu_gJ0&Kg7c4)3h)dUWMbhk{ap{T0H5%FI|Tqun~H$3Sg-#wl4Bk) z7Yo`7u&yw~Ync(88b1Kz-%ln?a$-$dSkQl(H30I^CMPLaY%J&&v`Km335Ur$+L%(N z$qkp)p30gk8J`sbv@E@xU@?&n^rn$P44y`rribzOd>D^yd5`q zQs^ppcu^?J^EVtHqzXF+L%``c2oJm6V!TLTM#E6<-PH;?44G&s=b~k+W*cNm@+DhF z(nt=Gs~icD{sbJ6<%1lq7akZCNMhhIz-O64*9$k4V=>nQaTu&Bhhd>G{0-$aRIn;o zWh@p8yoxaxi~)`4t!Hm$F+mAZhSR;1!!%T=G#^zg4u?}!Q&&}2R|Xi$^a$X=8m>&C zFBoSs$;XUDC(y`2ux~2{=8Fe&OAJFfIrv6X$ApOZAY0q1Tm4oWfq|;OqogzJNk4@A zEhQbEm{0|th13ul0l12I|Bw@iVF1)^YpZ8QC4>Y5S6nMIqmU3XQBU36)J)gZOha8A zr;Wv$nVG1Yo0(f^Ti{G_X1ZFYz+vnUbU(^9!PANYT#zUP(l0zU{}s<^bbsJ!Mxv2J zNkj`8HISv$AUusuf(vLUH(A1|S{PR{nC%8-)+7I37_~na<_~l~gn{)oo=yBkZ{})R zTFbT6v;kYq-|OuUbU)ZmDfLGoS!M~}P8BwxX(lz5@eBNKnA%?(+I0276{%+md}EBivM8Z^E1c8}RR_{V2sFDIma9gBb zQ+*H#dfu#63`XQY;P<8K7eoRc+drWHZUKWP7wJ#Q`BN7&mCfp~f0A@6OOG`N3aXW4 zqyfGkO){JYo>o6UvaL)_!RilhasbJQZogtV#>(7O8;jG{R#sO5ozHLae#^%aEFGcJ zB2=f^%fG83G05J3((%GMe^dwz)tk07zz7uM53p%PVCA{OomxN$Jcbx)XsUyLMNJi} z2962Z>G{9Xy8R2<>G{9X{vdUtkQqi`=?F`lU%7SOha2&TT@9>4X3Tf3PCmLVAaP%brxhi)BtcT>^P35 z5=^DT3PF{E>H-iD0*I!rmKrMr)d}LDGC>HcUq=HN2OI)?5aQra7hr-AzLy3t6*z?N zq5(_@4goC)S+u}_G_jf>7Y>26ARLG2u;RLKhy!whkcETO0&yL67_I}14TQiXHL*Cr z6AocooGwg@(}i(xx-bq7$HKv3S#g*fj>Qd!gYSrA@dS3L1R5(=TM3x05-@coZ6zHg zT_v0nPz@HVgjH9Y9-TW`sOzU9;+%kp^ajJZoLE>Y9-T zW`sOzU9;+%kp^ajJZoLE>Y9-TW`sOzU9;+%kp^ajJZoLE>Y9-TW`sOzU9;+%kp^aj zJZoLE>Y9-TW`sOzU9;+%kp^ajJZoLE>Y9-TW`sOzU9;+%kp^ajJZoLE>Y9-TW`sOz zU9;+%kp^ajJZoLE>Y9-TW`sOzU9;+%kp^ajJZoLE>Y9-TW`sOzU9;+%kp^aj{Fm0n z^J4`ni2|0LhJp2^%;#uVur|rV&VIFpm5n)Tu`$}xhD@O%!K&9l3WEl(R&sS)i{X3- z*1~dweb2z=VR!;P$kxFE-uDUuE159xk|sDlaexKO!%gEWW$TqK?J$_hjK6smA_URE z&Q%CIfUiLW>rO#@8;A#lF@j+Ddk`1(@`vL{ctx-%4G0M0l5pH-Jg&sT8ILc6xe7_hWL7h_2Z zgZE`uwgbz8@iZdFlo}X>r$j)|c$r};Nca!S#aQ6+;4d?$;r&$GKru9 zD|G7kmk3jse;%23KNa|XQ%mhIX5-tUVPLB!fNjn~Xc#)Ygb1Vjs}cW?38#rQO%5fn zYL`RD%yKP?EH#^HZRHjM)u9k*)`5ji~uiF&9&g0-R$ zs=o$e6XAtW?#Dq6VyfP3xShcU0}$jQ`+D5&K^)|>!k+?U0!Sk1WY$)Dkg2^Rh7dvv z9Y%NtQU==(=s^0=GRPcS3AR{tgxsJF5CLpq5D4}|41+d8 zo1q<09JC)g3>}5iq0>+nlm`_;rO-9#26Pvy20y;s2(^Q~3A&+P=sh$HeFH!9%ZcDa zh#=-5WD)X+r3iI|F2V?5j<7-4Bis<42pPNMQqS5TFxdel=?AL=U` z2b%~RhE17GpUslZiH*P(%ofA8m+dIqIkpnE+idl0&)D9xjj{8wOS3O!*JHP0cV+is z4`biKp2U8Zy_o$Ddn0={`!ELwhd75KhYp7&hZ~0&Zj_VwC94|PAI5|1z za4zLE4p0k4UF=sdD7cO2dSuS-h3$C?X6s|2?NnF`nE^r7f`F<~)HF=w%Gu~e}#v8UoFaRqTJ@c{7z@j~$?@ezr6 z5+)KPiQN);5|1T5OU{*CCP|XqBbhJRC^<3*Gsk?6|C|GJO6PP+u}LkFS|b%EbzJI> zRNq|Dx%zVnbN9?GoZBXilwKljFC8U)O1egRXr9cx74w4T9hrA)UZ0G(%rY52nM9d# znYXecvPQCG*+kh2*&d7-#sm|9Nx|I4yq_;U-*SG){1fvZ&i^K-DCZ=%MJ`{ia{+tyCRT(^3miJFV7^6~?Z_Zoyu`epFwg zPEb!(Z_wb=u+WIrxTNtxbEzgt^SEYfXb#{br9NV21IfXdgbQW-Scg}MD>|*9}(B-MCs%x}swVRY1+3nI=&b7{K z&#oO>XTI+6x^8zZ_Z{v{>lN3BufM-RYD2(=G7kX{yho8IyQhn1w&!>JYWzw3ke8L$ zF|YRoQ$jMKm$;0WNPJ5&BpoEZ_BQlB=>5jW(C3iPTVG?}B;P)=DfuY*gP)~ey5DF2 z)&80O%m9~w{6MZi&%nzRVTwQHHdTfiPOS@C8nh$mX|P`K;o$c)YuZ^lg1(-9i6IIe zrfNbKg=`Ob7HSll8u}&7IjksLD4Y^r6R{*>cf{*Ri^wxkY*B=$n;YkE+`REwv`O@d z7(|R$%+1&ZvD;$1H?7!oZZpqj|IH7!sBJm8WpJy@)+^iQZQHc%#r753b9V6WpzUbh zslPLQ7uzoKu7|rdb|2Y2wuiWk>Wiih?0ns_ocq2PcOM$s=K`M^35yySBkHyT+O^T|5|F9 zSXn|jPx-cTW<_Mh(Dk6}eK&k=ytwIcv;CIqt%locZa=(Zedpd?i@UcfO)4wy8Q!~g zU+@0qD&4BmYVGQh8m*e*2U-t`A8J1=snw~y^a%IpN}WMn`D5e9H|ovm?>1O9R5z|_ ztZQ;=YH4{{HF|5W>F*)y|eHP0QM zx4$5~=zU3l`MrDFE527ruVr6ny-|O2?XAVzM?LF$x_g6qzxD0t7wSJYuxQ}oyJhcc z-n+i<{y_V{{J8hioKKm9nu9lo?1r8U2M&MxyywfDFXz7MeytpF8F~FJ>^tZ8l+neb zSH`TzI+%fA|K{A$%)KY7v;b%Um$2A zwroxC0ei148d~_xw8y3n^_q#N8?+^aAtZtgfn;NmvG^l|1m`1#vFi5A?AC~2-kTK2 zE%#!!L1=J)q!3C7;EbGRA;JN=v)iFH^XTc@)Q@{T%+KC3j}NbodSD}9+sjCb75C@w z)N5Q5QF_|xNx0SK2j)87ajQ~4m6e&P;m+OZKC7BN^q3YzOdJdic>gl5ul_{Mg{%Yj zk9Os+5+;81+1yk2>6K^ko3ia*j+%~phl>J_S#RsPLpuAgfTLayoWf3ewk5&*^)hSE z`;}>sZg35+(3^W8(tqD8wH`n7XTEMSTnnK3DNzxi5L^f(gkXohFIOPo?NoMkXrGFH z&c$7$>~Kqc9;T~SBtTIi8b7oZE9}pnvRT;wrAPMhCC#_b_<9KXn%vp1?seZQ5$!3Y zcSca|%py#XdSyVyk!*$4QYmPnxMSiJWE=IWgpT19O1=5cV<0 z9G!YTv>7HBpbc6+G6xgyxY}Q zd{1WyjA9AA3?YqtD#Dgx-xrPFk|dgXUE!92@rH_~NG4>iaO=9-?MFy_zAJvu{N0i$ zoogZ-h^=PxQY`gtPD+}zB(@1*_@%$y(2gs7I+xURzgN0xm#5Go1>KA{Y66?^H?-e# zy1mj>5V|fKpKy0fXA>U%Nm_*KsU*E7wu&VJ*oF$|%sRpBTz&oWca*~YQG2^D;PurS z0wj(nKCEyuEgqEMx)nD3lnI>-Ve{iC8cJLmrrBWY*w7m zS-tE__byDK7jboAxz{!*ZS$L~qYe~>F3MWGAvkzT`GsQ5qLA%ZR+F|x>sW>MUNE~xofmr{zVLM;ru)^a zNPqo}eICmXcQ+`O>et5n$RCGL9}ouWHGKHub$j9bj22l>aX3~L)oS7LoX$COpn9rAKL#z*uzIQUJP zm*e#kbCPs2DNQcWGSyz;&N1m^+HxP&s)}(tgm3ymkhb=amBK-5oV;*r?XAe_c?!E) zNLj)52A{_*1p$!0A7C#pYY9A(lJDk8jkq1LNA#S=^%z3;&JV#x-A(U0bF8`RbDDE~ zNtX6)){=z_g((YeDF_xvUn}rP)`-_Wv8%4t%%*QxtmCQ;LtxvOESg)Up?0_77PIo> zd#`+%CvY`XwbjqVUa6r?>T1$sulp#@_>jsF(!Aw;Y+KRRmtQ^K_szLDu)Zic4n?ve^hQ#Tn3x}StmBUnj%_m2(gW^JEn{0aiG@Av^7}) zh8NRsUDlX$Gb8d~;oh~;HMd5uZM=CWQR*RP(_JsK9fV^xHXFUdbNg-0kuB$sIt_Gj z5O_V!s`c@^!%UF-Mk)i zg3-P6+<*W<=5^SjTm0@HtDhyP%4~G3_tzTBS>s*xcHiUmo9A4-uw$|ADy!OC>Yibo z=Z)NJ+eZws1F9#@0=#UF37n>?bGiEr#7*ab z1KmRHSSA#YRM_MQDD;>rB^p_i^y zA4jRHDTpX}rmWsZJKpt0_fbPT+u824Zv*CwQx@lmFX_Opwz=2+;>h){uB5vs59j7n z8rM1<92!;W!7WY!J>O>N`x$Q@Su^+^kkdn{m@I9UPatpKVJEP0ppSo2iZk02rA~I5# zkmS&&57d^b6@DMn#q8^jr8~OKv$Xq;-e(oFe{2~(rs|7+D)$a56&-opVgHF($z>7` zUNkhto~!MwOrZC?vr_R49mpXX+z)?}CwFi6dzC};F{-*k08k zj!{*=Ziq3gFdmVPBDh%YKD6LmNRHww`ktZ93N|Y?ec{@*=__Ow-WE{G;Y8*YP0wBCv-uijpr=xn==&8K#t*Hy*X8jXr8f0ene?k%b* zVg7OdEf=48Iw2E`y%#7D95~?BOo__c=JsVZ z$s}HPn*Gbn1wC^3i0aefOZ5HXuG*dDv9GJb?0mZB^X?V>0p%kWPhDvuk)n&gkPj!~o@XcveceRC(*b#%Gphr6pH zjvIUrex1Nq7G=G@sSAheI8Ce`j+-NSF#X!4tqIfyBafvVt{NlDUT&)>*JX2YJ+pML z^O?O|dslR#q)#r0H|&geXkiyD=FJ#2&+X$Au zE^JNZJy^5*Qs^$>@DCMj#-;^zY4&IGPi5zDN8Ne+J@?7FvuV!@)(SW5tUEz0Soh8H zUC6$ZXYUTw+m{4{`jr;0U%0jEq7krCe0W+IhJ>5{LNG?S?NNJcxE%SK1WwDnE;~y|31dS~r5-8gbFyY>Df=qGMMG z#g7c1RGjpupyw$hFYin<^eYzcLxn^hEjjk!TGa!wfU{*9_JVGu3L}v(N#A?ZY7*jB zcY0jS&0JZ2X{&3Z;~oky|y(05X8(O#Hans>+XMgUsS?8siXr48BP|}lN z;}}%>yWp}8-{E!MolW1YWcECDJp1mp%Gu7lcf9vH9v1p2Ke`0J{!+>Zv0PLZ*=r{}lFJTK<>mgnWlSipT9cs^nC+s?esp(gQ2SxCr2%@o_zZ{Qmy#UYV$E(Z`!dX4 zmQ*#O+|br{va>Dmo7w3HbM1Dt@a-rmQMzk!y7bY>qNpz0^^dJ~d|GpUxVx<9{Jm1E zD|XP?ly>S2qK7}fFUBIip2>uIU%!G#5WFEOJU z66znJxR8Py;U_K+xnB)!swP}5D#~rC(<@^rTjy3d=5EsJ$?M=eV|k(Fu5J|Ws*I}a r<&5Ow^-bq`_sEMSAyA07{IsQuJVz;Ck4OaXxaQQ}m;Z4!v-SS~W4yhG literal 0 HcmV?d00001 diff --git a/images/founding-sponsors-logos/flumotion-logo-160x50.gif b/images/founding-sponsors-logos/flumotion-logo-160x50.gif new file mode 100644 index 0000000000000000000000000000000000000000..d58225d922e5642ca41fd367b519216a3bfd7073 GIT binary patch literal 1243 zcmdUs`8V4K0KmVJXufq+hN7;Qd_}0^u`+dxd{NhC?^&yFT`6iTw&tO)p5v{v_$DMm zi#S?$66Y$~h^p3o&NUj{p8H5y1WhZbBet^F{TKWE@cH@k-p4P%*V*MJ7q|ed0YEyP z-q+h3;Nu%CFmoXntzj^VErqL-Q#GG&MY1r`*QZ29H#dnU#gnfkl51D5uIuV1B_xD5 zefs`rdw2J6CoN6x?Va>ftIwC^?B8OPJw0LHJvtJL-{<9xzmyhm@)J4&=jPv3iW!@G ztCzp2Di}*V5DNEsy!wX8KR1VO#R=ayIOOIJl#gbONZX#aPA_jwiQ9{}A|n~hu9A-8 z#f`<@{-qCFTkTD$KRhG9yK?21-s@$RqyI=G8)jx2Sn%ZJ1o%HgP-6bexB2LgPXO!* z4MymU^b95|lbw})?|x2h9w)z`u;{_V;*!#`@`_3>k6%??Q(IU6>!Sui@y=@L#8vI3ES8`0|kBW)*6?|l=DF=};ENKqhtS(#RjHUPnQ zK*iRQ(+;atjd*=f6G(DBxfp#*4Q;Y@eH3dtj-1Qv|Tvn)ESpU$>D7tP-yK2yn^kKK@b8>Z4Xsw<8Dnv=)%wM%>JS3)9ulo zOu$aP7>Yd(InY{S-$hgKsZMwB!-Li=jc)f?{Cx98&~C{&^>0xpb^z66-U9<5sU9D{ zS6h()wIiPgiHbrIsz$ajSiQOeUhFclkYu#!b4a&J)8 z84n{e+CPDee$2i!@;TfQcQ3@z3ah)@w^_)TY$yl*WCin_<6K+|!F>f8;UF2eyw6|pN1d_k|mPkuLDc;7P z2DsABQ4hlyXQsNsFC<$XO^p`7iuKR|9ePJ>S8|PDXVj)uzB6V&WV8Fb<1}@5+*u~r So%sAfzWWl!zWo9Zxcv)e@9|{- literal 0 HcmV?d00001 diff --git a/images/founding-sponsors-logos/hwebtsf160x80.png b/images/founding-sponsors-logos/hwebtsf160x80.png new file mode 100644 index 0000000000000000000000000000000000000000..12f478a6918f89576e9f353cf02a33f222995e94 GIT binary patch literal 7292 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 TV9_}69}uLWs;g3~WF7T?7p@#m literal 0 HcmV?d00001 diff --git a/images/founding-sponsors-logos/hydra.png b/images/founding-sponsors-logos/hydra.png new file mode 100644 index 0000000000000000000000000000000000000000..166bbf988e4f885329e9738b7648bcbe61d85a96 GIT binary patch literal 55202 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 LzEZh@O~n5Kn7{II literal 0 HcmV?d00001 diff --git a/images/founding-sponsors-logos/lucasfilm.jpg b/images/founding-sponsors-logos/lucasfilm.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c6295f9ffceef4027c06b6d0d247ce82ba6e381e GIT binary patch literal 7315 zcmbVxc|26_+yAleWQ&9;ONyjOg!r@|gshWw%95?2vJH)yBt&*0>y*80$(D6uY*F?l z#2Auwm?_3E+i&_l-{1H5dOd&rp65ERbIvtquKS+*eO=eNmU|fA8H>OXQzH{2fQ5wx zxXC;K1`c>?2=loQ0Osa^G5`SF00)Z*z{ccQmdkHnidZ2#de{S{@*0oMW6zr^ydD=RA-8z(y(lejoI z*g3hmxVitHJiG#YJUslo+}wOZeEb4}Oyc1?A}k~*{Fnbb$=~73QJn1ToPs>uJbxwr zXT7J0u4t1Ru(ok zR(3Y#dYOt~iC}&YunTjDoV;+AQ`G7nm)s*U^~lt>-166IJH@R>2?`o+kDu}I9+i+h zCZ%{v>GT=pi<+0Tv@h#izhP)(eAC3##@5are8<7j-NW;~m$#2^U{G*KC@d^I>Unfb z?2EYgwDeaQnOU#1a|(-!OG?Yi-@X4>SKrXs^r^X}3)9`x+t>ePU~GJ1a%%ef%q(tc z`RB^7)wT5v;_pAZd!&8x!Qo$AECAbo!TJxf|AtGLiHnt;osFIAFD@3=Q0B=d%+7K0 z0;kATE3SKwMCH^Yxy7!fzOC)#k=L*$h`T)=RUnQM*`~pU$ zf>Sr@Og~VKxI-&9@U0P{e?uMFg$T}UwlpQQUDv7lI^~#@?ZV@R3yk$UYjMx7@8?46 zVl}H8(j!{JQGRKoMR7H}fzMVRb_@pLpX^k%qRJTn58SVu>O{+ZKv!6Uh*IrjGtR2( z_MLlqSAkP6R`Pdkifux8)LagExr+fb1uZDjYN|S9jF%$9g?JW*8XI+RV^EGc*DT=! z#gGT*kMODB1)ZNFtS^utpBVuA8bp8rcm_zoKp3--oTI6sVFGVja=&Hq^CvibP&d<+ z%_le+!)%)=a5_LMHf)6J3SH3zX7W<$lx$?S`$l^bjYb6gKmPp#C zr6<(vTyca#z@x?`E!1{?K@gXWKf`G@C~$?-#^1L#s(9Dhq?(ew_bqD%j5bTP<8GT-CL}H9~bCbQ>{> zmT3#77*LN8K*>Sqqr=Os0{&D-XG~bx>}S1Z)%*9(-q(&%0NXwkw8bl56-dRSxTt0o zR8O)%5t#vCu%dckXvxO$wolvjP8=!X+LvX)H6Z6bY19CA&Ssg{7h8wL>_p8rJ)?qg z$RlegkBNIN6Y|ezeUDZ_<>Kz8DnJ*r*vcgDJ~UF<+KKLv2l41j()$r?nPHVH)6g0J zLVK0w#0p(b*VP~x)z_e@!m7v6?p2-$IQe4M&3C%kT;q`R5NcPo9nU?nw_>Gpb@i_C zcppFCmSQjZD5xP5O}PROBI%;)}Nkp9`s96yvnFIS@=`cUsh+ zETNAY@acK?({I%3X^6|fn-V{>HGf8qbu5$faRTzBS_bg!QRf?&e0QTfKC^Lr&Vu_< zi+Xiyj4?+_c<3>9`??;t5+~tnc8W?8`gi8%XH9&(!ZeT9S5s!{JqTn^Veq%N7O@4_7+(&PS$aLPzuE&8Zq46+EX}Hc88w z^0T0$2f6faH+iPeApQ{DgA$#ASyCe!@bYnk@3CriI&ie%~^*v!a-2NPbuOs#I%OOSYlk;T!Z($RCt?!P3v{Pn_I^A49AVKrZn39bU< zc8V&~R@y-j4hXEqJnIIrGW}|$w@?v_V#Od|{U_8{#Sgcm2iT$tbinIPFOe&}I%ryY z83Py#w0qj;=GR+u#Y9Q!vEM@4q~kF7$z0KRRrJfwk>Yi2BUMu$s7y;$E0sEALvkTc zRwG7Hg285+mM`>G#v7o@fij2Yg+3e2ZVo{A9RqnK`FFz>bTwit>Bl637crp)5_&ta zhdtWq7jUJqRdXochrdz1KUK4#r`DEF{+x6DW7ZOfFs>7U41i#YIuNFxVF2H+foNhG ze`-GSZVF+>FBrGc3FDG zQy;_eo_@0fv_yL$p1pyQJP8H2g2C0*5n3QQxRM;TgxoqPhF>MDb|;JR30Mr`FQqv9 z9OcGm3`9|?HTqmL7SVzR4-ARmsI~wCwmbA_3s+x&kZWT$r`1taciM@6njWeMw01SU zCPF`NusBB_>MnN6N|K)tgfMi0y4UN6o{bfO#cLzqXYkFKZ*4|nmma>qJy$2XeZ6Vbak);pwCQ4=vuBu=kI%qfxYmET5@bohkRkry5;UN)g;`@T5*i+z#sU*ZO>AR zYK5D>zvBm~TWEgolf@V8{-|VNWZ(@hhI?mQ0HKKN)Y2CrUta>@HI^*J$vMY26R&rk zaW7x<5$H_PY!376PU2E)8j!Sp^rc@9T=k;HG1DtHMx^4Em)KrK;c;5Igx0o z=7{juFC2R2ZlqgUOl`Ig&+-i)=m|*Bd;TlUDpAFD=$2XkH_g&=+8IDPW`qH3-9a$` zV^xIu-+06TejdQJ7=T+Ba&5X=Rw?wY6CJHa(-f_UK`y*w0MktjprmeZwG;K*yyKJ? z{aGmT@GN*KdCPU7!Zm9eoLWyTpCGD>1L|A&3ZOWex!v$1S}#zA5cCMSfd!a?{IiWdAjc~1>P zGsgY)*)OvYHPkUbb6W%&`<0z7?}1G7m(|iR-;M|RXAE85$F=(6!z$LtXcqCJiF!sy zZ9<&$BZRYvhZGE!Fo5N{OKx9;@KA4zHxvmb;-(uKa%TVBYRMTLJNC68>_>r{kqj5R z%)BkzB;1O)v$e7qkPPCk2gQx}aV;H9FLMG3d}F=&#n(&UN-@>6`WJ_Z`{!fJRd(c7 zD6R_9jb`aM?$>dKKu?TVjJroX^=V&AelSVp?!CE!>_4ZHHydKLwaI0q+zEXi>UCx^ zcnQ%L{1tt)0eKwpg#k3wbX`%wVdH|$5;bm*Y*p>ZwZy?&X_d8aQ{>8hx-F%$Zu7C5 z&#WN|$x)Q6uP1SQ>I7+rF&$_of^ISeDFn#Uv(A8t|>>hb_w<7q>9VVWSKVAu$ z^c$!d+qZ5tS6W$d2v)B5?#;s$hh>@Pj@S4nY%%~ST5@xNjg~}JBf58iD~id>CKC@< z>n7Y1JYqc@K0bD5o0X;ssOlw}{Fh!x8Qy`Yz?Q5j`(yaM!OXJ-r$ZmlP*)V>rY4g5F)|Yg=U40GJpZGU?fG!k^vO|LhGZM z#-2rCP@H;v%R*5)9ce*OkpL0%V4Nzl`)C@sm14GV8d0#T@}%_!#(O^F!9%}Y1Mmd( z_;L+d34tb1J|naV!*RjKQT%3Qv)=?}U;GS7C|^~YZc-ATepc}eGg>|giGP(*kQwfv z8iCJGb5vZ@>jdXJJ|fv$mFG{}&6EDL{y5;H^Vl!|IfEVp3OCcM3)9+A4kwX|s}aXu zN3(U44ip%`gic2))87NAnnW}P%}X_n>ebJUXUZ)Tfon{=n{4YU05BL)g%T zctV5?t{!`Ynb3wsH5Xp*7l6k6rocip#%y$NG_s}L&{<|kRys^C) zTh$yy+1)#HdRQh7yrA;iYZ@y?weJulUnb0T%euV~U25%=_g{W6{rGy`p=T#mWxV4Y z%pKDq#sHo#lVa2Ucy8%)XO0ifJay;w7{U!-Gl##UJlF`aVn)&n7gcRA@A!{4cBnM? z8OE{7)vHS7vCM@_&Csg!&pK?N35HiB?CYCl1L7<3C!U`Om=4gryB{ew74V8Cy|hR?0=UzY}2A9 zoCodU5x4#*BR?%8`woltO!w)Qd`uJ7-bd1;Rft)1-jGhDKSZF8znst|Vt}uh-k3m% zz*RwbXvI7^wp&(;@U1b*=hQ3t_Q@m8&X+w?&{r% zZv*~5F86%R?aa`l5Ym&G_7y~dak=;GuU2RP*MB=}kmGgth1cn~lvV>yNbq+V+41VTb;8(F z7jq2aONo|Ide`(6s|JZz^t7Z^E6C`j-goE6pkH%InjNoOdksPuKs)N8OOf{3H`H&Y zt$s#I)H|J9r~y+8!Zs zX1P(ce4Hi!oDNmUoeRze(A9I-EH0+uhP5BH-wPGgY#8+#FTM zNXOeoNkXz@&KvnSz{*I)lX_}C<+HG4L$XbwbL-X8IkUhrn8Udl#BYq~LBI+2<T&GlYk~Z2K>S_0nB)|fF3IJ}+HDWLqxJeOYqY=chhfI(N zFU?g<%3eYV!Ed68QtM3)U13E73ze~{VsGuDJUpb6;YlF6y)5_qhr)ZeS3JU#=g*spKOC?; zhQgt@dhSvFVTJ-@eHF6*f-O0Wu!_l<$Cu6Q4({gsy1-s|dO1lqPRd%ww$&`g&OJ#T z*hSA+TDCJwtY^t^t`Yxj)dpzbX9U{>lSoZ<-`h_tPH#q}_TKylbG{c7bvM?(&h`v!t>H zS6gHN!sO7-tXh*wllSE6Spj7nNI<4O%S5N<^%_{Ynm5xqHAScaF{97jPBx@?!1V~I z&vwMJ=ySmgfWPPA#RyT?_Ux6GC)q`FvYzgvws)l;p&a)D0IEDOo~b7dv@a7v)}=#E z6j7GaWA<*&d*5-T7`c|HSXa44zu$fBgXvW_{hd!$=sDRjZwBBu3_yCy@2sEqL-K4> zHQ&JUYpl-V8yxs6nHc@c;)>T?nQFTQrEY0c0(DmI>wEv`X5KE6 ziS{L1c51)^ZjLETb#VAWg!Zafrwk{l%(jXC2SZBlAHq3m-Rb|)-*rAk;w+1H=c!hk zrHB(r@KD?`0|*taWB|W4VY|P>MV+TtsC0__M5eOox)D8-ra-fpzD^!}2iG9yz9U17 z$n(pPn1z$$=lDYlK;&%imTxax5r0XVm()PMzOt$?I7dJ!( zRnpVG;yuhnH!OTkKm=jd3mdCAWIX*iT$^|?65bB6BsU-*0{na`T~KjFcGgc1k^+-d zl(V6Z%GM>0bL*jWdvtEI+KjD^&ZZE=?VmsZ(0}>hn{&E`SaTJ z_1n#HJLyB*&rMEW?)%EQEhzM%Uz`By-igzIy`=M$5QMs{^Noi-G^0hrGSi9$WLm?{ zze;_j5c}Zyk>?r8p?6bV^WSZJSZ4r2K|8W=)5a0itpco#$b09v z^Kn}q7rq=n&tCDqgHNWb`8?UnzUI`)^7?ekvR1K-S^s^r#=~;FA88=^oVSu9vY^H( z95QIwd>BdSqgz37LKKmc%J zfUYjWt?=mTXp-cF?|XM^QQySAJa;xdx+YPADq44=mK;FwrUsJ(!1^^^w#Sl+dQSiSauNloUhT7rK~{~Q)#%Xjx4yZwCE)r9WNtc=(Ti8`wRy+|Ro zaf~$sVD?xx7}N)Jr@0bI4~5I8$FjGOipq>->y`$ujADm_-iV&{?};~V^FQ*lRQtqU zVf>x5u`E0$@6GI>%sS|NuNQ11F3>hycir;{_MDw+$AvWH}l}H8}`7J=hmHu4S67#?l}A{6}iH6mCu) z8=nm2JzZ6T$%dk~vzF=i{a$GBF#vHo=x3N(46|v?Kq%?#EfNEI@&%{OZ0~soLDfx8 zrG5y>5)ror7E`o5JXm$6<*)=ZgM`*3eL3pIyFvpdZ6Jzq{OOw90>en#C0ao>4U(0; zV>LvqE>1`JzoaG&fyjy$9dNH=TG`T6ik=>+KlpyKX<$ei-esLzwRSvYOIQ4ayRu)( zCuW4bLv@u%S8VD|juoAal~c<0AI%QzRF=D2CKIW>chSnC(J(UJzKo1kQ-64{aLIZq zLigNG|9Sv&F_Qrt@z)2fnW7~049>L*?zPpmG<{0zJ>mf^ohN>R=RPjs`i9DtthqIU zX5!?srjTZY&v#oiTH%r6P#A{I2^?1${znX(Ug z>(#MstSMw}MMLN^E`%a_Jfs^*SsG?;5HcM{u$s)g8mcWB(1>2lzYxj`+XMCj&N2X$ z3Q^l&iocJJKx3#0-;i`3&&4lr@!$X)I-Y(p7Hp_`SJMx6s?J!!>#rj#_H4zlPU z?n|S3o*W=kzmUi2Ja(Q>h{tcY5+u6kBG|fqr%dI9R1|CeAW`81o(>YQ;S(8LTwL1U zf001Zm0ssI2_D*Kc00009a7bBm000XU z000XU0RWnu7ytkYPiaF#P*7-ZbZ>KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=00004XF*Lt006O$eEU(80000WV@Og>004R=004l4008;_004mL004C` z008P>0026e000+nl3&F}0015ANkl>WfIOF#c<0bYuPU49tFB43>jJMd1H%x3C z2q0ETNPs{>5<)_IOWl39sxyCFkY%wt$;-s=x&G*%)VfQZ^VRvzQm2GO1g9SaAVCUX z0O*2308U6CfjkBpfC44}5Y9Ff0E3Ulf5X5t0}KEPhyemXk`zam`uey~JQ_k7R-i!W z1b_hSj4;!=tb&ime+$54;3!he?d@LwTcKp;C7)1%T$glUh@b=j0|MY5DfDk`h;z8+ zIKrrsvaN|XZE}PytUn=;f5=niat!?o>< znoA*V5-{WB72z)m1du=o_>lwt8>MIhasU~DpqSUNe)##dsn!S+Qc7=xNA;;Qjrj|- zqFH2QD~14`0u6u(LWJYQ?mwLru#Z6g+XUDKB%t8%p}{8~WUYHmFgQ6(4J&4hpfMWO z^~tl$!r4Y)4y2_hmZOEz5D^f7X+T0L0AvV&C;@E1z()b~-xR=LgVZ76{Qi0C^(R7P zk<>I-f*4VpDGYcRcN`rc%MBa-DW+F6zkJCB$;duS#W-eYn6E>=fHV#vBmi&$HQ%(~ zdoP~CfBRn%9rq7PDaM$83!Zenf7#gQdk?`6S!6Il!12G1{d_tl{E0r8002DbI~3os z(M-gF5hsPfT^T?irc51Gz$H{xLXLDNg(?_~^Nxnm=Z4(FoKg(P4q{1Gpe8RcCy4n- z`WSeKsFXVX$?&~IicSF@V@xSEUcytVW=weh$sayzd;gq?$QPV3=Kngj;{Ren7AntR z@zI@|vHhSSB?Au1BTfpq@LU3mD?}v#RFaEWde+q1qF$|`WAu>AhJgm8dl>A7{k?z4 zG%BWNUtSozh*1hVAqe_|2x**b_&%c?6O5g+5C0Ri@HdOMzfvcV(+3hzOt4qK$tnp}p~~TQXdifg%owNK!E*F45NdfP!2Fr1WB1X1MBnC}u5#ze~!az(XXtCzWIt z>8-Jmme%%$MP<&6+-1^3!I1DIZ%=f>ei0Dhl$NS!0+lPJIOhN$rR1E`iNQXELEXvp zJ6;O^=kbt#V1N~X0^$Im2oMMv5bNH5*y$O{lAv_3nL;IWmubX7a^2O4b14&Dy55yj zP&v1v#a`bV?@~G{4@i2FJVlBKxMsK__R_nLK&>{b=n^RfXS!0#M`Cbr@PYdu=stRs zA^LU=07}YRzW%jYH8nnRiA3VQd)KtJwduM(Hettgzx?GdC#~e#wQGI(UDv(gh8r%s z?6NV`gl{`^QJI_92FMp~SzWQD+l1U8~zXWP)c!kKxWyr%WVUrn-|R3*7`fk`P8Fv-av z85`0=ykPpInUm@V{&OVJ~_NMIcXtg`q$!+1Ju~pg5=2Cu0Iaz~<&= zE0KtV!wi|v%)VZgCw*%2T<@2UKMqQTLn*+}cOSOn6ql4_WoI`xH%B57!!R7jDJm+e zs;U}8#b=1|svJXo0@s}!u}@eE<3aWB^}qL{zX?#Cl5bBAlqOv4qpN)XqG-*UHJdkY zjz*)1m`o;%rWDPaH}8qHPprOswP~7;j3;(6AvqC%07%Fk zfJ1%q>30twDowp^@u#EYwY~V8$)kN4i~%^Lh)V&|a!~b#Gjit4kmj-0wjGK{5fBkd zk0d7wN~s|#PsKH^4-Ya!&jrDy!$?%4zp}3NtTf96!oYC>p zlif!Tr7BF3$|MGe$3!lhHZxQc+}izI% zxm7>{5R@X{I`=jfV%iI4~Z0Z~esOeO(9D)sAM|3^F?PYH#9009AkNHK;rvu1g& zXJ|S@CNv?H%*)Nwb)ASf=aywPH}7j~Z0PUr2Y}Sn)XK`rnKNhVx-O+;oDB{Pwzs#B z>AkwT+On*MhKBzB{tGU+AT2FzU|^uGu5S14-QC^YQp(KC%<0poUv$yptgOs2+vS`m zlgWmLhF!aM9Xxn&aA*htB9Ta8Vd31lbLY&N69@#x+qaamp`l^>_U)~0ZNo!Dfk2?7 zq-5d3g;iBmLKCjz9y+*RO8N3jFU4XpP1B^5fk2?Pw$^c+x^3I`@854224l=HjI{Lh z1N#q{W-vD|ucM=5aB#4+v{ciy(*n!^2uK0A!0L}!^@j%)n68)dhlc(UOMYhV;-bQe zV|DLzHST0xomz50k+Raurqs;pa9R!?YeL3pwl+;@zF{DN0z!sF!RGO~s-?#rqKl|=+etB`~LU8 zpO>Gfq~d}%H#h&}k)OP^etmy`zXBp6hR7L@Mk3c;fBmZ4Z;!=>zxtK0bR9j4h?=J1 ziLqwQnui~L*m0ahA|W^@BEty0@WS)YJoEI*TW`JMiYwlDATk0NaMi~8uD+xa++i+wn7XZbwEgg&MV0y0=U%7>35UW7$Dn*Mue=_mvl4Y&&@H@n8P3xOD1{y6uC5gP!XtDcjo) zfA_At1_lNcQCUgJPyY2^fBv(dE2Xr69yAQgvH&0$2q0opL*vS?-SXIDk6m=h#Yc~H z-MVt+wr$(O;c&nR5K(GsYBHI0EK3L>J@4r!pA3aU_piB+3%+5)hE=OpwYD4#nPwmm zNG6j&z!(eYMm#q1$d4a#ZTr$COPZRSiO4j~vFJfc+27w!M4F}vAq1i#@;tAvZ`AR; zqLSi{jt(L^a^y%(PEL1scTrK%$pGVV0|rb2?AYJi+%~{j26INaWPrj0vu7~*+`BEW z?34w$k>d1dc6e@CgGEe8V(NKvYUGL?U2}*^XOWT#N_} zjg6*h8oJ@w&eW2rCB?;S)~xx_4}WOrdMFgKZ9AGCz3`$%ZEbDshub;l(X_P2y?cN0 zi(lM%*IoPf?GG4+rU}LPa4ZH&`D=gYu3fLc{<@}Vj4{i#i;9Xry=+-57JKHIXDrJ~ zNl6(V9=`wn`xjhz;j_;^TUS>XjYfUOzV+5yKX=`AZLO{Ubo=dl_wF?e0}(g8_10*7 z^uU1wD_5@U?d^?5B2p;=xaz8_s;a79dF7SH`g$`M)HLm>r=IFOa-_Vx+_vq$zCJ0X zU&%5}v#_ub0Q&p;lgXq4P(-0nD1TCZN+dj^ddAS;;Ly-eadELyDm69rloai2-IIuI zqqu%ow`~Um5CcXOSA<+?1QOA(Mrq&vc%yqPH^{HQnDOjw$=-E2oaJQ}pphj-N%vsk zzMi)B#LiJ{b8RKKa2)0(@@s0Art|F|@2K1U@Q)t~=!UNAmSyGT|uk1Q((OCw@tW@dhVenDZuiWMu~dTRsMgg=LY zfq{GOx#w7SPfALPl9GtNdF!p;`iK7s0GC{H$;~(3I504vaWN8$5x^_I``w#wyz$L% ze$x-ZEX%t2=9^coTGij*zhcFTy?ghjnC9rn$dy-K`MvLbPm)SYPcN7>2>^O~d#6vI zehPq(hm=Hsd=&8AhK|PC+4i67EH#cj#4h*G~ z1XNaDez?8eN+fh$-?C*(YinyT7_@AAazQ~L5NJJk2skHFnh-N*&TMIENyZbt*)h&b zOG=(xx6Vo?BhjeiIGU#2apylRT6_@zR8&sC__9md+YSc|!*Sh7lO{DcHxCR9Xqx5+ z)kJi|4L5xL^Pm60-FI*K;~#|(p7fBjf4uFs=~b1|^|&VHpMUtFY?#ER(^C8ecD-+fmEI5IvsIG7Sn>FevWZ95nYDy4)FvuDpviG+K5d;OK?c^+qM z-n@C~nHfHT17b~0&1nlAc-$p=E^7OGtao>{+oY3BG9^9GYz7EuD8*4(o~4)$4&+Ah zyz*pTboXf6mY@e*1-WvOTaMM1h#lo-TUpl4k*U{gI?7vU{9pfaPdpy?U0pJn zy!ob^ez@k|-8*+RH8pY0Ip?-*&#kRpvUDjC`Gr+KZWfIB%xPKHRaafLZr!?}p`nzN z6wbL)YR8TpTefV`G|e>4^Ugc(jyvv{F>B^)uf67%R27k~>(^g@y>94AN@PqCDI(4o zArO%3x}&j?`ucj$^L(A8r>B>dl>tCwW8?7fu>Y2naJZtP;WZtyzT# z30J=KySICf4WI%~l2nqsB&h_cgytnQ+tQ>&FA-)VRr!h86>W*(H$A7%Q@SP5Lr+O5 zfN5Z3Vtee!nhdt-f}-=IOH1;rfh4Jk1?GMG_6-jYbH=3SA!2$)#*CRWUC$ez zI696~QBg5x&YbS^IXsK`%DBE9qk>ht*t@`&-EO~UUbo-g2~6D z7|-(nk(A<`PnkS*Gs6XWwi<^J^%Zs z`pxwJdA#;>Gtr_&|I#UcYD0cfRwTz0FO!uKNLhe}BKwG$Dji3J@*JBBgxS z)7#tkt6%*}Dyi$bl}tvX(WOh5Ht*XvIy&lCV*tRfy!Q6>9Xfaj5xFmHRh3_|r4uFX z({%v|0#ZO67y>YY$(bqN{l-n-`O#1J>|CEW?L46y(sd;=50$GN&eh~>Hg7s|W#uW%aE}7=I*@Jyq*##j0P{8>~ozeY$eQj-RW5#L(jF~fM1q_2T zW-G-3h)7BK`5SI9O|!nCfiWh5NU5M{R#jK;*s;Tpca&0^u9uaU8-aijLY>GiUU=b! z+S*#B)DKp#e)0Jig%HSaBsOyM-`zYkG&B;6X`1G`ZaADWR=zHtI#oAx#ux!GO}zNq z7cX71Bs(YTx4(VqzI)e@Qrow0-?(vOBpgmlOFPus$~pH-iC_BCmuAnM6G{o4zhJ?X zDO2{;@6k2gH`6(D=5(~Tx9s0OH%62ZN@R(z5OA zZ@6K`teMX}_nhZ>fj~fdUMLju=XUt;;m)p3P16W~7$c(Io@1J>M^Ym`NuSn&$7d}J z!Ie~8n04=WzVh%do_k~41}!}|B{f4gQaxdKV5f)Fyt3%@oWrr!*GMJ+m8X;>kcx34 zhLSN4K?)EyH@f-@1L=z+*@XZE5by}Z`=_yg-~PU1y@p}a-VFdk2q|SsI9ys@o|}_XUS8hZ+-#br zVHj_|`DRm7la#WvvojKn0Kn+z= z6w*-NzGKIApZ#nk8r|32td#OYWzPAX-~P6r`Ix4Oh=yUj^2#gH^GZugo0^+9Y}gPo zLjW)`GBRt{tWSOFQ*Mjb>$+0PL?TgCR8&w{h=_{FbzR%G zJAQCB93CDfBG2<|+b%9H7D6;OHX@?yy2)g+u&^*ABO{y|z2%l$0)apx zk?`59qod=*|r^z$E&KUe)8y}**V#Db#*>-B$COpva-y~OyAnl)6#Fd?Y3|@ zJUTi`M1u3q&d&Nhdwd=o85s!%gLmF}=l@vog{!Z*dd7?y@p#lC<>6E|36@C-v45QCn+kI2;azLVi*-ckWz35JIG;rur$wv}x0pU%MOt zT3cI9)AYAi7-O?%&mI^Uh{xlpsi{N+MAg;RX=!Po=-O+q)imwF2Od1sddT05@^@Dz zO`3GY6<2)mi(i~nSg?ENu91)s^El@|859&0Tz&P`D^{%VliK$7_M~H_rlxYv zk+GRGXKIEH1aoWW-hTV->(;I7@9+23Rb5?OT3Y(&c2%Be0w6~+D`6WNStCcA8{Qu5 zJ2cdLXlSU#FgmA|I;B&Tki!~Nf^%YKzsx_{f60v6I|GqP3W%TTT#{0%t+mZ|Y@dyZ zC_6hlH8st)t&a9~rIaFyL?Zclc~YsPT}MabqyCjjshsQ_##vWa7enTHE&^m^WaQ-L z`ecQO{eAsgw{2}}ZF3wa90^aJJh{56DknGB&-e$2hK?LL!Wmbjh^U~TAR3L1EjvG9 z9UUFrxog+n#>Sz+K_d{z&CQ)rT|IqzB^O*u$q=PdzWd*|Z(nm$Q%6Tf|G)Y7T5XV1>b$pHW#^;j&{b>s+V z+@DNlR#rx4hEEcRI505K*VpH|uD>~!pP%n5Wc(K71b=)sfJp*+05$;!&=E9W4M5~t zv7z20dmGiy)q&Z@Za-8m<3#h>-1=K}xu z7oB-Uo}uk)eBZENJ3~70i9qMJh(8#>Cm;J%M8}&RK>hH^eLX9Y5p(UB7e&Dce*7qp&!sw&H}IpiXS)B(})8|{sCfd=$-Ws_VjFAcD5 zfIMrD`}=^z<3$Yr%kco8^2RgRz?lFh02fG{?Qr*r-Cb~!eLJ?lR#tXiMqbIe966{xAVdzB>j6=lt(D{yzlxPZRmiQPf`y z;J=!*|8D^Nfu#O(&cuEM@c&&DPnX<((5l55GLADxaQ`&`qJFJdhsr1S00000NkvXX Hu0mjf1z19; literal 0 HcmV?d00001 diff --git a/images/founding-sponsors-logos/onresolve3.png b/images/founding-sponsors-logos/onresolve3.png new file mode 100644 index 0000000000000000000000000000000000000000..d6a2c218c17b082e191d37386bd4c8eb8e75d1b1 GIT binary patch literal 11089 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 literal 0 HcmV?d00001 diff --git a/images/founding-sponsors-logos/seafelt.png b/images/founding-sponsors-logos/seafelt.png new file mode 100644 index 0000000000000000000000000000000000000000..d39be8ad0ca17fae5198a71d212abc2e5dcee39a GIT binary patch literal 7457 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 literal 0 HcmV?d00001 diff --git a/images/founding-sponsors-logos/securitymetrics.png b/images/founding-sponsors-logos/securitymetrics.png new file mode 100644 index 0000000000000000000000000000000000000000..bd7864873017bdf1420cd62960e441a27471e132 GIT binary patch literal 6238 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 literal 0 HcmV?d00001 diff --git a/images/founding-sponsors-logos/sun.png b/images/founding-sponsors-logos/sun.png new file mode 100644 index 0000000000000000000000000000000000000000..85e39e3881aa09db67cd8c77ed9b9d553d9b89a2 GIT binary patch literal 13417 zcmWk#WmMeU77Y}a;)UWexLYZ1g)&f}*x>G7+}(=9;7)PZQW*RLin|u4#ogWBydTM3 z$;yx9o|Ap{*>~T_uS%b>F-S200Kf*zeNu&w`S3#l4H16!2uxzos^oQ&j{2Z+ZX-3;}@qSNOOO0B&3Wa9{)gLg@fN z>)=n4>YhtS`fk4J12=iFUu_-&C%L%PxFDJ!rjwI*D^X2f{rFkF>M$Ye zj=4RPgnx5afzBVDV(OBPh&Mf>Jj*T%Bb^I~)?WBf5 z*f7W5()Ru~=5;9Kj-oat%P=QhuSS*oL0krpCKREYjg^(fKETCM%T4hOe1@KG+h6IC zvkmoFF#stw@VaekJy|T*wZkgaUBjkaimfpF*z>`Eermyq^ z3MS&8j?)4r+9+B=jFP&a_6x$sZ7+qtbO`S=TYt4a#I-(HG|9dJlBY1}=;nK}`2{TP zs}<3MpO#TQ;^*Cuo5fePL>yaEVAgsjH{%_NRoMu*(X`G^JZqQzM@K8IqNsFufrMaq zv`GJ(o3q-jY&?E-eNUXCt{*wlk)^7pGWTb`WYZHYg^!e;&-7k;grw{%*ZA9#HR+sw zB%c=8pC@*s{P}Nf>zEz>g`hv{f1A>Fr;zHeVUCrDLS|Ulz~o+E=Xn2VC%-sv>BDM> z3Vt}D3;;CgtgZgOi`BGTT-JFOxbLiMhW9AnUFFx%qEEMIcEbrK&)>7w58J`TnBn z>FGe=#vlPCp#lQF7H+QUE3Pl|bBeYdtcFaLsr83KM%q4>yLSjJ|F?D!9~WQ9QA+W8 zAgk6GXCa3U-VA;m%h^Akny4vdt|_Z}y?6|@bqd1}d;>_Jd6c>Nt+I&;;nJp!yiOxB zc$}=^*7JYEi%*)FKqU1IBFVO!4;uMJt4Mj(sCe$#jh2^L=nA97- z`a{mqW$=5D5Uet-thQ8V6ny>2W7UVnPp&&(xNl}S9lqliyvG2nM;@^FH2DaL1XKypX+U6A4o1r_*G0@buQ`EDLdUnIo1amy++3Pk6V+o7KxlHj z>RuYU{{C|pzY)gAEzrSX&``ACeCvi1gRESGR^Q03=t?gWlf=;a7f<~{2D--4f#o5& z-!FKl?hjAZ6J7ENBP39eD|r_~U%=m$zzA(jM0`KJY7YG|C-K3T}_2AziyQ$0!dHgTCM=ltdl~x!LFp4HqMv zoTQ?!@-UE+HI-Wz=Z4sgDQa}3@y_qH_?>>{=d&isLMV+28B?#U1#fnU)In=3$s^VP*9gyhm}2dTi0JhC^I~Z~EhrKn1z^(FcGek- zYgT&nhIKy0TN9#xQb7XhFoamU_EU07eLJ!ZeEoSswFv2fKs_b%ZT=OQE*9{VBga9K zm5`QX$e1?e-DhUPc1vz_`;pkAj+c>|5M*X)`|seYOCndiCXioeHEms=Lg>%m-=&Pv z1=L_PAYXmbTHEc_^I5(7OpMcxD!#r*yv8I$*jhu_J&*EayLB_H9E6Uff(Wo`v#{2l zrwAxNdJ7(V8e_=dw^JYd>x}Ayzut!Cd)KY1)m( zzj|mczY-(vcsi^<64wk6XOUJ$jp$rNRcf+h|Ez~FtgwU!PL4Dbl!&qy`fjTRSTfF# zMTX^He$>{P%FNNNcXmo>Yctm~=>#DJQUQG35xj{3&t@8Hl~P+t}Q@B<78c zO_^(=D9_kllO~Ue^%t$-V0LW9&5%q09nBgup-rb7d8iT0(M?pB+efx%+ZLHY*v{dJ z`h1#YMKREI`#0?H9GN8*85rDl^;LE9hTO*tiA~s1L?q0bSDI%mUe~sJ3H_OP4m;k& zgMNB;N`)oqTrZu>bQ(C+iU`Eg)>F#^Kv*^`N!3rdX=Q9~r?)VTQ*YEP1p_TmO3B

#ahHjQkhpj`nL1=7_W6L_(h`Y)a%2}uTu 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 literal 0 HcmV?d00001 diff --git a/images/founding-sponsors-logos/zenoss.gif b/images/founding-sponsors-logos/zenoss.gif new file mode 100644 index 0000000000000000000000000000000000000000..d79393cd1da9cc325a3a8bd43a56f77d361b0ab1 GIT binary patch literal 7287 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 N%J;Z886^PQ{{cLq@?`)3 literal 0 HcmV?d00001 diff --git a/images/sponsors-logos/Atlassian-hipchat-logo.png b/images/sponsors-logos/Atlassian-hipchat-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e2b82f30794b6554447569ed8be1a75eee5f2ef1 GIT binary patch literal 3661 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 literal 0 HcmV?d00001 diff --git a/images/sponsors-logos/CouponDC.png b/images/sponsors-logos/CouponDC.png new file mode 100644 index 0000000000000000000000000000000000000000..31ac79da20fa6d4eb38dfe88de037731f61ba600 GIT binary patch literal 6218 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%0DjsfV$rceqb>xYB(Vz|`w`;$$h8vY| z9%rM*l5kOXO#V?*)M@edtb6T;+&dVOW9;Ea zF{PTL0#%JcUWR%pj|1@)KkQR$EnL}r^VsIp`dmZ=xvk&oP>g%D^d#eh`B)|^+d&ZnOZuFp$NXBf!)>|uS#%7OC)%nOD8(fm zkQS!Fsir2;_3g3sa#C~U;%d0w4^k`kCu~DP{lU}Klp4tJ^w(rBYiqS$m5EUZ$Gp#Y z^)$B_BytgdUxap{8)TKwyj5HT#fvq+&s!-!#?Hr%pDFe3-Tiwu=4WbY0rP7bNHgw* zYR7%m5q)KaMF{%vBmY-uT}+B6XE9#t+0ARyu;(TP)O?Gd7=I)9I99PmL(Gm#6Dz%T za)#$8?qo&(v{f7HDAj9=8PJZw;7;(zb&&R15YcI}YCXYKmM`Tu?}$&S8Y07Co8V

?u_Rgj$QsJ7Zxw(~g#rPJn_)3d+WISv5 zE^g#G5YYJ>!ix&2cB(gL=qP$4IcM|CrrKdg%DHQKD-*bvEeyXpqT~mhs`?`9lezm{ z_rk?Vjov;gw(d9i*51z6KOayd>OKe>{St;H5yuE=r)XCOSU z)cQ1BS zcE`OP*G53)5UZ`kGH6Nu+ohs_Gm~uWj+7B(77zLb>TZU3qaO!ZLlF!VG z|4`P^13FcdhbQYsMBcU<%S%e9=cpFA-gB5#xV5_af#{$Tsm%W!dAE6vMThsauZ{#RR+D@_fF_cu2@S=h_uJ$VXgNY{=6l1AiK+xJs)!suu9W`IGgc>rD8nj>>y5T!tv- z>Kd*rq`Oqo_Yr-8C(2bXQuXb*^fkQj4kEy0Q^wu{kz?gKN)2=yB4J}%;HWYWYCpET z*X0^T$CmAkjnzj#%DI(4nEeRru!Wi)CC&!4iK8=+S~;fy{X@EZrdGEr`=%I(hTX@} z4M%1e)}VewJDFkBZj1f-A<-78v`u(=Kn;KR++&qI^a>-!R{J?rt%||eW;SxzIdjOx z6ATfPjvDp}OHOx?PrzsnxkhYT=_@fA6~vZuS$<%HJn2aZzNK2w_<&PRpQgVv!4oi{Cgo7%e=>6q|Eplf z#7tvb{{-|`Vo}zborE6v{1Y~l#GAbB4k!9~+ePYV#r~kflPt&eJMrCx=h$uU?*kR6 z-zQrdWeP$w57i5lgkywP3-m|=HEA2jxYWN12%BH1PSwPI{?1{NkCHp2DeQikgR)Ba z6g!K^MR^r%KLh#jBZOaXN~v#2DlC0U*iIey*c))VPaVs>_69kQM{5p^~1))GEZ+@ UV|GXc{C?e6Rn$}{lQR$aACIk2v;Y7A literal 0 HcmV?d00001 diff --git a/images/sponsors-logos/Variomedia-rescaled.png b/images/sponsors-logos/Variomedia-rescaled.png new file mode 100644 index 0000000000000000000000000000000000000000..0ecf567cefedaf4d76fa9338921cc46433db85cc GIT binary patch literal 7008 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 literal 0 HcmV?d00001 diff --git a/images/sponsors-logos/landingi-logo.png b/images/sponsors-logos/landingi-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8fd5c005115fed36492ff98f9386ab102a56b25c GIT binary patch literal 6150 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 literal 0 HcmV?d00001 diff --git a/images/sponsors-logos/videdressing-logo-160x40.jpg b/images/sponsors-logos/videdressing-logo-160x40.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b25a2ea1eaeb62045eba5e712524aaff96e47ead GIT binary patch literal 3019 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 E3xl#%XaE2J literal 0 HcmV?d00001 From 749705e2473b654f87a12f3121d5c43eff0e5f42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Juge?= Date: Sun, 20 Feb 2022 14:13:38 +0100 Subject: [PATCH 4/4] Add sphinx files --- Makefile | 20 ++++++++++++++++++++ conf.py | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ make.bat | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 107 insertions(+) create mode 100644 Makefile create mode 100644 conf.py create mode 100644 make.bat diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..d4bb2cb --- /dev/null +++ b/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/conf.py b/conf.py new file mode 100644 index 0000000..f38a4cd --- /dev/null +++ b/conf.py @@ -0,0 +1,52 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +# import os +# import sys +# sys.path.insert(0, os.path.abspath('.')) + + +# -- Project information ----------------------------------------------------- + +project = 'Twisted' +copyright = '2022, TDB' +author = 'TDB' + + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'furo' + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] diff --git a/make.bat b/make.bat new file mode 100644 index 0000000..153be5e --- /dev/null +++ b/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=. +set BUILDDIR=_build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.https://www.sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd